Tastatur ausstellen // if-Anweisung



  • Hallo,
    ich habe 2 kleine Fragen.
    1. Wie kann ich die Eingabe von Buchstaben und Sonderzeichen verhindern (ausstellen?) ?

    2. Warum geht ein meinem kleinen Programm die if-Anweisung nicht mit char?

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    int berechnung(int,int,int);
    
    int main()
    {
    //ZAHLEN RATEN
    
       int zufallszahl, ratezahl=0, versuche=1;
       char wahl;
    
       printf("Zahlen raten");
       printf("\n===========");
       printf("\n\nErraten Sie die Zahl zwischen 1 und 100");
       berechnung(zufallszahl, ratezahl, versuche);
       printf("\nSpiel vorbei");
       printf("\nNochmal? J/N: ");
       scanf("%c", &wahl);
    
         if (wahl=='j' || wahl=='J')
         {
             berechnung(zufallszahl, ratezahl, versuche);
         }         
    
         system("PAUSE");
    } 
    int berechnung (int zufallszahl, int ratezahl=0, int versuche=1)
    {
    //Erstellen einer Zufallszahl
       srand(time(NULL));
       zufallszahl=rand()%100+1;
    
      do
        {
         printf("\n\n%i. von 10 Versuchen", versuche);
         printf("\nBitte eine Zahl eingeben: ");
         scanf("%i", &ratezahl);
    
         if (zufallszahl < ratezahl)
          {
                    printf("Die gesuchte Zahl ist kleiner");             
                        versuche++;
          }
            else if (zufallszahl > ratezahl)
          {
                    printf("Die gesuchte Zahl ist groesser");
                        versuche++;
    
          }      
    
            else if  (zufallszahl = ratezahl)
          {
                    printf("RICHTIG");
    
          }
    
       }
    while(versuche < 11 && zufallszahl!=ratezahl);
    if (ratezahl != zufallszahl)
         {
                      printf("\n\nSchade, denn sie lautet: %i",zufallszahl);
         }
    
    }
    

    Ist ein einfaches Programm und wenn ich bei "Nochmal?" anstatt char - einen INT Wert einbinde, funktioniert alles wunderbar. Wenn nicht, springt er sofort zu SYSTEM("PAUSE"). Was mach ich falsch?



  • @1: Was genau willst du erreichen? Du könntest höchstens überprüfen, was ankommt und falsche Eingaben mit einer Fehlermeldung quittieren (oder ignorieren) - es gibt bestimmt auch systemspezifische Funktionen, die ohne Bildschirmecho einlesen.

    @2: Ich vermute mal, daß du dort noch ein '\n' im Tastaturpuffer hast (vom letzten scanf() in der berechnung()) - den mußt du zunächst auslesen und kompostieren, weil er sonst von deinem scanf() abgefangen wird (und '\n' erfüllt definitiv nicht deine if()-Bedingung ;))

    PS: Ich sehe den Sinn nicht ganz, warum du die Arbeitsvariablen deiner Funktion als Parameter anforderst - da reichen lokale Variablen völlig:

    void berechnung()
    {
      int zufallszahl=rand()%100+1;
      int ratezahl;
      int versuche=1;
      ...
    }
    

    PPS: Und eventuell wäre eine Schleife ("do...while(toupper(wahl)=='J');") hilfreicher als dein if() am Ende, vor allem wenn der Spieler noch eine dritte Zahl erraten will.



  • ich bin anfänger und hab das sozusagen übernommen, also das umgesetzt was im buch stand,
    aber vielen dank, ich ändere es mal so ab

    EDiT: okay also bei einer "nicht-zahl-eingabe" kommt denn eine fehlermeldung...mach ich 😉
    ich dachte aber daran den benutzer gar nicht erst die möglichkeit zu geben, quasi ein pc auf dem man kein windows installieren kann



  • printf("\n\n%i. von 10 Versuchen", versuche);
    
    printf("\nBitte eine Zahl eingeben: ");
    
    printf("\n\nSchade, denn sie lautet: %i",zufallszahl);
    

    Ich verstehe das mit dem Tastaturpuffer noch nicht. Wenn dort "\n" steht, soll er in die nächste Zeile gehen, wegen der Optik..macht er ja auch, warum nimmt das Programm denn diesen Wert?



  • Der Tastaturpuffer hat mit den printf() nichts zu tun (dort steht \n für ein newline = Zeilenwechsel) - da geht es um deine Eingaben (scanf()).

    PS: Irgendwo in der FAQ findet sich auch ein Beitrag, wie du den Puffer entleeren kannst.

    PPS: Sicher gibt es Möglichkeiten, die Tastatur teilweise abzuschalten. Aber dazu müsstest du extrem tief ins System eingreifen.



  • vielen dank, es läuft alles wunderbar..und jetz ein betriebssystem 🕶



  • hi 😉
    hab ein neues Problem.
    Ich kann das umgemodelte Programm nicht ausführen und ich weiß nicht woran es liegt. Die Fehlermeldung hilft mir nicht all zu viel weiter.

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    int vergleich();
    int rat();
    int zahlenbereich();
    
    int rat()
     {
    
        printf("\n\nErraten Sie die Zahl zwischen 1 und 100");
        vergleich();
        printf("\nSpiel vorbei");
    
     }
    
    int zahlenbereich()
     {
        int start, ende;
        int differenz;                  
     do
     {
    
        printf("\nStart und Endpunkt müssen mindestens eine Differenz von 10 aufweisen!");
        printf("\nGeben Sie einen Startpunkt ein: ");
        scanf("%i", &start);
        printf("\nGeben Sie einen Endpunkt ein: ");
        scanf("%i", &ende);
        printf("Start %i, Ende %i", start, ende);
        differenz = ende - start;
     }
     while(differenz < '10'); 
     vergleich();
     }
    
     int vergleich ()
    {
        int zufallszahl;
        int ratezahl=0;
        int versuche=1;         
        int start, ende;
    //Erstellen einer Zufallszahl
       srand(start);
       zufallszahl=rand()%ende+1;
    
      do
        {
         printf("\n\n%i. von 10 Versuchen", versuche);
         printf("\nBitte eine Zahl eingeben: ");
         scanf("%i", &ratezahl);
    
         if (zufallszahl < ratezahl)
          {
                    printf("Die gesuchte Zahl ist kleiner");             
                        versuche++;
          }
            else if (zufallszahl > ratezahl)
          {
                    printf("Die gesuchte Zahl ist groesser");
                        versuche++;
    
          }      
    
            else if  (zufallszahl = ratezahl)
          {
                    printf("RICHTIG");
    
          }
    
        fflush(stdin);
       }
        while(versuche < 11 && zufallszahl!=ratezahl);
        if (ratezahl != zufallszahl)
         {
                      printf("\n\nSchade, denn sie lautet: %i",zufallszahl);
         }
    
    }
    
    int main()
    
    {
    
    //ZAHLEN RATEN
    
       char wahl;
    
       printf("Zahlen raten");
       printf("\n===========");
    
     do      
     {
       fflush(stdin);
       rat();
       printf("\nNochmal? J/N: ");
       scanf("%c", &wahl);
     }
        while (wahl == 'j' || wahl== 'J');    
         system("PAUSE");
    
    }
    

    [Warning] multi-character character constant
    In function Z3ratv': [Linker error] undefined reference tovergleich()'
    In function Z13zahlenbereichv': [Linker error] undefined reference tovergleich()'
    ld returned 1 exit status

    kann mir bitte einer sagen, was ich ändern muss?
    danke euch



  • alles klar, hab den fehler, jetzt stürzt das programm nur noch ab^^



  • die zufallszahl liegt nicht zwischen dem vom anwender festgelegten bereich, liegt das am mudolo? ich weiß echt nich weiter

    do
     {
    
        printf("\nStart und Endpunkt muessen mindestens eine Differenz von 10 aufweisen!");
        printf("\nGeben Sie einen Startpunkt ein: ");
        scanf("%i", &start);
        printf("\nGeben Sie einen Endpunkt ein: ");
        scanf("%i", &ende);
        differenz = ende - start;
     }
     while(differenz < 10); 
    
    //Erstellen einer Zufallszahl
       srand(start);
       zufallszahl=rand()%ende+1;
    


  • Erstens solltest du srand() nur einmal am Anfang aufrufen (und dann normalerweise nicht mit einem festen Wert). und zweitens liefert "rand()%x" einen Wert im Bereich 0..x-1 - da mußt du die richtigen Grenzwerte einsetzen:

    zahl=rand()%(ende-start+1)+start;
    


  • genial, es geht
    aber könntest du es mir eventuell noch erklären?



  • rand() liefert eine Zufallszahl im Bereich 0 bis RAND_MAX (das ist eine Konstante im sehr hohen int-Bereich, die vom System vorgegeben wird), mit dem Modulo wird das auf den Bereich 0 bis n-1 beschränkt - und anschließend in die richtige Position angehoben:

    rand()            0..RAND_MAX
    rand()%(e-s+1)    0..(e-s)
    rand()%(e-s+1)+s  s..e
    


  • alles klar, danke


Anmelden zum Antworten