Données du tableau en application de quiz C ++

J'ai écrit un code qui montre une question et 4 réponses , request de choisir la bonne et vérifie le choix. Maintenant, je construisais une table qui contiendrait 6 colonnes: question / a / b / c / d / correctif , et une centaine de lignes avec mes questions. Maintenant, j'aimerais que mon programme choisisse au hasard 5 d'une question à partir de la table et qu'elle l'affiche à l'user.

La première question est : puis-je faire ma table dans Excel et l'utiliser comme dans Visual Studio? Sinon, quel logiciel dois-je utiliser pour faire un tableau aussi simple que possible et comment le mettre en œuvre dans mon projet Visual Studio? Si oui, comment implémenter le tableau Excel dans mon projet Visual Studio?

La deuxième question est: quel code le plus simple dois-je écrire pour choisir au hasard 5 des 100 questions de ma table?

Un code d'une question est:

int main() { ssortingng ans; //Users input ssortingng cans; //Correct answer, comes from table ssortingng quest; //Question, comes from table ssortingng a; // Answers, come from table ssortingng b; ssortingng c; ssortingng d; int points; //Amount of points points = 0; cout << "\n" << quest << "\n" << a << "\n" << b << "\n" << c << "\n" << d << "\n"; cout << "Your answer is: "; cin >> ans; if (ans == cans) { points = points + 1; cout << "Yes, it is correct\n"; } else { cout << "No, correct answer is " << cans << "\n"; } return 0; } 

Première partie

Vous pouvez certainement utiliser Excel pour modifier vos questions et les save. Mais lorsque vous l'enregistrez, faites attention au format de file.

Vous souhaitez save votre file Excel en tant que file .csv au lieu du file .xls ou .xlsx . Allez simplement dans Fichier -> Enregistrer le file comme -> et modifiez le type de .csv .

C'est parce que lire des files .csv est beaucoup plus facile. .csv files .csv ont chaque cellule en rangée séparée par une virgule ( , ) et chaque ligne par un caractère de nouvelle ligne ( '\n' ).

Donc, voici un exemple de file Excel:

Exemples de données au format Excel

Après que je l'enregistre en tant que file .csv et l'ouvrez à l'aide d'un éditeur de text (Atom, ici), cela ressemble à ceci:

Exemple de données au format .csv

Ensuite, il suffit d'écrire un code pour lire le file.

C'est le code que j'ai utilisé (j'ai ajouté des commentaires excessifs pour rendre le code plus explicite pour les débutants):

 #include <iostream> #include <fstream> #include <vector> #include <sstream> using namespace std; const int MAX_QUESTIONS = 3; const int COLUMNS = 6; //Question, Options A, B, C, D, Correct Answer int main() { ifstream fp; fp.open("test.csv"); //If file could not be opened if (fp.fail()) { std::cout << "failed to open file" << std::endl; return 1; } //Create a 2D vector of ssortingngs to store the values in the file vector< vector<ssortingng> > table; ssortingng line; //Loop through the entire file (fp) //Store all values found until I hit a newline character ('\n') in the ssortingng line //This loop automatically exits when the end-of-file is encountered while (getline(fp, line, '\n')) { //Create an temporary vector of ssortingngs to simulate a row in the excel file vector<ssortingng> row; //Now I am passing in this ssortingng into a ssortingng stream to further parse it ssortingngstream ss; ss << line; ssortingng part; //Similar to the outer loop, I am storing each value until I hit a comma into the ssortingng part while (getline(ss, part, ',')) { //Add this to the row row.push_back(part); } //Add this row to the table table.push_back(row); } //Print out the entire table to make sure your values are right for (int i = 0; i <= MAX_QUESTIONS; ++i) { for (int j = 0; j < COLUMNS; ++j) { cout << table[i][j] << " "; } cout << endl; } return 0; } 

Deuxième partie

Pour choisir un nombre random, vous pouvez utiliser ce code (je l'ai emprunté à une autre réponse )

 #include <random> std::random_device rd; // only used once to initialise (seed) engine std::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) std::uniform_int_dissortingbution<int> uni(min,max); // guaranteed unbiased auto random_integer = uni(rng); 

Contrairement à l' ancienne méthode , cela ne crée pas de biais vers l'extrémité inférieure. Cependant, le nouveau moteur n'est disponible que dans les compilateurs C ++ 11. Alors garde cela en tête. Si vous devez utiliser l'ancienne méthode, vous pouvez corriger le biais en suivant cette réponse .

Pour choisir 5 nombres différents, chaque fois que vous générez un nombre random, enregistrez-le dans un tableau et vérifiez si ce nombre a déjà été utilisé. Cela peut empêcher la répétition de questions.

Pour répondre à la question 1: Dans Excel, click Fichier> Enregistrer sous. Choisissez UTF-16 Unicode Text (.txt), nommez votre file et enregistrez-le lorsque votre programme peut y accéder. Dans votre programme C ++, utilisez la bibliothèque fstream pour les files text:

 #include <fstream> 

Avec le file text dans le même directory, utilisez

 ifstream fin; fin.open("FILENAME.txt"); . . . fin >> variable; . . . fin.close(); 

Pour répondre à la question 2: Il existe une fonction rand () qui renvoie un integer entre zéro et RAND_MAX. Ensuite, vous pouvez utiliser le module (%) pour get un nombre random dans la plage souhaitée.

 #include <cstdlib> // for srand() and rand() #include <ctime> // for time() . . . srand(time(NULL)); // seed the RNG on seconds . . . var = rand() % ONE_MORE_THAN_MAX; 

Voici un quizz que j'ai fait pour m'aider à étudier:

 #include <iostream> #include <fstream> #include <cstdlib> #include <cssortingng> #include <ctime> using namespace std; const char QUESTIONS_FILE_NAME[] = "questions.dat"; const char QUESTION_ANSWER_SEPARATOR = ','; const char QUESTION_SEPARATOR = '\n'; const short MAX_QUESTION_LENGTH = 300; const short MAX_ANSWER_LENGTH = 300; const short MAX_NUM_QUESTIONS = 300; int main() { char questions[MAX_NUM_QUESTIONS][MAX_QUESTION_LENGTH]; char answers[MAX_NUM_QUESTIONS][MAX_ANSWER_LENGTH]; short counter = 0; short question_choice; char user_answer[MAX_ANSWER_LENGTH]; ifstream fin; fin.open( QUESTIONS_FILE_NAME ); srand(time(NULL)); while(fin.getline( questions[counter], MAX_QUESTION_LENGTH-1, QUESTION_ANSWER_SEPARATOR )) { fin.getline( answers[counter], MAX_ANSWER_LENGTH-1, QUESTION_SEPARATOR ); counter++; } fin.close(); cout << endl << "Press CTRL+C to quit at any time" << endl << endl; while ( counter > 0 ) { question_choice = rand() % counter; cout << endl << questions[question_choice] << " "; cin >> user_answer; if ( strcmp( user_answer, answers[question_choice] ) ) { cout << endl << "Incorrect" << endl << "It was " << answers[question_choice] << endl; strcpy( questions[counter], questions[question_choice] ); strcpy( answers[counter], answers[question_choice] ); counter++; } else { cout << endl << "Correct" << endl; counter--; strcpy( questions[question_choice], questions[counter] ); strcpy( answers[question_choice], answers[counter] ); } } cout << endl << "You Win!!!!" << endl; return 0; } 

questions.dat aurait des données comme celle-ci

 In what year was the Pendleton Civil Service Reform Act enacted? a.1873 b.1883 c.1893 d.1903,b In what year did Hurricane Kasortingna occur? a.2001 b.2003 c.2005 d.2007,c