Advertisement
s4ros

Egzagen

Jun 11th, 2017
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. #include <iostream>         // std::
  2. #include <fstream>          // std::ifstream
  3. #include <vector>           // std::vector
  4. #include <cstdlib>          // std::random
  5. #include <algorithm>        // std::sort
  6.  
  7. // zlicza liczbe wszystkich odpowiedzi z pliku
  8. // czyli zwraca, ile jest wszystkich pytan na egzaminie
  9. int pobierz_liczbe_pytan()
  10. {
  11.   std::ifstream plik("odp.txt");
  12.   char c;
  13.   int licznik = 0;
  14.   while (plik >> c)
  15.   {
  16.     // std::cout << "Literka: " << c << '\n';
  17.     licznik++;
  18.   }
  19.   plik.close();
  20.   return licznik;
  21. }
  22.  
  23. // funkcja zwraca vector typu <char> z odczytanymi z pliku wartosciami
  24. // odpowiedzi dla poszczegolnych pytan
  25. std::vector<char> pobierz_poprawne_odpowiedzi()
  26. {
  27.   std::ifstream plik("odp.txt");
  28.   std::vector<char> v;
  29.   char c;
  30.   while(plik >> c)
  31.   {
  32.     v.push_back(c);
  33.   }
  34.   plik.close();
  35.   return v;
  36. }
  37.  
  38. // losuje liczbe z przedzialu <min;max)
  39. int losuj_z_przedzialu(int min, int max)
  40. {
  41.   return (std::rand() % max) + min;
  42. }
  43.  
  44. // funkcja sprawdza, czy podany vector <v> zawiera w sobie liczbe <num>
  45. // true - jesli zawiera
  46. // false - jesli nie zawiera
  47. bool sprawdz_czy_zawiera(std::vector<int> v, int num)
  48. {
  49.   // std::cout << "v.size = " << v.size() << '\n';
  50.   for(int i=0; i<v.size(); i++)
  51.   {
  52.     if(v[i] == num)
  53.     {
  54.       return true;
  55.     }
  56.   }
  57.   return false;
  58. }
  59.  
  60. // zwraca vector z wylosowanymi z zakresu, unikalnymi (niepowtarzajacymi sie)
  61. // liczbami calkowitymi
  62. std::vector<int> losuj_unikalne_z_przedzialu(int min, int max, int ile)
  63. {
  64.   std::vector<int> v;
  65.   int ile_wylosowano=0;
  66.  
  67.   while(ile_wylosowano != ile)
  68.   {
  69.     int wylosowana = losuj_z_przedzialu(min, max);
  70.     // std::cout << "Unikalne losowanie: "<< wylosowana << '\n';
  71.     if (sprawdz_czy_zawiera(v, wylosowana) == true)
  72.     {
  73.       continue;
  74.     }
  75.     else
  76.     {
  77.       // std::cout << "Wylosowano unikalna liczbe: "<< wylosowana << '\n';
  78.       v.push_back(wylosowana);
  79.       ile_wylosowano++;
  80.     }
  81.   }
  82.   return v;
  83. }
  84.  
  85. void print_vector(std::vector<int> v)
  86. {
  87.   for(int i=0; i<v.size(); i++)
  88.   {
  89.     std::cout << "V: "<< v[i] << '\n';
  90.   }
  91. }
  92.  
  93. char losuj_zla_odpowiedz(char poprawna)
  94. {
  95.   char odpowiedzi[4] = {'a', 'b', 'c', 'd'};
  96.   while(true)
  97.   {
  98.     int i = std::rand() % 4;
  99.     if(poprawna != odpowiedzi[i])
  100.       return odpowiedzi[i];
  101.   }
  102. }
  103.  
  104. void zapisz_uczestnika(std::vector<char> v)
  105. {
  106.   std::ofstream plik("uczestnik.txt");
  107.   for(int i=0; i<v.size(); i++)
  108.   {
  109.     plik << v[i] << std::endl;
  110.   }
  111.   plik.close();
  112. }
  113.  
  114. // ----------------------------------------------------------------------------
  115. // glowny kod
  116. //
  117. int main()
  118. {
  119.   // inicjujemy randomizer ;)
  120.   srand(time(NULL));
  121.  
  122.   // pobranie liczby wszystkich pytan na egzaminie
  123.   int liczba_pytan = 0;
  124.   liczba_pytan = pobierz_liczbe_pytan();
  125.  
  126.   int ile_poprawnych = 0;
  127.   std::cout << "Ile poprawnych odpowiedzi ma uzyskac uczestnik: ";
  128.   std::cin >> ile_poprawnych;
  129.  
  130.   // sprawdzamy, czy dzialanie ma sens
  131.   if(ile_poprawnych > liczba_pytan)
  132.   {
  133.     std::cout << "Liczba poprawnych odpowiedzi nie moze byc wieszka niz liczba pytan!" << '\n';
  134.     exit(1);
  135.   }
  136.  
  137.     // vector poprawnych odpowiedzi
  138.   std::vector<char> odpowiedzi = pobierz_poprawne_odpowiedzi();
  139.  
  140.   // vector z numerami (indeksami) wylosowanych poprawnych odpowiedzi
  141.   std::vector<int> unikalne = losuj_unikalne_z_przedzialu(0, liczba_pytan, ile_poprawnych);
  142.   // sortujemy vector rosnΔ…co
  143.   std::sort(unikalne.begin(), unikalne.end());
  144.   // print_vector(unikalne);
  145.  
  146.   std::cout << "----------------------" << '\n';
  147.   std::vector<char> uczestnik;
  148.  
  149.   int unikalne_iterator = 0;
  150.   for(int i=0; i<liczba_pytan; i++)
  151.   {
  152.     char dobra_odpowiedz = odpowiedzi[i];
  153.     std::cout << i+1 << ". ";
  154.     // std::cout << "i:"<<i<<"    unikalne["<< unikalne_iterator << "]:"<<unikalne[unikalne_iterator] << '\n';
  155.     if(i == unikalne[unikalne_iterator])
  156.     {
  157.       // std::cout << "Poprawna odpowiedz: "<< dobra_odpowiedz << '\n';
  158.       std::cout << ">" << dobra_odpowiedz << "<" << '\n';
  159.       unikalne_iterator++;
  160.       uczestnik.push_back(dobra_odpowiedz);
  161.     }
  162.     else
  163.     {
  164.       char zla_odpowiedz = losuj_zla_odpowiedz(dobra_odpowiedz);
  165.       // std::cout << "Zla odpowiedz: "<< zla_odpowiedz << '\n';
  166.       std::cout << zla_odpowiedz << '\n';
  167.       uczestnik.push_back(zla_odpowiedz);
  168.     }
  169.   }
  170.   // zapisz_uczestnika(uczestnik);
  171.  
  172.   return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement