Problem mit dem Modulo Operator



  • Hallo zusammen,
    vorweg ich bin neu in der Community und wenn ich hier in der Falschen Abteilung gelandet bin dann tut es mir leid und bitte um eine Verschiebung in die Richtige!
    So nun zu meinem Problem ich bin noch dabei das Programmieren zu lernen und hab in der Berufsschule Folgende Aufgabe bekommen:
    Es Soll ein Programm geschrieben werden das einen Bruch kürzen kann (Quick und Dirty Version ist auch erlaubt).
    Dazu habe ich folgenden Code entwickelt

    #include <iostream> 
    
     using namespace std;
    
     int main()
     {
     	int Zaehler = 0, Nenner = 0, KleinsteZahl = 0;
    
     	cout << "Geben sie einen Bruch zum Kuerzen ein: "  << endl;
     	cin >> Zaehler >> Nenner; // Einlesen von Zähler und Nenner
    
     	if( Zaehler <= Nenner)
     	{
     	   KleinsteZahl = Zaehler; // Ist der Zähler die kleinste Zahl bekommt KleinsteZahl den Wert von Zähler 
     	}
    
     	else
     	{
     		KleinsteZahl = Nenner;  // Ist der Nenner die kleinste Zahl bekommt KleinsteZahl den Wert von Nenner
     	}
     		cout << KleinsteZahl << endl; // Ausgabe zum Debuggen
     	for (int i = KleinsteZahl; i >= 1; i--) // Schleife Zählt von Kleinster Zahl bis 1 runter 
     	{
     		cout << "I: " << i<< endl; //Ausgabe zum Debuggen
            if(Zaehler % i == 0 && Nenner % i == 0) //lässt sich der Zähler und Nenner Restlos durch die Zahl der Schleife Teilen ? 
     		{
     			Zaehler = Zaehler / KleinsteZahl; //Zähler wird durch die Aktuelle Zahl der Sc hleife Geteilt
     			Nenner = Nenner / KleinsteZahl;	
     			if(Nenner < 0)
     			{
     				Nenner = Nenner * -1;  // Nenner Darf nicht Negativ sein 
     			}
     	    }
     	    cout << Zaehler % i << " & " << Nenner % i << endl; // Ausgabe zum Debuggen
     	}
    
        cout << "Der Gekuerzte Bruch lautet " << Zaehler << " / " << Nenner;
    
     	return 0;
     }
    

    Es ist Simpel das Programm soll zwischen Zähler und Nenner den kleinsten Wert der beiden Ermitteln und eine Zählschleife solange runter zählen bis beide Kürzbar sind allerdings rechnet der Modulo in der If Abfrage etwas Komisch.

    Wenn ich mir das ganze Ausgeben lasse (Inklusive eingebauter Debug ausgaben) erhalte ich folgendes bei Zähler = 12 und Nenner = 15.
    Geben sie einen Bruch zum Kuerzen ein:
    12
    15
    12
    I: 12
    0 & 3
    I: 11
    1 & 4
    I: 10
    2 & 5
    I: 9
    3 & 6
    I: 8
    4 & 7
    I: 7
    5 & 1
    I: 6
    0 & 3
    I: 5
    2 & 0
    I: 4
    0 & 3
    I: 3
    1 & 1 <==== Hier müsste ja eigentlich 0 & 0 Rauskommen so das die IF Bedingung erfüllt ist?! Woher kommt dieser Rest? 😕
    I: 2
    1 & 1
    I: 1
    0 & 0
    Der Gekuerzte Bruch lautet 0 / 0
    --------------------------------
    Wenn ich es Statisch ausgeben lasse kommt auch 0 & 0 heraus 😕
    Zuvor hatte das Programm ein Array mit den ersten 15 Primzahlen und Fast identischem code auch da hat alles funktioniert 😕 Was Mache ich falsch ?
    Ich Hoffe Ihr könnt mir helfen!
    P.s. da es sich hier im Prinzip nur um eine Methode für eine Zukünftige Klasse handelt die mit Brüchen Rechnen kann, ist bspw. eine Komplette Primzahl Errechnung zur Kürzung nicht ganz sinnvoll 😋


  • Mod

    Das Problem liegt ganz woanders. Denk mal über deine Zeilen 27 und 28 nach.



  • Dein Fehler:

    if(Zaehler % i == 0 && Nenner % i == 0) //lässt sich der Zähler und Nenner Restlos durch die Zahl der Schleife Teilen ? 
            {
                Zaehler = Zaehler / KleinsteZahl; //Zähler wird durch die Aktuelle Zahl der Sc hleife Geteilt
                Nenner = Nenner / KleinsteZahl;
    

    Wenn Zähler und Nenner beide durch i teilbar sind, dann teilst du beide durch "KleinsteZahl". Dein Kommentar besagt aber, dass du durch i teilen willst.

    Aber allgemein geht man anders vor: man sucht den größten gemeinsamten Teiler und teilt durch diesen. Siehe:
    https://de.wikipedia.org/wiki/Euklidischer_Algorithmus



  • Wenn Zähler und Nenner beide durch i teilbar sind, dann teilst du beide durch "KleinsteZahl". Dein Kommentar besagt aber, dass du durch i teilen willst.

    *Klatsch Hand vor den Kopf* Manchma sieht man auch den Wald vor lauter Bäumen nicht 🙄
    Danke für die Hilfe!

    Aber allgemein geht man anders vor: man sucht den größten gemeinsamten Teiler und teilt durch diesen. Siehe:
    https://de.wikipedia.org/wiki/Euklidischer_Algorithmus

    Jo Danke für den Tipp ich werds mir aufjedenfall mal Ansehen und ggf. mein Programm ändern!


Log in to reply