2017-01-17 10 views
1

Ich habe versucht, meine C++ - Faktor-Programm von vor ein paar Jahren in meiner neuen Sprache C# neu zu erstellen. Alles, woran ich mich erinnern konnte, war, dass es möglicherweise einen Modulo beinhaltete und möglicherweise auch nicht. Ich wusste, dass es mindestens eine for und if-Anweisung gab. Als ich jedoch anfing, es nachzubauen, bekam ich nichts in der Nähe von dem, was sein sollte. Ich dachte, es hätte etwas damit zu tun, dass ich Loops nicht verstehe, aber es stellt sich heraus, dass ich Loops gut verstehe. Was ich nicht verstehe, ist, wie man den Modulo bei mathematischen Operationen benutzt.Ich brauche Hilfe, um den Modulo-Operator zu verstehen

zum Beispiel was mache ich, wenn ich so etwas sagen wie:

(ignorieren, dass es vielleicht nicht wirklich funktionieren, es ist nur ein Beispiel)

if(12 % 2 == 0) 
{ 
    Console.WriteLine("I don't understand."); 
} 

Diese Art der Sache, die ich nicht ganz tun hab noch einen griff. Ich erkenne, dass es den Rest nimmt, und das ist alles, was ich erfassen kann, nicht, wie es tatsächlich in der realen Programmierung verwendet wird. Ich habe es geschafft, nach ein bisschen Nachdenken und Basteln mein Faktor-Programm in C# zu bringen, das heißt aber nicht, dass ich diesen Operator oder seine Verwendung verstehe. Ich habe keinen Zugriff mehr auf die alte C++ - Datei.

+0

Wie es in "echte Programmierung" verwendet wird, hier ist ein weiteres Beispiel - angenommen, Sie haben eine Zeit in Sekunden, und Sie müssen es in Minuten und Sekunden konvertieren. . . . – peterG

Antwort

3

Der Operator% (Modulo) ergibt den Rest aus der Division. In Ihrem Beispiel ist der Rest gleich 0 und der wenn ergibt wahr (0 == 0). Ein klassisches Beispiel ist, wenn es verwendet wird, um zu sehen, ob eine Zahl gerade ist oder nicht.

if (number % 2 == 0) { 
    // even 
} else { 
    // odd 
} 
1

Der Modulo-Operator % gibt den Rest einer Divisionsoperation zurück. Zum Beispiel, wo 13/5 = 2, 13 % 5 = 3 (mit Integer-Mathematik).

Es ist eine übliche Taktik, einen Wert gegen % 2 zu überprüfen, um zu sehen, ob es gerade ist. Wenn es gerade ist, wird der Rest 0 sein, sonst wird es sein 1.

Wie für Ihre spezifischen Gebrauch davon, Sie 12 % 2 tun, die nicht nur 0 ist, wird aber immer 0 sein, die immer Machen Sie die If-Bedingung 12 % 2 == 0 wahr, was die Wenn redundant macht.

2

Denken Sie an Modulo wie ein Kreis mit einem Zeiger (Spinner), einfachste Beispiel ist eine Uhr.

https://latex.artofproblemsolving.com/f/4/d/f4daa2601de14fddf3d8441e16cc322a25e85354.png

Beachten Sie, wie an der Spitze es Null ist.

Die Modulo-Funktion bildet einen beliebigen Wert auf einen der Werte auf dem Drehfeld ab. Stellen Sie sich den Wert links von % als Anzahl der Schritte um den Drehfeld und den zweiten Wert als Anzahl der Gesamtschritte in der Spinner, so haben wir folgendes.

0% 12 = 0

1% 12 = 1

12% 12 = 0

13% 12 = 1

Wir sind immer bei 0 beginnen.

Also, wenn wir 0 Schritte um einen 12-Schritt-Spinner gehen, sind wir immer noch bei 0, wenn wir einen Schritt von Null gehen, sind wir auf 1, wenn wir 12 Schritte gehen, sind wir wieder bei 0. Wenn wir 13 gehen, gehen wir den ganzen Weg und wieder bei 1 enden.

Ich hoffe, dies hilft Ihnen, es zu visualisieren.

Es hilft, wenn Sie Strukturen wie ein Array verwenden, und Sie durch sie durchlaufen möchten. Stellen Sie sich vor, Sie haben eine Reihe von Tagen der Woche, 7 Elemente (Mon-Sonntag). Sie möchten den Tag immer 3 Tage vom aktuellen Tag anzeigen lassen. Nun, heute ist Dienstag, also ist das Array-Element days[1], wenn wir den Tag 3 Tage ab jetzt wollen wir tun days[1+3]; jetzt ist das in Ordnung, aber was ist, wenn wir am Samstag sind (days[5]) und wollen 3 Tage von dort bekommen? Nun, wir haben days[5+3] das ist ein Index außerhalb der Grenzen Fehler als unser Array hat nur 7 Elemente (max Index von 6) und wir haben versucht, den 8. Element zugreifen.

jedoch zu wissen, was Sie über modulos und Spinnern wissen jetzt, Sie folgendes tun:

string threeDaysFromNow = days[(currentDay + 3)%7]; Wenn es über die Grenzen des Arrays geht, es wickelt sich um und beginnt um wieder von vorne. Dafür gibt es viele Anwendungen. Erinnere dich nur an die Visualisierung von Spinnern, das heißt, als es in meinem Kopf geklickt hat.

1

Wie bereits erwähnt, wird es häufig zum Prüfen von gerade/ungerade verwendet, kann es aber auch verwenden, um Schleifen in Intervallen zu wiederholen oder Dateien in Mod-Chunks aufzuteilen. Ich persönlich benutze Mod für Probleme mit dem Zifferblatt, da meine Daten oft einen Kreis navigieren.

das Register in mod beispielsweise ein 8-Bit-Register rollen auf 2^8 so, damit die Einhaltung in einen Grßenregister zwingen mod var = (var, 256)

und das letzte, was ich über mod wissen ist, dass es in der Prüfsummen- und Zufallszahlerzeugung verwendet wird, aber ich bin nicht in das Warum für jene gegangen. überhaupt

-1

Ein Beispiel, wo Sie dies verwenden könnten, ist die Indexierung von Arrays in bestimmten for Schleifen. Nehmen wir zum Beispiel die einfache Gleichung, die den neuen Pixelwert eines neu abgetastete Bild mit bikubische Interpolation definiert:

wo

Keine Sorge, was bikubische Interpolation genau für den Moment ist, wir sind nur besorgt über das Ausführen, was scheint, zwei einfache for Schleifen: eine für den Index i und eine für den Index j. Beachten Sie, dass der Vektor "a" 16 Ziffern lang ist.

Eine einfache for Schleife würde jemand versuchen könnte sein:

int n= 0; 
for(int i = 0; i < 4; ++i) 
{ 

    for(int j = 0; i < 4; ++j) 
    { 
    pxy += a[n] * pow(x,i) * pow(y,j); // p(x,y) 
    n++; // n = 15 when finished 
    } 

} 

Oder man könnte es in einer for Schleife tun:

for(int i = 0; i < 16; ++i) 
{ 
    int i_new = floor(i/4.0); // i_new provides indices 0-3 incrementing every 4 iterations of loop  
    int j_new = i % 4;   // j_new is reset to 0 when i is a multiple of 4  
    pxy += a[i] * pow(x,i_new) * pow(y,j_new); // p(x,y) 
} 

Druck i_new und j_new in der Schleife:

i_new j_new 
0  0 
0  1 
0  2 
0  3 

1  0 
1  1 
1  2 
1  3 

2  0 
2  1 
2  2 
2  3 

3  0 
3  1 
3  2 
3  3 

Wie Sie sehen können, % kann sehr nützlich sein.

+0

Dies ist keine Antwort auf die Frage –

+0

Nachdem Sie die Frage erneut gelesen haben, haben Sie Recht. Ich wurde erwischt, als ich ein Beispiel gab. – Envidia

Verwandte Themen