DarkFelix (Normal User)
Newbie
Messaggi: 14
Iscritto: 18/10/2010
|
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++ |
#include <stdio.h> #include <stdlib.h> main() { int punti; char x; char y; char v; char z; char w; char k; punti=0; printf("Benvenuto in questo test\n"); printf("1a domanda, rispondi SI (s) o NO (n)\n"); printf("2 + 2 x 2 = 8 ?\n"); scanf("%c", &x); switch(x){ case 'n': printf("Risposta esatta\n"); punti=punti+1; printf("2a domanda, rispondi SI (s) o NO (n)\n"); printf("Madrid e' la capitale della Spagna?\n"); scanf("%c", &y); switch(y){ case 'n': printf("Risposta errata\n"); punti=punti-1; printf("3a domanda, rispondi SI (s) o NO (n)\n"); printf("Un atomo di ossigeno e' formato da due molecole di Ossigeno?\n"); scanf("%c", &z); switch(z){ case 'n': printf("Risposta esatta\n"); punti=punti+1; break; case 's': printf("Risposta errata\n"); punti=punti-1; break; default: printf("Carattere non compreso\n"); break; } break; case 's': printf("Risposta esatta\n"); punti=punti+1; printf("3a domanda, rispondi SI (s) o NO (n)\n"); printf("Il toro e' il machio della mucca?\n"); scanf("%c", &v); switch(v){ case 'n': printf("Risposta errata\n"); punti=punti-1; break; case 's': printf("Risposta esatta\n"); punti=punti+1; break; default: printf("Carattere non compreso\n"); break; } break; default: printf("Carattere non compreso\n"); break; } break; case 's': printf("Risposta errata\n"); punti=punti-1; printf("2a domanda, rispondi SI (s) o NO (n)\n"); printf("Totti e' il capitano della Roma?\n"); scanf("%c", &v); switch(v){ case 'n': printf("Risposta errata\n"); punti=punti-1; printf("3a domanda, rispondi SI (s) o NO (n)\n"); printf("Mercurio ha atmosfera attorno a se'?\n"); scanf("%c", &w); switch(w){ case 'n': printf("Risposta esatta\n"); punti=punti+1; break; case 's': printf("Risposta errata\n"); punti=punti-1; break; default: printf("Carattere non compreso\n"); break; } break; case 's': printf("Risposta esatta\n"); punti=punti+1; printf("3a domanda, rispondi SI (s) o NO (n)\n"); printf("Gli anfibi sanno nuotare?\n"); scanf("%c", &k); switch(k){ case 'n': printf("Risposta errata\n"); punti=punti-1; break; case 's': printf("Risposta esatta\n"); punti=punti+1; break; default: printf("Carattere non compreso\n"); break; } break; default: printf("Carattere non compreso\n"); break; } break; default: printf("Carattere non compreso\n"); } printf("Punteggio ottenuto: %d\n", punti); system("pause"); }
|
Ultima modifica effettuata da DarkFelix il 13/05/2011 alle 18:41 |
|
-tonix (Normal User)
Newbie
Messaggi: 6
Iscritto: 13/05/2011
|
Ciao, prima di ogni scanf inserisci questo codice fflush(stdin);
in questo modo:
Codice sorgente - presumibilmente Plain Text |
printf("Totti e' il capitano della Roma?\n");
fflush(stdin);
scanf("%c", &v);
|
in questo modo ti da la possibilità di rispondere a tutte le domande..
|
|
DarkFelix (Normal User)
Newbie
Messaggi: 14
Iscritto: 18/10/2010
|
Ok, grazie, ma... Potrei sapere qual è la sua funzione? Vorrei capire... ^^
|
|
-tonix (Normal User)
Newbie
Messaggi: 6
Iscritto: 13/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 xD
Ultima modifica effettuata da -tonix il 14/05/2011 alle 16:04 |
|
DarkFelix (Normal User)
Newbie
Messaggi: 14
Iscritto: 18/10/2010
|
Ok, grazie dell'aiuto ^^
Si, infatti ora funge.
Si può chiudere.
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
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 xD |
La scanf lascia il carattere di invio nello stdin se non è diversamente specificato nella stringa di formattazione. |
|
R1C (Member)
Newbie
Messaggi: 17
Iscritto: 19/03/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.
|
|
torn24 (Normal User)
Pro
Messaggi: 156
Iscritto: 04/01/2008
|
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
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 |
|
torn24 (Normal User)
Pro
Messaggi: 156
Iscritto: 04/01/2008
|
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++ |
#include <stdio.h> #include <stdlib.h> #include<string.h> int punti=0; void punteggio(char ,char); main() { char x; punti=0; printf("Benvenuto in questo test\n"); printf("1a domanda, rispondi SI (s) o NO (n)\n"); printf("2 + 2 x 2 = 8 ?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'n'); printf("2a domanda, rispondi SI (s) o NO (n)\n"); printf("Madrid e' la capitale della Spagna?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'s'); printf("3a domanda, rispondi SI (s) o NO (n)\n"); printf("Un atomo di ossigeno e' formato da due molecole di Ossigeno?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'n'); printf("4a domanda, rispondi SI (s) o NO (n)\n"); printf("Il toro e' il machio della mucca?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'s'); printf("5a domanda, rispondi SI (s) o NO (n)\n"); printf("Totti e' il capitano della Roma?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'s'); printf("6a domanda, rispondi SI (s) o NO (n)\n"); printf("Gli anfibi sanno nuotare?\n"); fflush(stdin); scanf("%c", &x); punteggio(x,'s'); puts("___________________________________________"); printf("\n\nPunteggio ottenuto: %d\n", punti); system("pause"); } void punteggio(char risp_data ,char risp_esatta) { if(risp_data==risp_esatta) { printf("Risposta esatta!\n"); punti++;} else { printf("Risposta errata!\n"); punti--;} }
|
|
|