我想创建一个可重用的程序,用于从文本文件中创建随机多项选择测试。文本文件将包含问题,答案和其他错误答案。我希望程序搜索标识文本文件部分的关键字。以下是文本文件的现状(该示例适用于骨骼解剖测试):
Q0 "What bone is the supraorbital foramen found on?" [Frontal Bone]
Q1 "What bone is the Sella Turcica found on?" [Sphenoid Bone]
Q2 "What bone is the Crista Galli found on?" [Cribriform Plate]
Q3 "What bone is the Foramen Magnum found on?" [Occipital Bone]
Q4 "What bone is next to the Ulna?" [Radius]
W0 <Frontal Bone>
W1 <Sella Turcica>
W2 <Carpals>
W3 <Temporal Bone>
W4 <Femur>
W5 <Ulna>
W6 <Sphenoid Bone>
W7 <Crista Galli>
W8 <Cribriform Plate>
W9 <Mandible>
W10 <Radius>
W11 <Foramen Magnum>
W12 <Occipital Bone>
W13 <Leg>
W14 <Arm>
Q0表示问题0.引号旁边的是问题,答案在括号中。 W0和on是单词bank,这是其他潜在的答案。我认为我需要的是一个解析器。我还是个初学者。我只需要知道如何让程序读取该文件并正确显示。我并没有要求为我编写程序,我只是想要一些建议使用这种格式的解析器。
答案 0 :(得分:1)
首先要处理数据结构 - 这是一个很好的做法。如您所见,可能存在以下结构:
map<string, int> answers;
struct question {
int id;
string text;
int answer;
}
list<question> questions;
如您所见,最好在问题之前将答案放在档案中。为什么?因为你可以通过这种方式编写程序:
answers
地图。questions
。只需在answers[answer_string]
中输入答案号码即可获得相应答案的编号。现在您可以创建一个算法。 让我们看看在这种情况下通常如何为一个简单的解析器工作:
s
。如果s == 'W'
则读取答案的号码。如果s == 'Q'
读取问题的编号,则另外。s == '"'
读取问题的字符串,直到下一个'“'。s == '['
读取问题的答案字符串,直到']'。s == '<'
读取答案的字符串,直到'&gt;'。只需使用这些规则,您将获得递归解析算法。另外,关于详细信息,请阅读recursive descent parsers。
这就是全部!您有数据结构和算法。现在你可以编写一些代码。
为什么不使用问题的答案而不是字符串来减少重复? :-)
答案 1 :(得分:0)
如果我是你,我会使用XML格式而不是文本文件。市场上已经有几种免费的XML解析器,所以你不需要编写太多的解析代码。
另一个好处是,如果您以后决定更改格式,则更容易重写解析器。
第三个好处是,你可以在一个非常适合数据结构的层次结构中建立你的问题和答案。