# Klassen und Hilfe Outputs!



## Tombery (8. Nov 2009)

Hallo,

wir haben nun das Thema "Klassen" und dazu ein Arbeitsblatt bekommen.

in der 1. Aufgabe geht es darum die nullstellen einer quadratischen Gleichung zu berechnen und auszugeben. 

dazu sollen wir zwei Klassen erstellen, einmal "Quadratische Gleichung" und einmal "Applikation". 
bei der ersten Klasse soll man mit hilfe eines custom-konstruktor die Werte für a, b und c initialisieren und die ergebnisse der gleichung ausrechnen. 
bei der zweiten klasse sollen die daten zur initialisierung der quadratischen gleichung einlesen (also eingeben denk ich mir mal) und die berechneten ergebnisse ausgeben.

die ergebnisse sollen so aussehen:

Eingabe => Ergebnis:

0 2 3     =>  Bitte geben Sie für den ersten Wert eine Zahl ungleich 0 ein.

1 -12 35 => x1 = 5.00
                 x2 = 7.00

1 -4 4    =>  x = 2.00

mir bereiten jedoch die outputs irgendwie probleme...und ich weiß nicht ob alles auch so ungefähr stimmt oder die fehler auch woanders liegen.

meine bisherige lösung:


```
public class Applikation {
   public static void main (String[]args){
	   
	   //Erstellen eines neuen Objekts
	   QuadratischeGleichung q = new QuadratischeGleichung (1,2,3);
	   
	   //Ausgabe des Ergebnisses der Nullstellenberechnung
	   q.output();
   }
}
```

und 


```
public class QuadratischeGleichung {
	
	QuadratischeGleichung(int a, int b, int c)
	{
		//Wenn der erste Wert 0 ist
		if(a == 0){
			
			void output()
		       {
				   System.out.println("Bitte geben Sie für den ersten Wert eine Zahl ungleich 0 ein.");
			   }
		}
		//sonst werden die Nullstellen berechnet
		else{
			
		//Berechnen der Diskriminante, um Nullstellen-Anzahl zu bestimmen
		double diskriminante;
		diskriminante = (b*b)-(4*a*c)/(2*a);
		
		//Ergebnis für keine Nullstellen
		if(diskriminante < 0){
			
			//Ausgabe
			void output()
		       {
				   System.out.println("Gleichung hat keine Nullstellen");
			   }
			
		}
		//Ergebnis für eine Nullstelle
		if(diskriminante == 0){
			
			//Berechnen der Nullstelle mit der Mitternachtsformel
			double nullstelle;
			
			nullstelle = -b / (2*a);
			
			//Ausgabe
			void output()
		       {
				   System.out.printf("x = %.2g%n", nullstelle);
			   }
			
		}
		//Ergebnis für zwei Nullstellen
		else{
			
	    //Berechnen der Nullstellen mit der Mitternachtsformel
		double nullstelle1;
		
		nullstelle1 = -b + math.sqrt(diskriminante);
		
		double nullstelle2;
		
		nullstelle2 = -b - math.sqrt(diskriminante);
		
		//Ausgabe
		void output()
	       {
			   System.out.printf("x1 = %.2g%n", nullstelle1);
			   System.out.printf("x2 = %.2g%n", nullstelle2);
		   }
		}
		}
		
	}
		

}
```

Würde mich sehr auf Hilfe freuen.


----------



## Marco13 (8. Nov 2009)

Diese "Methoden in Methoden" wie

```
void output()
           {
               System.out.printf("x1 = %.2g%n", nullstelle1);
               System.out.printf("x2 = %.2g%n", nullstelle2);
           }
```
gibt's halt nicht - dort müßte einfach

```
System.out.printf("x1 = %.2g%n", nullstelle1);
               System.out.printf("x2 = %.2g%n", nullstelle2);
```
stehen...


----------



## Tombery (8. Nov 2009)

waaas? wieso gibts diese methode nicht?

in dem java buch steht das wortwörtlich drinnen:

void output ()

{
      System.out.printf("%d/%d%n", num, denom);
}

wieso kann man das dann nicht verwenden?

ich will es ja in der anderen klasse das ergebnis sozusagen ausgeben...also die verbindung zu dem "q.output"


----------



## Tombery (9. Nov 2009)

weitere frage:

bei der 2. aufgabe soll man wieder zwei klassen erstellen.
in der Klasse Rational enhält 4 methoden (reduce, output, getGgt und addRational). Also zwei Brüche addieren, Ergebnis dann kürzen und ausgeben. 

aber ich verstehe nicht, wieso man die Brüche doppelt addieren muss?
einmal in der Klasse Rational mit der Methode "addRational" und einmal in der Klasse Applikation wo ja die zwei objekte (brüche) eh schon addiert werden.


```
public class Applikation {
	public static void main (String []args){
		   //Hauptklasse
		
		   Rational rat1 = new Rational();
		   rat1.num = 2;
		   rat1.denom = 9;
		   rat1.output();
		   
		   Rational rat2 = new Rational();
		   rat2.num = 3;
		   rat2.denom = 10;
		   rat2.output();
		   
		   Rational rat3 = new Rational();
		   rat3.num = rat1.num + rat2.num;
		   rat3.denom = rat1.denom + rat2.denom;
		   rat3.reduce();
		   rat3.output();
	   }
}
```

und


```
public class Rational {

	int num;
	int denom;
	
	//Methode Brüche addieren
	void addRational(Rational rational)
	{
		???
	}
	//Methode Bruch kürzen
	void reduce()
	{
		int ggt = getGgt(num,denom);
		
		num /= ggt;
		denom /= ggt;
	}
	//Methode größter gemeinsamer Teiler
	int getGgt (int x, int y)
	{
		while (x != y){
			
			if (x > y){
				x = x - y;
			}
			else{
				y = y - x;
			}
	   }
	}
	//Methode Ausgabe
	void output()
	{
		//wird in der nächsten Methode angewendet
	}
	
	//gekürzten Bruch ausgeben
	void outputReduced()
	{
		reduce();
		output();
	}
	
}
```


ich habe jetzt versucht die zwei additionen zu verbinden...aber egal was ich mache, es haut einfach nicht hin:

ich denk mal bei klasse applikation stimmt alles soweit:


```
public class Applikation {
	public static void main (String []args){
		   //Hauptklasse
		
		   Rational rat1 = new Rational();
		   rat1.num = 2;
		   rat1.denom = 9;
		   rat1.output();
		   
		   Rational rat2 = new Rational();
		   rat2.num = 3;
		   rat2.denom = 10;
		   rat2.output();
		   
		   Rational rat3 = new Rational();
		   rat3.addRational(rat1,rat2);
		   rat3.reduce();
		   rat3.output();
	   }
}
```

und


```
public class Rational {

	int num;
	int denom;
	
	//Methode Brüche addieren
	void addRational(Rational rational)
	//wieso muss hier oben das Komma zwischen Rational und Rational weggelassen werden?
	{
		rat3 = Rational + rational;
	}
```

also...das addRational muss auf alle fälle "addRational (Rational rational)" heißen.....aber wie macht man das, das da auch wirklich 2 objekte genommen werden? von der logik her würde man hier eher (Rational Rational) schreiben....aber da wird ja immer nur auf EIN objekt zugegriffen, da selber name....aber wie macht man das dann? rational...ist ja überhaupt nicht definiert?? der compiler weiß garnicht, dass damit das 2.objekt gemeint ist..glaub ich mal...aber...die Objekte kann man ja nur durch Rational (klasse) definieren! :bahnhof:


----------



## Painii (9. Nov 2009)

Visuell hat gesagt.:


> von der logik her würde man hier eher (Rational Rational) schreiben....



Von der Logik her benennst du jedes Objekt was die Klasse bekommt:
[c]addRational(Rational rational)[/c] Deine Methode kennt dann ein Rational-objekt mit Namen rational.
Wenn du 2 Objekte von Rational in der Methode willst müssen sie unterschiedlich heissen:
[c]addRational(Rational r1, Rational r2)[/c] hier dann r1 und r2.

Also immer die Form [c]methode(Objekt-klasse Objekt-name)[/c], wenn du mehr brauchst eben noch durch Kommata getrennt.

Zu dem Code-Beispiel mag ich grad nicht viel sagen, aber nur die Zeile irritiert mich:
[c]r3.addRational(r1,r2)[/c]
Du brauchst den Bruch r3 um r1 und r2 zu addieren?
Das wäre ja so wie wenn du 1/2 und 1/4 addieren willst, und dazu aber erstmal noch 5/12 hinschreiben musst(damit aber nichts machst) -> macht keinen Sinn!

Entweder nur ein Parameter oder die Methode static...


----------



## Marco13 (9. Nov 2009)

Oh je - lies' dir auf jeden Fall mal irgendein Grundlagenbuch durch - so lange zufällig irgendwelche Zeichen und Zeilen einfügen und weglassen, bis Eclipse nichts mehr rot unterstreicht, führt zu nichts....

_waaas? wieso gibts diese methode nicht?
in dem java buch steht das wortwörtlich drinnen:
_

Das ist eine Methode. Wenn man schreibt

```
class Klasse
{
    void output ()
    {
        System.out.printf("hallo");
    }

    void callOutputThreeTimes()
    {
        output();
        output();
        output();
    }
```
Dann wird, wenn man callOutputThreeTimes aufruft, drei mal die Methode "output" aufgerufen - also drei mal das gemacht, wad in der Methode "output" steht.


Das mit dem Rational ... da hat Painii ja schon was gesagt. 

Lies' ein Grundlagenbuch.


----------



## Tombery (9. Nov 2009)

ich lese ja das grundlagenbuch von der schule! aber anscheinend kapiere ich das nicht oder es ist nicht ausreichend erklärt. da steht z.B. nicht drinnen, dass man die void outputs (die sie da drinnen haben) nicht benutzen darf. diese speziellen sachen, wie z.B. verschiedene outputs in jeweils if-anweisungen kommt halt nirgends vor...oder irgendwie ein ansatz was warum wie falsch ist. da hiflt das buch nicht weiter.

zu outputs:
achso....das heißt man darf dieses void output...also nur einmal definieren sozusagen  und dann überall wo es hin soll mit "output()" einfach hinschreiben, oder?
ok das ist klar.

ABER.....ich brauche ja VERSCHIEDENE outputs. doch....man darf sie nicht in einer if-anweisung benutzen oder?? also..wenn ich sie außerhalb von einer if-anweisung setze..müsste es gehen...aber dann ist die ganze if-anweisung umsonst! weil ja dann genau DANN dieses output eingesetzt werden soll...für verschiedene fälle....
hm...ich versuche mal die "output()" in die if-anweisungen zu setzen und darüber jeweils das normale "void output()...."


----------



## Marco13 (9. Nov 2009)

Mir ist noch nicht 100% klar, was du meinst (dir vermutlich auch nicht  ) aber sowas geht auch 

```
class Klasse
{
    void outputHallo()
    {
        System.out.printf("Hallo");
    }
    void outputWelt()
    {
        System.out.printf("Welt");
    }

    void call(int x)
    {
        if (x==0) outputHallo();
        if (x==1) outputWelt();
    }
```
oder so...


----------



## Tombery (9. Nov 2009)

hm....das erste void wird mir in der Klasse QuadratischeGleichung angestrichen...und das q.result in der Klasse Applikation...habe aber genau dem Beispiel in dem Buch gefolgt...nämlich: 

Rational r = new Rational ();
r.num
...
...
r.outputReduced();

also hier eben:


```
public class Applikation {
   public static void main (String[]args){
	   
	   //Erstellen eines neuen Objekts
	   QuadratischeGleichung q = new QuadratischeGleichung (1,2,3);
	   
	   //Ausgabe des Ergebnisses der Nullstellenberechnung
	   q.result();
   }
}
```

und


```
public class QuadratischeGleichung {
	
	QuadratischeGleichung(int a, int b, int c)
	{
		//Aufzählung der output´s
		
		void outputNull()
	       {
			   System.out.println("Bitte geben Sie für den ersten Wert eine Zahl ungleich 0 ein.");
		   }
		   
		void outputKeineN()
	       {
			   System.out.println("Gleichung hat keine Nullstellen");
		   }
		
		void outputEineN()
	       {
			   System.out.printf("x = %.2g%n", nullstelle);
		   }
		   
		void outputZweiN()
	       {
			   System.out.printf("x1 = %.2g%n", nullstelle1);
			   System.out.printf("x2 = %.2g%n", nullstelle2);
		   }
		   
		void result()
		{
		//Wenn der erste Wert 0 ist
		if(a == 0){
			//Ausgabe
			outputNull();
			
		}
		//sonst werden die Nullstellen berechnet
		else{
			
		//Berechnen der Diskriminante, um Nullstellen-Anzahl zu bestimmen
		double diskriminante;
		diskriminante = (b*b)-(4*a*c)/(2*a);
		
		//Ergebnis für keine Nullstellen
		if(diskriminante < 0){
			
			//Ausgabe
			outputKeineN();
			
		}
		//Ergebnis für eine Nullstelle
		if(diskriminante == 0){
			
			//Berechnen der Nullstelle mit der Mitternachtsformel
			double nullstelle;
			
			nullstelle = -b / (2*a);
			
			//Ausgabe
			outputEineN();
			
		}
		//Ergebnis für zwei Nullstellen
		else{
			
	    //Berechnen der Nullstellen mit der Mitternachtsformel
		double nullstelle1;
		
		nullstelle1 = -b + math.sqrt(diskriminante);
		
		double nullstelle2;
		
		nullstelle2 = -b - math.sqrt(diskriminante);
		
		//Ausgabe
		outputZweiN();
		
		}
		}
		}
		
	}
		

}
```


----------



## Marco13 (9. Nov 2009)

Welchen Zweck sollen die Outputs erfüllen? Man kann KEINE

```
void methoden()
{
     void machen()
     {
         void die() 
         { 
             void so() 
             { 
                 void verschachtelt() 
                 { 
                     void sind() 
                     { 
                         // Das geht eben einfach nicht. 
                     }
                 }
             }
         }
     }
}
```

Mal compilierbar gemacht....


```
public class Applikation {
   public static void main (String[]args){

       //Erstellen eines neuen Objekts
       QuadratischeGleichung q = new QuadratischeGleichung (1,2,3);

       //Ausgabe des Ergebnisses der Nullstellenberechnung
   }
}
class QuadratischeGleichung {

        //Aufzählung der output´s
        void outputNull()
           {
           }

        void outputKeineN()
           {
           }

        void outputEineN()
           {
           }

        void outputZweiN()
           {
           }

    QuadratischeGleichung(int a, int b, int c)
    {

        //Wenn der erste Wert 0 ist
        if(a == 0){
            //Ausgabe
               System.out.println("Bitte geben Sie für den ersten Wert eine Zahl ungleich 0 ein.");

        }
        //sonst werden die Nullstellen berechnet
        else{

        //Berechnen der Diskriminante, um Nullstellen-Anzahl zu bestimmen
        double diskriminante;
        diskriminante = (b*b)-(4*a*c)/(2*a);

        //Ergebnis für keine Nullstellen
        if(diskriminante < 0){

            //Ausgabe
               System.out.println("Gleichung hat keine Nullstellen");

        }
        //Ergebnis für eine Nullstelle
        if(diskriminante == 0){

            //Berechnen der Nullstelle mit der Mitternachtsformel
            double nullstelle;

            nullstelle = -b / (2*a);

            //Ausgabe
               System.out.printf("x = %.2g%n", nullstelle);

        }
        //Ergebnis für zwei Nullstellen
        else{

        //Berechnen der Nullstellen mit der Mitternachtsformel
        double nullstelle1;

        nullstelle1 = -b + Math.sqrt(diskriminante);

        double nullstelle2;

        nullstelle2 = -b - Math.sqrt(diskriminante);

        //Ausgabe
               System.out.printf("x1 = %.2g%n", nullstelle1);
               System.out.printf("x2 = %.2g%n", nullstelle2);

        }
        }

    }


}
```


