19/08/09 11:42
Pierga
Sto creando un giochetto per aiutarmi a memorizzare nuovi vocaboli di inglese (e per imparare qualcosa di più su C++). Col tempo ho creato un vocabolario "My EN-ITA Vocabulary.txt" in cui i vari vocaboli sono scritti come:
xxx xxxxx = yy yyyyyy
Quello che vorrei fare é: far si che il programma generi un numero a caso, si posizioni sulla riga del vocabolario corrispondente a tale numero e me la chieda.
Questo è quello che ho fatto:
Il problema è che inizia a leggere dal numero a caso e va solo verso la fine del file vocabolario. Se il generatore casuale dà un numero minore del precedente si blocca, mentre ad ogni domanda dovrebbe ripartire a leggere il vocabolario dall'inizio.
Spero di essere stato chiaro, grazie a chiunque mi illummini la via!
xxx xxxxx = yy yyyyyy
Quello che vorrei fare é: far si che il programma generi un numero a caso, si posizioni sulla riga del vocabolario corrispondente a tale numero e me la chieda.
Questo è quello che ho fatto:
#include <iostream> #include <stdio.h> #include <fstream> #include <string> #include <windows.h> #include <ctime> using namespace std; int main () { int n=0; int righetot=0; int contalinee=0; int divisione; int result=0; int x=0; int num_casuale; int num_cas_prec=0; string line; cout<<"How many terms I have to ask you? "; cin>>n; ifstream myfile; myfile.open ("My EN-ITA Vocabulary.txt", ios::out); if (myfile.is_open()) { //conta le righe del file while (! myfile.eof() ) { getline (myfile,line); righetot=righetot+1; } cout<<"righe totali= "<<righetot<<endl; myfile.close(); } for(int i=0; i < n; i++) { //Genera un numero casuale sempre diverso srand((unsigned)time(NULL)); num_casuale = rand() % righetot+1; while(num_casuale==num_cas_prec){ srand((unsigned)time(NULL)); num_casuale = rand() % righetot+1; } num_cas_prec=num_casuale; cout<<"num casuale: "<<num_casuale<<endl; ifstream myfile2; size_t found; myfile2.open ("My EN-ITA Vocabulary.txt", ios::out); if (myfile2.is_open()) { while (! myfile2.eof() ) { getline (myfile2,line); contalinee=contalinee+1; if (contalinee==num_casuale){ cout<<line<<endl; found=line.find("="); if (found!=string::npos) { cout<<" EN: "<<line.substr(0,found-1)<<endl; char risp[200]; cout<<" ITA: "; cin.getline(risp,200); if(x==0) { cin.getline(risp,200); x=x+1; } if (line.substr(found+2).compare(risp) != 0){ cout<<" Error..."<<endl; } if (line.substr(found+2).compare(risp) == 0){ cout<<" Good!!!"<<endl; result = result+1; } } myfile2.close(); } } } else { cout << "Unable to open file, check what you wrote!"<<endl; } } cout<<endl; cout<<"End of file."<<endl; result=(result*10)/n; cout<<"Score: "<<result<<"/10"<<endl; system("PAUSE"); return 0; }
Il problema è che inizia a leggere dal numero a caso e va solo verso la fine del file vocabolario. Se il generatore casuale dà un numero minore del precedente si blocca, mentre ad ogni domanda dovrebbe ripartire a leggere il vocabolario dall'inizio.
Spero di essere stato chiaro, grazie a chiunque mi illummini la via!
Ultima modifica effettuata da Pierga 19/08/09 11:44
aaa