#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
void wczytywanie_pytan();
void wczytywanie_odpowiedzi();
void wypisz();
using namespace std;
const int ilosc_pytan = 5; //Wygodniej zmieniać rozmiar tablic oraz wygodniej do zrozumienia dla czytającego kod.
string odpA[ilosc_pytan], odpB[ilosc_pytan], odpC[ilosc_pytan], odpD[ilosc_pytan], popr[ilosc_pytan], pytania[ilosc_pytan], odp;
//int punkty = 0; Brak powodów aby była zmienną globalną. Zadeklaruj w funkcji wypisz(), gdzie jest wykorzystywana. Punkty będą liczone od 0 za każdym wywołaniem funkcji wypisz().
int main () {
/* WCZYTANIE DANYCH */
wczytywanie_pytan();
wczytywanie_odpowiedzi();
/* WYPISANIE DANYCH */
wypisz();
return 0;
}
void wczytywanie_pytan () {
fstream plik;
//string linia; Wygodniej zadeklarować przed for, ponieważ tylko tam bedzie używana
//int numer = 0; Brak potrzeby na tę zmienną kiedy pętla while zostanie zastąpiona pętlą for
plik.open("pytania.txt", ios::in); // otwarcie pliku "pytania.txt"
if ( plik.good() == false ) { // sprawdzanie czy plik istnieje
cout << "Niepoprawna sciezka pliku!" << endl;
//Sleep(2000);
exit(0);
}
string linia;
//while(getline(plik, linia)) { //wygodniej zastąpić pętlą for
//Tu jest błąd. Problem występuje kiedy w pliku jest więcej linii niż ilosc_pytan. Dlaczego?
for ( int numer = 0; getline(plik, linia); ++numer) {
pytania[numer] = linia;
//numer++;
}
plik.close(); // zamkniecie pliku "pytania.txt"
}
void wczytywanie_odpowiedzi () {
//fstream plik; Brak potrzeby
//string linia;Brak potrzeby deklaracji tych zmiennych. Są za daleko od miejsca, w którym są wykorzystywane oraz są wykorzystywane tylko jako zmienne tymczasowe;
//int numer = 0, licznik = 1;
//Czytelniejsza wersja. Dlaczego?
fstream plik("odpowiedzi.txt", ios::in); // otwarcie pliku "odpowiedzi.txt"
//Drugi raz wykorzystujesz ten kod. Wygodniej byłoby go przenieść do funkcji.
if (plik.good() == false) { // sprawdzanie czy plik istnieje
cout << "Niepoprawna sciezka pliku!" << endl;
//Sleep(2000);
exit(0);
}
/*
while (getline(plik, linia)) {
switch (licznik) {
case 1: odpA[numer] = linia; break;
case 2: odpB[numer] = linia; break;
case 3: odpC[numer] = linia; break;
case 4: odpD[numer] = linia; break;
case 5: popr[numer] = linia; break;
}
//Rozsądniej by to było stałą z nazwą lub oznaczone komentarzem, co oznacza. Inaczej to magiczna liczba, której znaczenie trzeba sie domyślać.
if (licznik == 5) {
licznik = 0;
numer++;
}
licznik++;
}*/
//Czytelniej ponieważ wszystkie zmienne są blisko na miejscu
string linia;
for( int numer = 0, licznik = 1; getline(plik, linia); ++licznik ) {
switch (licznik) {
case 1: odpA[numer] = linia; break;
case 2: odpB[numer] = linia; break;
case 3: odpC[numer] = linia; break;
case 4: odpD[numer] = linia; break;
case 5: popr[numer] = linia; break;
}
if (licznik == 5) {
licznik = 0;
++numer;
}
}
plik.close(); // zamkniecie pliku "odpowiedzi.txt"
}
void wypisz () {
int punkty = 0;
for (int i = 0; i < 5; i++) {
cout << i+1 << ". " << pytania[i] << endl;
cout << "a)" << odpA[i] << endl;
cout << "b)" << odpB[i] << endl;
cout << "c)" << odpC[i] << endl;
cout << "d)" << odpD[i] << endl;
cout << "Twoja odpowiedz: ";
cin >> odp;
transform(odp.begin(), odp.end(), odp.begin(), ::tolower);
if(odp == popr[i]) {
cout << "Dobra odpowiedz! Zdobywasz punkt" << endl;
punkty++;
}
else
cout << "Niestety, to nie jest poprawna odpowiedz. Jest nia: " << popr[i] << endl;
}
cout << "Koniec quizu. Stan twojego konta z punktami to: " << punkty << "/5";
}