Hallo,
Ich habe eine Klasse Bruch
Die Funktion ggt funktioniert 100% (hab sie selbst mit Werten getestet, die in anderen ggt-tools immer funktionieren)
Das Problem liegt in kuerzen!
Es wird beim setzen oder beim erstellen eines Bruchs-Objekt immer gekürzt!
Nur, irgendwie kürzt das Programm falsch? Was habe ich falsch gemacht?Den Zähler kürzt er auch irgendwie nur eben den Nenner nicht richtig.(Ist das ein algorithmischer Fehler?Der Bruch sollte ja in der gekürzesten Form sein, wenn man den Zeahler und den Nenner durch den GGT teilt).
Außerdem funktioniert das multiplizierren auch nicht, obwohl der algorithmus doch stimmen *müsste* oder?
Danke schonmal für die Hilfe.
gruß
ocean
Ich habe eine Klasse Bruch
Code:
package bruch_verwaltung;
public class Bruch {
private int zeahler;
private int nenner;
public Bruch() {
this.set(0,1);
}
public Bruch(int zeahler){
this.set(zeahler, 1);
}
public Bruch(int zeahler, int nenner){
this.set(zeahler,nenner);
}
public void set(int zeahler, int nenner){
if(nenner >0){
this.nenner = nenner;
this.zeahler = zeahler;
this.kuerzen();
}
else
System.out.println("Nenner muss größer 0 sein!");
}
public String show(){
return "Zeahler: "+this.zeahler+"\nNenner: "+nenner+"";
}
public double rational() {
return (double) zeahler / (double) nenner;
}
public Bruch add(Bruch x){
return new Bruch(this.zeahler * ((this.nenner * x.nenner) / this.nenner) + x.zeahler * ((this.nenner * x.nenner) / x.nenner), this.nenner * ((this.nenner * x.nenner) / this.nenner));
}
public Bruch mul(Bruch x){
return new Bruch(this.zeahler*x.zeahler, this.nenner*x.nenner);
}
public Bruch div(Bruch x){
return new Bruch(this.nenner * x.zeahler, this.zeahler * x.nenner);
}
public Bruch sub(Bruch x){
if(x.kleiner(this))
return new Bruch(this.zeahler * ((this.nenner * x.nenner) / this.nenner) - x.zeahler * ((this.nenner * x.nenner) / x.nenner), this.nenner * ((this.nenner * x.nenner) / this.nenner));
else
return new Bruch(x.zeahler * ((x.nenner * this.nenner) / x.nenner) - this.zeahler * ((x.nenner * this.nenner) / this.nenner), x.nenner * ((x.nenner * this.nenner) / x.nenner));
}
public static int ggt(int a, int b) {
//Schleife
while(a!=b){
if(a>b)
a = a-b;
else
b = b-a;
}
return a;
//Rekursiv
/**a = Math.abs(a);
b = Math.abs(b);
if(a!=b){
if(a>b){
ggt(a-b,b);
}
if(a<b){
ggt(a,b-a);
}
}
return a;*/
}
private static int kgv(int a, int b){
return (a*b)/ggt(a,b);
}
public void kuerzen() {
if (this.zeahler!=0){
this.zeahler = this.zeahler / ggt(this.zeahler, this.nenner);
this.nenner = this.nenner / ggt(this.zeahler, this.nenner);
}
else{
this.zeahler = 1;
}
}
public boolean kleiner(Bruch x){
if(this.rational() < x.rational())
return true;
else
return false;
}
public boolean identisch(Bruch x){
x.kuerzen();
if(x.zeahler == this.zeahler && x.zeahler == this.zeahler)
return true;
else
return false;
}
}
Die Funktion ggt funktioniert 100% (hab sie selbst mit Werten getestet, die in anderen ggt-tools immer funktionieren)
Das Problem liegt in kuerzen!
Es wird beim setzen oder beim erstellen eines Bruchs-Objekt immer gekürzt!
Nur, irgendwie kürzt das Programm falsch? Was habe ich falsch gemacht?Den Zähler kürzt er auch irgendwie nur eben den Nenner nicht richtig.(Ist das ein algorithmischer Fehler?Der Bruch sollte ja in der gekürzesten Form sein, wenn man den Zeahler und den Nenner durch den GGT teilt).
Außerdem funktioniert das multiplizierren auch nicht, obwohl der algorithmus doch stimmen *müsste* oder?
Danke schonmal für die Hilfe.
gruß
ocean