fork download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <string>
  6.  
  7. void wczytywanie_pytan();
  8. void wczytywanie_odpowiedzi();
  9. void wypisz();
  10. using namespace std;
  11.  
  12. const int ilosc_pytan = 5; //Wygodniej zmieniać rozmiar tablic oraz wygodniej do zrozumienia dla czytającego kod.
  13.  
  14. string odpA[ilosc_pytan], odpB[ilosc_pytan], odpC[ilosc_pytan], odpD[ilosc_pytan], popr[ilosc_pytan], pytania[ilosc_pytan], odp;
  15. //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().
  16.  
  17. int main () {
  18. /* WCZYTANIE DANYCH */
  19. wczytywanie_pytan();
  20. wczytywanie_odpowiedzi();
  21. /* WYPISANIE DANYCH */
  22. wypisz();
  23.  
  24. return 0;
  25. }
  26.  
  27. void wczytywanie_pytan () {
  28.  
  29. fstream plik;
  30. //string linia; Wygodniej zadeklarować przed for, ponieważ tylko tam bedzie używana
  31. //int numer = 0; Brak potrzeby na tę zmienną kiedy pętla while zostanie zastąpiona pętlą for
  32.  
  33. plik.open("pytania.txt", ios::in); // otwarcie pliku "pytania.txt"
  34.  
  35. if ( plik.good() == false ) { // sprawdzanie czy plik istnieje
  36. cout << "Niepoprawna sciezka pliku!" << endl;
  37. //Sleep(2000);
  38. exit(0);
  39. }
  40.  
  41. string linia;
  42. //while(getline(plik, linia)) { //wygodniej zastąpić pętlą for
  43. //Tu jest błąd. Problem występuje kiedy w pliku jest więcej linii niż ilosc_pytan. Dlaczego?
  44. for ( int numer = 0; getline(plik, linia); ++numer) {
  45. pytania[numer] = linia;
  46. //numer++;
  47. }
  48. plik.close(); // zamkniecie pliku "pytania.txt"
  49.  
  50. }
  51.  
  52. void wczytywanie_odpowiedzi () {
  53. //fstream plik; Brak potrzeby
  54. //string linia;Brak potrzeby deklaracji tych zmiennych. Są za daleko od miejsca, w którym są wykorzystywane oraz są wykorzystywane tylko jako zmienne tymczasowe;
  55. //int numer = 0, licznik = 1;
  56.  
  57. //Czytelniejsza wersja. Dlaczego?
  58. fstream plik("odpowiedzi.txt", ios::in); // otwarcie pliku "odpowiedzi.txt"
  59.  
  60. //Drugi raz wykorzystujesz ten kod. Wygodniej byłoby go przenieść do funkcji.
  61. if (plik.good() == false) { // sprawdzanie czy plik istnieje
  62. cout << "Niepoprawna sciezka pliku!" << endl;
  63. //Sleep(2000);
  64. exit(0);
  65. }
  66.  
  67. /*
  68. while (getline(plik, linia)) {
  69. switch (licznik) {
  70. case 1: odpA[numer] = linia; break;
  71. case 2: odpB[numer] = linia; break;
  72. case 3: odpC[numer] = linia; break;
  73. case 4: odpD[numer] = linia; break;
  74. case 5: popr[numer] = linia; break;
  75. }
  76. //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ć.
  77. if (licznik == 5) {
  78. licznik = 0;
  79. numer++;
  80. }
  81. licznik++;
  82. }*/
  83. //Czytelniej ponieważ wszystkie zmienne są blisko na miejscu
  84. string linia;
  85. for( int numer = 0, licznik = 1; getline(plik, linia); ++licznik ) {
  86. switch (licznik) {
  87. case 1: odpA[numer] = linia; break;
  88. case 2: odpB[numer] = linia; break;
  89. case 3: odpC[numer] = linia; break;
  90. case 4: odpD[numer] = linia; break;
  91. case 5: popr[numer] = linia; break;
  92. }
  93. if (licznik == 5) {
  94. licznik = 0;
  95. ++numer;
  96. }
  97. }
  98.  
  99. plik.close(); // zamkniecie pliku "odpowiedzi.txt"
  100. }
  101.  
  102. void wypisz () {
  103. int punkty = 0;
  104.  
  105. for (int i = 0; i < 5; i++) {
  106. cout << i+1 << ". " << pytania[i] << endl;
  107. cout << "a)" << odpA[i] << endl;
  108. cout << "b)" << odpB[i] << endl;
  109. cout << "c)" << odpC[i] << endl;
  110. cout << "d)" << odpD[i] << endl;
  111.  
  112. cout << "Twoja odpowiedz: ";
  113. cin >> odp;
  114.  
  115. transform(odp.begin(), odp.end(), odp.begin(), ::tolower);
  116.  
  117. if(odp == popr[i]) {
  118. cout << "Dobra odpowiedz! Zdobywasz punkt" << endl;
  119. punkty++;
  120. }
  121. else
  122. cout << "Niestety, to nie jest poprawna odpowiedz. Jest nia: " << popr[i] << endl;
  123. }
  124. cout << "Koniec quizu. Stan twojego konta z punktami to: " << punkty << "/5";
  125. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
Niepoprawna sciezka pliku!