C++ Risposta Con tempo limitato

di il
8 risposte

C++ Risposta Con tempo limitato

Buongiorno a tutti, sono nuovo su questo sito.
Ho scritto un programma in C++. Funziona tutto ma vorrei aggiungere un tempo per l'assegnazione del valore a una variabile(intendo che l'utente ha solo tot secondi per poter rispondere).
Spegato: Per 10 volte genero due numeri naturali interi compresi tra 1 e 20 che si andranno a sommare, l'utente dovrà indovinarne il risultato.
Però quando arrivo a 'cin>>risposta;' il programma giustamente si ferma aspettando una risposta dall'utente, io vorrei fare in modo che questa attesa duri solo 10 secondi e se l'utente non inserisce nessun valore entro quel lasso di tempo allora il programma andrà avanti.

#include <iostream>
#include <windows.h>
#include <time.h>
using namespace std;
int main(){
	int volteTest, num1, num2, risposta, corretta, voto, timer;
	srand(time(NULL));
	for(volteTest=0 ; volteTest<10 ; volteTest++){
		num1 = (rand()%20)+1;
		num2 = (rand()%20)+1;
		cout <<num1 <<" + " <<num2 <<" = ";
//Qui vorrei che l'utente abbia solo 10 secondi per poter rispondere altrimenti la risposta non sarà valida e si andrà alla operazione successiva.
		cin >>risposta;
		cout <<endl;
		corretta = num1 + num2;
		if(risposta==corretta)
			voto++;
	}
	return 0;
}
Abbiate pazienza sono nuovo con c++

8 Risposte

  • Re: C++ Risposta Con tempo limitato

    Non ho capito niente...

    Lo hai fatto tu questo programma oppure no ?

    Cosa non funziona nel programma ?

    Editalo nei tag code, altrimenti diventa poco comprensibile...
  • Re: C++ Risposta Con tempo limitato

    Tralasciando che per me quello è tutt’altro che C++ (le variabili andrebbero dichiarate quando usate, non è C89; l’inutilità dell‘header Windows.h e time.h deprecato).

    Quello che ti serve è confrontare il tempo passato dalla possibilità di input alla lettura di cin. Puoi usare std::time e fare una differenza o std::chrono::steady_clock, differenza e std::chrono::duration.
  • Re: C++ Risposta Con tempo limitato

    Grazie per la risposta, la prossima volta cercherò di essere più chiaro.
  • Re: C++ Risposta Con tempo limitato

    R3Puk ha scritto:


    Grazie per la risposta, la prossima volta cercherò di essere più chiaro.


    Guarda che nel momento in cui si posta un thread in un forum, sarebbe cosa buona portarlo a termine concludendo con la soluzione del problema.
    Non ha senso fare una domanda e uscirsene fuori dopo due messaggi senza avere raggiunto lo scopo.

    Ho notato che hai cambiato completamente (correggendo), tutta la domanda posta inizialmente nel thread.
    Mi fa piacere che tu abbia immediatamente messo il tuo codice nel tag code, un po' meno piacere che tu l'abbia fatto lasciando tutto il codice com'era all'inizio, senza provare a implementare correzioni, ma cambiando completamente la domanda che hai posto, perche' cosi come tu l'hai impostata ora, la domanda si capisce molto meglio, e il senso della risposta che io ti avevo dato subito dopo cambia completamente.

    Comunque tralasciando questo cosa, posso dirti che mancano diversi pezzi di codice per arrivare alla soluzione del tuo problema.
    Una delle principali mancanze e' proprio il controllo sui fatidici 10 secondi.

    Nel codice da te postato chiedi per 10 volte la soluzione ad una somma di due variabili, ma i controlli non esistono proprio...

    1) se invece che un numero, l'utente inserisce un carattere alfanumerico qualsiasi, cosa accade ?
    2) il controllo sui 10 secondi, dopodiche' passati tali, il programma va avanti... dove sono ?
    3) potresti implementare un controllo con un semplice ciclo, ad esempio: do-while... e ovviamente opportune if...

    Tieni presente che esiste la funzione sleep(time), potrebbe ritornarti utile...
  • Re: C++ Risposta Con tempo limitato

    Cosa piu semplice dovresti usare un input da console non bloccante. E nel loop controllare il tempo. Mi pare aver fatto sta cosa anni fa.
  • Re: C++ Risposta Con tempo limitato

    Buonasera ragazzi sono nuovo nel forum scusate ma ho letto il codice e l'argomento mi interessa perché anche io volevo utilizzare questa cosa della risposta entro un tempo limitato in alcuni miei programmi ma non so come fare .
    serve qualche libreria ??
    cosa devo fare per poterlo fare ?? qualcuno può fare un esempio applicato al codice qui sopra ??
  • Re: C++ Risposta Con tempo limitato

    Sotto windows c'è la funzione kbhit() per fare il polling non bloccante dell'evento di pressione di un tasto, poi c'è getch() per leggere il tasto. La libreria è conio.h. In linux non mi ricordo ma sarà qualcosa in ncurses.h

    Per il tempo che passa si può usare chrono come già detto, sennò direttamente un counter che incrementi tu stesso
  • Re: C++ Risposta Con tempo limitato

    E in Lnux, nel caso, si fa cosi (versione senza ncurses)

    https://stackoverflow.com/questions/448944/c-non-blocking-keyboard-input

    Tuttavia, entrambi i metodi (getch, kbhit e linux way) non sono standard, come vedi si usano funzionalita' non portabili.

    Un sistema piu standard, (provato in linux), e' questo
    
    /*
     * Test app (C) Iprogrammatori.it
     */
    
    #include <stdio.h>
    #include <sys/select.h>
    
    /* According to earlier standards */
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main()
    {
    	struct timeval tv;
    	int maxfd, sd = 1;
    	fd_set fds;
    	char c[2];
    
    	for(;;) {
    		FD_ZERO(&fds);
    		FD_SET(sd, &fds); 
    		FD_SET(STDIN, &fds);
    		
    		tv.tv_sec = 10;
    		tv.tv_usec = 0;
    
    		select(sd+1, &fds, NULL, NULL, &tv); 
    
    		if (FD_ISSET(sd, &fds)) {
    			read(sd, &c, 2);
    			printf("User input - stdin %c\n", c[0]);
    		} else {
    			printf("Il tempo e' finito !\n");
    		}
    	}
    
    	return 0;
    }
    
    ?-angelo at dfj in ~/shared using ‹› 19-11-12 - 21:57:13
    ?-? gcc test.c -o test
    ?-angelo at dfj in ~/shared using ‹› 19-11-12 - 21:57:15
    ?-? ./test            
    Il tempo e' finito !
    
    User input - stdin 
    
    ^C
    ?-an
    
    
Devi accedere o registrarti per scrivere nel forum
8 risposte