Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » break und continue in verschachtelten Schleifen

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
23.12.2004, 14:32 Uhr
virtual
Sexiest Bit alive
(Operator)


@kronos:
Mehrfach problematisch:
Zum einen dürfte strchr immer einen Zeiger != NULL zurückliefern.
Zum anderen (selbst wenn das Problem nicht wäre), ist lottozahlen ggf. nicht 0 terminiert, wenn die letzte Zahl gezogen wird.
Wenn es also schon nicht das random_shuffle sein darf (siehe 1000 Posts zuvor), dann würde ich es eher so lösen:

C++:
void generiereLottoZahlen(int* lottozahlen) {
     for(int i=0; i<6; ++i) {
         boolean nochmal = false;
         do {
             lottozahlen[i] = rand()%49 + 1;
             for(int j=0; !nochmal && j<i-1; ++j)
                 nochmal = lottozahlen[i]==lottozahlen[j];
         } while(nochmal);
     }
}


Naja, und weil ich schon den parameter ziemlich krank finde, finde ich die ganze Routine krankt: denn es gibt keine Sicherheit, daß lottozahlen wirklich genug platz hat....
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
30.12.2004, 12:44 Uhr
kronos
Quotenfisch
(Operator)



Zitat von virtual:
@kronos:
Mehrfach problematisch:
Zum einen dürfte strchr immer einen Zeiger != NULL zurückliefern.


nein:

Zitat:
The strchr() and strrchr() functions return a pointer to
the matched character or NULL if the character is not
found.




Zitat:
Zum anderen (selbst wenn das Problem nicht wäre), ist lottozahlen ggf. nicht 0 terminiert, wenn die letzte Zahl gezogen wird.

Da ist was dran, ich meinte eigentlich auch:

C++:
memset(lottozahlen,0,7);

(es ist ja eh nicht gesagt, wie groß der speicher ist)


Zitat:
Naja, und weil ich schon den parameter ziemlich krank finde, finde ich die ganze Routine krankt: denn es gibt keine Sicherheit, daß lottozahlen wirklich genug platz hat....


Für 'nen Lottosimulator würde ich einfach zwei Zahlen zwischen 1 und 10 068 347 520 ziehen und wenn sie gleich sind, hat der Spieler gewonnen. Aber ich bin sowieso gegen Glückspiel, deswegen lass ich's bleiben.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 30.12.2004 um 12:44 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
30.12.2004, 13:14 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von kronos:

Zitat:
@kronos:
Mehrfach problematisch:
Zum einen dürfte strchr immer einen Zeiger != NULL zurückliefern.


nein:

Zitat:
The strchr() and strrchr() functions return a pointer to
the matched character or NULL if the character is not
found.






Genau. Und vor diesem Hintergrund sieh Dir doch mal Deine Schleife an:

C++:
    memset(lottozahlen,0,6);  
    for(int i=0;i<6;++i)  
      do
      {
            lottozahlen[i]=Rnd(49,1);
        } while(strchr(lottozahlen,lottozahlen[i]);



In der Zeile

C++:
lottozahlen[i]=Rnd(49,1);

Wird also ein Zeichen angefügt.
in der Zeile

C++:
while(strchr(lottozahlen,lottozahlen[i]);

Wird dann geprüft, ob das eben eingefügte Zeichen im String ist. Dies ist trivialerweise stets der Fall, folglich terminiert die Schleife nie, weil ja - wie du selbst zitiert hast - strchr nur dann NULL zurückgibt, wenn das Zeichen nicht drin ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
04.01.2005, 15:06 Uhr
kronos
Quotenfisch
(Operator)


Hmpf... okokok....
also, jetzt aber:

C++:
    for(int i=0;i<6;++i)  
      do
      {
            lottozahlen[i]=Rnd(49,1);
        } while(strchr(lottozahlen,lottozahlen[i])-lottozahlen+i);


So, die Lösung funktioniert jetzt, ist superschnell und fast golfreif.

Oder...?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
04.01.2005, 15:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Was wäre denn jetzt so schlimm gewesen != anstelle von - zu verwenden?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
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: