This commit is contained in:
Luca Conte 2023-05-17 16:37:25 +02:00
parent 972af6a3ba
commit 3775c742da
6 changed files with 169 additions and 0 deletions

Binary file not shown.

10
u20/.classpath Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

1
u20/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/bin/

17
u20/.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>u20</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -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

127
u20/src/Bruch.java Normal file
View File

@ -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));
}
}