Wiese wird das Ergebnis nicht gekürzt?

  • Themenstarter Themenstarter Bisasam12345
  • Beginndatum Beginndatum
B

Bisasam12345

Gast
Hallo mein Problem ist folgendermaßen - siehe Quellcode

Das hier ist meine Hauptklasse, genannt "Application"

Java:
public class Application {
	
	public static void processRationalNumbers(Rational r1, Rational r2) {
		// Addieren  r2 - r1
		
		System.out.print("Addiere r2 zu r1: ");
		r1.addRational(r2);
		r1.printCommentedRational();
		
		// Subtrahieren  r2 - r1
		
		System.out.print("Subtrahiere r2 von r1: ");
		r1.subtractRational(r2);
		r1.printCommentedRational();
		
		// Multiplizieren  r1 mit r2
		
		System.out.print("Multipliziere r1 mit r2: ");
		r1.multRational(r2);
		r1.printCommentedRational();
		r1.reduceRational();
		
		// Dividieren  r1 durch r2
		
		System.out.print("Dividiere r1 durch r2: ");
		r1.divideRational(r2);
		r1.printCommentedRational();
		
		System.out.println();
	}

	public static void main(String[] args) {
		
		// Bruch anlegen
		
		System.out.print("Lege Bruch r1 an: ");
		Rational r1 = new Rational(3, 4);
		r1.printCommentedRational();
		
		
		// Zweiter Bruch anlegen
		System.out.print("Lege Bruch r2 an: ");
		Rational r2 = new Rational(5, 6);
		r2.printCommentedRational();
		
		System.out.println();
		
		processRationalNumbers(r1, r2);
		
		// Modifizieren von r1
		
		System.out.print("Nenner von r1 sei -4: ");
		r1.setDenom(-4);
		r1.printCommentedRational();
		System.out.println();
		
		processRationalNumbers(r1, r2);
		
		// Modifizieren von r2
		
		System.out.print("Zähler von r2 sei 0: ");
		r2.setNum(0);
		r2.printCommentedRational();
		System.out.println();
		
		processRationalNumbers(r1, r2);
	}
}

und das hier ist meine Unterklasse "Rational":

Java:
public class Rational {

	// Attribute der Klasse (Zähler und Nenner)
	private int num;
	private int denom = 1;
	
	// Konstruktor
	public Rational(int n, int d)
	{
		num = n;
		denom = d;
	}
	
	// Zugriffsmethoden
	public int getNum()
	{
		return num;
	}
	public void setNum(int n)
	{
		num = n;
	}
	public int getDenom()
	{
		return denom;
	}
	public void setDenom(int d)
	{
		if (d == 0)
	{
			System.out.println(" Nenner darf nicht 0 werden; initialisiert mit 1 ");
			denom = 1;
	}	
		else if (d < 0)
	{
		denom = -d;
		num = -num;
	}
		else
	{
		denom = d;
	}
	}



	public void printRational()
	{
		System.out.print(num + "/" + denom);
	}
	
		public void printCommentedRational()
	{
		System.out.print(" Das Ergebnis hat den Wert ");
		printRational();
		System.out.println();
	}
		
		public void reduceRational() 
		{
			// Kürzen
			int ggT = Math.abs(calculateGreatestCommonDivisor(num, denom));
			setNum(num / ggT);
			setDenom(denom / ggT);
		}
		
		public void expandRational(int a)
		{
			if (a == 0)
			{
				System.out.println (" Ist der Faktor 0, kann nicht erweitert werden! ");
			}
			else
			{
				a = Math.abs(a);
				setNum(num * a);
				// factor positiv --> Zugriff möglich
				setDenom(denom * a);
			}
		}
		
		public Rational invertRational()
		{
			// Bruch mit Kehrwert multiplizieren
			if (denom == 0)
			{
				System.out.println(" Keiner der beiden Brüche darf als Nenner 0 enthalten! ");
				return null;
			}
			else
				
				return new Rational (num, denom);
			}
		
		public void addRational(Rational b) 
		{
			// kgV für Rational b und bestehende Rationale Zahl
			int lcm = calculateLowestCommonMultiple(this.denom, b.denom);
			
		
			// Brüche auf Nenner = kgV erweitern.
			this.expandRational(lcm / denom);
			b.expandRational(lcm/b.denom);
			
			// Zähler addieren
			setNum(this.num + b.num);
			setDenom(lcm);
			
			// Kürzen
			this.reduceRational();
			b.reduceRational();
		}
		
		public void subtractRational(Rational c)
		{
			//kgV für Rational c und bestehende Rationale Zahl
			int lcm = calculateLowestCommonMultiple(this.denom, c.denom);
			
			//Brüche auf Nenner = kgV erweitern.
			this.expandRational(lcm / denom);
			c.expandRational(lcm / c.denom);
			
			// Zähler subtrahieren
			setNum(this.num - c.num);
			setDenom(lcm);
			
			//Kürzen
			this.reduceRational();
			c.reduceRational();
		
		}

