Данные из таблицы в приложение c++ quiz

Я написал код, который показывает вопрос и 4 ответа, прошу выбрать правильный, и проверяет выбор.
Теперь я построю таблицу, которая будет содержать 6 столбцов: question/a/b/c/d / correct_answer , и около сотни строк с моими вопросами. Теперь я хотел бы, чтобы моя программа случайным образом выбрала 5 вопросов из таблицы и показала их пользователю.

Первый вопрос: Можно ли сделать таблицу в Excel и использовать ее в Visual Studio? Если нет, то какое программное обеспечение я должен использовать, чтобы сделать таблицу как это просто, как это возможно, и как реализовать его в мой проект Visual studio? Если да, то как реализовать таблицу Excel в мой проект Visual studio?

Второй вопрос, Какой самый простой код я должен написать, чтобы случайным образом выбрать 5 из 100 вопросов из моей таблицы?

Код вопроса:

int main()
{

    string ans; //Users input
    string cans; //Correct answer, comes from table
    string quest; //Question, comes from table
    string a; // Answers, come from table
    string b;
    string c;
    string 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 correctn";
    }
    else
    {
        cout << "No, correct answer is " << cans << "n";
    }


    return 0;
}

2 ответа

  1. Первая Часть

    Вы можете использовать Excel для редактирования вопросов и их сохранения. Но при сохранении обратите внимание на формат файла.

    Вы хотите сохранить файл Excel как .csvфайл, а .xlsне или .xlsxфайл. Просто перейдите в Файл — > Сохранить файл как ->> и измените тип на>>.csv.

    Это потому, что чтение .csvфайлов намного проще. .csvкаждая ячейка в строке файла разделена запятой (,), а каждая строка-символом newline ('\n').

    Итак, вот пример файла Excel:

    Пример данных в формате Excel

    После того, как я сохраню его как .csvфайл и открою его с помощью текстового редактора (Atom, здесь), он выглядит следующим образом:

    Пример данных в .формат CSV

    После этого вам нужно только написать некоторый код, чтобы прочитать файл.

    Это код, который я использовал (я добавил избыточные комментарии, чтобы сделать код более явным для начинающих):

    #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 strings to store the values in the file
        vector< vector<string> > table;
    
        string line;
    
        //Loop through the entire file (fp)
        //Store all values found until I hit a newline character ('\n') in the string line
        //This loop automatically exits when the end-of-file is encountered
        while (getline(fp, line, '\n')) {
    
            //Create an temporary vector of strings to simulate a row in the excel file
            vector<string> row;
    
            //Now I am passing in this string into a string stream to further parse it
            stringstream ss;
            ss << line;
    
            string part;
    
            //Similar to the outer loop, I am storing each value until I hit a comma into the string 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;
    }
    

    вторая часть

    Чтобы выбрать случайное число, можно использовать этот код (я позаимствовал его из другого ответа)

    #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_distribution<int> uni(min,max); // guaranteed unbiased
    
    auto random_integer = uni(rng);
    

    В отличие от старого метода , это не создает смещения в сторону нижнего конца. Однако новый движок доступен только в компиляторах C++11. Так что имейте это в виду. Если вам нужно использовать старый метод, вы можете исправить смещение, следуя этому ответу .

    Чтобы выбрать 5 различных чисел, каждый раз, когда вы генерируете случайное число, храните его в массиве и проверяете, было ли это число уже использовано. Это может предотвратить повторение вопросов.

  2. Чтобы ответить на вопрос 1: в Excel выберите Файл>Сохранить как. Выберите UTF-16 Unicode Text (.txt), назовите свой файл и сохраните его там, где программа может получить к нему доступ. В программе C++ используйте библиотеку fstream для текстовых файлов:

    #include <fstream>
    

    Если текстовый файл находится в том же каталоге, используйте

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

    Чтобы ответить на вопрос 2: существует функция rand (), которая возвращает целое число между нулем и RAND_MAX. Затем вы можете использовать модуль (%), чтобы получить случайное число в нужном диапазоне.

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

    Вот тест, который я сделал, чтобы помочь себе учиться:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstring>
    #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;
    }
    

    вопросы.dat будет иметь такие данные

    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 Katrina occur?
    a.2001
    b.2003
    c.2005
    d.2007,c