diff --git a/.nfs000000000157ded700000020 b/.nfs000000000157ded700000020 new file mode 100644 index 0000000..11ac226 Binary files /dev/null and b/.nfs000000000157ded700000020 differ diff --git a/u20/.classpath b/u20/.classpath new file mode 100644 index 0000000..57bca72 --- /dev/null +++ b/u20/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/u20/.gitignore b/u20/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/u20/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/u20/.project b/u20/.project new file mode 100644 index 0000000..e0b1cb8 --- /dev/null +++ b/u20/.project @@ -0,0 +1,17 @@ + + + u20 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/u20/.settings/org.eclipse.jdt.core.prefs b/u20/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8c9943d --- /dev/null +++ b/u20/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/u20/src/Bruch.java b/u20/src/Bruch.java new file mode 100644 index 0000000..8679bcd --- /dev/null +++ b/u20/src/Bruch.java @@ -0,0 +1,127 @@ +import java.util.Objects; + + +/** + * Speichert einen Bruch aus zwei integern ab + * @author p8q-yhw-u1 + * + */ +public class Bruch { + + private int zaehler; + private int nenner; + + /** + * Erzeugt ein Bruch Objekt mit Zähler und Nenner + * @param zaehler + * @param nenner + */ + public Bruch(int zaehler, int nenner) { + this.setZaehler(zaehler); + this.setNenner(nenner); + } + + /** + * Setzt den Zähler des Bruchs + * @param zaehler + */ + public void setZaehler(int zaehler) { + this.zaehler = zaehler; + } + + /** + * Setzt den Nenner des Bruchs + * @param nenner darf nicht 0 sein + */ + public void setNenner(int nenner) { + if (nenner == 0) { + throw new IllegalArgumentException("Nenner darf nicht 0 sein"); + } + this.nenner = nenner; + } + + /** + * Liefert den Zähler des Bruchs + * @return Zähler + */ + public int getZaehler() { + return this.zaehler; + } + + /** + * Liefert den Nenner des Bruchs + * @return Nenner + */ + public int getNenner() { + return this.nenner; + } + + /** + * Liefert den Bruch als Dezimalzahl + * @return + */ + public double zahl() { + return (double) this.zaehler / this.nenner; + } + + /** + * Vergleicht Bruch auf Gleichheit mit einem anderen Objekt beliebiger Art + * Liefert false wenn das Objekt nicht vom Typ Bruch ist + */ + @Override + public boolean equals(Object b) { + return b instanceof Bruch ? this.equals((Bruch) b) : false; + } + + /** + * Überprüft Bruch mit einem anderen Bruch auf Gleichheit + * @param b der zu vergleichende Bruch + * @return true falls die beiden Brüche die gleiche Zahl ausdrücken + */ + public boolean equals(Bruch b) { + return this.zaehler * b.nenner == this.nenner * b.zaehler; + /* + * Alternative Implementierung wäre + * return this.hashCode() == b.hashCode(); + * allerdings deutlich ineffizienter + */ + } + + /** + * Liefert den Bruch in gehashter Form + */ + @Override + public int hashCode() { + /* Absolute Werte bestimmen + * Um redundanz zu vermeiden und Rechenleistung zu sparen + * werden sie in temporären Variablen gespeichert + */ + int absZ = Math.abs(this.zaehler); + int absN = Math.abs(this.nenner); + + /* + * Größten gemeinsamen Teiler bestimmen + */ + int i; + for (i = Math.min(absZ, absN); i > 0; i--) { + if (absZ % i == 0 && absN % i == 0) { + break; + } + } + + /* + * Vorzeichen bestimmen + */ + if (this.zaehler < 0) i *= -1; + if (this.nenner < 0) i *= -1; + + /* + * Hash des Bruchs berechnen. + * Wenn negativ wird immer der Zähler als negativ angegeben, nie der Nenner. + * Sorgt dafür dass -1/2 == 1/-2 + */ + return Objects.hash(absZ / i, absN / Math.abs(i)); + } + + +}