		public void multRational (Rational r)
		{
			// Bruch wird mit anderem Bruch multipliziert
			setNum (num * r.num);
			setDenom(denom * r.denom);
			printRational();
		}
		
		public void divideRational(Rational s)
		{
			// Dividiert rationale Zahl durch Parameter (rationale Zahl)
			Rational inverse = s.invertRational();
			if (inverse == null)
			{
				System.out.print(" 0 ist keine gültige Zahl! ");
			}
			else
			{
				multRational(inverse);
			}
		}
			
		// Hilfsmethoden ggT + kgV
		private int calculateGreatestCommonDivisor(int m, int n)
		{
			if (n == 0)
			{
				return m;
			}
			else
			{
				return calculateGreatestCommonDivisor( n, m % n);
			}
		}
		private int calculateLowestCommonMultiple(int m, int n)
		{
			return Math.abs(m * n) / calculateGreatestCommonDivisor(m, n);
		}
}

es kommt folgendes raus:

Java:
Lege Bruch r1 an:  Das Ergebnis hat den Wert 3/4
Lege Bruch r2 an:  Das Ergebnis hat den Wert 5/6

Addiere r2 zu r1:  Das Ergebnis hat den Wert 19/12
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert 3/4
Multipliziere r1 mit r2: 15/24 Das Ergebnis hat den Wert 15/24
Dividiere r1 durch r2: 25/48 Das Ergebnis hat den Wert 25/48

Nenner von r1 sei -4:  Das Ergebnis hat den Wert -25/4

Addiere r2 zu r1:  Das Ergebnis hat den Wert -65/12
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert -25/4
Multipliziere r1 mit r2: -125/24 Das Ergebnis hat den Wert -125/24
Dividiere r1 durch r2: -625/144 Das Ergebnis hat den Wert -625/144

Zähler von r2 sei 0:  Das Ergebnis hat den Wert 0/6

Addiere r2 zu r1:  Das Ergebnis hat den Wert -625/144
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert -625/144
Multipliziere r1 mit r2: 0/144 Das Ergebnis hat den Wert 0/144
Dividiere r1 durch r2: 0/1 Das Ergebnis hat den Wert 0/1

warum werden meine brüche nicht gekürzt? beim Mulitplizieren hab ich doch extra die Methode reduceRational(); eingefügt
und wie bekomme ich die brücher hinter den Doppelpunkten weg? die sollen da gar nicht hin aber stehn doppelt da...
ich versteh das nicht kann mir da einer helfen?

wäre wirklich nett, mfg !
 
warum werden meine brüche nicht gekürzt? beim Mulitplizieren hab ich doch extra die Methode reduceRational(); eingefügt
Du gibst das Ergebnis zuerst aus und rufst dann die Kürzen-Methode auf.

und wie bekomme ich die brücher hinter den Doppelpunkten weg? die sollen da gar nicht hin aber stehn doppelt da...
Weil du in multRational() auch printRational() aufrufst.
 
Wenn ich das richtig sehe, rufst du die Methode zum Kürzen der Brüche erst nach der Ausgabe auf. Dann ist natürlich klar das die Brüche nicht in gekürzter Form auftauchen. Eventuell mal Breakpoints setzen und mit nem Debugger den Programmablauf verfolgen.
 
