Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - getchar() problematico
Forum - C/C++ - getchar() problematico

Avatar
Luk3 (Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 23:05
Domenica, 14/11/2010
Salve, sto facendo un giochino dove bisogna indovinare un numero.
Quanto questo finisce chiedo all'utente se vuole giocare ancora..

Se preme n va tutto correttamente, se preme s invece il ciclo ricomincia ma mi chiede immediatamente se voglio giocare ancora..premendo ancora s si esce.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main()
  6. {
  7.     int nRand, nTent=1, nUser, nMax=1000, nMaxcp, nMin=0, nMincp, flag=0;
  8.     do
  9.     {
  10.         system("clear");
  11.         srand(time(0));
  12.         nRand = rand()%(nMax-nMin+1);
  13.         printf("Ho generato un numero random, indovinalo!\n");
  14.         nMaxcp = nMax;
  15.         nMincp = nMin;
  16.         while(flag == 0 && nTent <= 10)
  17.         {
  18.             printf("\nTentativo %d di 10.", nTent);
  19.             printf("\nInserisci un numero fra %d e %d: ", nMin, nMax);
  20.             scanf("%d", &nUser);
  21.             if(nUser == nRand)
  22.             {
  23.                 printf("\nHai indovinato il numero!\n");
  24.                 printf("Hai impiegato %d tentativi.\n\n", nTent);
  25.                 flag = 1;
  26.             }
  27.             else
  28.             {
  29.                 if(nTent == 10)
  30.                 {
  31.                     printf("\nNon hai indovinato.\n");
  32.                     printf("Hai terminato i tentativi!\n");
  33.                     printf("Il numero era %d.\n\n", nRand);
  34.                 }
  35.                 else
  36.                 {
  37.                     printf("\nNon hai indovinato. Ritenta.\n");
  38.                     if(nUser > nRand)
  39.                     {
  40.                         if(nUser > nMax)
  41.                         {
  42.                             nMax = nMaxcp;
  43.                         }
  44.                         else
  45.                         {
  46.                             nMax = nUser;
  47.                             nMaxcp = nMax;
  48.                         }
  49.                     }
  50.                     if(nUser<nRand)
  51.                     {
  52.                         if(nUser < nMin)
  53.                         {
  54.                             nMin = nMincp;
  55.                         }
  56.                         else
  57.                         {
  58.                             nMin = nUser;
  59.                             nMincp = nMin;
  60.                         }
  61.                     }
  62.                 }
  63.                 nTent++;
  64.             }
  65.         }
  66.         printf("\nVuoi giocare ancora? (S/N): "); // Il problema è qui.
  67.         getchar();
  68.     } while(getchar() == 's' || getchar() == 'S');
  69.         system("clear");
  70.         return 0;
  71. }



Perchè?? :(

Ultima modifica effettuata da Luk3 il 14/11/2010 alle 23:06


Non basta godersi un cielo stellato senza pensare che in un angolo ci siano le fate?
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 23:23
Domenica, 14/11/2010
prima di ogni getchar, gets e quant'altro metti fflush(stdin)


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Segnala al moderatore
Postato alle 23:27
Domenica, 14/11/2010
dovresti provare e risettare le variabili al loro valore di default quando selezioni la prima S.......in modo da "ripercorrere" le istruzioni del ciclo nelle stesse "condizioni" della prima volta.

poi dovresti svuotare il buffer del canale di input. Quando inserisci un char, quello rimane nel buffer fino a quando non lo svuoti. Quando tu inserisci la seconda S, questa si va ad accostare alla prima e quindi il ciclo finisce in ogni caso perchè avresti ss.....capito?


PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 12:10
Lunedì, 15/11/2010
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main()
  6. {
  7.     char ch;
  8.     int nRand, nTent=1, nUser, nMax=1000, nMaxcp, nMin=0, nMincp, flag=0;
  9.     do
  10.     {
  11.         system("clear");
  12.         srand(time(0));
  13.         nRand = rand()%(nMax-nMin+1);
  14.         printf("Ho generato un numero random, indovinalo!\n");
  15.         nMaxcp = nMax;
  16.         nMincp = nMin;
  17.         while(flag == 0 && nTent <= 10)
  18.         {
  19.             printf("\nTentativo %d di 10.", nTent);
  20.             printf("\nInserisci un numero fra %d e %d: ", nMin, nMax);
  21.             scanf("%d", &nUser);
  22.             if(nUser == nRand)
  23.             {
  24.                 printf("\nHai indovinato il numero!\n");
  25.                 printf("Hai impiegato %d tentativi.\n\n", nTent);
  26.                 flag = 1;
  27.             }
  28.             else
  29.             {
  30.                 if(nTent == 10)
  31.                 {
  32.                     printf("\nNon hai indovinato.\n");
  33.                     printf("Hai terminato i tentativi!\n");
  34.                     printf("Il numero era %d.\n\n", nRand);
  35.                 }
  36.                 else
  37.                 {
  38.                     printf("\nNon hai indovinato. Ritenta.\n");
  39.                     if(nUser > nRand)
  40.                     {
  41.                         if(nUser > nMax)
  42.                         {
  43.                             nMax = nMaxcp;
  44.                         }
  45.                         else
  46.                         {
  47.                             nMax = nUser;
  48.                             nMaxcp = nMax;
  49.                         }
  50.                     }
  51.                     if(nUser<nRand)
  52.                     {
  53.                         if(nUser < nMin)
  54.                         {
  55.                             nMin = nMincp;
  56.                         }
  57.                         else
  58.                         {
  59.                             nMin = nUser;
  60.                             nMincp = nMin;
  61.                         }
  62.                     }
  63.                 }
  64.                 nTent++;
  65.             }
  66.         }
  67.         printf("\nVuoi giocare ancora? (S/N): "); // Il problema è qui.
  68.        while (getchar() != '\n');
  69.        ch = getchar();
  70.     } while(ch == 's' || ch == 'S');
  71.         system("clear");
  72.         return 0;
  73. }


:k:
Se hai ancora qualche dubbio ( dopo aver visto il codice modificato e funzionante) posta!


Yep, I came back :P
PM Quote