[C++] Quiz z klasami

Ni3uchwytny
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 15 maja 2020, o 21:35
Płeć: Mężczyzna
wiek: 19

[C++] Quiz z klasami

Post autor: Ni3uchwytny » 15 maja 2020, o 21:43

Witam, mam do napisania program, którego treść jest napisana poniżej, jeżeli ktoś mógłby pomóc w jakiś sposób byłbym bardzo wdzięczny :)
Z góry dziękuję!

Program ma za zadanie wczytać pytania z pliku tekstowego, wyświetlić je w losowej kolejności (wraz
z losową kolejnością odpowiedzi) oraz zebrać odpowiedzi użytkownika. Po zakończonym quizie,
program wyświetla liczbę zdobytych punktów (również procentowo) oraz listę pytań, na które
odpowiedziano źle (wraz z zaznaczeniem odpowiedzi poprawnej i tej, której udzielił użytkownik).
Pytania nie mogą się powtarzać.
Program magazynuje zdobyte informacje w pliku tekstowym: po każdym rozwiązaniu Quizu podlicza
statystykę odpowiedzi poprawnych na dane pytanie.

Poza tym:
 Program powinien posiadać klasy oraz każda definicja klasa powinna być w innym pliku
 Program powinien mieć poprawne zdefiniowane pola private/public (nie wszystkie zmienne
powinny być publiczne).
 Programy powinny mieć zabezpieczenia do wpisywania nie poprawnych danych
Rekrutacja Instytut Matematyczny, Uniwersytet Wrocławski (gif)

Ponury123
Użytkownik
Użytkownik
Posty: 73
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 4 razy
Pomógł: 12 razy

Re: [C++] Quiz z klasami

Post autor: Ponury123 » 16 maja 2020, o 11:26

Hej,
fajne zadanko, zróbmy to krokami, zaznaczam, że fragmenty kodu, które zamieszczę poniżej nie będą w C++ tylko w Javie, powinieneś łatwo je przerobić, sam zbyt dawno nie pisałem w C++ żeby się tego podjąć z marszu:

- program wczytuje pytania wraz z pulą odpowiedzi z pliku tekstowego: i tutaj proponuje CI skorzystać z formatu JSON, znacznie ułatwi to procedurę wczytywania i parsowania danych.

Przykładowa klasa reprezentująca jedno pytanie i jego odpowiedzi może wyglądać tak:

Kod: Zaznacz cały

public class Quiz {

    private String question;
    private List<String> answerList;
    private int countOfCorrectAnswer = 0;

}
W pliku miałbyś więc listę takich obiektów:

Kod: Zaznacz cały

public class JsonData {
	private List<Quiz> quizList;
}
JsonData oczywiście musiałby mieć swoja reprezentację w postaci tego pliku tekstowego, najłatwiej będzie Ci chyba utworzyć ręcznie obiekty Quiz w kodzie, dodać je do listy w obiekcie JsonData, a następnie użyć jakiejś biblioteki aby sparsować ten obiekt do formatu JSON i zapisać wynik do pliku. Potem możesz wykorzystać ten plik tak jak w treści zadania, analogicznie wczytasz dane z pliku i sparsujesz do obiektu JsonData.
Tutaj masz pierwszą lepszą bibliotekę jaką znalazłem do obsługi JSONa dla C++:
https://www.codeproject.com/Articles/20 ... mplemented

- lecimy dalej mamy już nasz plik i przyzwoitą metodę na jego parsowanie, tak sobie myślę, że może lepiej żeby pytania nie były listą Stringów tylko listą takiego oto obiektu:

Kod: Zaznacz cały

public class AnswerData {
	private String answer;
	private boolean isCorrect;
}
dzięki temu znacznie ułatwi to potem napisanie metody do sprawdzenia poprawności odpowiedzi użytkownika. Dobra mamy już dane teraz chcemy, żeby wyświetlały się losowo, zarówno pytania jak i odpowiedzi. Zauważ, że tu i tu mamy listę obiektów więc wystarczy nam jedna dobra metoda do przetasowania listy. Taki pseudo kod mi przychodzi na myśl:
  • 1. pobierz rozmiar listy
    2. zainicjuj obiekt random tak aby zwracał liczby całkowite od zera do rozmiaru listy
    3. losuj liczbę, obiekt pod tym indeksem wstaw do nowej listy
    4. zablokuj możliwość zwrócenia wylosowanego już indeksu(jakaś czarna lista albo zabawa z obiektem random)
    5. powtarzaj aż rozmiar nowej listy nie będzie taki sam jak wejściowej


- ok mamy już obiekt JsonData z wczytanymi danymi w losowej kolejności, teraz w sumie zostało wyświetlenie tego quizu, nie wiem na jakim jesteś etapie, dla mnie najwygodniej było by zrobić jakieś GUI, ale forma tekstowa w terminalu też będzie spoko.

- pytania nie mogą się powtarzać - w naszym podejściu wystarczy przelecieć po wszystkich elementach listy quizList bo lista jest już w losowej kolejności(warunek w poleceniu jest po to bo formę losowości można by załatwić poprzez pobieranie pytania pod losowym indeksem, zamiast sortować całą listę, ale wtedy trzeba obsłużyć sytuację zwrócenia indeksu, który już był, twój wybór co wybierzesz).

- "Po zakończonym quizie, program wyświetla liczbę zdobytych punktów (również procentowo) oraz listę pytań, na które
odpowiedziano źle (wraz z zaznaczeniem odpowiedzi poprawnej i tej, której udzielił użytkownik)." - ogarnijmy sobie najpierw obiekt, w którym takie dane będziemy sobie przechowywać

Kod: Zaznacz cały

public class Result {
	private String userAnswer;
	private String correctAnswer;
}
czyli po każdorazowym udzieleniu odpowiedzi dodajemy do jakieś listy

Kod: Zaznacz cały

List<Result>
nowy element jeśli odpowiedź była zła,
a jeśli była dobra to dla aktualnego obiektu Quiz zwiększamy pole

Kod: Zaznacz cały

private int countOfCorrectAnswer
o 1. Dzięki temu od razu mamy załatwioną część : "po każdym rozwiązaniu Quizu podlicza statystykę odpowiedzi poprawnych na dane pytanie". Po zakończeniu całego quizu zostaję zapisać nam obiekt JsonData powrotem do pliku, będzie on teraz bogatszy o informację o liczbie poprawnych odpowiedzi dla danego pytania.

no i na sam koniec:
  • Program powinien posiadać klasy oraz każda definicja klasa powinna być w innym pliku
    Program powinien mieć poprawne zdefiniowane pola private/public (nie wszystkie zmienne
    powinny być publiczne).
    Programy powinny mieć zabezpieczenia do wpisywania nie poprawnych danych
kilka słów o tym w kolejności:
  • 1. generalnie w programowaniu obiektowym zaleca się żeby dana klasa stanowiła odrębny plik(oczywiście nadal w ramach jednej klasy możesz mieć kilka innych)
    2. chodzi tutaj o hermetyzację zmiennych, np. klasa jest zazwyczaj typu public bo chcemy z jej obiektów skorzystać w innej klasie, no ale już pola tej klasy np. private String userAnswer; powinno być prywatne, dlaczego? Ponieważ chcemy żeby operację na tym polu były wykonywane w ramach tej danej klasy, a nie innych, jeśli potrzebujemy mieć dostęp do tego pola z innych klas to powinno być to zrealizowane za pomocą getterów i setterów.
    3. no tu już kwestia tego jak rozwiążesz kwestię prezentacji tego quizu, jeśli poprzez terminal n to już sam musisz sobie odpowiedzieć na pytanie co chcesz żeby wpisał użytkownik, w przypadku GUI tego problemu mieć nie będziesz bo ogarniesz to poprzez przyciski.
To tyle z mojej strony, miłej implementacji życzę ;)

ODPOWIEDZ