# Methode, die 2 Werte kürzen soll



## paco89 (3. Aug 2012)

hallo,

ich habe mir eine aufgabe ausgedacht, bei der man einer methode 2 werte (zaehler und nenner) übergibt und diese dann gekürzt werden sollen.

so dazu habe ich folgenden code:


```
public class KuerzenTest{
	

	static double kuerzen(double a , double b){
		int i =1;
		while(true){
			i += 1;
			double tmp = 0;
			if((a%i) == 0 && (b%i) ==0 ){
			tmp = ((a/i)/(b/i));
			}
		return tmp;
			
		}
	
	}

	public static void main(String [] args){
	
	double res;

	System.out.println("Bitte geben Sie einen Wert für den Zähler ein: ");
	int zaehler = Integer.parseInt(System.console().readLine());
	
	System.out.println("Bitte geben Sie einen Wert für den Nenner ein: ");
	int nenner = Integer.parseInt(System.console().readLine());

	res= kuerzen(zaehler, nenner);

	System.out.println(res);	

	

	
	
	}

}
```

der code funktioniert wenn ich bspw. zaehler = 2 und nenner = 4 eingeben. als ergebnis erhalte ich wie erwartet 0.5.

aber wenn ich zaehler = 3 und nenner = 9 eingebe, kommt da 0.0 als ergebnis raus, was nicht stimmt. oder wenn ich zaehler = 45 und nenner = 90 eingebe, kommt ebenfalls 0.0 raus. 


was habe ich falsch gemacht? kann mir das jmd. vtl. sagen?


----------



## xehpuk (3. Aug 2012)

Ich habe keinen Schimmer, was du machen willst. Normalerweise kürzt man Brüche. Aus 2/4 wird dann 1/2. Du gibst jedoch nur einen double zurück. Für mich hört es sich so an, als wollest du einfach nur dividieren.

Deine while-Schleife ist sinnlos, weil sie immer beim ersten Durchlauf durch das return verlassen wird. Die Methode ließe sich so umschreiben:




```
static double kuerzen(double a, double b) {
	int i = 1;
	i += 1; // while (true) entfernt
	double tmp = 0;
	if ((a % i) == 0 && (b % i) == 0) {
		tmp = ((a / i) / (b / i));
	}
	return tmp;
}
```



```
static double kuerzen(double a, double b) {
	int i = 2; // 1 + 1
	double tmp = 0;
	if ((a % i) == 0 && (b % i) == 0) {
		tmp = ((a / i) / (b / i));
	}
	return tmp;
}
```



```
static double kuerzen(double a, double b) {
	int i = 2;
	double tmp = 0;
	if ((a % i) == 0 && (b % i) == 0) {
		tmp = a / b; // (a / i) / (b / i) == (a / i) * (i / b) == a / b
	}
	return tmp;
}
```



```
static double kuerzen(double a, double b){
	return ((a % 2) == 0 && (b % 2) == 0) ? a / b : 0;
}
```


Wenn also beide Zahlen gerade sind, dividierst du normal. Ansonsten gibst du einfach 0 zurück.


----------



## nillehammer (3. Aug 2012)