----------



## Tombery (10. Nov 2009)

jetzt hast du es so gemacht, dass man die output´s auch gleich weglöschen kann :shock:

mit der klasse Applikation sollen jedoch die Ergebnisse ausgegeben werden. in dieser gibt man die Werte sozusagen ein, die klasse quadratischegleichung rechnet mit diesen und dann gibt die klasse applikation die ergebnisse wiederum aus. 

und bei der 2. aufgabe kapiere ich das addrational nicht, wie man da die werte zusammenzählt.


```
public class Applikation {
	public static void main (String []args){
		   //Hauptklasse
		
		   Rational rat1 = new Rational();
		   rat1.num = 2;
		   rat1.denom = 9;
		   
		   Rational rat2 = new Rational();
		   rat2.num = 3;
		   rat2.denom = 10;
		   		   
                             Rational rat3 = new Rational();
		   rat3 = ???.addRational(rat1,rat2);
		   rat3.outputReduced();
	   }
}
```


```
public class Rational {

	int num;
	int denom;
	
	//Methode Brüche addieren
	void addRational(Rational rat1, Rational rat2)
	{
		 ??? = rat1 + rat2;
	}
	//Methode Bruch kürzen
	void reduce()
	{
		int ggt = getGgt(num,denom);
		
		num /= ggt;
		denom /= ggt;
	}
	//Methode größter gemeinsamer Teiler
	int getGgt (int x, int y) 
//FEHLERMELDUNG: int-ergebnis....wobei hier doch logisch ist das ein int-Ergebnis rauskommt.....
	{
		while (x != y){
			
			if (x > y){
				x = x - y;
			}
			else{
				y = y - x;
			}
	   }
	}
	//Methode Ausgabe
	void output()
	{
		//wird in der nächsten Methode angewendet
	}
	
	//gekürzten Bruch ausgeben
	void outputReduced()
	{
		reduce();
		output();
	}
	
}
```


----------



## Marco13 (10. Nov 2009)

Visuell hat gesagt.:


> jetzt hast du es so gemacht, dass man die output´s auch gleich weglöschen kann :shock:


