2013-11-01 77 views
1

我想創建一個可重用的程序,創建一個文本文件的隨機多項選擇測試。文本文件將保存問題,答案和其他不正確的答案。我想讓程序搜索標識文本文件部分的關鍵字。下面是文本文件,怎麼現在(的例子是針對骨解剖試驗):複雜的C + +文本文件IO

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.1什麼是報價旁邊是個問題,答案是在括號內。 W0和上是單詞庫,這是其他可能的答案。我認爲我需要的是一個解析器。我仍然是一個初學者,有點。我只需要知道如何讓程序讀取這個文件並正確顯示它。我並沒有要求爲我編寫這個程序,我只是想提出一些建議,以便使用這種格式創建解析器。

回答

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 == '<'讀答案的字符,直到‘>’。

只要使用這些規則,你就可以得到一個遞歸解析算法,並且可以閱讀關於recursive descent parsers的更多信息

這就是你所擁有的數據結構和算法現在你可以編寫一些代碼

爲什麼不使用數字作爲問題的答案而不是字符串來減少重複? :-)

0

如果我是你,我會使用XML格式而不是文本文件。市場上已經有幾種免費的XML解析器,所以你不需要編寫太多解析代碼。

另一個好處是,如果您稍後決定更改格式,則可以輕鬆重寫解析器。

第三個好處是你可以在層次結構中建立問題和答案,這個層次結構很適合在數據結構中使用。