danke für die hilfe leute, aber das mit dem kürzen funktioniert immer noch nicht, obwohl ich überall die reduce Methode eingefügt habe...habt ihr eine Erklärung dafür? 🙁( bin verzweifelt

Main

Java:
/*	
 * Bearbeiter: Dennis Christoph, 02373009
 * Helfer    : Praktikum
 * 11.12.2009
 * Blatt 08
 * Aufgabe 2
 * 
 * Hauptprogramm; dient zur Steuerung des Programms
 * 
 *
 */

public class Application {
	
	public static void processRationalNumbers(Rational r1, Rational r2) {
		// Addieren  r2 - r1
		
		System.out.print("Addiere r2 zu r1: ");
		r1.addRational(r2);
		r1.reduceRational();
		r1.printCommentedRational();
		
		// Subtrahieren  r2 - r1
		
		System.out.print("Subtrahiere r2 von r1: ");
		r1.subtractRational(r2);
		r1.reduceRational();
		r1.printCommentedRational();
		
		// Multiplizieren  r1 mit r2
		
		System.out.print("Multipliziere r1 mit r2: ");
		r1.multRational(r2);
		r1.reduceRational();
		r1.printCommentedRational();
		
		
		// Dividieren  r1 durch r2
		
		System.out.print("Dividiere r1 durch r2: ");
		r1.divideRational(r2);
		r1.reduceRational();
		r1.printCommentedRational();

		
		System.out.println();
	}

	public static void main(String[] args) {
		
		// Bruch anlegen
		
		System.out.print("Lege Bruch r1 an: ");
		Rational r1 = new Rational(3, 4);
		r1.printCommentedRational();
		
		
		// Zweiter Bruch anlegen
		System.out.print("Lege Bruch r2 an: ");
		Rational r2 = new Rational(5, 6);
		r2.printCommentedRational();
		
		System.out.println();
		
		processRationalNumbers(r1, r2);
		
		// Modifizieren von r1
		
		System.out.print("Nenner von r1 sei -4: ");
		r1.setDenom(-4);
		r1.printCommentedRational();
		System.out.println();
		
		processRationalNumbers(r1, r2);
		
		// Modifizieren von r2
		
		System.out.print("Zähler von r2 sei 0: ");
		r2.setNum(0);
		r2.printCommentedRational();
		System.out.println();
		
		processRationalNumbers(r1, r2);
	}
}

Klasse Rational:
Java:
public class Rational {

	// Attribute der Klasse (Zähler und Nenner)
	private int num;
	private int denom = 1;
	
	// Konstruktor
	public Rational(int n, int d)
	{
		num = n;
		denom = d;
	}
	
	// Zugriffsmethoden
	public int getNum()
	{
		return num;
	}
	public void setNum(int n)
	{
		num = n;
	}
	public int getDenom()
	{
		return denom;
	}
	public void setDenom(int d)
	{
		if (d == 0)
	{
			System.out.println(" Nenner darf nicht 0 werden; initialisiert mit 1 ");
			denom = 1;
	}	
		else if (d < 0)
	{
		denom = -d;
		num = -num;
	}
		else
	{
		denom = d;
	}
	}



	public void printRational()
	{
		System.out.print(num + "/" + denom);
	}
	
		public void printCommentedRational()
	{
		System.out.print(" Das Ergebnis hat den Wert ");
		printRational();
		System.out.println();
	}
		
		public void reduceRational() 
		{
			// Kürzen der Brüche
			int gcd = Math.abs(calculateGreatestCommonDivisor(num, denom));
			setNum(num / gcd);
			setDenom(denom / gcd);
		}
		
		public void expandRational(int a)
		{
			if (a == 0)
			{
				System.out.println (" Ist der Faktor 0, kann nicht erweitert werden! ");
			}
			else
			{
				a = Math.abs(a);
				setNum(num * a);
				// factor positiv --> Zugriff möglich
				setDenom(denom * a);
			}
		}
		
		public Rational invertRational()
		{
			// Bruch mit Kehrwert multiplizieren
			if (denom == 0)
			{
				System.out.println(" Bruch mit Zähler 0 kann nicht invertiert werden! ");
				return null;
			}
			else
				
				return new Rational (num, denom);
			}
		
		public void addRational(Rational b) 
		{
			// kgV für Rational b und bestehende Rationale Zahl
			int lcm = calculateLowestCommonMultiple(this.denom, b.denom);
			
		
			// Brüche auf Nenner = kgV erweitern.
			this.expandRational(lcm / denom);
			b.expandRational(lcm/b.denom);
			
			// Zähler addieren
			setNum(this.num + b.num);
			setDenom(lcm);
			
			// Kürzen
			this.reduceRational();
			b.reduceRational();
		}
		
		public void subtractRational(Rational c)
		{
			//kgV für Rational c und bestehende Rationale Zahl
			int lcm = calculateLowestCommonMultiple(this.denom, c.denom);
			
			//Brüche auf Nenner = kgV erweitern.
			this.expandRational(lcm / denom);
			c.expandRational(lcm / c.denom);
			
			// Zähler subtrahieren
			setNum(this.num - c.num);
			setDenom(lcm);
			
			//Kürzen
			this.reduceRational();
			c.reduceRational();
		
		}

		public void multRational (Rational r)
		{
			// Bruch wird mit anderem Bruch multipliziert
			setNum (num * r.num);
			setDenom(denom * r.denom);
			
		}
		
		public void divideRational(Rational s)
		{
			// Dividiert rationale Zahl durch Parameter (rationale Zahl)
			Rational inverse = s.invertRational();
			if (inverse == null)
			{
				System.out.print(" 0 ist keine gültige Zahl! ");
			}
			else
			{
				multRational(inverse);
			}
		}
			
		// Hilfsmethoden ggT + kgV
		private int calculateGreatestCommonDivisor(int m, int n)
		{
			if (n == 0)
			{
				return m;
			}
			else
			{
				return calculateGreatestCommonDivisor( n, m % n);
			}
		}
		private int calculateLowestCommonMultiple(int m, int n)
		{
			return Math.abs(m * n) / calculateGreatestCommonDivisor(m, n);
		}
}

Ergebnis:

Java:
Lege Bruch r1 an:  Das Ergebnis hat den Wert 3/4
Lege Bruch r2 an:  Das Ergebnis hat den Wert 5/6

Addiere r2 zu r1:  Das Ergebnis hat den Wert 19/12
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert 3/4
Multipliziere r1 mit r2:  Das Ergebnis hat den Wert 5/8
Dividiere r1 durch r2:  Das Ergebnis hat den Wert 25/48

Nenner von r1 sei -4:  Das Ergebnis hat den Wert -25/4

Addiere r2 zu r1:  Das Ergebnis hat den Wert -65/12
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert -25/4
Multipliziere r1 mit r2:  Das Ergebnis hat den Wert -125/24
Dividiere r1 durch r2:  Das Ergebnis hat den Wert -625/144

Zähler von r2 sei 0:  Das Ergebnis hat den Wert 0/6

Addiere r2 zu r1:  Das Ergebnis hat den Wert -625/144
Subtrahiere r2 von r1:  Das Ergebnis hat den Wert -625/144
Multipliziere r1 mit r2:  Das Ergebnis hat den Wert 0/1
Dividiere r1 durch r2:  Das Ergebnis hat den Wert 0/1

außerdem soll bei den letzten zwei Zeilen folgendes stehn:

Dividiere r1 durch r2: Bruch mit Zähler 0 kann nicht invertiert werden!
Anweisung wird ignoriert! Das Ergebnis hat den wart 0/1

aber das steht bei mir auch nich da

🙁(

hoffe ihr könnt mir helfen

mfg
 
was genau soll denn reduziert werden? 625/144 läßt sich nunmal nicht kürzen,

> Zähler von r2 sei 0: Das Ergebnis hat den Wert 0/6

wenn du nun r1 durch diese 0 teilst (r2), ja was soll denn da rauskommen?
 
Das Ergebnis soll sein:

r1 sei -4: Das Ergebnis hat den wert -3/4

Addiere r2 zu r1: Das Ergebnis hat den Wert 1/12
Subtrahiere r2 von r1: Das Ergebnis hat den wert -3/4
Multipliziere r1 mit r2: Das Ergebnis hat den Wert -5/8
Dividiere r1 durch r2: Das Ergebnis hat den Wert -3/4

Zähler von r2 sei 0: Das Ergebnis hat den Wert 0/6

Addiere r2 zu r1: Das Ergebnis hat den Wert -3/4
Subtrahiere r2 von r1: Das Ergebnis hat den wert -3/4
Multipliziere r1 mit r2: Das Ergebnis hat den Wert 0/1
Dividiere r1 durch r2: Bruch mit Zähler 0 kann nicht invertiert werden!
Anweisung wird ignoriert! Das Ergebnis hat den Wert 0/1


aber da kommen bei mir viel zu hohe brüche raus, deswegen muss man da schon kürzen können
verstehs einfach nich wie...

mfg
 
Welche Werte sollen r1 und r2 denn am Anfang haben? 3/4 und 5/6?
Dann rechne es doch erstmal von Hand nach, dann weißt du, was rauskommen soll.
 
Ich stimm Michael zu, in der "divide" methode stimmt irgendetwas nicht:

Lege Bruch r1 an: Das Ergebnis hat den Wert 3/4
Lege Bruch r2 an: Das Ergebnis hat den Wert 5/6
[..]
Dividiere r1 durch r2: Das Ergebnis hat den Wert 25/48

aber 3/4 durch 5/6 = 3/4 * 6/5 -> 18/20 nicht 25/48
 
es liegt also an der "divide" Methode ..

ok ich guck mir das morgen nochmal an und versuchs zu ändern, heute hab ich keine lust und zeit mehr ..schon relativ spät

danke aber für eure antworten ! is echt wichtig für mich dass mir einer sagt was ich falsch mache ...sonst kommt man einfach nich weiter..


mfg !
 
Ah, ich glaub ich habs:

Du hast einen Fehler in der "invertRational"-Methode. Du gibts

[JAVA=93]return new Rational (num, denom);[/code]

zurück (wenn der Nenner nicht Null ist). Aber das ist dann ja wieder die gleiche Zahl. Richtig wäre:

[JAVA=93]return new Rational(denom, num);[/code]

Dann sollte dein Programm auch richtig rechnen.
 
Jaa ! stimmt !!!!!


oh man sowas kleines hat sone große Wirkung ...

danke leute und vor allem danke gman für eure hilfe !

ihr seid die besten ! =)

mfg
 

Neue Themen


Zurück
Oben