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++ - Perché il mio prgramma non funziona?
Forum - C/C++ - Perché il mio prgramma non funziona?

Avatar
DarkFelix (Normal User)
Newbie


Messaggi: 14
Iscritto: 18/10/2010

Segnala al moderatore
Postato alle 18:40
Venerdì, 13/05/2011
Salve a tutti, sono novizio del linguaggio C, ma mi ci sto impegnando al massimo. Avevo provato a fare un programma, dalla consegna sul libro dove lo sto studiando, ma vedo che non funge a dovere, infatti sia rispondendo 'n' che 's' mi da la schermata che ho allegato, si trova in fondo alla pagina. Grazie a tutti ^^

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. main()
  4. {
  5.     int punti;
  6.     char x;
  7.     char y;
  8.     char v;
  9.     char z;
  10.     char w;
  11.     char k;
  12.     punti=0;
  13.     printf("Benvenuto in questo test\n");
  14.     printf("1a domanda, rispondi SI (s) o NO (n)\n");
  15.     printf("2 + 2 x 2 = 8 ?\n");
  16.     scanf("%c", &x);
  17.     switch(x){
  18.               case 'n': printf("Risposta esatta\n");
  19.               punti=punti+1;
  20.               printf("2a domanda, rispondi SI (s) o NO (n)\n");
  21.               printf("Madrid e' la capitale della Spagna?\n");
  22.               scanf("%c", &y);
  23.               switch(y){
  24.                         case 'n': printf("Risposta errata\n");
  25.                         punti=punti-1;
  26.                         printf("3a domanda, rispondi SI (s) o NO (n)\n");
  27.                         printf("Un atomo di ossigeno e' formato da due molecole di Ossigeno?\n");
  28.                         scanf("%c", &z);
  29.                         switch(z){
  30.                                   case 'n': printf("Risposta esatta\n");
  31.                                   punti=punti+1;
  32.                                   break;
  33.                                   case 's': printf("Risposta errata\n");
  34.                                   punti=punti-1;
  35.                                   break;
  36.                                   default: printf("Carattere non compreso\n");
  37.                                   break;
  38.                                   }
  39.                         break;
  40.                         case 's': printf("Risposta esatta\n");
  41.                         punti=punti+1;
  42.                         printf("3a domanda, rispondi SI (s) o NO (n)\n");
  43.                         printf("Il toro e' il machio della mucca?\n");
  44.                         scanf("%c", &v);
  45.                         switch(v){
  46.                                   case 'n': printf("Risposta errata\n");
  47.                                   punti=punti-1;
  48.                                   break;
  49.                                   case 's': printf("Risposta esatta\n");
  50.                                   punti=punti+1;
  51.                                   break;
  52.                                   default: printf("Carattere non compreso\n");
  53.                                   break;
  54.                                   }
  55.                         break;
  56.                         default: printf("Carattere non compreso\n");
  57.                         break;
  58.                         }
  59.               break;
  60.               case 's': printf("Risposta errata\n");
  61.               punti=punti-1;
  62.               printf("2a domanda, rispondi SI (s) o NO (n)\n");
  63.               printf("Totti e' il capitano della Roma?\n");
  64.               scanf("%c", &v);
  65.               switch(v){
  66.                         case 'n': printf("Risposta errata\n");
  67.                         punti=punti-1;
  68.                         printf("3a domanda, rispondi SI (s) o NO (n)\n");
  69.                         printf("Mercurio ha atmosfera attorno a se'?\n");
  70.                         scanf("%c", &w);
  71.                         switch(w){
  72.                                   case 'n': printf("Risposta esatta\n");
  73.                                   punti=punti+1;
  74.                                   break;
  75.                                   case 's': printf("Risposta errata\n");
  76.                                   punti=punti-1;
  77.                                   break;
  78.                                   default: printf("Carattere non compreso\n");
  79.                                   break;
  80.                                   }
  81.                         break;
  82.                         case 's': printf("Risposta esatta\n");
  83.                         punti=punti+1;
  84.                         printf("3a domanda, rispondi SI (s) o NO (n)\n");
  85.                         printf("Gli anfibi sanno nuotare?\n");
  86.                         scanf("%c", &k);
  87.                         switch(k){
  88.                                   case 'n': printf("Risposta errata\n");
  89.                                   punti=punti-1;
  90.                                   break;
  91.                                   case 's': printf("Risposta esatta\n");
  92.                                   punti=punti+1;
  93.                                   break;
  94.                                   default: printf("Carattere non compreso\n");
  95.                                   break;
  96.                                   }
  97.                         break;
  98.                         default: printf("Carattere non compreso\n");
  99.                         break;
  100.                         }
  101.               break;
  102.               default: printf("Carattere non compreso\n");
  103.               }
  104.     printf("Punteggio ottenuto: %d\n", punti);
  105.     system("pause");
  106. }



