0

我想创建一个可重用的程序,从文本文件中创建随机多项选择测试。文本文件将包含问题、答案和其他不正确的答案。我希望程序搜索标识文本文件部分的关键字。这是文本文件现在的样子(该示例用于骨骼解剖测试):

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 是单词库,这是其他可能的答案。我认为我需要的是一个解析器。我还是一个初学者,有点。我只需要知道如何让程序读取这个文件并正确显示它。我不是要求为我编写程序,我只是想要一些关于制作这种格式的解析器的建议。

4

2 回答 2

1

首先要注意数据结构——这是一个很好的做法。如您所见,可能有以下结构:

map<string, int> answers;

struct question {
    int id;
    string text;
    int answer;
}

list<question> questions;

如您所见,最好将答案放在问题之前的文件中。为什么?因为可以这样写程序:

  1. 解析答案并填写answers地图。
  2. 解析问题并填写questions。只需输入一个答案的编号answers[answer_string]即可获得相应的答案编号。

现在您拥有创建算法的一切。让我们看看通常如何在这种情况下使用简单的解析器:

  1. 跳过所有空格。
  2. 读一个符号s。如果s == 'W'然后阅读答案的编号。否则,如果s == 'Q'阅读问题的编号。
  3. 如果s == '"'在下一个'"'之前读取问题的字符串。
  4. 如果s == '['在 ']' 之前读取问题的答案字符串。
  5. 如果s == '<'在“>”之前读取答案的字符串。

只需使用这些规则,您将获得递归解析算法。此外,最好阅读有关递归下降解析器的详细信息。

就这样!你有数据结构和算法。现在你可以写一些代码了。

为什么不使用数字代替字符串来减少重复?:-)

于 2013-11-01T20:44:21.330 回答
0

如果我是你,我会使用 XML 格式而不是文本文件。市场上已经有几种免费的 XML 解析器,因此您不需要编写太多解析代码。

另一个好处是,如果您以后决定更改格式,那么重写解析器会更容易。

第三个好处是您可以将问题和答案建立在一个非常适合保存在数据结构中的层次结构中。

于 2013-11-04T10:56:36.120 回答