tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
19
ZUGRIFFE
3294
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MasterOfTheDark MasterOfTheDark ist offline Mitglied
    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 MasterOfDarkness
    Geändert von MasterOfTheDark (22.10.08 um 16:58 Uhr)
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  3. #3
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    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 chmee
     
    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 <-

  4. #4
    MasterOfTheDark MasterOfTheDark ist offline Mitglied
    Registriert seit
    Oct 2008
    Beiträge
    15
    mit array hab ichs auch versucht, nur nicht hinbekommen
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Mein Vorschlag in C++:
    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;
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    MasterOfTheDark MasterOfTheDark ist offline Mitglied
    Registriert seit
    Oct 2008
    Beiträge
    15
    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;
    }
    naja, fehlermeldungen weg, aber im ausgabefenster erscheint nur"drücken sie eine beliebige taste...."?
    Geändert von MasterOfTheDark (22.10.08 um 20:35 Uhr)
     

  7. #7
    engelmarkus engelmarkus ist offline Mitglied Brokat
    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;
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von MasterOfTheDark Beitrag anzeigen
    Code :
    1
    
    int Zahlen[7] // für 6 speicherplätze
    Das Array bietet 7 Speicherplätze, von 0 bis 6.
    Zitat Zitat von MasterOfTheDark Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      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;
    }
    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.

  9. #9
    MasterOfTheDark MasterOfTheDark ist offline Mitglied
    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
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von MasterOfTheDark Beitrag anzeigen
    1) funktion zum zurückgeben:
    srand(time(NULL));
    array[7]=rand()%45+1;
    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.
    Zitat Zitat von MasterOfTheDark Beitrag anzeigen
    2) aber hier das problem, hab keinen schimmer wie das funktioniern sollte, odcer ich steh einfach auf der leitung..
    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:
    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;
    }
    \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
    
    int a1[] = { 1, 2, 3, 4, 5 };
    cout << boolalpha << "a1: " << istschondrin(a1, sizeof(a1)/sizeof(*a1), 6) << " == false" << endl;
    ...
    Gruß

    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.

  11. #11
    RenderWilli RenderWilli ist offline Mitglied Silber
    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)
     

  12. #12
    MasterOfTheDark MasterOfTheDark ist offline Mitglied
    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
     

  13. #13
    Avatar von Jochen_Schneider
    Jochen_Schneider Jochen_Schneider ist offline Mitglied Silber
    Registriert seit
    Apr 2006
    Ort
    Bei Dortmund
    Beiträge
    51
    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
    Ich hoffe das war jetzt mehr verständlich. Ist nichts anderes als ein Dreieckstausch.
     
    Eine Lüge kann einmal um die ganze Welt laufen, bevor die Wahrheit ihre Stiefel angezogen hat.
    (Winston Churchill)

  14. #14
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    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 <-

  15. #15
    RenderWilli RenderWilli ist offline Mitglied Silber
    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

  1. doppelte einträge vermeiden
    Von Webgau im Forum PHP
    Antworten: 2
    Letzter Beitrag: 28.01.09, 18:59
  2. Doppelte Datenbankeinträge vermeiden mit JPA
    Von unclesunshin im Forum Java
    Antworten: 2
    Letzter Beitrag: 30.10.08, 10:19
  3. Antworten: 8
    Letzter Beitrag: 10.09.08, 07:18
  4. Lotto zahlen sortieren
    Von r4d1um im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 02.12.07, 18:48
  5. Doppelte Kunden vermeiden
    Von mC pAiN im Forum PHP
    Antworten: 1
    Letzter Beitrag: 05.08.04, 15:18