#include <iostream> // std::
#include <fstream> // std::ifstream
#include <vector> // std::vector
#include <cstdlib> // std::random
#include <algorithm> // std::sort
// zlicza liczbe wszystkich odpowiedzi z pliku
// czyli zwraca, ile jest wszystkich pytan na egzaminie
int pobierz_liczbe_pytan()
{
std::ifstream plik("odp.txt");
char c;
int licznik = 0;
while (plik >> c)
{
// std::cout << "Literka: " << c << '\n';
licznik++;
}
plik.close();
return licznik;
}
// funkcja zwraca vector typu <char> z odczytanymi z pliku wartosciami
// odpowiedzi dla poszczegolnych pytan
std::vector<char> pobierz_poprawne_odpowiedzi()
{
std::ifstream plik("odp.txt");
std::vector<char> v;
char c;
while(plik >> c)
{
v.push_back(c);
}
plik.close();
return v;
}
// losuje liczbe z przedzialu <min;max)
int losuj_z_przedzialu(int min, int max)
{
return (std::rand() % max) + min;
}
// funkcja sprawdza, czy podany vector <v> zawiera w sobie liczbe <num>
// true - jesli zawiera
// false - jesli nie zawiera
bool sprawdz_czy_zawiera(std::vector<int> v, int num)
{
// std::cout << "v.size = " << v.size() << '\n';
for(int i=0; i<v.size(); i++)
{
if(v[i] == num)
{
return true;
}
}
return false;
}
// zwraca vector z wylosowanymi z zakresu, unikalnymi (niepowtarzajacymi sie)
// liczbami calkowitymi
std::vector<int> losuj_unikalne_z_przedzialu(int min, int max, int ile)
{
std::vector<int> v;
int ile_wylosowano=0;
while(ile_wylosowano != ile)
{
int wylosowana = losuj_z_przedzialu(min, max);
// std::cout << "Unikalne losowanie: "<< wylosowana << '\n';
if (sprawdz_czy_zawiera(v, wylosowana) == true)
{
continue;
}
else
{
// std::cout << "Wylosowano unikalna liczbe: "<< wylosowana << '\n';
v.push_back(wylosowana);
ile_wylosowano++;
}
}
return v;
}
void print_vector(std::vector<int> v)
{
for(int i=0; i<v.size(); i++)
{
std::cout << "V: "<< v[i] << '\n';
}
}
char losuj_zla_odpowiedz(char poprawna)
{
char odpowiedzi[4] = {'a', 'b', 'c', 'd'};
while(true)
{
int i = std::rand() % 4;
if(poprawna != odpowiedzi[i])
return odpowiedzi[i];
}
}
void zapisz_uczestnika(std::vector<char> v)
{
std::ofstream plik("uczestnik.txt");
for(int i=0; i<v.size(); i++)
{
plik << v[i] << std::endl;
}
plik.close();
}
// ----------------------------------------------------------------------------
// glowny kod
//
int main()
{
// inicjujemy randomizer ;)
srand(time(NULL));
// pobranie liczby wszystkich pytan na egzaminie
int liczba_pytan = 0;
liczba_pytan = pobierz_liczbe_pytan();
int ile_poprawnych = 0;
std::cout << "Ile poprawnych odpowiedzi ma uzyskac uczestnik: ";
std::cin >> ile_poprawnych;
// sprawdzamy, czy dzialanie ma sens
if(ile_poprawnych > liczba_pytan)
{
std::cout << "Liczba poprawnych odpowiedzi nie moze byc wieszka niz liczba pytan!" << '\n';
exit(1);
}
// vector poprawnych odpowiedzi
std::vector<char> odpowiedzi = pobierz_poprawne_odpowiedzi();
// vector z numerami (indeksami) wylosowanych poprawnych odpowiedzi
std::vector<int> unikalne = losuj_unikalne_z_przedzialu(0, liczba_pytan, ile_poprawnych);
// sortujemy vector rosnąco
std::sort(unikalne.begin(), unikalne.end());
// print_vector(unikalne);
std::cout << "----------------------" << '\n';
std::vector<char> uczestnik;
int unikalne_iterator = 0;
for(int i=0; i<liczba_pytan; i++)
{
char dobra_odpowiedz = odpowiedzi[i];
std::cout << i+1 << ". ";
// std::cout << "i:"<<i<<" unikalne["<< unikalne_iterator << "]:"<<unikalne[unikalne_iterator] << '\n';
if(i == unikalne[unikalne_iterator])
{
// std::cout << "Poprawna odpowiedz: "<< dobra_odpowiedz << '\n';
std::cout << ">" << dobra_odpowiedz << "<" << '\n';
unikalne_iterator++;
uczestnik.push_back(dobra_odpowiedz);
}
else
{
char zla_odpowiedz = losuj_zla_odpowiedz(dobra_odpowiedz);
// std::cout << "Zla odpowiedz: "<< zla_odpowiedz << '\n';
std::cout << zla_odpowiedz << '\n';
uczestnik.push_back(zla_odpowiedz);
}
}
// zapisz_uczestnika(uczestnik);
return 0;
}
Comments