2016-12-31 7 views
0

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

Первый вопрос:, могу ли я сделать свою таблицу в 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 correct\n"; 
    } 
    else 
    { 
     cout << "No, correct answer is " << cans << "\n"; 
    } 


    return 0; 
} 
+0

простой будет загружать данные из текстового файла, один строка за вопрос, вы должны использовать структуру данных, которая поддерживает индексирование по числу, если вам нужно извлекать случайные записи, надеюсь, что это было полезно –

ответ

0

Первая часть

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

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

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

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

Sample Data in Excel format

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

Sample Data in .csv format

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

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

#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; 
} 

Вторая часть

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

#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); 

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

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

+0

Хорошо, спасибо за ваш ответ. Я выполнил ваши шаги, и моя программа очень хорошо печатает мой стол. – Mac

+0

Но как прикрепить части каждой строки (вопросы, ответить a, ответить b и т. Д.) На мои строки, упущенные в начале? – Mac

+0

Ну, я думаю, я нашел решение, но вы можете опубликовать свое, чтобы сравнить. – Mac

0

Чтобы ответить на вопрос 1: В Excel нажмите «Файл»> «Сохранить как». Выберите UIF-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; 

Вот Quizzer я сделал, чтобы помочь себе изучить:

#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; 
} 

questions.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 
+0

Функция rand() создает смещение к нижнему концу. И это очень заметно при работе с даже небольшим диапазоном (1, 100). Итак, если вы не используете компилятор C++ 11, вы можете использовать метод, описанный здесь (http://stackoverflow.com/a/19728404/5055644). И почему бы не использовать 'string' вместо' char'? Вам не нужно беспокоиться о длине строк (или я ошибаюсь, полагая это?) – Apara