Voglio creare un programma riutilizzabile che creaun test a scelta multipla casuale da un file di testo. Il file di testo contiene la domanda, la risposta e altre risposte errate. Voglio che il programma cerchi parole chiave che identificano parti del file di testo. Ecco come è ora il file di testo (l'esempio è per un test di anatomia ossea):
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 significa domanda 0. Quello che è accanto ad esso tra virgolette è la domanda, la risposta è tra parentesi. W0 e on è la parola banca, che è altre potenziali risposte. Penso che quello di cui ho bisogno è chiamato parser. Sono ancora un principiante, una specie di. Ho solo bisogno di sapere come ottenere il programma per leggere questo file e visualizzarlo correttamente. Non sto chiedendo che il programma sia scritto per me, voglio solo qualche consiglio per fare un parser con questo formato.
risposte:
1 per risposta № 1Innanzitutto prenditi cura delle strutture dati: è una buona pratica. Come puoi vedere, ci possono essere queste strutture:
map<string, int> answers;
struct question {
int id;
string text;
int answer;
}
list<question> questions;
Come vedi, è meglio inserire le risposte nel file prima delle domande, perché? Perché puoi scrivere un programma in questo modo:
- Parse risponde e riempie
answers
carta geografica. - Parse question e fill
questions
. Basta inserire il numero di una risposta inanswers[answer_string]
per ottenere il numero di una risposta corrispondente.
Ora hai tutto per creare un algoritmo. Vediamo come generalmente funziona un parser semplice per questo caso:
- Salta tutti gli spazi.
- Leggi un simbolo
s
. Ses == "W"
quindi leggi il numero di una risposta, altrimenti ses == "Q"
leggi una domanda "numero. - Se
s == """
leggere una stringa "s di domande fino al prossimo" "". - Se
s == "["
leggere una stringa di risposta "s s" fino a "]". - Se
s == "<"
leggi la stringa di una risposta fino a ">".
Basta usare queste regole e otterrai un algoritmo di parsing ricorsivo. Inoltre sarebbe bello leggere parser di discesa ricorsivi per dettagli.
Questo è tutto! Hai strutture dati e un algoritmo, ora puoi scrivere del codice.
E perché non usare un numero per la risposta della domanda al posto della stringa per ridurre le duplicazioni? :-)
0 per risposta № 2
Se fossi in te, userei un formato XML invece di un file di testo. Esistono diversi parser XML gratuiti già disponibili sul mercato, quindi non è necessario scrivere molto codice di analisi.
Un altro vantaggio è che se in seguito si decide di modificare il formato è più facile quindi riscrivere il parser.
Il terzo vantaggio è che le domande e le risposte si accumulano in una gerarchia che si adatta molto bene alle strutture dei dati.