Grundfrage zum Modulo-Operator?



  • Hallo,

    bin gerade dabei etwas über C++ zu lernen, und habe mich das ganze Wochenden
    schon mit dem Modulo-Operator beschäftigt, da ich eine Lösugn zur Quersummenberechnung nicht verstanden habe.

    Nun habe ich zu dem Modulo-Operator zwei Fragen 🙂

    1. wenn man den Modulo-Operator verwendet mit Ganz-Zahlen "int"
    ist es normal das dieser bei den neueren Compiler automatisch ab und aufrundet?

    int a, b, c, d; 
    
    a = 5; 
    b = 4; 
    c = a / b; 
    d = a % b;
    

    zumindest bei mir wird ab dem Rechnerischen Ergebniswert "d" 1,5 aufgerundet.

    2. Wenn man das nächste Beispeil der Quersummenberechnung anschaut
    Hauptsächlich meine Kommentare zur Berechnung sind diese soweit richtig?

    Ich habe zumindest die Vermutung das diese richtig sind da ich zuvor noch nie
    was mit einem Modulo-Operator gemacht habe und mit meiner Logik nicht verstanden
    hatte wie das ganze den Funktioniert.

    Will eigentlich nur wissen ob ich das Rechnerisch nun wirklich richtig verstanden habe?

    // Übungs-Aufgabe 3.10-2:
    
    /* Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe 
     * einer vierstelligen Zahl auffordert. Das Programm soll daraufhin 
     * die Quersumme der vierstelligen Zahl errechnen und das Ergebnis 
     * auf den Bildschirm ausgeben.
    
       Dateiname:   aufgabe-3.10-2.cpp
       Compilieren: g++ -o aufgabe-3.10-2 aufgabe-3.10-2.cpp
       Ausführen:   ./aufgabe-3.10-2
     */
    
    #include <iostream> // std::cout
    
    int main() 
    { 
      int zahl; // Variable für Ganzzahl erstellen (stellen nach dem Komma fallen weg)
    
      std::cout << "Bitte geben Sie eine vierstellige Zahl ein: " << std::flush;
      std::cin >> zahl; // Beispiel zahl = 1234
    
      int quersumme = zahl % 10; // quersumme ist "Rest" von 1234 : 10 = 123 Rest 4 (quersumme ist also 4)
      zahl /= 10;                // 1234 : 10 = 123
      quersumme +=zahl % 10;     // quersumme (4) plus neuen Restwert aus 123 : 10 = 12 Rest 3  (quersumme ist also 4 + 3 = 7)
      zahl /= 10;                // 123 : 10 = 12
      quersumme +=zahl % 10;     // quersumme (7) plus neuen Restwert aus 12 : 10 = 1 Rest 2  (quersumme ist also 7 + 2 = 9)
      zahl /= 10;                // 12 : 10 = 1 
      quersumme +=zahl % 10;     // quersumme (9) plus neuen Restwert aus 1 : 10 = 0 Rest 1  (quersumme ist also 9 + 1 = 10)
    
      std::cout << "Die Quersumme der Zahl ist: " << quersumme << std::endl; 
    }
    


  • 1. sollte nicht sein (meines Wissens nach). int / int = int. Da taucht erst gar kein 1.5 auf und wenn eine Kommazahl in einen Integer umgewandelt wird, wird auch nur alles nach dem Komma abgeschnitten, also immer abgerundet. 1.1 = 1.5 = 1.9 = 1

    2. passt

    greetz KN4CK3R



  • Hallo,

    KN4CK3R schrieb:

    1. sollte nicht sein (meines Wissens nach). int / int = int. Da taucht erst gar kein 1.5 auf und wenn eine Kommazahl in einen Integer umgewandelt wird, wird auch nur alles nach dem Komma abgeschnitten, also immer abgerundet. 1.1 = 1.5 = 1.9 = 1

    Hmm das dachte ich auch zumindest nachdem was ich gelesen habe,
    aber wenn ich bei mir dies Compiliere und ausführe:

    int a, b, c, d; 
    
    a = 6; 
    b = 4; 
    c = a / b; 
    d = a % b; 
    
      std::cout << "Die Zahl ist: " << c << std::endl; 
      std::cout << "Die Zahl ist: " << d << std::endl;
    

    erhalte ich diese Ausgabe:

    egle@Core2Quad:~/Programmierung/C++ Kurs/Boris Schäling$ g++ -o test test.cpp
    egle@Core2Quad:~/Programmierung/C++ Kurs/Boris Schäling$ ./test
    Die Zahl ist: 1
    Die Zahl ist: 2
    

    KN4CK3R schrieb:

    2. passt

    Das Beruhigt mich aber, denn wenn ich nur für dieses Kleine mathematische
    Problem einen kompletten Sonntag gebraucht habe um hinter der Logik zu kommen
    kann ich das noch verkraften 😉



  • EgLe schrieb:

    int a, b, c, d;
    a = 6; 
    b = 4; 
    c = a / b; 
    d = a % b; 
            
    std::cout << "Die Zahl ist: " << c << std::endl; 
    std::cout << "Die Zahl ist: " << d << std::endl;
    

    erhalte ich diese Ausgabe:

    Die Zahl ist: 1
    Die Zahl ist: 2
    

    Was soll daran nicht stimmen? Die Ganzzahldivision von 6 / 4 ergibt 1 und es bleiben 2 Rest ...



  • Hallo,

    hmm, stimmt, habe bzw. hatte da ja wieder einen Denkfehler.
    Die Variable d speichert ja nur den "Restwert"....

    Schrieb ja bereits das dieser Module-Operator mich richtig gefordert hatte 🙂

    Danke ich denke das habe ich nun soweit verstanden und kann es mir "merken"...


Anmelden zum Antworten