Frage zu Funktion rand() und code

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Frage zu Funktion rand() und code

    Hallo liebe C freunde ;)

    Ich habe jetzt auch angefangen mit C! So jetzt habe ich hier eine Aufgabe:

    Es soll ein Ratespiel geschrieben werden in dem Der Computer eine Zufallszahl zwischen 0 und 9 auswählt und der spieler soll diese erraten dafür hat er 3 Versuche wenn er Falsch rät bekommt er einen Tipp ob die gesuchte Zahl größer oder kleiner ist so in Code sieht das ganze dann so aus :

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <time.h>
    4. int rand();
    5. int z; /*zufallszahl*/
    6. int e; /* Zahl die eingegeben wird*/
    7. int count;/*Versuchszaehler*/
    8. int i=3; /*Zaehler für Ausgabe*/
    9. int main(void)
    10. {
    11. srand(time(0)); /* initialisiert Zuffalszahl Generator*/
    12. z= (int) (10.0*rand()/(RAND_MAX+1.0)); /*erstellen der Zuffalszahl mir Funktion rand()*/
    13. printf("erraten Sie meine Zahl von 0-9!\naber Vorsicht:\nSie haben nur 3 Versuche!\n");
    14. do{
    15. scanf("%i",&e); /* einlesen einer Zahl von der Console*/
    16. count=count+1; /* zaehlt die Versuche hoch */
    17. if (z==e)
    18. {
    19. /*wenn z gleich e dann richtig geraten*/
    20. printf("\nGut geraten!\nDas ist richtig!\n");
    21. }
    22. /*wenn eingegebene Zahl zu klein*/
    23. if (z>e && count<3 )
    24. {
    25. printf ("\nTipp: die gesuchte Zahl ist größer!\n");
    26. printf("Probieren Sie nocheinmmal!\n");
    27. i=i-1; /* i wird bei jeden Versuch um 1 reduziert*/
    28. if(i<2)
    29. {
    30. printf("\n");
    31. printf("Sie haben noch %den Versuch!\n",i);
    32. }
    33. if (i>1){
    34. printf("\n");
    35. printf("Sie haben noch %d Versuche!\n", i);
    36. }
    37. }
    38. /*wenn eingegebene Zahl zu gross*/
    39. if (z<e && count<3 )
    40. {
    41. printf ("\nTipp: die gesuchte Zahl ist kleiner!\n");
    42. printf("Probieren Sie nocheinmal!\n");
    43. i=i-1;
    44. if(i<2)
    45. {
    46. printf("\n");
    47. printf("Sie haben noch %den Versuch!\n",i);
    48. }
    49. if (i>1){
    50. printf("\n");
    51. printf("Sie haben noch %d Versuche!\n", i);
    52. }
    53. }
    54. }while(z!= e && count<3); /* wird ausgeführt solange z ungleich e und count kleiner 3*/
    55. /*wenn count gleich 3 und immer noch nicht richtig erraten*/
    56. if (count==3 && e!=z)
    57. {
    58. printf("\nDie gesuchte Zahl lautet: ");
    59. printf("%d\n",z);
    60. printf("\n");
    61. printf("vielleicht klappt es beim nächsten mal\n");
    62. printf("\n");
    63. }
    64. system("pause");
    65. return 0;
    66. }
    Alles anzeigen


    Jetzt ist nur blöd das der Zufallsgenerator irgenwie nicht so will wie ich der generiert nämlich immer die selbe Zahl nur nach mehrmaligen aufrufen des Programms ändert sich das wieso?
    was kann ich dagegen tun ? und wie Funktioniert diese Funktion rand() eigentlich also z= (int) (10.0*rand()/(RAND_MAX+1.0));
    war nämlich schon so vor gegeben und ich weiß nicht wie das Ding arbeitet ?

    Warum muss ich eigentlich Funktionen und Variablen in c auserhalb der main deklarieren ?
    und wieso kann ich die initialisierung des Generrators srand(time(0)); nicht auch Außerhalb der main stehen lassen ?

    und wäre schön wenn mir jemand noch die Unicodezeichen für Sonderzeichen nennen könnte wie ß ä ö ü usw hab schon gegoogelt aber finde nichts brauchbares

    danke!

    Mit freundlichen Grüßen!
  • Wenn du Zeile 7 raus schmeisst, sollte es laufen.

    Wenn Worte der Sprachfunktion hinter int oder char u.s.w. stehen, sollte man sich ansehen ob das unbedingt sein muss.
    Auch, wenn das wie hier in einer Bibliothek genutzt wird. Wie in deinem Beispiel: rand() <- da sollte die rote Warnlampe aufleuchten.

    Wie so: Variablen in c auserhalb der main deklarieren ? -> Probier es doch mal innerhalb.

    Mit dem Quelltext formatieren das geht aber noch besser ;)

    Unicode ist noch ein wenig Compilerabhängig.
    Versuche das als Variable möglichst zu vermeiden, da ä und Verwandte eine Besonderheit der deutschen Sprache sind.
  • Danke für deine Antwor bcc-fan!

    deine Lösung mit Zeile 7 rausnehmen funzt leider nicht habe das jetzt so gelöst:

    Quellcode

    1. srand(time(0));
    2. rand ();


    so funzt das ganze wunderbar !

    bcc-fan schrieb:

    Wenn Worte der Sprachfunktion hinter int oder char u.s.w. stehen, sollte man sich ansehen ob das unbedingt sein muss.

    Auch, wenn das wie hier in einer Bibliothek genutzt wird. Wie in deinem Beispiel: rand() <- da sollte die rote Warnlampe aufleuchten.
    Was meinst du damit und warum sollte man aufpassen bin noch anfänger ?
  • Hab den DEV++ mit dem MinGW 3.4.5 (?) nicht auf der aktuellen Festplatte.

    Da dein Quelltext mit dem MinGW 4.4.5, ohne die Zeile 7 deines 1. Quelltextes das macht, was er soll, gehe ich mal von einem Bedienungsfehler an deinem DEV++ aus.
    Auch einige andere Compiler sehen dies so :D

    Der DEV++ wird ja schon seit Jahren nicht mehr weiterentwickelt - okay wer möchte kann sich den Delphi-Quellcode besorgen und ...

    Code::Blocks 10.5 ist aktueller mit einem aktuelleren MinGW 4.4.1 und steht bei C::B so zum Download. Wer will kann auch andere Compiler unter C::B ausführen.
    C::B sollte eine Importfunktion für DEV++ Projekte an Bord haben.

    So Eindateien-Projekte bearbeite ich auch gern an einem entsprechenden Editor - da gibt es ja ein paar Einschlägige 8)
  • Ich benutze fast nur die Komanndozeile, sprich für gcc, g++, seit ich Linux habe.
    Zum Bearbeiten nutze ich für ein Dateien-Projekte vi, für mehr Dateien-Projekte Kate.
    Ach ja, QT Creator, habe ich jetzt auch noch auf der Platte.
    @the_old_pirate
    Hier ein Verbesserungsvorschlag:
    Nehme in zeile 40und 58 die Variable raus und setze die 1 direkt in den String ein.
    Hier die Escape-Sequenzen von C, einfach in einen String einfügen.
    Ä = \142
    Ö = \153
    Ü = \154
    ä = \132
    ö = \148
    ü = \129
    ß = \225

    Wofür brauchst du eigentlich:

    Quellcode

    1. #include <time.h>

    Wenn du getchar nimmst, ist das ganze unnötig, und Plattformunabhängig,
    Linux kennt keinen Befehl pause, glaube mac auch nicht.
    Nimm statt

    Quellcode

    1. system("pause");

    das hier

    Quellcode

    1. setvbuf(stdin, NULL, _IONBF, 0)
    2. setvbuf(stdin, NULL, _IOFBF, BUFSIZ);
    3. getchar();

    Dann kannst du time.h rausnehmen, und es ist plattformunabhängig.
    mfg Pokertom
    Du bist Terrorist, warum? Siehe hier
  • @bcc-fan
    Du solltest schon eine aktuelle nehmen, wenn ich mir anhöre, dass du 3.45 oder 4.45 (wäre nicht so schlimm wäre gut) hast, wirds mir zuviel...
    Nimm mal MinGW 4.5, damit sollte es klappen.
    @the_old_pirate
    Habe leider auch kein Windows Betriebssystem momentan auf der Platte, aber mit gcc 4.5 klappts auf jedenfall.
    Und wenn gcc schon nicht meckert, ist es meistens 95-100% richtig, weil gcc für seine Genauigkeit bzw. Richtigkeit bekannt ist.
    Anders gesagt, es hält sich sehr genau an den Standard.
    MinGW ist halt nür die abgespeckte Version davon.
    edit:
    @bcc-fan
    Sry, falsch gelesen: 4.41 geht noch, würde den nur mal aktualisieren.
    edit2: kann das hier stimmen?
    Wenn ja, nehm ich alles zurück mit gcc 4.4.5.
    gcc.gnu.org/releases.html
    Trotzdem ist gcc 4.4.1 vom 22 Juli 2009, also veraltet.
    Du bist Terrorist, warum? Siehe hier

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von pokertom ()

  • Der gcc hängt unter Windows meist der Linux-Version hinterher :D

    Der 4.4.1 wurde erwähnt weil er im Paket mit Code::Blocks 10.5 im Netz zum Download bereit steht. -> Ist für Anfänger leichter -> installieren und ohne grosse Anpassung sollte es rennen. Wenn das läuft, kann man immer noch updaten.

    Sollte für solch einfachen Quelltext aber kaum eine Rolle spielen.

    Aber da ich öfter auch noch mit anderen Compilern herum mache, bevorzuge ich Quelltext, der möglichst ohne Änderungen auf allen Compilern ausführbar ist.

    Es wird schon am gcc 4.5.1 "gebastelt" aber der 4.4.5 sollte stabiler sein.

    MfG bcc-fan
  • Dann kann ich dich verstehen. :D
    Warum nicht einfach mal ein minimalistiches Linux wie Damn Small Linux, ausprobieren, zum programmieren mit C reicht es allemal?
    edit: passt auf fast jeden USB-Stick.

    @ the old pirate

    Versuchs mal so:

    Kenn mich nicht mehr mit windoof aus, hab zu lange nicht mit gearbeitet,
    deswegen kann ich nichts zu system("PAUSE") sagen, nehme einfach an das es richtig ist;.

    Quellcode

    1. #ifdef __win32__
    2. system("PAUSE"); //Wenn Windows, dann Pause
    3. #endif
    4. #ifdef __unix__
    5. system("sleep 3"); //3 Sekunden wenn Unix System
    6. #endif
    7. #ifdef __apple__
    8. system("sleep 3"); //3 Sekunden wenn Apple System
    9. #endif

    mfg Pokertom
    Du bist Terrorist, warum? Siehe hier

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von pokertom ()