Komplexe Zahlen in Java als Klasse

Eine Aufgabe in der Vorlesung „Objektorientiertes Programmieren“ war es, eine Klasse ComplexNumber zur Repräsentation einer komplexen Zahl in Java zu erstellen. Meine kommentierte Musterlösung hilft hoffentlich auch einigen anderen Studenten. Hierzu sollten auch clone, equals, hashCode und toString sinnvoll überschrieben werden.

Die zusammenhängende, unkommentierte Klasse ist übrigens unter „Informatik-Studium – Vorlesungen – Objektorientiertes Programmieren – Komplexe Zahl als Klasse in Java“ zu finden.

/**
 * Repräsentation einer komplexen Zahl.
 *
 * @author Karl Lorey
 * @version 1.0.0
 *
 */
public class ComplexNumber {

Attribute

Zunächst müssen die Eigenschaften einer komplexen Zahl als Attribute dargestellt werden. Dies sind der Real- und der Imaginär-Teil der jeweiligen Zahl.

	/**
	 * Realteil.
	 */
	double re;

	/**
	 * Imaginärteil
	 */
	double im;

Konstruktoren

Weiterhin sind für die komplexe Zahl Konstruktoren zur Erstellung einer komplexen Zahl zu definieren. Zunächst ein Konstruktor zum Erstellen der Zahl 0.

	/**
	 * Erstellt 0.
	 */
	public ComplexNumber() {
		this(0);
	}

Weiterhin ein konstruktor, zum Erstellen einer reellen Zahl. Eine reelle Zahl ist eine komplexe Zahl mit 0 als Imaginärteil. Es wird der Konstruktor zum Erstellen einer komplexen Zahl aufgerufen und 0 als imaginärteil übergeben.

	/**
	 * Erstellt eine reelle Zahl.
	 *
	 * @param real
	 *            Reelle Zahl.
	 */
	public ComplexNumber(double real) {
		this(real, 0);
	}

Der Konstruktor zum Erstellen einer „normalen“ komplexen Zahl.

	/**
	 * Erstellt eine komplexe Zahl.
	 *
	 * @param real
	 *            Realteil.
	 * @param img
	 *            Imaginärteil.
	 */
	public ComplexNumber(double real, double img) {
		this.re = real;
		this.im = img;
	}

Um mit einer komplexen Zahl schnell eine weitere komplexe Zahl zu instanziieren zu können, existiert ein Konstruktor, der eine andere komplexe Zahl dupliziert.

	/**
	 * Erstellt eine komplexe Zahl mithilfe einer anderen komplexen Zahl.
	 *
	 * @param cn
	 *            komplexe Zahl.
	 */
	public ComplexNumber(ComplexNumber cn) {
		this.re = cn.re;
		this.im = cn.im;
	}

Rechenoperationen für komplexe Zahlen

	/**
	 * Addiere eine komplexe Zahl zu dieser Zahl.
	 *
	 * @param cn
	 *            komplexe Zahl die addiert werden soll.
	 * @return Das Ergebnis der Addition.
	 */
	public ComplexNumber add(ComplexNumber cn) {
		return new ComplexNumber(this.re + cn.re, this.im + cn.im);
	}

	/**
	 * Subtrahiere eine komplexe Zahl von dieser Zahl.
	 *
	 * @param cn
	 *            komplexe Zahl die subtrahiert werden soll.
	 * @return Das Ergebnis der Subtraktion.
	 */
	public ComplexNumber subtract(ComplexNumber cn) {
		return new ComplexNumber(this.re - cn.re, this.im - cn.im);
	}

	/**
	 * Multiplizieren eine komplexe Zahl zu dieser Zahl.
	 *
	 * @param cn
	 *            komplexe Zahl die multipliziert werden soll.
	 * @return Das Ergebnis der Multiplikation.
	 */
	public ComplexNumber multiply(ComplexNumber cn) {
		double re = this.re * cn.re - this.im * cn.im;
		double im = this.im * cn.re + this.re * cn.im;
		return new ComplexNumber(re, im);
	}