> ich habe mir eine aufgabe ausgedacht, bei der man einer methode 2 werte (zaehler und nenner) übergibt und diese dann gekürzt werden sollen.
> 
> ```
> static double kuerzen(double a , double b){
> ...


-Zähler und Nenner sind bei Brüchen Ganzzahlen. Deswegen kommen als Methodenparameter eigentlich keine doubles in Frage, eher wohl zwei ints.
-Ein (gekürzter) Bruch besteht aus Zähler und Nenner. Als Returnwert kommt also auch kein double in Frage, eher wohl ein Array von ints mit zwei Elementen oder eine selbst programmierte Klasse "Bruch". Die Signatur Deiner Methode _kuerzen_ ist also für die Lösung des Problems nicht geeignet, änder sie wie folgt:

```
static int[] kuerzen(int zaehler, int nenner) {
  ...
}
```
In Deiner while-Schleife suchst du offensichtlich gemeinsame Teiler mit hilfe des Modulo-Operators. Das ist ein guter Ansatz. Mache Dir aber über Deinen Algorithmus Gedanken:
- Du brauchst die Abbruchbedingung "weiter kürzen geht nicht" statt des _true_.
- Mache Dir zu Nutze, dass mögliche Teiler immer kleiner-gleich der Hälfte der Zahl sind, für die sie gesucht werden..


----------



## Landei (3. Aug 2012)

Nimm den Euklidischen Algorithmus, ermittle damit den größten gemeinsamen Teiler, und teile Zähler und Nenner durch selbigen.

<Opamodus>
Lernt man sowas heute nicht mehr in der Schule? Zu meiner Zeit musste ich zwar zehn Kilometer barfuß durch den Schnee bergauf (hin _und_ zurück) gehen, aber dann wurde auch ordentlich Stoff durchgenommen, und ich meine nicht den Stoff, den diese komischen Onkels heutzutage auf den Schulhöfen verticken.
</Opamodus>


----------



## xehpuk (3. Aug 2012)

[Anekdote]Ich habe in der fünften oder sechsten Klasse gelernt, den ggT und das kgV über Primfaktorzerlegung zu bestimmen.
Den euklidischen Algorithmus habe ich dann erst im Studium kennengelernt.[/Anekdote]


----------



## paco89 (4. Aug 2012)

joa, danke für den tipp mit dem erweiterten euklidischen Algorithmus, landei. damit kann ich was anfangen.

werde dann damit weitermachen. alles außer dem euklidischen Algorithmus hatte ich sowieso nicht verstanden.



vielen dank, landei.


edit: das, was nillehammer versucht hat zu erklären, habe ich auch verstanden. aber den rest nicht.


----------



## paco89 (6. Aug 2012)

okay, ich brauche wieder mal eure hilfe. also ich habe folgendes jetzt gemacht:

der folgende Code steht in der Klasse RationaleZahlen.java und enthält die methode mit der man kürzen kann. den code für den größten gemeinsamen Teiler habe ich in der Klasse GanzeZahlen.java



```
public static int[] kuerzen(int a, int b){
	int[] tmp = new int [2];
	
	int gemTeiler = GanzeZahlen.ggt(a,b);
	
	tmp[0] = a/gemTeiler;
	tmp[1] = b/gemTeiler;

	return tmp;

	}

	public static void ausgabe(int [] a){
		
	for (int i = 0 ; i < a.length ; i++){
	System.out.println(a[i]);
	}
	
	}
	
	public static void main (String [] args){

	System.out.println("Bitte geben Sie den Wert fuer Zähler ein: ");
	int x = Integer.parseInt(System.console().readLine());
	
	System.out.println("Bitte geben Sie den Wert fuer Nenner ein: ");
	int y = Integer.parseInt(System.console().readLine());
	
	int[] array = kuerzen(x,y);
	
	System.out.println("Die gekuerzten Werte lauten: ");
	ausgabe(array);
```




```
static int ggT(int a, int b){
	
	if(a==b || b == 0)
	return a;
	
	else
	return ggT(b, a%b);
	
	
	}
```



wenn ich jetzt in der Methode kuerzen die Methode ggt() aus der klasse GanzeZahlen.java mit dem klassennamen aufrufe spuckt der compiler mir die Meldung "Cannot find symbol" raus...was mache ich da verkehrt?


----------



## xehpuk (6. Aug 2012)

Die Methode heißt 
	
	
	
	





```
ggT()
```
, du rufst aber 
	
	
	
	





```
ggt()
```
 auf. Bei Java werden Groß- und Kleinbuchstaben unterschieden.


----------



## paco89 (6. Aug 2012)

aach, wie dumm, dass ich das übersehen habe.....;(

vielen dank.


----------

