Methode, die 2 Werte kürzen soll

paco89

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

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

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

  1. Java:
    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;
    }
  2. Java:
    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;
    }
  3. Java:
    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;
    }
  4. Java:
    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.
 
N

nillehammer

Gast
ich habe mir eine aufgabe ausgedacht, bei der man einer methode 2 werte (zaehler und nenner) übergibt und diese dann gekürzt werden sollen.
Java:
 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;
            
        }
    
    }
-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:
Java:
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..
 
Zuletzt bearbeitet von einem Moderator:

Landei

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

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

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

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


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);



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

Top Contributor
Die Methode heißt
Code:
ggT()
, du rufst aber
Code:
ggt()
auf. Bei Java werden Groß- und Kleinbuchstaben unterschieden.
 

Neue Themen


Oben