Problema con programma che crea un quiz di 3 domande.

di il
11 risposte

Problema con programma che crea un quiz di 3 domande.

Ciao ragazzi, dovrei creare una specie di quiz di 3 domande su un argomento a piacere a cui l'utente possa rispondere semplicemente V/F. Ho scritto questo codice, ma da problemi con la seconda domanda, mi visualizza una risposta prima che l'utente l'inserisca... il resto del programma funziona. Sapete aiutarmi? Grazie
/Realizzare un programma che presenti 3 domande sulla musica Rock a cui l'utente possa rispondere vero o falso (v\f). Il punteggio iniziale è 0, ogni risposta esatta vale 1 punto. Al termine si visualizzi il punteggio ottenuto dall'utente.
//		counter = counter + 1;
#include <stdio.h>
#include "stdafx.h"

char risp1;
char risp2;
char risp3;
int counter = 0;

int main()
{
	printf("BENVENUTO AL NOSTRO QUIZ SULLA MUSICA ROCK E SOTTOGENERI!\n\n");

	printf("Domanda n1. Kurt Cobain fu' lo storico leader dei Nirvana. (V\\F)  ");
	scanf_s("%c", &risp1);
	if (risp1 == 'v' or risp1 == 'V')
		printf("Esatto! Cobain fu' chitarrista e cantante dei Nirvana dal 1987 al 1994. (+1 punto)");
	else printf("Risposta sbagliata. Cobain fu' chitarrista e cantante dei Nirvana dal 1987 al 1994. (+0 punti)");

	printf("\n\n\nDomanda n2. La celeberrima traccia 'Dazed and Confused' dei Led Zeppelin e' in realta' una cover. (V\\F)  ");
	scanf_s("%c", &risp2);
	if (risp2 == 'v' or risp2 == 'V')
		printf("Risposta esatta! e' una rielaborazione dell'omonimo brano di Jake Holmes. (+1 punto)");
	else printf("Risposta errata. Dazed and Confused e' una rielaborazione dell'omonimo brano di Jake Holmes. (+0 punti)");
	
    
	printf("\n\n\nDomanda n3. Brian Patrick Carroll (meglio conosciuto come 'Buckethead') fu' il chitarrista con i quali i Guns 'N Roses registrarono il loro album di debutto 'Appetite for Destruction'. (V//F)  ");
	scanf_s("%c", &risp3);
	if (risp3 == 'f' or risp3 == 'F')
		printf("Risposta corretta! Buckethead registro' con i Guns 'N Roses solo l'album 'Chinese Democracy', 'Appetite for Destruction' fu' registrato con lo storico chitarrista dei G'N'R, Slash. (+1 punto)");
	else printf("Risposta errata. Buckethead registro' con i Guns 'N Roses solo l'album 'Chinese Democracy', 'Appetite for Destruction' fu' registrato con lo storico chitarrista dei G'N'R, Slash. (+0 punti)");
	scanf_s("%d");
		

	return 0;
}

11 Risposte

  • Re: Problema con programma che crea un quiz di 3 domande.

    Prova a far seguire ad ogni chiamata a scanf() una chiamata a getchar()...
  • Re: Problema con programma che crea un quiz di 3 domande.

    AldoBaldo ha scritto:


    Prova a far seguire ad ogni chiamata a scanf() una chiamata a getchar()...
    Cosi funziona, grazie ma mi sapresti spiegare perchè il mio codice precedente dava problemi ed invece quello che mi hai suggerito tu no?
  • Re: Problema con programma che crea un quiz di 3 domande.

    Sono stato fuori per una settimana. Rispondo ora.

    Per qualche ragione, scanf() lascia nello stream di input il carattere '\n'; getchar() lo "capta", togliendolo dallo stream di input.
  • Re: Problema con programma che crea un quiz di 3 domande.

    Non "per qualche ragione" come se fosse un bug. Il \n non viene consumato perché nella stringa di formato non compare nulla che indichi che debba essere fatto, quindi rimante nel buffer.
  • Re: Problema con programma che crea un quiz di 3 domande.

    "Qualche ragione" includeva la possibilità di quella ragione lì. Hai fatto bene a precisare.
    A questo punto, però, stuzzichi una domanda: la tua precisazione implica che si può formulare la stringa di formato in scanf() in modo che il '\n' venga "digerito" senza il getchar() successivo? Se sì, come? Con qualcosa tipo "%d\n" o "%s\n"? Con "%d%c" (il %c per intercettare il carattere '\n')? Non ho mai provato, proverò (ci vogliono due minuti). Però se metti qui la risposta può essere utile anche ad altri.
  • Re: Problema con programma che crea un quiz di 3 domande.

    Basta inserire uno spazio prima di %c

    " %c"
  • Re: Problema con programma che crea un quiz di 3 domande.

    Dunque, ipotizzando di voler "ricevere" un intero senza lasciare "pendenze" basta scrivere...

    scanf( "%d %c", &variabile_int, &variabile_char );

    Corretto?
  • Re: Problema con programma che crea un quiz di 3 domande.

    Con un intero non hai il problema del newline ti basta "%d"

    Che vuoi dire?
  • Re: Problema con programma che crea un quiz di 3 domande.

    Intendo rimanere sul tema del '\n' "pendente" che rimane nello stream dopo che ne hai "estratto" l'intero. Quello per eliminare il quale, nella mia prima risposta, ho suggerito di aggiungere un getchar() dopo la scanf().

    Comunque sia, per tagliare la testa al toro, ho provato in prima persona con questi risultati:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n, cInt;
        char c;
    
        scanf( "%d", &n );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e rimane un '\n' nello stream
        */
    
        cInt = getchar();
    
        /*
        con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
        stream (cInt riceve 10) e lo "elimino"
        */
    
        scanf( "%d", &n );
        getchar();
    
        /*
        cosi', con scanf() ricevo l'intero in n e '\n' rimane nello stream
               con getchar() elimino quel '\n' dallo stream stesso, scartandolo
        */
    
        scanf( "%d %c", &n, &c );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e un carattere in c, e
        rimane un '\n' nello stream (come effettivamente mi aspettavo, quello
        spazio "guasta" il risultato, impedendo d'ottenere lo scopo che mi
        prefiggevo di ottenere)
        */
    
        cInt = getchar();
    
        /*
        con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
        stream (cInt riceve 10) e lo "elimino"
        */
    
        scanf( "%d%c", &n, &c );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e '\n' in c, e nello stream
        non rimane nulla; il risultato e' equivalente a usare scanf("%d",&n) e
        getchar() in sequenza, che e' quello che volevo verificare
        */
    
        return 0;
    }
    
  • Re: Problema con programma che crea un quiz di 3 domande.

    In questi casi usa %*c


    scanf("%d%*c", &n);

    scanf("%d %c%*c", &n, &c);
  • Re: Problema con programma che crea un quiz di 3 domande.

    E' vero! Così (con *) non c'è bisogno di passare l'indirizzo di una variabile che "riceva" il carattere, perché il valore corrispondente viene letto e "buttato via". Sì, ricordo di aver letto di quella caratteristica, ma non ho mai avuto bisogno/occasione di usarla.
Devi accedere o registrarti per scrivere nel forum
11 risposte