Teilbarkeit einer Zahl prüfen, ohne Modulo zu verwenden



  • Hi, ich versuche mich gerade an ein Programm, bei dem man eine Uhrzeit angeben kann und darauf dann die Taktzeit (z.B 14:00 und Taktzeit: 10 min) nun soll das Programm dann angebene, wie oft (in diesem Fall) der Bus an den gesamten Tag kommt (sprich 14:00, 14:10, 14:20, ... 00:40, 00:50 ENDE): Um die einzelnen Takt-Minuten angeben zu können, setze ich eine If-Bedingung, bei der nur die Zahlen ausgegeben werden sollen, welche durch die Taktzeit teilbar sind. Dafür verwende ich den Modulo-Operator. Jedoch habe ich das Problem, dass ich glatte Uhrzeit (14:00, 15:00, usw) nicht eingeben kann, weil der Compiler dann wegen des Modulo-Operators streikt. BZW wegen dieser Zeile.
    Gibt es noch eine andere Möglichkeit die Teilbarkeit einer Zahl auszugeben, ohne den Modulo-Operator?
    Hier ein kurzer Abschnitt des Codes:

    int aktuelle_minute = minute;

    for (aktuelle_minute; taktzeit + aktuelle_minute <= 59; taktzeit++)
    {
    
    	if ((taktzeit % aktuelle_minute) == 0) // nicht durch Divisor teilbar wenn minute 0 ist. Modulo keine gute Lösung
    	{
    		int aktuelle_minute = minute + taktzeit;
    		cout << stunde << ":" << aktuelle_minute << endl;
    		
    		/*if (aktuelle_minute > 60 && stunde<23)  // macht noch keinen Sinn
    		{
    			
    			stunde++;
    		}*/
    
    	}
    }

  • Mod

    Hast du mal getestet, ob deine Methode überhaupt für die anderen Minutenangaben funktioniert? Du hast da nämlich einen fundamentalen Fehler drin, der vielleicht offensichtlich wird, wenn du mal ein bisschen herumspielst, was momentan überhaupt das Ergebnis deiner Rechnung ist.

    Wenn du diesen Fehler behebst, wird es auch für 0 funktionieren.



  • @mmm_1482_ sagte in Teilbarkeit einer Zahl prüfen, ohne Modulo zu verwenden:

    Hi, ich versuche mich gerade an ein Programm, bei dem man eine Uhrzeit angeben kann und darauf dann die Taktzeit (z.B 14:00 und Taktzeit: 10 min) nun soll das Programm dann angebene, wie oft (in diesem Fall) der Bus an den gesamten Tag kommt (sprich 14:00, 14:10, 14:20, ... 00:40, 00:50 ENDE):

    Den gesamten Tag ist um 00:00 Uhr doch bereits zu Ende?



  • @SeppJ Ja ist mir auch aufgefallen. Wenn ich zb Taktzeit 2 eingebe ist es im endeffekt jede zweite Zahl. Was auch sinn macht. Dennoch meine Frage, ob es auch eine andere Möglichkeit zur Überprüfung der Teilbarkeit gibt, ohne Modulo. Ich muss den Code defintiv anders gestalten



  • @SeppJ kannst du mir eventuell die Zeile mit dem fundamentalen Fehler zeigen? 😃



  • Nein, ist es nicht. Ja, du musst den Code anders gestalten, nämlich korrekt. Ja, es gibt Lösungen ohne Modulo, aber die sind unnötig kompliziert. Auf die Zeile mit dem Fehler kommst du sehr schnell, wenn du mal ein bisschen den Debugger nutzt mit ein paar verschiedenen Eingaben.



  • @TGGC Das mache ich... bei manchen Uhrzeiten klappt es einwandfrei und bei anderen gar nicht oder nur teilweise
    zb 16:5 mit der Taktzeit 5 Minuten klappt perfekt



  • @TGGC ich glaub ich habs ! Der Fehler lag in Zeile: 6. Statt aktuelle_minute= minute+taktzeit muss
    aktuelle_minute= aktuelle_minute+taktzeit

    zumindest funktioniert es mit der taktzeit von 2 minuten jetzt

    aber jetzt funktioniert es wiederum für andere Zeiten nicht


  • Mod

    @mmm_1482_ sagte in Teilbarkeit einer Zahl prüfen, ohne Modulo zu verwenden:

    zumindest funktioniert es mit der taktzeit von 2 minuten jetzt

    aber jetzt funktioniert es wiederum für andere Zeiten nicht

    Dann war's wohl offensichtlich nicht die Lösung.

    Möglichkeiten:

    1. Du fügst jede Menge Ausgaben für alle möglichen Zwischenwerte ein und vollziehst nach, ob diese Zwischenwerte zu dem passen, was du erwartest.
    2. Besser: Du lernst, wie man einen Debugger nutzt. Das klingt nach einem spannenden Wort, ist aber ganz harmlos. Kann man gar nicht früh genug lernen. Was dir der Debugger ermöglicht ist eine bessere Form von Punkt 1, damit kannst du Schritt für Schritt das Programm durchlaufen lassen und immer alle Werte sehen. Damit fällt es leicht die Stellen zu finden, an denen das Programmverhalten nicht mehr deinen Erwartungen entspricht. Und dann hat man auch schnell die Ursache.
    3. Du hoffst, dass dir hier jemand die Fehler korrigiert, aber das wäre halt langfristig nicht nützlich, weil du dann nichts daraus lernst.

    PS: Du hast übrigens mehr als einen Fehler drin.



  • @mmm_1482_ Du benutzt den Modulo-Operator falsch.

    Der wird genauso benutzt wie auch die Division, nur dass du den Rest erhälst.

    Wenn du (a % b) == 0 ersetzen willst, kannst du auch (a/b*b) == a schreiben`, vorausgesetzt a und b sind Ganzzahltypen.
    (Das bringt die aber gar nichts, weil du siehe erste Zeile)


Log in to reply