Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » gleiche zahlen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
07.12.2003, 20:05 Uhr
~punkisx
Gast


tja das is das prob ich versteh das nicht kannst du mir alles ganz genau erklären (jede Zeile)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
07.12.2003, 20:16 Uhr
~punkisx
Gast


tschuldigung fürs doppelpost aber ich hab das programm noch mehr vereinfacht : jetzt kannst mir das erklären:


C++:
#include <iostream.h>
#include <conio.h>

void main()
{
    int lotto[45], i, tmp;


    for(i=0; i<6; ++i) {

        do
        {
            tmp = rand()%45;
        } while(lotto[tmp]==1);
        lotto[tmp]=1;
       cout << tmp+1 << ", ";
    }

  getch();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
07.12.2003, 20:32 Uhr
Pablo
Supertux
(Operator)


ich weiß nicht wie viel Mal ich dir noch sagen muss, dass die Main Funktion int ist, und nicht void

Post 021 erklärt das, ich warum ich new benutze, es könnte sein, dass ein Element von lotto[45] schon ne 1 speichert, bevor du die for-schleife aufrufst, und das wäre nicht gut!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 07.12.2003 um 20:33 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
07.12.2003, 20:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
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


au... die tatsache das danach nullen drin stehen ist IMHO kein guter Grund new zu verwenden.
eine einfache schleife oder memset sind besser für sowas geeignet
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 07.12.2003 um 20:42 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
07.12.2003, 20:49 Uhr
Pablo
Supertux
(Operator)


An memset habe ich gar nicht gedacht! Das ist auch eine gute Idee
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 07.12.2003 um 20:50 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
07.12.2003, 21:17 Uhr
~punkisx
Gast


ich habs geschnallt : 1.Zahl wird 1
wenn die 2. Zahl nicht eins ist wird sie zu eins
und so weiter danke für die hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: