2016-12-31 56 views
0

我写这表明一个问题,4答案代码,请选择正确的一个,并检查选择。 现在我将建立一个包含6列的表格:问题/ a/b/c/d/correct_answer,以及大约数百行包含我的问题的表格。现在我想让我的程序随机选择5表中的一个问题并显示给用户。数据转换成C++应用竞猜

第一个问题是,我可以在Excel中执行我的表并使用它,而不是在Visual Studio中吗?如果没有,我应该使用哪种软件来尽可能简单地执行此操作,以及如何将其实施到我的Visual Studio项目中?如果是,如何实现Excel表格到我的Visual Studio项目?

第二个问题是,我应该写什么样的最简单的代码来从我的表中随机选择100个问题中的5个?

问题的代码是:

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文件。只需转到文件 - >另存文件为 - >并将类型更改为.csv

这是因为,阅读.csv文件是一个容易得多。 .csv文件具有在由逗号(,),并且每个行由一个新行('\n')字符分隔行的每个小区。

所以,这里是一个样本Excel文件:

Sample Data in Excel format

后,我将它保存为.csv文件,并使用文本编辑器(凌动,这里)打开它,它看起来是这样的:

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

但是,如何将每行的部分(问题,答案,答案b等)附加到我的字符串开始时删除? – Mac

+0

好吧,我想我找到了一个解决方案,但你可以发布你的比较。 – Mac

0

要回答问题1:在Excel中,单击文件>另存为。选择UTF-16 Unicode文本(.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; 
} 

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)。 为什么不使用字符串而不是'char's?你不必担心字符串的长度(或者我是否错误地假设?) – Apara