Program TEST C++

0

Witam. Piszę program C++, którego zadaniem jest przeprowadzenie testu z angielskiego. Mam pytanko. Muszę losować 20 pytań z puli 100 pytań. Pytania są w pliku .txt. I mam parę pytań:

I. W jaki sposób wylosować 20 pytań jeżeli struktura pliku z pytami wyglądała by w ten sposób:

  1. Pytanie?
    a) ODP b) ODP
    c) ODP d) ODP

Jak uzyskać efekt losowania, że losuje jedno pytanie i czeka na odpowiedź na to pytanie? Bo normalnie wczytując z pliku to wczytuje cały plik, i żeby wpisać odp np. a no to trzeba zjechać na dół aż skończą się pytania

Pozdrawiam

3

Wczytaj pytania do pamięci najpierw a dopiero potem losuj i coś z tymi pytaniami rób.

3

+Wczytywanie: http://melpon.org/wandbox/permlink/4LrFqIIwXSjt7dPT

Czyli...

Struktura pod to sztywniactwo (Serio, tylko abcd? Może kiedyś będzie potrzebne tylko ab? albo aż do f?

struct quiz_item{
	string question;
	
	struct variant_answers{
		string a, b, c, d;
	} variants;
};

Cały zbiór sztywniactwa:

using quiz_items = vector<quiz_item>;

Wczytywanie (Pilnowaniem numerków możesz się zająć, jeśli bardzo Ci przeszkadza ich ignorowanie):

quiz_items load_quiz_items(istream &in){
    quiz_items result;
    
    regex expr(R"((\d+).\s+(.+)?\s+a\)\s+(.*)\s+b\)\s+(.*)\s+c\)\s+(.*)\s+d\)\s+(.*)\s+)");
    const size_t req_matches_count = expr.mark_count()+1;
    while(in){
        string data, line;
	    box(4).times().perform([&]{
            getline(in, line);
            data += line + " ";
        });
        
        smatch match;
        regex_match(data, match, expr);
        
        if(match.size() != req_matches_count){
            throw runtime_error("Invalid quiz item");
        }
        result.push_back({match[1+1], {match[1+2], match[1+3], match[1+4], match[1+5]}});
    }
    return result;
}

Baw się dobrze.
<font size="1">PS. Chciałem zrefaktoryzować to wczytywanie, ale skoro po wrzuceniu wygląda zwięźle, to nie będę strzępił palców.</span>

1 użytkowników online, w tym zalogowanych: 0, gości: 1