DarkFelix ha allegato un file: Errore.jpg (28837 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da DarkFelix il 13/05/2011 alle 18:41
PM Quote
Avatar
-tonix (Normal User)
Newbie


Messaggi: 6
Iscritto: 13/05/2011

Segnala al moderatore
Postato alle 22:30
Venerdì, 13/05/2011
Ciao, prima di ogni scanf inserisci questo codice fflush(stdin);

in questo modo:

Codice sorgente - presumibilmente Plain Text

  1. printf("Totti e' il capitano della Roma?\n");
  2. fflush(stdin);        
  3. scanf("%c", &v);



in questo modo ti da la possibilità di rispondere a tutte le domande..


Antonio
PM Quote
Avatar
DarkFelix (Normal User)
Newbie


Messaggi: 14
Iscritto: 18/10/2010

Segnala al moderatore
Postato alle 14:16
Sabato, 14/05/2011
Ok, grazie, ma... Potrei sapere qual è la sua funzione? Vorrei capire... ^^

PM Quote
Avatar
-tonix (Normal User)
Newbie


Messaggi: 6
Iscritto: 13/05/2011

Segnala al moderatore
Postato alle 16:01
Sabato, 14/05/2011
In pratica con il comando fflush(stdin); svuoti il buffer della tastiera.

Non conosco proprio la definizione precisa.. So però che spesso la scanf crea questo problema quindi è meglio usarlo prima di ogni scanf..

Mi è capitato che se avevo più scanf inserivo un valore alla prima e poi mi ripeteva quello stesso valore anche alla scanf successiva..

Quando ero agli inizi non sai quanto tempo ho perso dietro a questo tipo di errore :grr: xD

Ultima modifica effettuata da -tonix il 14/05/2011 alle 16:04


Antonio
PM Quote
Avatar
DarkFelix (Normal User)
Newbie


Messaggi: 14
Iscritto: 18/10/2010

Segnala al moderatore
Postato alle 9:12
Domenica, 15/05/2011
Ok, grazie dell'aiuto ^^

Si, infatti ora funge.

Si può chiudere.

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 12:32
Domenica, 15/05/2011
Testo quotato

Postato originariamente da -tonix:

In pratica con il comando fflush(stdin); svuoti il buffer della tastiera.

Non conosco proprio la definizione precisa.. So però che spesso la scanf crea questo problema quindi è meglio usarlo prima di ogni scanf..

Mi è capitato che se avevo più scanf inserivo un valore alla prima e poi mi ripeteva quello stesso valore anche alla scanf successiva..

Quando ero agli inizi non sai quanto tempo ho perso dietro a questo tipo di errore :grr: xD


La scanf lascia il carattere di invio nello stdin se non è diversamente specificato nella stringa di formattazione.


bool Woman::makeYourselfBetter() {
       goto bathroom;

bathroom:
       while (1);

       return this->_isGoodResult();
}
PM Quote
Avatar
R1C (Member)
Newbie


Messaggi: 17
Iscritto: 19/03/2011

Segnala al moderatore
Postato alle 0:54
Lunedì, 16/05/2011
bisogna prestare attenzione ad usare questa istruzione poiche' non funziona sempre "fflush(stdin)", nella generalita' si potrebbe usare getchar(); in modo tale da compiere lo stesso lavoro ovvero quello di svuotare il buffer sempre e comunque.


Soli moriremo dal freddo, ma insieme possiamo farcela! L'Unione ci rende imbattibili....
PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 137
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 14:33
Giovedì, 19/05/2011
ciao , do un mio parere sul codice anche se il problema è stato risolto

usando switch annidati il codice diviene meno comprensibile
e si complicha la vita per nulla :pat:

semplici if  else if  else in sucessione
controlli se ' s  '  
controlli se 'n '
se il carattere non è valido else
per incrementare o decrementare una variabile
soluzione più semplice e logica :)

