Advertisement
limun11

6.1 AddRemoveOdgovor-Rjesenje

Jun 9th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.50 KB | None | 0 0
  1. //Izvršiti definiciju funkcija na naèin koji odgovara opisu(komentarima) datom neposredno uz pozive ili nazive funkcija.
  2. //Možete dati komentar na bilo koju liniju code - a koju smatrate da bi trebalo unaprijediti ili da æe eventualno uzrokovati grešku prilikom kompajliranja.
  3. //Takoðer, možete dodati dodatne funkcije koje æe vam olakšati implementaciju programa.
  4.  
  5. #include <iostream>
  6. #include <tuple>
  7. using namespace std;
  8.  
  9. /*
  10. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEÆE BODOVATI
  11. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  12. 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
  13. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  14. 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)
  15. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  16. */
  17. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  18. //LJUBI TE JASKI TVOJ NEMOJ WARNINGE PROIZVODIT CMOK
  19. #pragma warning(disable:4996)
  20.  
  21. const char * crt = "\n-------------------------------\n";
  22. const int MAX_ODGOVORA = 10;
  23.  
  24. char * AlocirajNizKaraktera(const char * sadrzaj) {
  25.     if (sadrzaj == nullptr)
  26.         return nullptr;
  27.     int vel = strlen(sadrzaj) + 1;
  28.     char * temp = new char[vel];
  29.     strcpy_s(temp, vel, sadrzaj);
  30.     return temp;
  31. }
  32. struct Kandidat {
  33.     char * _imePrezime;
  34.     char _JMBG[14];
  35.     void Unos(const char * ip, const char * jmbg) {
  36.         _imePrezime = AlocirajNizKaraktera(ip);
  37.         strcpy_s(_JMBG, jmbg);
  38.     }
  39.     void Dealociraj() {
  40.         delete[] _imePrezime; _imePrezime = nullptr;
  41.     }
  42.     void Ispis() {
  43.         cout << _imePrezime << " " << _JMBG << " ";
  44.     }
  45. };
  46. struct Pitanje {
  47.     char * _tekstPitanja;
  48.     char * _odgovori[MAX_ODGOVORA];//maksimalno 10 odgovora
  49.                                    /* svako pitanje moze imati jedan ili vise tacnih odgovora, a njihove lokacije se pohranjuju u niz _tacni*/
  50.     int _tacni[MAX_ODGOVORA];
  51.     /*ako pitanje ima vise tacnih odgovora, onda se broj osvojenih bodova (tokom izrade testa) odredjuje na osnovu broj tacnih odgovora
  52.     (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 iznositi 2.5.
  53.     drugim rijecima, vrijednost ovog atributa je bitna zbog  odredjivanja uspjeha kandidata prilikom izrade ispita)*/
  54.     int _bodova;
  55.  
  56.     //parametri: tekstPitanja, brojBodova
  57.     void Unos(const char * tekstPitanja, int bodova)
  58.     {
  59.         _tekstPitanja = AlocirajNizKaraktera(tekstPitanja);
  60.         /*umjesto dodavanja brojaca iskoristite defaultne vrijednosti clanova niza kako biste
  61.         manipulisali njihovim vrijednostima (dodavanje, uklanjanje)*/
  62.         for (size_t i = 0; i < MAX_ODGOVORA; i++)
  63.         {
  64.             _odgovori[i] = nullptr;
  65.             _tacni[i] = -1;
  66.         }
  67.         _bodova = bodova;
  68.     }
  69.     void Dealociraj() {
  70.         delete[] _tekstPitanja; _tekstPitanja = nullptr;
  71.         for (size_t i = 0; i < MAX_ODGOVORA; i++) {
  72.             if (_odgovori[i] == nullptr)
  73.                 break;
  74.             delete[] _odgovori[i]; _odgovori[i] = nullptr;
  75.         }
  76.     }
  77.     /*dodaje novi odgovor u listu ponudjenih odgovora.
  78.     onemoguciti ponavljanje odgovora, te voditi racuna da vise odgovora moze biti tacno*/
  79.     //parametri: tekstOdgovora, daLiJeTacanTajOdgovor
  80.     bool AddOdgovor(const char * tekstOdgovora, bool daLiJeTacan)
  81.     {
  82.         for (int i = 0; i < MAX_ODGOVORA; i++)
  83.         {
  84.             if (_odgovori[i] != nullptr)
  85.             {
  86.                 if (strcmp(_odgovori[i], tekstOdgovora) == 0)
  87.                 {
  88.                     cout << "Odgovor vec postoji: " << _odgovori[i] << endl;
  89.                     return false;
  90.                 }
  91.             }
  92.         }
  93.  
  94.         for (int i = 0; i < MAX_ODGOVORA; i++)
  95.         {
  96.             if (_odgovori[i] == nullptr)
  97.             {
  98.                 int size = strlen(tekstOdgovora) + 1;
  99.                 _odgovori[i] = new char[size];
  100.                 strcpy_s(_odgovori[i], size, tekstOdgovora);
  101.  
  102.                 if (daLiJeTacan == true)
  103.                 {
  104.                     _tacni[i] = i;
  105.                 }
  106.                 cout << "dodan odgovor: " << _odgovori[i] << endl;
  107.                 return true;
  108.             }
  109.         }
  110.  
  111.         return true;
  112.     }
  113.  
  114.     /*na osnovu primljene lokacije uklanja podatke o ponudjenom odgovoru.
  115.     prilikom uklanjanja ocuvati redoslijed dodavanja odgovora.
  116.     takodjer, potrebno je onemoguciti uklanjanje svih tacnih odgovora na nacin da se prije njegovog uklanjanja mora unijeti novi tacan odgovor */
  117.     bool RemoveOdgovor(int indexOdgovora)//uklanja odgovor Fojnica
  118.     {
  119.         int brojacTacnih = 0;
  120.         if (_tacni[indexOdgovora] != -1) //-1 znaci nije popunjeno, na pocetku je tako inicijalizovao, gledamo na fazon !=nullptr
  121.         {
  122.             for (int i = 0; i < MAX_ODGOVORA; i++)
  123.             {
  124.                 if (_tacni[i] != -1)//trazim mjesto koje je popunjeno da bih mogla brojati
  125.                 {
  126.                     brojacTacnih++;
  127.                 }
  128.             }
  129.             if (brojacTacnih == 1)
  130.             {
  131.                 cout << "Ima samo jedan tacan odg. ne mozes ga brisati... " << endl;
  132.                 return false;
  133.             }
  134.         }
  135.         cout << "Brise se odgovor: " << _odgovori[indexOdgovora] << endl;
  136.         _tacni[indexOdgovora] = -1;
  137.         delete[] _odgovori[indexOdgovora];
  138.         _odgovori[indexOdgovora] = nullptr;
  139.         return true;
  140.     }
  141.  
  142.     /*
  143.     -------------------------------
  144.     1. U kojem gradu se nalazi FIT?
  145.     -------------------------------
  146.     1. Mostar
  147.     2. Sarajevo
  148.     3. Tuzla
  149.     4. Zenica
  150.     -------------------------------
  151.     */
  152.     //prethodno je prikazan ocekivani ispis pitanja
  153.     void Ispis()
  154.     {
  155.         cout << crt;
  156.         cout << "1. " << _tekstPitanja << crt;
  157.         for (int i = 0; i < MAX_ODGOVORA; i++)
  158.         {
  159.             if (_odgovori[i] != nullptr)
  160.             {
  161.                 cout << i + 1 << ". " << _odgovori[i] << endl;
  162.             }
  163.         }
  164.         cout << crt;
  165.     }
  166. };
  167. struct PrijemniIspit {
  168.     //kandidati prijavljeni za prijemni ispit
  169.     Kandidat * _prijavljeniKandidati;
  170.     /*nakon sto urade ispit tj. nakon sto odgovore na pitanja za svakog od kandidata se cuva ostvareni uspjeh u okviru niza _uspjehKandidata.
  171.     broj elemenata u nizu _uspjehKandidata bi trebao biti identican broju elemenata u nizu _prijavljeniKandidati*/
  172.     float * _uspjehKandidata;
  173.     int _trenutnoKandidata;
  174.     //prag prolaznosti na prijemnom ispitu npr. 60.5 procenata
  175.     float _pragProlaznosti;
  176.     float _kazneniBodovi;
  177.     /*vrijednost kazenog boda (npr. 0.30) se mnozi sa svakim netacnim odgovorom na pitanje i oduzima od osvojenih bodova za to pitanje
  178.     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 1.9
  179.     (1 tacan = 2.5; 2 netacna * 0.30 kaznenih = 0.6; 2.5 - 0.6 = 1.9)*/
  180.  
  181.     void Unos(float pragProlaznosti, float kazneniBodovi) {
  182.         _pragProlaznosti = pragProlaznosti;
  183.         _kazneniBodovi = kazneniBodovi;
  184.         _prijavljeniKandidati = nullptr;
  185.         _uspjehKandidata = nullptr;
  186.         _trenutnoKandidata = 0;
  187.     }
  188.     void Dealociraj() {
  189.         for (size_t i = 0; i < _trenutnoKandidata; i++)
  190.             _prijavljeniKandidati[i].Dealociraj();
  191.         delete[] _prijavljeniKandidati; _prijavljeniKandidati = nullptr;
  192.         delete[] _uspjehKandidata; _uspjehKandidata = nullptr;
  193.     }
  194.  
  195.     /*dodaje novog kandidata u listu prijavljenih.
  196.     onemoguciti dodavanje kandidata sa istim jmbg-om*/
  197.     bool DodajKandidata(Kandidat kandidat)
  198.     {
  199.         for (int i = 0; i < _trenutnoKandidata; i++)
  200.         {
  201.             if (strcmp(_prijavljeniKandidati[i]._JMBG, kandidat._JMBG) == 0)
  202.             {
  203.                 cout << "Isti jmbg dodan. " << endl;
  204.                 return false;
  205.             }
  206.         }
  207.         Kandidat * temp = new Kandidat[_trenutnoKandidata + 1];
  208.         for (int i = 0; i < _trenutnoKandidata; i++)
  209.         {
  210.             temp[i].Unos(_prijavljeniKandidati[i]._imePrezime, _prijavljeniKandidati[i]._JMBG);
  211.         }
  212.         temp[_trenutnoKandidata].Unos(kandidat._imePrezime, kandidat._JMBG);
  213.         for (int i = 0; i < _trenutnoKandidata; i++)
  214.         {
  215.             _prijavljeniKandidati[i].Dealociraj();
  216.         }
  217.         delete[] _prijavljeniKandidati;
  218.         _prijavljeniKandidati = temp;
  219.         _trenutnoKandidata++;
  220.         return true;
  221.     }
  222.  
  223.     /*kandidatu sa JMBG 1111111111111 pokrece ispit na nacin da mu se prikazuju pitanja, od njega zahtijevaju odgovori, te izracunava ostvareni uspjeh
  224.     (da li je polozio ili ne, te sa kojim procentom uspjesnosti).
  225.  
  226.     prilikom izracuvanja uspjesnosti voditi racuna o kaznenim bodovima. po okoncanju ispita,
  227.  
  228.     uspjeh kandidata se pohranjuje u niz _uspjehKandidata.
  229.  
  230.     za pokretanje ispita kandidat prethodno mora biti dodan u listu.
  231.  
  232.     po vlastitoj zelji implementirajte nacin oznacavanja veceg broja tacnih odgovoran na postavljeno pitanje (jedno pitanje moze imati vise tacnih odgovora)*/
  233.     //kandidat jasmin je vec radio ispit
  234.     bool PokreniIspit(const char * jmbg, Pitanje * pitanja[], int brojPitanja)
  235.     {
  236.         int indeksaKandidata = 0;
  237.         bool jeLiKandidatUListi = false;
  238.         for (int i = 0; i < _trenutnoKandidata; i++)
  239.         {
  240.             if (strcmp(_prijavljeniKandidati[i]._JMBG, jmbg)  == 0)
  241.             {
  242.                 if (_uspjehKandidata != nullptr && (_uspjehKandidata[i]!=0))
  243.                 {
  244.                     cout << "Kandidat vec radio ispit... " << endl;
  245.                     return false;
  246.                 }
  247.                 jeLiKandidatUListi = true;
  248.             }
  249.         }
  250.         if (jeLiKandidatUListi == false)
  251.         {
  252.             cout << "kandidat nije u listi... " << endl;
  253.             return false;
  254.         }
  255.  
  256.         _uspjehKandidata = new float[_trenutnoKandidata];
  257.         for (int i = 0; i < _trenutnoKandidata; i++)
  258.         {
  259.             if (strcmp(_prijavljeniKandidati[i]._JMBG, jmbg) == 0)
  260.             {
  261.                 indeksaKandidata = i;
  262.             }
  263.             //inicijalizuj uspjeh na 0
  264.             _uspjehKandidata[i] = 0;
  265.         }
  266.         int odgovor;
  267.         // od Avde
  268.         for (int i = 0; i < brojPitanja; i++)
  269.         {          
  270.             odgovor = -1;
  271.  
  272.             pitanja[i]->Ispis();
  273.             cout << "Unesi tacne odgovore pojedinacno, ako zelis prekinuti unos unesi '0': ";
  274.             for (int t = 0; t < MAX_ODGOVORA; t++)
  275.             {
  276.                 cin >> odgovor;
  277.                 if (odgovor == 0)
  278.                 {
  279.                     break;
  280.                 }
  281.                 if (odgovor-1 == pitanja[i]->_tacni[t])
  282.                 {
  283.                     _uspjehKandidata[indeksaKandidata] += pitanja[i]->_bodova;
  284.                 }
  285.                 else
  286.                 {
  287.                     _uspjehKandidata[indeksaKandidata] -= _kazneniBodovi;
  288.                 }
  289.             }
  290.         }
  291.         return true;
  292.     }
  293. };
  294.  
  295.  
  296. int main() {
  297.  
  298.     Kandidat jasmin, adel;
  299.     jasmin.Unos("Jasmin Azemovic", "1111111111111");
  300.     adel.Unos("Adel Handzic", "2222222222222");
  301.  
  302.     const int brojPitanja = 3;
  303.     Pitanje * pitanja[brojPitanja];
  304.     for (size_t i = 0; i < brojPitanja; i++)
  305.         pitanja[i] = new Pitanje;
  306.  
  307.     //parametri: tekstPitanja, brojBodova
  308.     pitanja[0]->Unos("U kojem gradu se nalazi FIT?", 4);
  309.  
  310.     /*dodaje novi odgovor u listu ponudjenih odgovora. onemoguciti ponavljanje odgovora, te voditi racuna da vise odgovora moze biti tacno*/
  311.     //parametri: tekstOdgovora, daLiJeTacanTajOdgovor
  312.     if (pitanja[0]->AddOdgovor("Mostar", true))
  313.         cout << "Odgovor uspjesno dodan!" << crt;
  314.     if (pitanja[0]->AddOdgovor("Sarajevo", false))
  315.         cout << "Odgovor uspjesno dodan!" << crt;
  316.     if (!pitanja[0]->AddOdgovor("Sarajevo", false))//Sarajevo je vec dodano
  317.         cout << "Odgovor nije uspjesno dodan!" << crt;
  318.     if (pitanja[0]->AddOdgovor("Tuzla", false))
  319.         cout << "Odgovor uspjesno dodan!" << crt;
  320.     if (pitanja[0]->AddOdgovor("Fojnica", false))
  321.         cout << "Odgovor uspjesno dodan!" << crt;
  322.     if (pitanja[0]->AddOdgovor("Zenica", false))
  323.         cout << "Odgovor uspjesno dodan!" << crt;
  324.     /*na osnovu primljene lokacije uklanja podatke o ponudjenom odgovoru. prilikom uklanjanja ocuvati redoslijed dodavanja odgovora. takodjer,
  325.     potrebno je onemoguciti uklanjanje svih tacnih odgovora na nacin da se prije njegovog uklanjanja mora unijeti novi tacan odgovor */
  326.     if (pitanja[0]->RemoveOdgovor(4))//uklanja odgovor Fojnica
  327.         cout << "Odgovor uspjesno uklonjen!" << crt;
  328.  
  329.     /*
  330.     -------------------------------
  331.     1. U kojem gradu se nalazi FIT?
  332.     -------------------------------
  333.     1. Mostar
  334.     2. Sarajevo
  335.     3. Tuzla
  336.     4. Zenica
  337.     -------------------------------
  338.     */
  339.     pitanja[0]->Ispis();//prethodno je prikazan ocekivani ispis pitanja
  340.  
  341.     pitanja[1]->Unos("Odaberite tacne odgovore.", 5);
  342.  
  343.     if (pitanja[1]->AddOdgovor("FIT se nalazi u Mostaru", true))
  344.         cout << "Odgovor uspjesno dodan!" << crt;
  345.     if (pitanja[1]->AddOdgovor("FIT je clanica UNMO-a", true))
  346.         cout << "Odgovor uspjesno dodan!" << crt;
  347.     if (pitanja[1]->AddOdgovor("U Mostaru je uvijek jako vruce", false))
  348.         cout << "Odgovor uspjesno dodan!" << crt;
  349.  
  350.     pitanja[2]->Unos("Studij na FIT-u traje 4 godine?", 3);
  351.     if (pitanja[2]->AddOdgovor("Ne", true))
  352.         cout << "Odgovor uspjesno dodan!" << crt;
  353.     if (pitanja[2]->AddOdgovor("Da", false))
  354.         cout << "Odgovor uspjesno dodan!" << crt;
  355.     /*....*/
  356.  
  357.  
  358.     PrijemniIspit prijemni2018;
  359.     //parametri: pragProlaznosti, kazneniBodovi
  360.     prijemni2018.Unos(60, 0.30);
  361.     /*dodaje novog kandidata u listu prijavljenih. onemoguciti dodavanje kandidata sa istim jmbg-om*/
  362.     if (prijemni2018.DodajKandidata(jasmin))
  363.         cout << "Kandidat uspjesno dodan" << crt;
  364.     if (prijemni2018.DodajKandidata(adel))
  365.         cout << "Kandidat uspjesno dodan" << crt;
  366.  
  367.     /*kandidatu sa JMBG 1111111111111 pokrece ispit na nacin da mu se prikazuju pitanja, od njega zahtijevaju odgovori, te izracunava ostvareni uspjeh
  368.     (da li je polozio ili ne, te sa kojim procentom uspjesnosti). prilikom izracuvanja uspjesnosti voditi racuna o kaznenim bodovima. po okoncanju ispita,
  369.     uspjeh kandidata se pohranjuje u niz _uspjehKandidata. za pokretanje ispita kandidat prethodno mora biti dodan u listu. po
  370.     vlastitoj zelji implementirajte nacin oznacavanja veceg broja tacnih odgovoran na postavljeno pitanje (jedno pitanje moze imati vise tacnih odgovora)*/
  371.     if (prijemni2018.PokreniIspit("1111111111111", pitanja, brojPitanja))
  372.         cout << "Ispit uspjesno okoncan!" << crt;
  373.     if (!prijemni2018.PokreniIspit("1111111111111", pitanja, brojPitanja))//kandidat jasmin je vec radio ispit
  374.         cout << "Kandidat je vec polagao prijemni ispit!" << crt;
  375.  
  376.     if (prijemni2018.PokreniIspit("2222222222222", pitanja, brojPitanja))
  377.         cout << "Ispit uspjesno okoncan!" << crt;
  378.  
  379.     Kandidat * najbolji = nullptr;
  380.     float uspjeh = 0;
  381.     /*getNajbolji student je lambda funkcija koja treba vratiti podatke o studentu koji je ostvario najbolji uspjeh na prijemnom ispitu*/
  382.     auto getNajboljiStudent = [&]()
  383.     {
  384.         Kandidat * najbolji = nullptr;
  385.         float uspjeh = 0;
  386.         pair <Kandidat*, float> rezultat;
  387.  
  388.         for (int i = 0; i < prijemni2018._trenutnoKandidata; i++)
  389.         {
  390.             if (&prijemni2018._prijavljeniKandidati[i]!=nullptr && (&prijemni2018._uspjehKandidata[i]!=nullptr))
  391.             {
  392.                 if (prijemni2018._uspjehKandidata[i] > uspjeh)
  393.                 {
  394.                     uspjeh = prijemni2018._uspjehKandidata[i];
  395.                     najbolji = &prijemni2018._prijavljeniKandidati[i];
  396.                 }
  397.             }
  398.         }
  399.         rezultat = make_pair(najbolji, uspjeh);
  400.         return rezultat;
  401.     };
  402.     tie(najbolji, uspjeh) = getNajboljiStudent();
  403.     if (najbolji != nullptr)
  404.         cout << "Najbolji uspjeh od " << uspjeh << " % ostvario je kandidat " << najbolji->_imePrezime << "." << endl;
  405.  
  406.  
  407.     jasmin.Dealociraj();
  408.     adel.Dealociraj();
  409.     for (size_t i = 0; i < brojPitanja; i++) {
  410.         pitanja[i]->Dealociraj();
  411.         pitanja[i] = nullptr;
  412.     }
  413.  
  414.     system("PAUSE");
  415.     return 0;
  416. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement