Wozu braucht man Modulo ?

In der Arduino Befehlsübersicht von Andreas Nagel arduinoforum.de steht zu Modulo folgendes:

% Modulo Der Modulo Operator gibt den Rest einer Division zweier ganzzahligen Faktoren zurück. Zu kompliziert? Also ein kleines Beispiel: 9 / 2 ergibt 4,5. Wenn wir diesen Wert allerdings in eine int-Variable schreiben, nimmt die Variable den Wert 4 an, da der Nachkommawert einfach abgeschnitten wird. Der Modulo Operator gibt nun den Rest der Division zurück: 9 % 2 ergibt 1. Wieso? Besser zu verstehen ist das, wenn wir uns einmal das Konzept des schriftlichen Dividierens in der 3. Klasse anschauen. Wir schauen, wie oft die 2 in die 9 hineinpasst. Die 2 passt 4-mal in die 9, denn 4*2 = 8 Rest 1. Das Modulo gibt uns diesen Rest zurück. Der Vollständigkeit halber mache ich hier nun weiter: wir setzen ein Komma hinter die 4 und zu der 1 ziehen wir eine 0 hinunter. Jetzt fragen wir uns, wie oft passt die 2 in die 10 hinein? Klar, 5-mal. Hinter die 4, schreiben wir jetzt also eine 5 und wir bekommen 4,5. Syntax ergebnis = dividend % divisor Parameter dividend: die zu teilende Zahl divisor: der Teiler Beispiel x = 7 % 5; // x enthält 2 x = 9 % 5; // x enthält 4 x = 5 % 5; // x enthält 0 x = 4 % 5; // x enthält 4 Tipp Der Modulo Operator funktioniert logischerweise nicht mit floats. (Fließkommazahlen)

Ich finde die Erklärung hervorragend einfach und verständlich.

Bisher ist mir aber noch kein Modulo in Programmen begegnet, welche ich mir angeschaut habe weil ich sie interpretieren/ verstehen musste. Wozu brauche ich den abgeschnittenen Rest im Programm??? Hat jemand ein Beispiel für mich? Danke für eure Hilfe!!!!!

Stefan

hi,

man braucht es häufig, wenn man nur bei jedem soundsovielten durchlauf eine aktion starten will.

beispiel: eine for-schleife, in der man bei jedem fünften durchlauf zusätzlich eine bestimmte aktion starten will.

gruß stefan

EDIT: oder hier ein teil der loop aus einem uhrensketch. alle 40 millisekunden soll was passieren:

  mill_akt = millis() % 40;
  if (mill_akt < mill_alt) {
    setLEDs();
    sdim++;
    if (sdim > 24) {
      sdim = 0;
    }
  }

StefanBoth: Hat jemand ein Beispiel für mich? Danke für eure Hilfe!!!!!

Siehe hier ganz unten. Ich halte das für ein perfektes Beispiel (ich bin einer, der erst auf den fünften Blick kapiert hat, wozu das dient).

HTH

Gregor

PS: Was Eisbär schreibt, nutze ich ziemlich häufig. Wenn Du zum Beispiel nur alle fünf loop()-Durchgänge etwas tun willst, genügt ein

if(rundenzaehler%5==0)

Ah!!! wenn geteilt durch z.b. 5 keinen Rest hat, dann ist der fünfte Durchgang erreicht ?! Ich hab mich "umgekehrt" gefragt, was ich mit nem blöden Rest anfangen soll...

Stefan

StefanBoth: Ah!!! wenn geteilt durch z.b. 5 keinen Rest hat, dann ist der fünfte Durchgang erreicht ?!

Ja, genau so.

Gruß

Gregor

äh…

D A N K E 8)

Hallo,

oder wenn man mit Ganzzahl Rechnungen Einzelziffern aus Kommazahlen rausfiltern möchte. Die Schwierigkeit besteht eher darin an diese Möglichkeit(en) zu denken das es sie gibt.

Modulo verwendet man auch zb un ein int in 2 byte zu teilen:

int Zahl; byte Hzahl; byte Lzahl;

Hzahl = Zahl / 256; Lzahl = Zahl % 256;

ok bei 256 kann man das auch mit shiften machen aber bei 10 geht es nicht so einfach.

Grüße Uwe

StefanBoth: Ich hab mich "umgekehrt" gefragt, was ich mit nem blöden Rest anfangen soll...

Wenn es um Eis geht, gibt es nur eine richtige Antwort: Essen :-)

Gruß

Gregor