	/**
	 * Dividiere eine komplexe Zahl durch diese Zahl.
	 *
	 * @param cn
	 *            komplexe Zahl die dividiert werden soll.
	 * @return Das Ergebnis der Division.
	 */
	public ComplexNumber divide(ComplexNumber cn) {
		// a+bi / c+di
		double cAndDSquared = (cn.re * cn.re + cn.im * cn.im);
		double re = (this.re * cn.re + this.im * cn.im) / cAndDSquared;
		double im = (this.im * cn.re - this.re * cn.im) / cAndDSquared;
		return new ComplexNumber(re, im);
	}

Rechenoperationen für reelle Zahlen

	/**
	 * Addiere eine reelle Zahl zu dieser Zahl.
	 *
	 * @param number
	 *            reelle Zahl die addiert werden soll.
	 * @return Das Ergebnis der Addition.
	 */
	public ComplexNumber add(double number) {
		return this.add(new ComplexNumber(number));
	}

	/**
	 * Subtrahiere eine reelle Zahl von dieser Zahl.
	 *
	 * @param number
	 *            reelle Zahl die subtrahiert werden soll.
	 * @return Das Ergebnis der Subtraktion.
	 */
	public ComplexNumber subtract(double number) {
		return this.subtract(new ComplexNumber(number));
	}

	/**
	 * Multiplizieren eine reelle Zahl zu dieser Zahl.
	 *
	 * @param number
	 *            reelle Zahl die multipliziert werden soll.
	 * @return Das Ergebnis der Multiplikation.
	 */

	public ComplexNumber multiply(double number) {
		return this.multiply(new ComplexNumber(number));
	}

	/**
	 * Dividiere eine reelle Zahl durch diese Zahl.
	 *
	 * @param number
	 *            reelle Zahl die dividiert werden soll.
	 * @return Das Ergebnis der Division.
	 */
	public ComplexNumber divide(double number) {
		return this.divide(new ComplexNumber(number));
	}

Getter- und Setter-Methoden

	public void setRealPart(double real) {
		this.re = real;
	}

	public double getRealPart() {
		return this.re;
	}

	public void setImaginaryPart(double imaginary) {
		this.im = imaginary;
	}

	public double getImaginaryPart() {
		return this.im;
	}

clone, equals, hashCode und toString

Die clone-Methode dupliziert die komplexe Zahl. Die equals-Methode prüft auf Gleichheit und die hashCode-Methode erstellt einen hashCode mithilfe der Double-Objekte der beiden Attribute.

	public ComplexNumber clone() {
		return new ComplexNumber(this.re, this.im);
	}

	public boolean equals(Object o) {
		if (o instanceof ComplexNumber) {
			ComplexNumber cn = (ComplexNumber) o;
			if (cn.re == this.re && cn.im == this.im) {
				return true;
			}
		}
		return false;
	}

	public int hashCode() {
		Double re = this.re;
		Double im = this.im;

		// XOR erhält eine Gleichverteilung
		return re.hashCode() ^ im.hashCode();
	}

	public String toString() {
		return this.re + "+" + this.im + "i";
	}
}
Karl Lorey Verfasst von:

Karl Lorey studiert Informatik im Master am KIT in Karlsruhe. Er interessiert sich für Webentwicklung und damit verbundene Technologien. Seine Bachelorarbeit mit dem Titel “Gamification Framework for Subjective Assessment of Influence in Online Social Networks” beschäftigt sich mit der Einschätzung von Einfluss und weiteren Eigenschaften in sozialen Netzwerken durch ein von ihm erstelltes “gamifiziertes” Framework.

2 Kommentare

  1. jay
    April 15
    Antworten

    Bei der Division wäre zu berücksichtigen, dass die Komplexe-Zahl, die den Nenner vertritt der Regel a+bi !=0 entspricht.
    Tipp: entsprechend die Funktion devide um eine Fehlerbehandlung erweitern oder im Kommentar die Vorbedingung zu definieren, dass es vom Nutzer berücksichtigt wird.

    • Stimmt, die Fehlerbehandlung ist etwas dürftig. Danke für den Tipp.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.