Ja, sorry, das wollte ich auch - hatte ich nur vergessen (und das schieb' ich mal auf die Uhrzeit  ). Ich wollte eigentlich genau darauf hinaus: Diese Methoden machen IMHO keinen Sinn...

Überleg' dir in solchen Fällen ganz ... "pragmatisch" was man mit so einem "Ding" machen können will (solange in der Aufgabenstellung nichts genaueres steht). Was will man mit einer Quadratischen Gleichung machen können? Man will 
- sie erstellen: Konstruktor "QuadratischeGleichung(int a, int b, int c)"
- sie lösen: Methode "void löse()" (könnte ggf. private sein und direkt im Konstruktor aufgerufen werden)
- sie fragen, wie viele Lösungen es gibt: Methode "int gibAnzahlDerLösungen()"
- sie fragen, wie die Lösungen lauten: Method "float gibLösung(int nummerDerLösung)"

Versuch' mal, die Klasse mit genau diesen Methoden zu schreiben. Überlege dir, welche Variablen dann..

```
class QuadratischeGleichung
{
    //---------------------------------- Hier
    private int ...
    private float ...
...
}
```
in der Klasse stehen müssen, damit du diese Methoden erstellen kanns.


Es empfiehlt sich ganz allgemein in so einer Klasse KEINE System.out.println's drin zu haben. Wenn die bei der "Rational"-Klasse nur explizit gerfordert ist, macht man sie halt rein, gut, aber eigentlich hat die da IMHO nichts zu suchen.

Aber in bezug auf die erste Aufgabe: Die Ausgabe soll in der Applikation-Klasse erfolgen - DAS ist etwas, was du schon im ersten Post geschrieben hast. In Anlehung an die oben beschriebenen Funktionen könnte die Anwendung der QuadratischeGleichung-Klasse innerhalb der main dann z.B. so aussehen

```
public class Applikation 
{
   public static void main (String[]args)
   {
       
       //Erstellen eines neuen Objekts
       QuadratischeGleichung q = new QuadratischeGleichung (1,2,3);

       q.löse(); // Könnte schon im Konstruktor gemacht werden 
      
       System.out.println("Es gibt "+q.getAnzahlDerLösungen()+" Lösungen:");
       for (int i=0; i<q.getAnzahlDerLösungen(); i++)
       {
           System.out.println("Lösung "+i+" lautet "+q.gibLösung(i));
       }
   }
}
```


Die Rational-Klasse... wie gesagt, das mit dem "output" ist... naja... 
Die Fehlermeldung bei ggt kommt, weil am Ende der Methode eine Zeile stehen muss, die mit
[c]return[/c]
anfängt.

Bei der add-Methode müßtest du genauer sagen, ob die
void addRational(Rational rat1, Rational rat2)
heißen soll oder
void addRational(Rational rat1)
(beschreib' mal, was für einen Unterschied du dort vermutest)


----------



## Tombery (10. Nov 2009)

ok.....

ich habe in der schule das jetzt raus:


```
public class QuadratischeGleichung{
		int a;
		int b;
		int c;
		
		double diskriminante;
	
	QuadratischeGleichung (int a, int b, int c)
	{
	 
		this.a = a;
		this.b = b;
		this.c = c;
		
		this.diskriminante = ((this.b*this.b)-(4*this.a*this.c));}
		
		//Wenn der erste Wert 0 ist
	  void output(){

		   if(this.a == 0){
			
			//Ausgabe
			System.out.println("Bitte geben Sie für den ersten Wert eine Zahl ungleich 0 ein.");
		}
			
		//Berechnen der Diskriminante, um Nullstellen-Anzahl zu bestimmen
		
	    //Ergebnis für keine Nullstellen
		   else if(this.diskriminante < 0){
			
			//Ausgabe
			System.out.println("Gleichung hat keine Nullstellen");
			
		
		//Ergebnis für eine Nullstelle
		}
		
	   		else if(this.diskriminante == 0){
			
			//Berechnen der Nullstelle mit der Mitternachtsformel
			double nullstelle;
			
			nullstelle = -this.b / (2*this.a);
			
			//Ausgabe
			System.out.printf("x = %.2g%n", nullstelle);
			
		
		//Ergebnis für zwei Nullstellen
		}
			
			else if(this.diskriminante > 0){
			
	    //Berechnen der Nullstellen mit der Mitternachtsformel
				double nullstelle1;
		
		nullstelle1 = -this.b + Math.sqrt(this.diskriminante);
		
			double nullstelle2;
		
		nullstelle2 = -this.b - Math.sqrt(this.diskriminante);
		
		  //Ausgabe
		  System.out.printf("x1 = %.2g%n", nullstelle1);
		  System.out.printf("x2 = %.2g%n", nullstelle2);
		
		}
	}
}
```

doch es kommen die falschen ergebnisse raus? (formeln müssten aber korrekt sein) und das ergebnis ist nicht auf 2 kommastellen gerundet obwohl ich ja "%.2g" bei den system.out´s habe.....".2" steht ja für 2 Kommastellen.


----------



## Marco13 (11. Nov 2009)

Sicher dass die Formeln stimmen? Quadratische Gleichung ? Wikipedia


----------



## Tombery (11. Nov 2009)

ich habe nun alles richtig (bei der aufgabe 1 habe ich unten das /2*a vergessen)

jetzt gibts nur noch einen klitzekleinenwinzigen fehler in aufgabe 2:


```
public class Applikation {
	public static void main (String []args){
		   //Hauptklasse
		
		   Rational rat1 = new Rational(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
		   Rational rat2 = new Rational(Integer.parseInt(args[2]),Integer.parseInt(args[3]));
		   
		   Rational rat3 = new Rational();
		   rat1.addRational(rat2);
		   rat3.outputReduced();
	   }
}
```

das new Rational();....wird nicht akzeptiert..wenn ich es jedoch in der Rational Klasse definieren will wirds mir auch rot angestrichen weil dort ja das Rational schon für das rat1 und rat2 definiert wurde....
aber ich weiß nicht wie ich sonst das outputReduced(); ausgeben soll......wenn ohne rat3.


----------



## Marco13 (11. Nov 2009)

Poste mal deine letzte Version der Rational-Klasse. Vermutlich würde es ein
new Rational(0,1)
schon tun, aber ...


----------



## Tombery (11. Nov 2009)

```
public class Rational {

	int num;
	int denom;
	
	Rational(int n, int d) { 
		
	    num = n;                         
	    denom = d; 
	    
    }
	
	//Methode Brüche addieren
	void addRational(Rational rat)
	{
		 if(rat.denom!=0 && denom!=0){ 
		    	num = rat.num + num;
			    denom= rat.denom + denom;
			    reduce (); 
		    }else{
		    	System.out.println("Bitte geben Sie für die Nenner Zahlen ungleich 0 ein.");
		    }
	}
	//Methode Bruch kürzen
	void reduce()
	{
		int ggt = getGgt(num,denom);
		
		num /= ggt;
		denom /= ggt;
	}
	//Methode größter gemeinsamer Teiler

	   int getGgt (int x1, int y1)
       {
	
		int x = Math.abs(x1);
		int y = Math.abs(y1);
		
		while (x != y){
			
			if (x > y){
				x = x - y;
			}
			else
				y = y - x;
			}
			return x;
		}
	
	//Methode Ausgabe
	void output()
	{
		System.out.printf("%g/%g",num,denom);
	}
	
	//gekürzten Bruch ausgeben
	void outputReduced()
	{
		reduce();
		output();
	}
	
}
```


----------



## Marco13 (11. Nov 2009)

Ja, da als erstes jetzt noch einen Konstruktor

```
Rational() { 
        this(0,1);
    }
```
rein...: Wenn man einen Konstruktor angibt (wie bei dir den, der zwei parameter bekommt), dann gibt es nicht mehr den "default-Konstruktor" (der KEINE Parameter braucht), _außer_ wenn man explizit einen angibt. Warum das so ist, wird an diesem Beispiel ganz gut deutlich: Man kann eine Rationale Zahl aus Zähler und Nenner erstellen. Aber wenn man nichts davon angibt, welche Werte sollen die dann haben? In diesem Fall 0 und 1 (um eine division durch 0 zu vermeiden - das könnte man ggf. sowieso noch abfangen....)


----------



## Tombery (11. Nov 2009)

jetzt kommen keine ergebnisse raus oô


```
public class Rational {

	int num;
	int denom;
	
	Rational() { 
        this(0,1);
    }
	
	Rational(int n, int d) { 
		
	    num = n;                         
	    denom = d; 
	    
    }
	
	//Methode Brüche addieren
	void addRational(Rational rat)
	{
		 if(rat.denom!=0 && denom!=0){ 
		    	num = rat.num + num;
			    denom= rat.denom + denom;
			    reduce (); 
		    }else{
		    	System.out.println("Bitte geben Sie für die Nenner Zahlen ungleich 0 ein.");
		    }
	}
	//Methode Bruch kürzen
	void reduce()
	{
		int ggt = getGgt(num,denom);
		
		num /= ggt;
		denom /= ggt;
	}
	//Methode größter gemeinsamer Teiler

	   int getGgt (int x1, int y1)
       {
	
		int x = Math.abs(x1);
		int y = Math.abs(y1);
		
		while (x != y){
			
			if (x > y){
				x = x - y;
			}
			else
				y = y - x;
			}
			return x;
		}
	
	//Methode Ausgabe
	void output()
	{
		System.out.printf("%g/%g",num,denom);
	}
	
	//gekürzten Bruch ausgeben
	void outputReduced()
	{
		reduce();
		output();
	}
	
}
```


----------



## Marco13 (11. Nov 2009)

Er bleibt hängen, und es gibt nur eine Stelle, wo das passieren kann. Pack' mal in die while-Schleife ein
            System.out.println("Hallo "+x+" "+y);
...


----------



## Tombery (11. Nov 2009)

der computer fängt an auch rumzuhängen <.<

ich soll da aber nix ausgeben...bei der einen hat das funktioniert <.< wieso hier nicht?


----------



## Marco13 (11. Nov 2009)

Dort mal so eine Zeile (eine "Debug-Ausgabe") einzufügen, um den Fehler aufzuspüren, ist OK. Mit irgendwelchen Zahlen funktioniert es vielleicht, mit anderen nicht - und wenn es NICHT funktioniert, kann man entweder selbst, im Kopf, nachvollziehen was an dem, was in dieser Methode steht, anders ist, als das, was Euklid sich da vor ein paar tausend Jahren ausgedacht hat, oder man läßt es den Computer mal kurz durchspielen und schaut ihm (mit Hilfe so einer Ausgabe) zu, was er da macht, und versucht, die Ursache für den Fehler zu finden. 

Und wenn der Fehler behoben ist, nimmt man diese Debug-Ausgabe wieder raus, und das Programm sieht wieder ... "schön sauber und ordentlich" aus


----------



## Tombery (11. Nov 2009)

wenn ich das mit dem käfer mache, hängt der computer XD"""" und es kommt auch nix raus...

er hängt also bei der schleife...hm....ich verstehe das nicht....es müsste richtig sein...


----------



## Marco13 (11. Nov 2009)

Die ggt-Berechnung stimmt noch nicht. Schau auch nochmal hier Euklidischer Algorithmus ? Wikipedia


----------



## Tombery (12. Nov 2009)

hm...die formel müsste so aber auch stimmen

in den unterlagen der lehrerin steht es ja auch so drinnen:


```
void reduce () {
int ggt = getGgt(num,denom);
num /= ggt;
denom /= ggt;
}
int getGgt (int x, int y) {
while (x != y) {
if (x > y) x = x-y;
else y = y-x;
}
return x;
}
```


----------



## Marco13 (12. Nov 2009)

OK, zugegeben, der Algorithmus an sich stimmt wohl (sorry  ) ,,, es gibt nur ein Problem, wenn man ihn aufruft, und x==0 oder y==0 ist.... Das müßte man vorher abfragen, und verhindern, dass er damit aufgerufen wird....


----------



## Tombery (12. Nov 2009)

ich dachte dafür wäre das Math.abs da...?
was soll ich da wegen der schleife machen, damit sie nicht mehr hängt?

ich muss es heute noch hochladen...


----------



## Tombery (12. Nov 2009)

hm....


```
private int getGgt (int x1, int y1)
       {
	  
		int x = Math.abs(x1);
		int y = Math.abs(y1);
		
		if((x != 0 || y != 0) && (x != 0 && y != 0))
		{
		while (x != y){
			
			if (x > y)
				x = x - y;
			
			else
				y = y - x;
			}
			return x;
		}
	   else
       {
    	//kein gemeinsamer Teiler
		   return 0;
       }
       }
```

jetzt zeigt er mir lauter anderer fehler an :shock:


----------



## Marco13 (12. Nov 2009)

Es ist aber auch zäh....

```
private int getGgt (int x1, int y1)
{
    if (x1 == 0 || y1 == 0)
    {
        System.out.println("Falsche Eingabe!");
        return 1;
    }

    // Hier der rest so wie ursprünglich...
}
```


----------