StefanBoth:
In der Arduino Befehlsübersicht von Andreas Nagel
arduinoforum.de steht zu Modulo folgendes:Ich finde die Erklärung hervorragend einfach und verständlich.

Bisher ist mir aber noch kein Modulo in Programmen begegnet,
welche ich mir angeschaut habe weil ich sie interpretieren/ verstehen musste.
Wozu brauche ich den abgeschnittenen Rest im Programm???
Hat jemand ein Beispiel für mich?
Danke für eure Hilfe!!!

Stefan

Kann man beispielsweise zum asynchronen Blinken verwenden.

void blinkWithoutDelay(int pin, int off, int on)
{
 int blinkPhase=millis()%(off+on);
 if (blinkPhase<off) digitalWrite(pin, LOW);
 else digitalWrite(pin, HIGH);
}

Ich bin ein Modulo Fan! Kann jedem nur raten sich damit zu beschäftigen.

Leider ist Modulo auch relativ teuer, wenn der Compiler es nicht optimieren kann. z.B. wenn der rechte Operand eine Variable ist.

:o Oh Gott !!! Grade war ich noch froh, etwas verstanden zu haben...

:D

Danke für die Beispiele. Ich werds mal an der Hardware testen. Wenn man sich so ein paar Modulo Anwendungen merkt, fällt es auch leichter an die Möglichkeit zu denken, wenn man nach ner Lösung sucht (* da war doch mal was mit...)

Stefan

StefanBoth: Grade war ich noch froh, etwas verstanden zu haben... Danke für die Beispiele. Ich werds mal an der Hardware testen. Wenn man sich so ein paar Modulo Anwendungen merkt, fällt es auch leichter an die Möglichkeit zu denken, wenn man nach ner Lösung sucht (* da war doch mal was mit...)

Falls Dich das tröstet: Ich renne seit rund 9 Jahren gegen die Wand, die C/C++ heißt. Und ich habe erst vor ein paar Monaten kapiert, wie sehr einem der enum-Typ die Arbeit erleichtert und obendrein noch für bessere Lesbarkeit des Codes sorgt.

Da es angeblich 11 Jahre dauert, bis man sich einen „guten“ Programmierer nennen darf, liege ich noch im Rahmen :-)

Gruß

Gregor

Es tröstet ! :-[

Wenn du eine Zahl auf einer 7-Segment Anzeige ausgeben willst, musst du diese in Ziffern aufteilen. Das geht einfach mit wiederholter Division und Modulo-Division durch 10. Beispiel mit 5697

5697 % 10 = 7 -> 1. Ziffer 5697 / 10 = 569 569 % 10 = 9 -> 2. Ziffer 569 / 10 = 56 56 % 10 = 6 -> 3. Ziffer 56 / 10 = 5 5 % 10 = 5 -> 4. Ziffer 5 / 10 = 0

Eine allgemeine mathematische Anwendung ist in der Kryptographie wo man Modulo-Divisionen in Algorithmen braucht die auf Primzahl-Faktorisierung oder diskreten Logarithmen basieren

Eine allgemeine mathematische Anwendung ist in der Kryptographie wo man Modulo-Divisionen in Algorithmen braucht die auf Primzahl-Faktorisierung oder diskreten Logarithmen basieren

:fearful: :fearful: :fearful: Oh? Schau auf die Uhr ! Ssoo spät schon ? Ich muss weg hier !!!

:) Dein Beispiel mit den Zehnerstellen ist aber Bombe !!! Da bin ich auch beim Taschenrechner in anderer Form gestolpert. Mit Modulo wärs einfacher gewesen !

Danke !

Dein Beispiel mit den Zehnerstellen ist aber Bombe !!!

hatte ich aber schon angedeutet…
Grüße Uwe

uwefed:
hatte ich aber schon angedeutet…

Ja sicher !!!
ich hab ja auch nur gesagt sein BEISPIEL is Bombe :wink:

Stefan

Ich bin auch ein totaler Modulo-Fan. Hab letztens für meine Kids ein C+±Programm geschrieben, das ihnen Rechenaufgaben stellt (um Mathe zu üben :-)). Die Zeit, die sie für die Beantwortung der Fragen gebraucht haben, wird in Minuten und Sekunden ausgegeben, wobei die Sekunden per Modulo ausgerechnet werden :

time_t start, end;
...
time(&start);    //Zeitmessung starten
//Rechenaufgaben stellen
time(&end);      //Zeitmessung anhalten
int timer = difftime(end,start);
if (timer > 60)
	cout << (timer/60) << " Minute(n) und " << (timer % 60) << " Sekunden" << endl;