Advertisement
adnanj

PRII - Ispit od 12. 7. 2017. god.

Jul 22nd, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4.  
  5. /*
  6. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  7. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  8. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  9. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  10. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
  11. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  12. */
  13. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  14. #pragma warning(disable:4996)
  15.  
  16. char * crt = "\n-------------------------------\n";
  17.  
  18. struct Kandidat {
  19.     char * _imePrezime;
  20.     char _JMBG[14];
  21.     void Unos(char * ip, char * jmbg) {
  22.         _imePrezime = new char[strlen(ip) + 1];
  23.         strcpy_s(_imePrezime, strlen(ip) + 1, ip);
  24.         // Preporuka je korištenje funkcije "strncpy_s" koja kopira prvih "n" karaktera, time sprječavajući prekoračenje.
  25.         strcpy_s(_JMBG, jmbg); // -> strncpy_s(_JMBG, jmbg, 13);
  26.     }
  27.     void Dealociraj() {
  28.         delete[] _imePrezime; _imePrezime = nullptr;
  29.     }
  30.     void Ispis() {
  31.         cout << _imePrezime << " " << _JMBG << " ";
  32.     }
  33. };
  34.  
  35. struct Pitanje {
  36.     char * _tekstPitanja;
  37.     char * _odgovori[10];//maksimalno 10 odgovora
  38.     int _tacni[10];
  39.     /*lokacije tacnih odgovora - svako pitanje moze imati jedan ili vise tacnih odgovora, a njihove lokacije se pohranjuju u niz _tacni*/
  40.     int _bodova;
  41.     /*ako pitanje ima vise tacnih odgovora, onda se broj osvojenih bodova (tokom izrade testa) odredjuje na osnovu broj tacnih odgovora
  42.     (npr. ako pitanje nosi 5 boda i ima 2 tacna odgovora, a student oznaci 1 tacan odgovor onda ce osvojeni broj bodova na tom pitanju
  43.     iznositi 2.5. drugim rijecima, vrijednost ovog atributa je bitna zbog odredjivanja uspjeha kandidata prilikom izrade ispita)*/
  44.  
  45.     void Unos(char * tekstPitanja, int bodova) {
  46.         _tekstPitanja = new char[strlen(tekstPitanja) + 1];
  47.         strcpy_s(_tekstPitanja, strlen(tekstPitanja) + 1, tekstPitanja);
  48.         /*umjesto dodavanja brojaca iskoristite defaultne vrijednosti clanova niza kako biste manipulisali njihovim vrijednostima (dodavanje, uklanjanje)*/
  49.         for (size_t i = 0; i < 10; i++) {
  50.             _odgovori[i] = nullptr;
  51.             _tacni[i] = -1;
  52.         }
  53.         _bodova = bodova;
  54.     }
  55.  
  56.     void Ispis(int redniBroj = 0)
  57.     {
  58.         cout << crt;
  59.         if (redniBroj == 0)
  60.             cout << _tekstPitanja;
  61.         else
  62.             cout << redniBroj << ". " << _tekstPitanja;
  63.         cout << crt;
  64.         for (int i = 0; _odgovori[i] != nullptr; i++)
  65.         {
  66.             cout << i + 1 << ". " << _odgovori[i];
  67.  
  68.             if (_odgovori[i + 1] != nullptr)
  69.                 cout << endl;
  70.         }
  71.         cout << crt;
  72.     }
  73.     void Dealociraj() {
  74.  
  75.         delete[] _tekstPitanja; _tekstPitanja = nullptr;
  76.         for (size_t i = 0; i < 10; i++)
  77.         {
  78.             if (_odgovori[i] == nullptr)
  79.                 break;
  80.             delete[] _odgovori[i]; _odgovori[i] = nullptr;
  81.         }
  82.     }
  83.    
  84.     bool AddOdgovor(char * odgovor, bool tacan)
  85.     {
  86.         for (size_t i = 0; i < 10; i++)
  87.         {
  88.             if (_odgovori[i] == nullptr)
  89.             {
  90.                 int vel = strlen(odgovor) + 1;
  91.                 _odgovori[i] = new char[vel];
  92.                 strcpy_s(_odgovori[i], vel, odgovor);
  93.  
  94.                 if (tacan)
  95.                     for (size_t j = 0; j < 10; j++)
  96.                         if (_tacni[j] == -1) { _tacni[j] = i; break; }
  97.                 return true;
  98.             }
  99.             else if (strcmp(_odgovori[i], odgovor) == 0)
  100.                 return false;
  101.         }
  102.         return false;
  103.     }
  104.  
  105.     bool RemoveOdgovor(int lokacija)
  106.     {
  107.         lokacija--;
  108.         int tacan = VratiLokacijuAkoJeTacan(lokacija), brojTacnihOdgovora(0), brojOdgovora(0);
  109.         PostaviBrojTacnihOdgovoraIBrojOdgovora(brojTacnihOdgovora, brojOdgovora);
  110.         if (lokacija < 0 || lokacija >= 10 || _odgovori[lokacija] == nullptr || tacan != -1 && brojTacnihOdgovora == 1)
  111.             return false;
  112.  
  113.         delete[] _odgovori[lokacija];
  114.         for (int i = lokacija; i < brojOdgovora; i++)
  115.             _odgovori[i] = _odgovori[i + 1];
  116.  
  117.         if(tacan != -1)
  118.             for (int i = tacan; i < brojTacnihOdgovora; i++)
  119.                 _tacni[i] = _tacni[i + 1];
  120.         return true;
  121.     }
  122.  
  123.  
  124.     void PostaviBrojTacnihOdgovoraIBrojOdgovora(int& brojTacnih, int& brojOdgovora)
  125.     {
  126.         for (size_t i = 0; i < 10; i++)
  127.         {
  128.             if (_tacni[i] != -1)
  129.                 brojTacnih++;
  130.             if (_odgovori[i] != nullptr)
  131.                 brojOdgovora++;
  132.         }
  133.     }
  134.  
  135.     int VratiLokacijuAkoJeTacan(int lokacija) // funkcija vraća lokaciju odgovora u nizu _tacni ako je odgovor tačan, u suprotnom -1
  136.     {
  137.         for (int i = 0; i < 10; i++) if (_tacni[i] == lokacija) return i;
  138.         return -1;
  139.     }
  140. };
  141. struct PrijemniIspit {
  142.     //kandidati prijavljeni za prijemni ispit
  143.     Kandidat * _prijavljeniKandidati[100];
  144.     /*uspjeh ostvaren na prijemnom ispitu za svakog pojedinog kandidata(prijemnom ispitu moze pristupiti maksimalno 100 kandidata i za svakog od
  145.     njih se cuva ostvareni uspjeh u okviru niza _uspjehKandidata (nakon sto urade ispit tj. nakon sto odgovore na pitanja)*/
  146.     float * _uspjehKandidata[100];
  147.     //prag prolaznosti na prijemnom ispitu npr. 60 procenata
  148.     float _pragProlaznosti;
  149.     float _kazneniBodovi;
  150.     /*vrijednost kazenog boda (npr. 0.30) se mnozi sa svakim netacnim odgovorom na pitanje i oduzima od osvojenih bodova za to pitanje
  151.     (npr. ako pitanje nosi 5 bodova i ima 2 tacna odgovora, a student odabere 1 tacan i 2 netacna odgovora, broj osvojenih bodova ce biti
  152.     1.9 (1 tacan = 2.5; 2 netacna * 0.30 kaznenih = 0.6; 2.5 - 0.6 = 1.9)*/
  153.  
  154.     void Unos(float pragProlaznosti, float kazneniBodovi) {
  155.         _pragProlaznosti = pragProlaznosti;
  156.         _kazneniBodovi = kazneniBodovi;
  157.         /*umjesto dodavanja brojaca iskoristite defaultne vrijednosti clanova niza kako biste manipulisali njihovim vrijednostima (dodavanje, uklanjanje)*/
  158.         for (size_t i = 0; i < 100; i++)
  159.         {
  160.             _prijavljeniKandidati[i] = nullptr;
  161.             _uspjehKandidata[i] = nullptr;
  162.         }
  163.     }
  164.  
  165.     void Dealociraj()
  166.     {
  167.         for (size_t i = 0; i < 100; i++)
  168.         {
  169.             if (_prijavljeniKandidati[i] == nullptr)
  170.                 break;
  171.  
  172.             _prijavljeniKandidati[i]->Dealociraj();
  173.             delete _prijavljeniKandidati[i];
  174.             delete _uspjehKandidata[i];
  175.         }
  176.     }
  177.  
  178.     bool DodajKandidata(Kandidat k)
  179.     {
  180.         for (int i = 0; i < 100; i++)
  181.         {
  182.             if (_prijavljeniKandidati[i] == nullptr)
  183.             {
  184.                 _prijavljeniKandidati[i] = new Kandidat;
  185.                 _prijavljeniKandidati[i]->Unos(k._imePrezime, k._JMBG);
  186.                 return true;
  187.             }
  188.             else if (strcmp(_prijavljeniKandidati[i]->_JMBG, k._JMBG) == 0)
  189.                 return false;
  190.         }
  191.         return false;
  192.     }
  193.  
  194.     bool PokreniIspit(char * JMBG, Pitanje * pitanja, int brojPitanja)
  195.     {
  196.         int indeks(-1);
  197.         for (int i = 0; _prijavljeniKandidati[i] != nullptr && indeks == -1; i++)
  198.             if (strcmp(_prijavljeniKandidati[i]->_JMBG, JMBG) == 0)
  199.                 indeks = i;
  200.  
  201.         if (indeks == -1 || _uspjehKandidata[indeks] != nullptr) return false;
  202.  
  203.         float osvojeniBodovi(0), maksimalnoBodova(0), procenat(0);
  204.         for (size_t i = 0; i < brojPitanja; i++)
  205.         {
  206.             pitanja[i].Ispis(i + 1);
  207.             int brojTacnihOdgovora(0), brojOdgovora(0);
  208.             pitanja[i].PostaviBrojTacnihOdgovoraIBrojOdgovora(brojTacnihOdgovora, brojOdgovora);
  209.            
  210.             if (brojTacnihOdgovora == 0)
  211.             {
  212.                 cout << "GRESKA: Pitanje nema definisane tacne odgovore." << crt;
  213.                 continue;
  214.             }
  215.             else {
  216.                 cout << (brojTacnihOdgovora == 1 ? "Vrsta -> jedan tacan" : "Vrsta -> vise tacnih") << crt;
  217.  
  218.                 int * odgovoriKorisnika = new int[brojOdgovora], brojUnesenih(0), odgovorKorisnika(0), brojTacnoOdgovorenih(0), brojNetacnoOdgovorenih(0);
  219.  
  220.                 do {
  221.                     cout << (brojTacnihOdgovora == 1? "Unesite odgovor" : "Unesite odgovore") << " (0 - prekid): ";
  222.                     cin >> odgovorKorisnika;
  223.  
  224.                     if (odgovorKorisnika == 0)
  225.                         break;
  226.  
  227.                     if (odgovorKorisnika <= 0 || odgovorKorisnika > brojOdgovora)
  228.                     {
  229.                         cout << "GRESKA: Odgovor mora biti u rasponu od 1 do " << brojOdgovora << "." << endl;
  230.                         continue;
  231.                     }
  232.  
  233.                     bool vecOdabrao(false);
  234.                     for (size_t j = 0; j < brojUnesenih; j++)
  235.                         if (odgovorKorisnika - 1 == odgovoriKorisnika[j])
  236.                             vecOdabrao = true;
  237.  
  238.                     if (vecOdabrao)
  239.                     {
  240.                         cout << "GRESKA: Vec ste odabrali navedeni odgovor." << endl;
  241.                         continue;
  242.                     }
  243.  
  244.                     odgovoriKorisnika[brojUnesenih++] = --odgovorKorisnika;
  245.                 } while (brojUnesenih < brojOdgovora && brojTacnihOdgovora > 1 || brojUnesenih == 0);
  246.  
  247.                 for (size_t j = 0; j < brojUnesenih; j++)
  248.                 {
  249.                     bool tacnoOdgovoren(false);
  250.                     for (size_t k = 0; pitanja[i]._tacni[k] != -1 && !tacnoOdgovoren; k++)
  251.                         if (odgovoriKorisnika[j] == pitanja[i]._tacni[k])
  252.                             tacnoOdgovoren = true;
  253.  
  254.                     if (tacnoOdgovoren) brojTacnoOdgovorenih++;
  255.                     else brojNetacnoOdgovorenih++;
  256.                 }
  257.                 osvojeniBodovi += pitanja[i]._bodova * ((float)brojTacnoOdgovorenih / brojTacnihOdgovora) - (brojNetacnoOdgovorenih * _kazneniBodovi);
  258.                 maksimalnoBodova += pitanja[i]._bodova;
  259.             }
  260.         }
  261.  
  262.         procenat = osvojeniBodovi / maksimalnoBodova * 100;
  263.  
  264.         cout << crt << "\t.::REZULTATI::." << crt;
  265.         cout << "Osvojeni bodovi: " << setw(11) <<  osvojeniBodovi << endl;
  266.         cout << "Maksimalno bodova: " <<  setw(9) << maksimalnoBodova << endl;
  267.         cout << "Osvojeni procenat: " << setw(8) << setprecision(4) << procenat << "%" << crt;
  268.  
  269.         if (procenat >= _pragProlaznosti)
  270.             cout << "Uspjesno ste polozili ispit!" << crt;
  271.         else
  272.             cout << "Zao nam je, niste polozili!" << crt;
  273.  
  274.         _uspjehKandidata[indeks] = new float(procenat);
  275.         return true;
  276.     }
  277. };
  278. int main() {
  279.     Kandidat jasmin, adel;
  280.     jasmin.Unos("Jasmin Azemovic", "1111111111111");
  281.     adel.Unos("Adel Handzic", "222222222222");
  282.  
  283.     int brojPitanja = 3;
  284.     Pitanje * pitanja = new Pitanje[brojPitanja];
  285.     //parametri: tekstPitanja, brojBodova
  286.     pitanja[0].Unos("U kojem gradu se nalazi FIT?", 4);
  287.  
  288.     /*dodaje novi odgovor u listu ponudjenih odgovora. onemoguciti ponavljanje odgovora, te voditi racuna da vise odgovora moze biti tacno*/
  289.     //parametri: tekstOdgovora,daLiJeTacanTajOdgovor
  290.     if (pitanja[0].AddOdgovor("Mostar", true))
  291.         cout << "Odgovor uspjesno dodan!" << crt;
  292.     if (pitanja[0].AddOdgovor("Sarajevo", false))
  293.         cout << "Odgovor uspjesno dodan!" << crt;
  294.     if (!pitanja[0].AddOdgovor("Sarajevo", false))//Sarajevo je vec dodano
  295.         cout << "Odgovor nije uspjesno dodan!" << crt;
  296.     if (pitanja[0].AddOdgovor("Tuzla", false))
  297.         cout << "Odgovor uspjesno dodan!" << crt;
  298.     if (pitanja[0].AddOdgovor("Fojnica", false))
  299.         cout << "Odgovor uspjesno dodan!" << crt;
  300.     if (pitanja[0].AddOdgovor("Zenica", false))
  301.         cout << "Odgovor uspjesno dodan!" << crt;
  302.     /*
  303.     na osnovu primljene lokacije uklanja podatke o ponudjenom odgovoru. prilikom uklanjanja ocuvati redoslijed dodavanja odgovora.
  304.     onemoguciti uklanjanje svih tacnih odgovora tj. osigurati da pitanje u svakom momentu posjeduje najmanje jedan tacan odgovor
  305.     */
  306.     if (pitanja[0].RemoveOdgovor(4))//uklanja odgovor Fojnica
  307.         cout << "Odgovor uspjesno uklonjen!" << crt;
  308.  
  309.     /*
  310.     -------------------------------
  311.     1. U kojem gradu se nalazi FIT?
  312.     -------------------------------
  313.     1. Mostar
  314.     2. Sarajevo
  315.     3. Tuzla
  316.     4. Zenica
  317.     -------------------------------
  318.     */
  319.     pitanja[0].Ispis();//prethodno je prikazan ocekivani ispis pitanja
  320.  
  321.     pitanja[1].Unos("Odaberite tacne odgovore.", 5);
  322.  
  323.     if (pitanja[1].AddOdgovor("FIT se nalazi u Mostaru", true))
  324.         cout << "Odgovor uspjesno dodan!" << crt;
  325.     if (pitanja[1].AddOdgovor("FIT je clanica UNMO-a", true))
  326.         cout << "Odgovor uspjesno dodan!" << crt;
  327.     if (pitanja[1].AddOdgovor("U Mostaru je uvijek jako vruce", false))
  328.         cout << "Odgovor uspjesno dodan!" << crt;
  329.  
  330.     pitanja[2].Unos("Studij na FIT-u traje 4 godine?", 2);
  331.     if (pitanja[2].AddOdgovor("Ne", true))
  332.         cout << "Odgovor uspjesno dodan!" << crt;
  333.     if (pitanja[2].AddOdgovor("Da", false))
  334.         cout << "Odgovor uspjesno dodan!" << crt;
  335.     /*....*/
  336.  
  337.     PrijemniIspit prijemni2017;
  338.     //parametri: pragProlaznosti, kazneniBodovi
  339.     prijemni2017.Unos(55, 0.30);
  340.     /*dodaje novog kandidata u listu prijavljenih. onemoguciti dodavanje kandidata sa istim jmbg-om*/
  341.     if (prijemni2017.DodajKandidata(jasmin))
  342.         cout << "Kandidat uspjesno dodan" << crt;
  343.     if (prijemni2017.DodajKandidata(adel))
  344.         cout << "Kandidat uspjesno dodan" << crt;
  345.  
  346.     /*kandidatu sa JMBG 1111111111111 pokrece ispit na nacin da mu se prikazuju pitanja, od njega zahtijevaju odgovori,
  347.     te izracunava ostvareni uspjeh (da li je polozio ili ne, te sa kojim procentom uspjesnosti). prilikom izracuvanja uspjesnosti
  348.     voditi racuna o kaznenim bodovima. po okoncanju ispita, uspjeh kandidata se pohranjuje u niz _uspjehKandidata. za pokretanje
  349.     ispita kandidat prethodno mora biti dodan u listu. po vlastitoj zelji implementirajte naci oznacavanja veceg broja tacnih
  350.     odgovoran na postavljeno pitanje (jedno pitanje moze imati vise tacnih odgovora)*/
  351.     if (prijemni2017.PokreniIspit("1111111111111", pitanja, brojPitanja))
  352.         cout << "Ispit uspjesno okoncan!" << crt;
  353.  
  354.     jasmin.Dealociraj();
  355.     adel.Dealociraj();
  356.     for (size_t i = 0; i < brojPitanja; i++)
  357.         pitanja[i].Dealociraj();
  358.     delete[] pitanja;
  359.     prijemni2017.Dealociraj();
  360.     return 0;
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement