Problema con il tempo in un programma c++

di il
8 risposte

Problema con il tempo in un programma c++

Ho creato un programma in c++ che ti permette di fare un test per vedere quanto veloce scrivi. Mi sono accorto di un singolo problema che non riesco a risolvere. Quando vado a inserire un tempo intero di 1, 2, 3, 4 minuti va benissimo però nel momento in cui inserisco un valore sotto uno, tipo 0,5 per giocare per soli 30 secondi il programma si chiude conclude subito prima che io possa far qualcosa. Essenzialmente non riesco a far si che il programma accetti valori temporali per la durata del gioco che siano sotto 1 minuto. Per caso qualcuno ha dei consigli o delle idee su come modificare il codice senza (se possibile) aggiungere librerie oltre a quelle utilizzate nel codice? Il mio livello informatico è allo stesso livello se non più basso di questo codice.

#include <iostream>//libreria input output
#include <fstream>//libreria per i file
#include <vector>//libreria per i vettori
#include <chrono>//libreria per il tempo + calcoli
#include <clocale>//libreria per i caratteri
#include <random>//libreria per le parole randomizzate
using namespace std; //per non scrivere ogni volta std::
using namespace std::chrono;//stesso motivo sopra
int main()
{
    setlocale(LC_ALL, "italian");//per i caratteri
    string filename = "280000_parole_italiane.txt";//titolo file parole
    random_device rd;//generatore di numeri causali di altà qualità random_device
    unsigned seed = system_clock::now().time_since_epoch().count();//crea un seme che cambia poiche si basa sulla data  00:00:00 UTC di giovedì 1 gennaio 1970. 
    mt19937 gen(seed);//meersenne twister è un algoritmo che genera una sequenza casuale di numeri
    vector<string> dictionary;//come si capisce dal nome questo è il vettore che conterrà le parole
    ifstream file(filename);//input file stream
    string word;//coso per inserire le parole in dictionary
    if (file.is_open())//se il file è aperto
    {
        while (file >> word)//prende una parola dal file e la mette in word fino a quando word è della stessa grandezza del file
        {
            dictionary.push_back(word);//mette la parola
        }
        file.close();//chiude
    }
    else
    {
        cerr << "Impossibile aprire il file " << filename << endl;//dice errore se non riesce a leggere il file
    }
    char giocare = 's';//per riavviare il gioco
    int score = 0;//punteggio
    int personalBest = 0;//punteggio migliore
    bool exitRequested = false;//per uscire prima
    int minutesToPlay;//minuti del gioco
        while (!exitRequested || giocare == 's' || giocare == 'S' )//inizia il gioco
        {
            cout << "Inserisci per quanti minuti vuoi giocare: ";
            cin >> minutesToPlay;
            steady_clock::time_point startTime = steady_clock::now();//inizializzo il tempo adesso
            steady_clock::time_point endTime = startTime + minutes(minutesToPlay);//inizializzo il tempo che indica fino a quando voglio giocare
            int typedWords = 0;//parole giuste scritte
            cout << " Scrivi esci per uscire dal gioco " << " \n " << endl;
            while (steady_clock::now() < endTime)//inizia il timer
            {
                uniform_int_distribution<> dis(0,dictionary.size());//prende un valore casuale
                string word = dictionary[dis(gen)];
                cout << " Scrivi la parola: " << word << " ---> " ;
                string inputWord;
                cin >> inputWord;
                cout<<endl;
                if (inputWord == "esci")//se scrivo esci finisce il programma
                {
                    exitRequested == true;
                    break;
                }
                if (inputWord == word)//se la parola è giusta aggiunge un punto allo score e aumenta di uno le parole giuste
                {
                    typedWords++;
                    score++;
                }
            }
            clock_t duration = duration_cast<minutes>(steady_clock::now() - startTime).count();//calcolo il tempo di durata in caso scrivessi esci
            float typingSpeed = (typedWords / duration);//dice la velocità di scrittura
            cout << " Tempo scaduto! Velocità di battitura: " << typingSpeed << " caratteri al minuto " << " \n " << endl;
            cout << " Tempo scaduto! Velocità di battitura: " << float(typingSpeed/60) << " caratteri al secondo " << endl;
            if (typingSpeed > personalBest)
            {
                personalBest = typingSpeed;
                cout << " Nuovo record personale! " << endl;
            }
            else
            {
                cout << " Record personale attuale: " << personalBest << " caratteri al minuto " << endl;
            }
            cout << " Il tuo punteggio attuale è: " << score << " \n " << endl;
            cout << " Grazie per aver giocato! " << " \n" << endl;
            cout << " Se volessi riprovare inserisci un nuovo tempo dopo aver scritto s o S " << " \n "<< endl;//se volessi rigiocare scrivi s o S
            cout << " Se volessi uscire scrivi n o N " << endl;// se volessi smettere di giocare dovrei scrivere n o N
            cin>>giocare;
            if(giocare != 's' && giocare != 'S')
            {
                break;
            }
        }
    return 0;
}
scusate per la lunghezza però lo trovo molto chiaro e preciso. inserisco anche la versione che pensavo avrebbe funzionato però purtroppo ha fallito. Ho provato a cambiare solo le cose che riguardano il tempo.
#include <iostream>//libreria input output
#include <fstream>//libreria per i file
#include <vector>//libreria per i vettori
#include <chrono>//libreria per il tempo + calcoli
#include <clocale>//libreria per i caratteri
#include <random>//libreria per le parole randomizzate
using namespace std; //per non scivere ogni volta std::
using namespace std::chrono;//stesso motivo sopra
int main()
{
   setlocale(LC_ALL, "italian");//per i caratteri
   string filename = "280000_parole_italiane.txt";//titolo file parole
   random_device rd;//generatore di numeri causali di altà qualità random_device
   unsigned seed = system_clock::now().time_since_epoch().count();//crea un seme che varia visto che ci daun valore nuovo basato sul momento in cui avviamo il programma
   mt19937 gen(seed);//meersenne twister è un algoritmo che genera una sequenza casuale di nunmeri
   vector<string> dictionary;//come si capisce dal nome questo è il vettore che conterrà le parole
   ifstream file(filename);//input file stream
   string word;//coso per inserire le parole in dictionary
   if (file.is_open())//se il file è aperto
   {
       while (file >> word)//prende una prola dal file e la mette in word fino a quando word è della stessa grandessa del file
       {
           dictionary.push_back(word);//mette la parola
       }
       file.close();//chiude
   }
   else
   {
       cerr << "Impossibile aprire il file " << filename << endl;//dice errore se non riesce a leggere il file
   }
   char giocare = 's';//per riavviare il gioco
   int score = 0;//punteggio
   int personalBest = 0;//punteggio migliore
   bool exitRequested = false;//per uscire prima
   float minutesToPlay;//minuti del gioco
       while (!exitRequested || giocare == 's' || giocare == 'S' )//inizia il gioco
       {
           cout << "Inserisci per quanti minuti vuoi giocare: ";
           cin >> minutesToPlay;
           int secondsToPlay = static_cast<int>(minutesToPlay * 60);
           steady_clock::time_point startTime = steady_clock::now();//inizializzo il tempo adesso
           steady_clock::time_point endTime = startTime + seconds(secondsToPlay);//inizializzo il tempo che indica fino a quando voglio giocare
           int typedWords = 0;//parole giuste scritte
           cout << " Scrivi esci per uscire dal gioco " << " \n " << endl;
           while (steady_clock::now() < endTime)//inizia il timer
           {
               uniform_int_distribution<> dis(0,dictionary.size());//prende un valore casuale
               string word = dictionary[dis(gen)];
               cout << " Scrivi la parola: " << word << " ---> " ;
               string inputWord;
               cin >> inputWord;
               cout<<endl;
               if (inputWord == "esci")//se scrivo esci finisce il programma
               {
                   exitRequested == true;
                   break;
               }
               if (inputWord == word)//se la parola è giusta aggiunge un punto allo score e aumenta di uno le parole giuste
               {
                   typedWords++;
                   score++;
               }
           }
           clock_t duration = duration_cast<seconds>(steady_clock::now() - startTime).count();//calcolo il tempo di durata in caso scrivessi esci
           float typingSpeed = (typedWords / duration);//dice la velocità di scrittura
           cout << " Tempo scaduto! Velocità di battitura: " << typingSpeed << " caratteri al minuto " << " \n " << endl;
           if (typingSpeed > personalBest)
           {
               personalBest = typingSpeed;
               cout << " Nuovo record personale! " << endl;
           }
           else
           {
               cout << " Record personale attuale: " << personalBest << " caratteri al minuto " << endl;
           }
           cout << " Il tuo punteggio attuale è: " << score << " \n " << endl;
           cout << " Grazie per aver giocato! " << " \n" << endl;
           cout << " Se volessi riprovare inserisci un nuovo tempo dopo aver scritto s o S " << " \n "<< endl;//se volessi giocare ancora scrivo s o S
           cout << " Se volessi uscire scrivi n o N " << endl;// se volessi smettere di giocare dovrei scrivere n o N
           cin>>giocare;
           if(giocare != 's' && giocare != 'S')
           {
               break;
           }
       }
   return 0;
}

8 Risposte

  • Re: Problema con il tempo in un programma c++

    Se usiuna variabile di tipo int  ovvio che avrai dei problemi con valori decimali.

    O usi un double o calcoli tutto in secondi e non in minuti.

  • Re: Problema con il tempo in un programma c++

    Con double però mi da errore qua: steady_clock::time_point endTime = startTime + minutes(minutesToPlay); se stiamo parlando del primo programma. Anche nel secondo non va con double. dove lo metteresti? grazie dell'aiuto. 

    Sto utilizzando codeblocks magari è l'applicazione che da errori? l'idea sarebbe quella di calcolare in minuti 

  • Re: Problema con il tempo in un programma c++

    Quale errore ti dà? Come puoi correggerlo?  Hai scritto tu quel codice…

    Oppure lavora con un int ma in secondi e dovrai comunque correggere il codice  (cosa che no sarà difficile se hai scritto tutto fino ad ora) 

  • Re: Problema con il tempo in un programma c++

    Il problema è che come puoi vedere nel secondo codice essenzialmente ho fatto quello che mi hai detto ma comunque il codice non va. il tipo di errore quando vado a sostituire int con double nel primo codice è: no matching function for call to ‘std::chrono::duration<long long int, std::ratio<60> >duration(double&)’  . Anche nel secondo programma dà lo stesso problema quando la variabile che viene utilizzata per i calcolare tempo è salvata come double (la variabile che intendo è secondstoplay). tieni conto che il primo codice rispecchia la tua idea di utilizzare double mentre tengo i minuti come variabile principale che però non funziona. Il secondo codice penso rispecchi invece la seconda idea di utilizzare i secondi però non funziona anch'esso sia che io utilizzi double o no.

  • Re: Problema con il tempo in un programma c++

    Che intendi quando dici che non va? io il secondo codice l'ho provato e gli inserimenti funzionano. Devi sistemare solo la parte del calcolo del punteggio.

  • Re: Problema con il tempo in un programma c++

    Dopo aver riprovato il codice sembra andare. Quando dicevo che non andava intendevo che il programma aveva errori o appena avviato dopo aver inserito il tempo concludeva subito. Come dovrei sistemare la parte del punteggio? dopo aver completato il test mi da come risultato sempre 0.

  • Re: Problema con il tempo in un programma c++

    13/01/2024 - ZorroIl Coqueror ha scritto:


    Dopo aver riprovato il codice sembra andare. Quando dicevo che non andava intendevo che il programma aveva errori o appena avviato dopo aver inserito il tempo concludeva subito. Come dovrei sistemare la parte del punteggio? dopo aver completato il test mi da come risultato sempre 0.

    Converti in decimale uno degli operandi della divisione (ho usato double perché sembra essere il tipo di riferimento di clock_t).

    double typingSpeed = (static_cast<double>(typedWords) / duration);

    Un'altra cosa, gli indici del vettore devono andare da 0 a size() - 1, quindi la distribuzione va inizializzata così

    uniform_int_distribution<> dis(0,dictionary.size() -1);

    Infine due cose “inutili”. Per cominciare includi “string” per chiarezza, anche se funziona lo stesso.

    Secondo, siamo pignoli ed evitiamo il costo di copiare le stringhe usando un reference :) 

    const string& word = dictionary[dis(gen)];
  • Re: Problema con il tempo in un programma c++

    13/01/2024 - Alexv ha scritto:


    13/01/2024 - ZorroIl Coqueror ha scritto:


    Dopo aver riprovato il codice sembra andare. Quando dicevo che non andava intendevo che il programma aveva errori o appena avviato dopo aver inserito il tempo concludeva subito. Come dovrei sistemare la parte del punteggio? dopo aver completato il test mi da come risultato sempre 0.

    Converti in decimale uno degli operandi della divisione (ho usato double perché sembra essere il tipo di riferimento di clock_t).

    double typingSpeed = (static_cast<double>(typedWords) / duration);

    Un'altra cosa, gli indici del vettore devono andare da 0 a size() - 1, quindi la distribuzione va inizializzata così

    uniform_int_distribution<> dis(0,dictionary.size() -1);

    Infine due cose “inutili”. Per cominciare includi “string” per chiarezza, anche se funziona lo stesso.

    Secondo, siamo pignoli ed evitiamo il costo di copiare le stringhe usando un reference :) 

    const string& word = dictionary[dis(gen)];

    grazie mille per l'aiuto, era da un bel po' che provavo a risolvere questi problemi. Essendo ancora alle basi mi sei stato veramente d'aiuto nel miglioramento del programma. Grazie

Devi accedere o registrarti per scrivere nel forum
8 risposte