Ultima modifica effettuata da torn24 il 19/05/2011 alle 14:36


Se si impara dai propri sbagli
non è cosi drammatico  sbagliare !
PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 137
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 15:29
Giovedì, 19/05/2011
ciao sono anche io un novizio del linguaggio c e per esercizio ho provato
a fare il tuo stesso programma secondo me ha dei vantaggi rispetto a come
lo hai fatto tu anche se a differenza del tuo non controlla se il careattere immesso è valido o no ("ci ho provato ma mi dava errore ")
posto il codice vorrei chiederti come ti sembra sinceramente


Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4.  
  5. int punti=0;
  6. void punteggio(char ,char);
  7. main()
  8. {
  9.    
  10.     char x;
  11.    
  12.    punti=0;
  13.    printf("Benvenuto in questo test\n");
  14.    printf("1a domanda, rispondi SI (s) o NO (n)\n");
  15.    printf("2 + 2 x 2 = 8 ?\n");
  16.    fflush(stdin);
  17.    scanf("%c", &x);
  18.    punteggio(x,'n');
  19.    printf("2a domanda, rispondi SI (s) o NO (n)\n");
  20.    printf("Madrid e' la capitale della Spagna?\n");
  21.    fflush(stdin);
  22.    scanf("%c", &x);
  23.    punteggio(x,'s');
  24.    printf("3a domanda, rispondi SI (s) o NO (n)\n");
  25.    printf("Un atomo di ossigeno e' formato da due molecole di Ossigeno?\n");
  26.    fflush(stdin);
  27.    scanf("%c", &x);
  28.    punteggio(x,'n');
  29.    printf("4a domanda, rispondi SI (s) o NO (n)\n");
  30.    printf("Il toro e' il machio della mucca?\n");
  31.    fflush(stdin);
  32.    scanf("%c", &x);
  33.    punteggio(x,'s');
  34.    printf("5a domanda, rispondi SI (s) o NO (n)\n");
  35.    printf("Totti e' il capitano della Roma?\n");
  36.    fflush(stdin);
  37.    scanf("%c", &x);    
  38.    punteggio(x,'s');
  39.    printf("6a domanda, rispondi SI (s) o NO (n)\n");
  40.    printf("Gli anfibi sanno nuotare?\n");
  41.    fflush(stdin);
  42.    scanf("%c", &x);
  43.    punteggio(x,'s');
  44.    puts("___________________________________________");
  45.    printf("\n\nPunteggio ottenuto: %d\n", punti);
  46.    system("pause");
  47.    
  48.    }
  49.    
  50.    
  51.    
  52. void punteggio(char risp_data ,char risp_esatta)  
  53. {
  54.  
  55.         if(risp_data==risp_esatta)
  56.         {  
  57.             printf("Risposta esatta!\n");
  58.                 punti++;}
  59.         else
  60.         {
  61.             printf("Risposta errata!\n");
  62.                 punti--;}
  63.  
  64.  
  65.  
  66. }



Se si impara dai propri sbagli
non è cosi drammatico  sbagliare !
PM Quote