Klassen und Hilfe Outputs!

Status
Nicht offen für weitere Antworten.

Tombery

Aktives Mitglied
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:

Java:
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

Java:
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

Top Contributor
Diese "Methoden in Methoden" wie
Code:
 void output()
           {
               System.out.printf("x1 = %.2g%n", nullstelle1);
               System.out.printf("x2 = %.2g%n", nullstelle2);
           }
gibt's halt nicht - dort müßte einfach
Code:
               System.out.printf("x1 = %.2g%n", nullstelle1);
               System.out.printf("x2 = %.2g%n", nullstelle2);
stehen...
 

Tombery

Aktives Mitglied
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"
 
Zuletzt bearbeitet:

Tombery

Aktives Mitglied
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.

Java:
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

Java:
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:

Java:
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

Java:
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:
 
Zuletzt bearbeitet:

Painii

Bekanntes Mitglied
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

Top Contributor
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
Code:
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

Aktives Mitglied
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....:eek:
hm...ich versuche mal die "output()" in die if-anweisungen zu setzen und darüber jeweils das normale "void output()...."
 

Marco13

Top Contributor
Mir ist noch nicht 100% klar, was du meinst (dir vermutlich auch nicht ;) ) aber sowas geht auch
Code:
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

Aktives Mitglied
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:

Java:
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

Java:
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

Top Contributor
Welchen Zweck sollen die Outputs erfüllen? Man kann KEINE
Code:
void methoden()
{
     void machen()
     {
         void die() 
         { 
             void so() 
             { 
                 void verschachtelt() 
                 { 
                     void sind() 
                     { 
                         // Das geht eben einfach nicht. 
                     }
                 }
             }
         }
     }
}

Mal compilierbar gemacht....

Java:
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

Aktives Mitglied
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.

Java:
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();
	   }
}

Java:
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();
	}
	
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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 :oops: ). 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..
Java:
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
Java:
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

Aktives Mitglied
ok.....

ich habe in der schule das jetzt raus:

Java:
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.
 

Tombery

Aktives Mitglied
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:

Java:
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

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

Tombery

Aktives Mitglied
Java:
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

Top Contributor
Ja, da als erstes jetzt noch einen Konstruktor
Code:
    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

Aktives Mitglied
jetzt kommen keine ergebnisse raus oô

Java:
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

Top Contributor
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

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

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

Marco13

Top Contributor
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

Aktives Mitglied
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...
 

Tombery

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

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

Java:
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

Top Contributor
OK, zugegeben, der Algorithmus an sich stimmt wohl (sorry :oops: ) ,,, 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

Aktives Mitglied
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...
 
Zuletzt bearbeitet:

Tombery

Aktives Mitglied
hm....

Java:
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

Top Contributor
Es ist aber auch zäh....
Code:
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...
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben