021
07.12.2003, 20:08 Uhr
Pablo
Supertux (Operator)
|
Gib mir 5 Minuten Zeit
C++: |
#include <iostream> // für std::cout #include <ctime>// für time()
int main() //nach ANSI { int* lotto; // im Prinzip könnte ich an dieser Stelle int lotto[45] schreiben // wenn ich das tue, dann haben alle 45 Felder im Array Müll // ich will, dass alle 45 Felder mit 0 intialisert werden. Deshlab benutze // ich new Operator, damit alle 0 haben und keine zusätzliche for-Schleife einbaue. // welche Idee dahinter steckt, hab ich schon gesagt, erkläre ich dir nochmal gleich srand(time(NULL)); // bereitet die Zufallszahlen für rand() vor. lotto = new int[45]; // generiere 45 Felder, die 0 speichern if (lotto==NULL) { // Fehlerausgabe, falls das nicht möglich war std::cerr << "Kein Speicher mehr!" << std::endl; return 1; }
for(int i=0; i<6; ++i) { // for-schleife für die 6 Zahlen int tmp; // der Name sagt, was das ist.
// eine do schleife ist wie eine while Schleife. Der Unterschied liegt darin, // dass der Rumpf der do-Schleife immer mindestens einmal ausgeführt wird. do { tmp = rand()%45; // Generiere Zufallszahl zwischen 0 und 44 % modulo (Rest der Divison) } while(lotto[tmp]==1); // Die Bedingung der while Schliefe (siehe unten, die Erklärung) lotto[tmp]=1; // setze gefunden freie Zufallszahl als schon genommen, damit ich sie nicht nochmla wähle std::cout << tmp+1 << ", "; // Zahl ausgaben. weil ich von 0, ..., 44 nehme, muss ich 1 addieren }
std::cout << "\b\b " << std::endl; // löscht das letzt Komma, nicht wichtig für das Programm
delete [] lotto; // Speicher frei geben. IMMER MACHEN WENN MAN MIT NEW GEARBEITET HAT return 0; //teile dem System mit, dass mein Programm fehlerlos beendet. }
|
Die Idee dahinter ist eine Mask zu machen, das heißt, ein Folge von 0 und 1 zu generieren. 0 steht dann für frei und 1 für belegt, bzw. 0 für "Zahl habe ich nicht genommen" und 1 für "Zahl habe ich schon gewählt."
Da es 45 Zahlen sind, dann erschaffe ich ein Array mit der Länge 45, so dass die Felder des Arrays den Lottozahlen entsprechen. Deshalb will ich, dass am Anfang alle 0 haben, d.h. am Anfnag sind alle Zahlen in der Urne und deshlab sind alle frei. Sobald ich eine Zahl nehme, muss ich die Stelle des Array mit 1 markieren, so merke ich mir, welche Zahlen ich schon genommen hab und welche nicht.
Das ist eben was ich will, denn die Lottozahlen müssen sich nicht wiedeholen. Die do - Schleife speichert in tmp eine Zahl zwischen 0 und 44. Dann überprüfe ich: Habe ich diese zahl schon geommen? Da das Array diese Information für mich speichert, muss ich nur nachschauen. Ich habe mein Array so konstruiert, dass die Stelle im Array der Lottozahl entspricht, deshlab ist in der Bedingung "lotto[tmp]==1". Sprich, wenn das TRUE liefert, heißt das, dass ich diese Zahl schon genommen habe. Und solange das der Fall ist generiere ich neue Zufallszahlen zwischen 0 und 44 bis ich auf lotto[tmp] stoße, so dass lotto[tmp] 0 speichert. Das sagt mir, die Zahl habe ich nich nicht genommen, die kann ich nehmen. Die Bedingung der Do-Schleife ist nicht mehr erfüllt. Dann muss ich diese Zahl als genommen merkieren. Deshlab ist die nächste Anweisung nach der do-Schleife lotto[tmp] = 1; Ich gebe die Zahl dann aus. Und mache mit tmp +1, weil tmp eine Zahl zwischen 0 und 44 ist, und ich mich für Zahlen zwischen 1 und 45 interessiere.
ich hoffe, dass ich es einigermaßen klar erklärt habe und dass du es verstehst. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 07.12.2003 um 20:29 Uhr von Pablo Yanez Trujillo editiert. |