ERLEDIGT
NEIN
NEIN
ANTWORTEN
19
19
ZUGRIFFE
3294
3294
EMPFEHLEN
-
22.10.08 16:48 #1
- Registriert seit
- Oct 2008
- Beiträge
- 15
hallo!
hab mal aus fun versucht Lotto zu programmieren, leider tritt oft das Problem auf, dass eine zahl 2 mal vorkommt und wollte euch jetzt nach Hilfe fragen.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { int wuerfel,i; char janein,Janein; do { printf("willkommen beim Lotto 6 aus 45\n"); srand(time(NULL)); wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; wuerfel=rand()%45+1; for(i=20;i>0;i--)//verzögerung der ausgabe { Sleep(50); printf("-"); } printf("%d\n",wuerfel); wuerfel=0; printf("willst du weiterspielen?[J/N]\n"); fflush(stdin); scanf("%c", &janein); system("cls"); } while(janein=='J' || janein=='j'); system("PAUSE"); return EXIT_SUCCESS; }
funktioniert das nur mit langwierigen if-Anweisungen, oder geht das auch schneller?
lg MasterOfDarknessGeändert von MasterOfTheDark (22.10.08 um 16:58 Uhr)
-
22.10.08 17:20 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Natürlich geht das viel schneller. Du solltest du entsprechende Funktionalität in eigene Funktionen auslagern.
In C++ wäre es am Einfachsten einen vector mit 45 "Kugeln" zu füllen, dessen Elemente dann in eine zufällige Reihenfolge zu bringen und nur die ersten 6 Elemente auszugeben.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
22.10.08 17:27 #3
Die Idee mit dem Vector ist gut, ich dachte an die simplere Methode, ein Array in einer Schleife zu füllen. Natürlich wird eine Zahl nur zum Array hinzugefügt, wenn sie nicht schon drin ist.
Da ich kein C programmiere, hier eine Codeform, die aber noch ins Reine gebracht werden muss, das ist Kauderwelsch, man möge mir vergeben
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
int Zahlen() // keine Ahnung wie Arrays in C aussehen for(Zug=1;Zug>6;Zug++) //6 Züge { gibtsschon=0; repeat wurf=rand()%45+1; for(Prüfung=0;Prüfung>Zug;Prüfung++) { if(wurf=Zahlen(Prüfung)) {gibtsschon=1;} } until(gibtsschon=0) Zahlen(Zug)=wurf; } for(Zahlenzeigen=0;Zahlenzeigen>6;i++) { printf Zahlen(i) // Pause für die Spannung :) }
mfg chmeeMein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
22.10.08 17:34 #4
- Registriert seit
- Oct 2008
- Beiträge
- 15
mit array hab ichs auch versucht, nur nicht hinbekommen
-
22.10.08 17:37 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Mein Vorschlag in C++:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#include <string> #include <iostream> #include <algorithm> #include <iterator> #include <cstdlib> using namespace std; class seq { char current; public: seq(char init) : current(init) { } char operator() () { return current++; } }; int main(int argc, char *argv[]) { string pool; srand(time(NULL)); generate_n(back_inserter(pool), 45, seq(1)); random_shuffle(pool.begin(), pool.end()); copy(pool.begin(), pool.begin() + 6, ostream_iterator<int>(cout, " ")); cout << endl; return 0; }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
22.10.08 20:05 #6
- Registriert seit
- Oct 2008
- Beiträge
- 15
naja, fehlermeldungen weg, aber im ausgabefenster erscheint nur"drücken sie eine beliebige taste...."?Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { int Zahlen[7]; // für 6 speicherplätze int Zug; int i; int gibtsschon; int Zahlenzeigen; int Pruefung; int wurf; { for(Zug=1;Zug>6;Zug++) //6 Züge { gibtsschon=0; do { wurf=rand()%45+1; for(Pruefung=0;Pruefung>Zug;Pruefung++); { if(wurf=Zahlen[Pruefung]) { gibtsschon=1; } } } while(gibtsschon=0); Zahlen[Zug]=wurf; } for(Zahlenzeigen=0;Zahlenzeigen>6;Zahlenzeigen++) { printf("%d",Zahlen[i]); for(i=10;i>0;i--) { Sleep(50); printf("-"); } } } system("PAUSE"); return EXIT_SUCCESS; }Geändert von MasterOfTheDark (22.10.08 um 20:35 Uhr)
-
22.10.08 20:08 #7
- Registriert seit
- Sep 2007
- Beiträge
- 473
Ich glaube, du hast da ein paar Strichpunkte vergessen? Oder ist die geschweifte Klammer an der falschen Stelle?
Code :1 2 3 4 5 6 7
int main(int argc, char *argv[]) { int Zahlen[7]; // für 6 speicherplätze int Zug; int gibtsschon; int Prüfung; int wurf;
-
22.10.08 20:38 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das Array bietet 7 Speicherplätze, von 0 bis 6.
Wie von chmee bereits gesagt, ist das nur Pseudocode. Du mußt erstmal den Code verstehen und die Sachen die es in C/C++ nicht gibt, durch entsprechende Befehle ersetzen. repeat und until gibt's doch gar nicht, da mußt du eine Schleife bauen.
Mach es dir einfach und nutze Funktionen. Sonst siehst du doch schon jetzt nicht mehr durch. Schreibe dir erstmal
1) eine Funktion die eine Zahl von 1 bis 45 zurückgibt
2) eine Funktion die prüft ob eine gegebene Zahl bereits in einem Array enthalten ist und entweder true oder false zurückgibt.
Wenn du das hast und es getestet ist und funktioniert, dann kannst du anfangen das zusammenzubauen.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
22.10.08 21:27 #9
- Registriert seit
- Oct 2008
- Beiträge
- 15
1) funktion zum zurückgeben:
srand(time(NULL));
array[7]=rand()%45+1;
2) aber hier das problem, hab keinen schimmer wie das funktioniern sollte, odcer ich steh einfach auf der leitung..
mfg Master
-
22.10.08 21:45 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das ist Unsinn. Das ist weder eine Funktion, noch ist es sinnvoll srand mehrfach im Programm aufzurufen. Weiter gibt es den Index 7 bei array gar nicht und das Ermitteln der Zufallszahl sollte man eigentlich nicht auf diese Weise machen. Das Array hat außerdem in der Funktion überhaupt nichts zu suchen.
Du bist zu voreilig. Du bist ja noch nicht mal mit der ersten Funktion fertig. Und mit testen meine ich auch testen. D.h. z.B. ein Testprogramm zu schreiben welches automatisch die Richtigkeit der Funktionswerte überprüft.
Wenn du dann mal die Funktion für die Zufallszahlen hast, dann brauchst du eine Datenstruktur um die 6 Werte zu sammeln. Dafür kannst du natürlich ein Array mit einer festen Größe nehmen. Dann mußt du dir aber erstmal merken wieviel Elemente überhaupt in dem Array drin sind. Die Suchfunktion müßte dann so aussehen:
\edit: Wenn diese Funktion implementiert ist, erstmal testen! D.h. ein paar Arrays nehmen und die Funktion damit aufrufen und überprüfen ob das richtige rauskommt:Code c:1 2 3 4 5 6 7
bool istschondrin(int array[], int anzahl_der_eintraege_im_array, int such_mich) { // Array nach such_mich durchsuchen, wenn gefunden return true for (...) { if (...) return true; } return false; }
GrußCode c:1 2 3
int a1[] = { 1, 2, 3, 4, 5 }; cout << boolalpha << "a1: " << istschondrin(a1, sizeof(a1)/sizeof(*a1), 6) << " == false" << endl; ...
PS: Bitte halte dich an die Netiquette, Punkt 15 - Groß/Kleinschreibung. Danke.Geändert von deepthroat (22.10.08 um 21:48 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
22.10.08 21:50 #11
- Registriert seit
- Oct 2008
- Beiträge
- 69
Code :1 2 3 4 5 6 7 8 9 10
int zahlen[45]; for (int i=0; i<45; i++){zahlen[i]=i+1;} srand(time(NULL)); for (int i=0; i<45; i++) { int tausch = rand()%45; int buffer = zahlen[i]; zahlen[i] = zahlen[tausch]; zahlen[tausch] = buffer; }
Wenn du jetzt die ersten 6 Werte aus zahlen[] ausliest, hast du deine Lottozahlen.Geändert von RenderWilli (23.10.08 um 08:46 Uhr)
-
22.10.08 22:58 #12
- Registriert seit
- Oct 2008
- Beiträge
- 15
danke,es funktioniert
aber ich kann es nicht nachvoll ziehen, da ich mit dem in der letzten for schleife nichts anfangen kann.
lg Master
-
22.10.08 23:22 #13
Ich darf mal gerade:
Die For-Schleife ist nichts anderes als eine Shuffle-Routine, d.h. das zuvor mit den 46 Zahlen gefüllte Array wird durcheinandergewürfelt.
Zeile 1 der Schleife ermittelt eine Zufallszahl zwischen 1 und 46. Der Inhalt des Arrays zahlen an der Stelle i wird in eine temporäre Variable buffer geschrieben, um ihn zu sichern (Zeile 2). Das Element des Arrays zahlen wird dann an der jeweiligen Stelle i durch das Element desselben Arrays an der Stelle der Zufallszahl ersetzt (Zeile 3). Schließlich wird das nun doppelt vorhandene Element an der Stelle der Zufallszahl durch die gesicherte Zahl ersetzt (Zeile 4).
Beispiel:
Schleife läuft zum ersten Mal -> i=0. Also:- Annahme: tausch = 20.
- buffer = zahlen[0]
- zahlen[0] = zahlen[20]
- zahlen[20] = buffer
Eine Lüge kann einmal um die ganze Welt laufen, bevor die Wahrheit ihre Stiefel angezogen hat.
(Winston Churchill)
-
22.10.08 23:52 #14
Was ich aber nicht gutheißen kann, werter MasterOfTheDark, ist, dass Du an diesem kleinen Versuch, ein Lottospiel zu schreiben, nichts gelernt hast. Ganz ehrlich, Dein erster Versuch brachte nicht das erhoffte Ergebnis ( es war abzusehen, dass gleiche Zahlen auftreten können ) und mit den Tipps konntest Du nichts anfangen, weil Du scheinbar gar keine Lust hast, etwas dabei zu lernen. Sogar in Deinem ersten Versuch hast Du die 6 Zahlzüge nicht in Schleife realisiert, sondern "stümperhaft" hintereinanderkopiert. Nun hast Du eine Lösung, die Du nicht verstehst, geschweige denn selbst geschrieben hast. Schade.. mfg chmee
p.s.: Vielleicht seh ich es zu eng, und Du solltest nur für den gehassten Informatik-Unterricht eine Hausaufgabe präsentieren, naja, ist dann wohl geschafft.Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
23.10.08 07:44 #15
- Registriert seit
- Oct 2008
- Beiträge
- 69
In erster Linie sollte gezeigt werden, dass es eine einfache Lösung gibt und das es funktioniert. Das Verständnis stellt sich nach Erfolgen ein und aus positiven Erlebnissen lernt man. Ich denke, es bringt nichts, wenn man tagelang an einem kleinen Problem sitzt, denn das baut eher Frust auf. Ausserdem wurden mehrere (komplexe) Lösungsansätze vorgeschlagen (Arrays&Vektoren) und das kann einen Anfänger doch sehr überfordern!
Also alles einfach halten und wenn man dann noch Lust zum Experimentieren hat, kommt das Verständnis von alleine.
Schöne Grüße,
Willi
Ähnliche Themen
-
doppelte einträge vermeiden
Von Webgau im Forum PHPAntworten: 2Letzter Beitrag: 28.01.09, 18:59 -
Doppelte Datenbankeinträge vermeiden mit JPA
Von unclesunshin im Forum JavaAntworten: 2Letzter Beitrag: 30.10.08, 10:19 -
Zufallsgenerator (Lottozahlen) Doppelte Zahlen vermeiden
Von dwex im Forum PHPAntworten: 8Letzter Beitrag: 10.09.08, 07:18 -
Lotto zahlen sortieren
Von r4d1um im Forum C/C++Antworten: 2Letzter Beitrag: 02.12.07, 18:48 -
Doppelte Kunden vermeiden
Von mC pAiN im Forum PHPAntworten: 1Letzter Beitrag: 05.08.04, 15:18





Zitieren


Login






