s4ros icon

Egzagen

s4ros | PRO | 06/11/17 01:13:17 PM UTC | 0 ⭐ | 466 👁️ | Never ⏰ | []
C++ |

4.33 KB

|

None

|

0 👍

/

0 👎

#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