Advertisement
wiuu23

Zapisnik stavka

Sep 13th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.02 KB | None | 0 0
  1. //Izvršiti definiciju funkcija na naèin koji odgovara opisu(komentarima) datom neposredno uz pozive ili nazive funkcija.7
  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.Takoðer,
  3. //možete dodati dodatne funkcije koje æe vam olakšati implementaciju programa.
  4.  
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. /*
  9. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEÆE BODOVATI
  10. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  11. 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
  12. 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. #pragma warning(disable:4996)
  19.  
  20. /*
  21. u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
  22.  
  23. -------------------------------------------
  24. Datum ispita: 07.09.2018
  25. Predmet: Programiranje II
  26. -------------------------------------------
  27. IZVJESTAJ O ODRZANOM ISPITU
  28. -------------------------------------------
  29. Br indeksa  Ime prezime   Komisijsko***  Ocjena
  30. 16001        A. Joldic        DA        5
  31. 15251        D. Music        NE        7 Ponisteno
  32. 16014        E. Babovic        DA        8
  33. -------------------------------------------
  34. UKUPNO POLOZILO:    2
  35. PROSJECNA OCJENA:    6.67
  36. -------------------------------------------
  37. *** komisijski ispit: ako student pristupa èetvrti put i dalje (raèunajuæi i poništene rezultate)
  38. */
  39.  
  40. const char * crt = "\n-------------------------------------------\n";
  41. const int MAX = 100;
  42.  
  43. char * AlocirajNizKaraktera(const char * sadrzaj) {
  44.     if (sadrzaj == nullptr)
  45.         return nullptr;
  46.     int vel = strlen(sadrzaj) + 1;
  47.     char * temp = new char[vel];
  48.     strcpy_s(temp, vel, sadrzaj);
  49.     return temp;
  50. }
  51. struct Datum {
  52.     int _dan, _mjesec, _godina;
  53.     void Unos(int d, int m, int g) {
  54.         _dan = d;
  55.         _mjesec = m;
  56.         _godina = g;
  57.     }
  58.     void Ispis() {
  59.         cout << _dan << "." << _mjesec << "." << _godina << " ";
  60.     }
  61. };
  62. struct Student {
  63.     char * _imePrezime;
  64.     int _brojIndeksa;
  65.     int _polozioECTS;
  66.  
  67.     void Unos(const char* ime, float indeks) {
  68.         _imePrezime = AlocirajNizKaraktera(ime);
  69.         _brojIndeksa = indeks;
  70.         _polozioECTS = 0;
  71.     }
  72.     void Dealociraj()
  73.     {
  74.         delete[] _imePrezime; _imePrezime = nullptr;
  75.     }
  76.     void DodajECTS(float ects) { _polozioECTS += ects; }
  77.     void UmanjiECTS(float ects) { _polozioECTS -= ects; }
  78.     void Ispis()
  79.     {
  80.         cout << _imePrezime << ", Indeks: " << _brojIndeksa << ", ECTS: " << _polozioECTS << " " << endl;
  81.     }
  82. };
  83.  
  84. struct ZapisnikStavka {
  85.     int _ocjena;
  86.     //ZapisnikStavka æe pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
  87.     Student* _student;
  88.     bool _ponisteno;
  89.     bool _komisijskoPolaganje;
  90.  
  91.     void Unos(Student* student, int ocjena, bool komisijskoPolaganje) {
  92.         _ocjena = ocjena;
  93.         _student = student;
  94.         _komisijskoPolaganje = komisijskoPolaganje;
  95.         _ponisteno = false;
  96.     }
  97.     void Ispis() {
  98.         cout << _student->_imePrezime << "\t" << _ocjena << "\t" << _student->_brojIndeksa << "\t";
  99.         if (_ponisteno)
  100.             cout << " Ponisteno";
  101.         cout << endl;
  102.     }
  103.     void IspisPrintaj()
  104.     {
  105.         cout << _student->_brojIndeksa << "\t\t" << _student->_imePrezime << "\t" << _komisijskoPolaganje << "\t\t" << _ocjena << endl;
  106.     }
  107.     void Dealociraj()
  108.     {
  109.         _student->Dealociraj();
  110.         delete[] _student;
  111.         _student = nullptr;
  112.     }
  113.  
  114. };
  115. struct IspitniZapisnik {
  116.     Datum _datum;
  117.     ZapisnikStavka * _stavke;//svaki put se dodaje po jedna stavka
  118.     int _brojStavki;
  119.     int _ects;
  120.     char * _predmet;
  121.  
  122.     bool dodajZapisnikStavku(ZapisnikStavka stavka)
  123.     {
  124.         ZapisnikStavka * temp = new ZapisnikStavka[_brojStavki + 1];
  125.         for (int i = 0; i < _brojStavki; i++)
  126.         {
  127.             temp[i].Unos(_stavke[i]._student, _stavke[i]._ocjena, _stavke[i]._komisijskoPolaganje);
  128.             temp[i]._ponisteno = _stavke[i]._ponisteno;
  129.         }
  130.         temp[_brojStavki].Unos(stavka._student, stavka._ocjena, stavka._komisijskoPolaganje);
  131.         temp[_brojStavki]._ponisteno = stavka._ponisteno;
  132.         delete[] _stavke;
  133.         _stavke = temp;
  134.         _brojStavki++;
  135.         return true;
  136.     }
  137.     void Unos(Datum & datum, const char* predmet, int ects) {
  138.         _datum = datum;
  139.         _brojStavki = 0;
  140.         _stavke = nullptr;
  141.         _ects = ects;
  142.         _predmet = AlocirajNizKaraktera(predmet);
  143.     }
  144.     void Dealociraj() {
  145.         delete[] _predmet; _predmet = nullptr;
  146.         delete[] _stavke; _stavke = nullptr;
  147.     }
  148.     /*Prosjecnu ocjenu izraèunati koristeæi lambda funkciju. u prosjek raèunati i poništene rezultate (stavke)*/
  149.     float GetProsjecnaOcjena()
  150.     {
  151.         auto lambda = [&]()
  152.         {
  153.             int suma = 0;
  154.             float prosjek = 0;
  155.             for (int i = 0; i < _brojStavki; i++)
  156.             {
  157.                 if (_stavke[i]._ponisteno==true || _stavke[i]._ponisteno == false)
  158.                 {
  159.                     suma += _stavke[i]._ocjena;
  160.                 }
  161.             }
  162.             prosjek = float(suma) / _brojStavki;
  163.             return prosjek;
  164.         };
  165.         return lambda();
  166.     }
  167.     void Ispis()
  168.     {
  169.         cout << "Datum: ";
  170.         _datum.Ispis();
  171.         cout << "Predmet: " << _predmet << " " << "Ects: " << _ects << endl;
  172.     }
  173. };
  174.  
  175. /*unutar objekta tipa Fakultet ce se cuvati podaci o svim studentima i ispitnim zapisnicima, a dodaju se pomocu globalnih funkcija*/
  176. struct Fakultet
  177. {
  178.     //umjesto brojaca koristiti default.ne vrijednosti
  179.     Student* _studenti[MAX] = { nullptr };
  180.     IspitniZapisnik* _zapisnici[MAX] = { nullptr };
  181.  
  182.     void Dealociraj() {
  183.         for (size_t i = 0; i < MAX; i++)
  184.         {
  185.             if (_studenti[i] != nullptr && _zapisnici[i] != nullptr)
  186.             {
  187.                 _studenti[i]->Dealociraj();
  188.                 _zapisnici[i]->Dealociraj();
  189.                 delete _studenti[i]; _studenti[i] = NULL;
  190.                 delete _zapisnici[i]; _zapisnici[i] = NULL;
  191.             }
  192.         }
  193.     }
  194.     /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  195.     zapisnik se nece prikazati ukoliko ne posjeduje niti jednu stavku ili su sve stavke poništene.
  196.     prilikom kreiranja zapisnika iskoristiti funkciju GetProsjecnaOcjena i njenu lambda implementaciju*/
  197.     /*
  198.     u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
  199.  
  200.     -------------------------------------------
  201.     Datum ispita: 07.09.2018
  202.     Predmet: Programiranje II
  203.     -------------------------------------------
  204.     IZVJESTAJ O ODRZANOM ISPITU
  205.     -------------------------------------------
  206.     Br indeksa  Ime prezime   Komisijsko***  Ocjena
  207.     16001        A. Joldic        DA        5
  208.     15251        D. Music        NE        7 Ponisteno
  209.     16014        E. Babovic        DA        8
  210.     -------------------------------------------
  211.     UKUPNO POLOZILO:    2
  212.     PROSJECNA OCJENA:    6.67
  213.     -------------------------------------------
  214.     *** komisijski ispit: ako student pristupa èetvrti put i dalje (raèunajuæi i poništene rezultate)
  215.     */
  216.     bool printaj()
  217.     {
  218.         //uslovi za ne prikazivanje (printanje) funkcije
  219.         int brojPonistenihStavki = 0;
  220.         for (int i = MAX - 1; i >= 0; i--)
  221.         {
  222.             if (_zapisnici[i] != nullptr)
  223.             {
  224.                 for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
  225.                 {
  226.                     if (_zapisnici[i]->_stavke[j]._ponisteno == true)
  227.                     {
  228.                         brojPonistenihStavki++;
  229.                     }
  230.                 }
  231.                 if (brojPonistenihStavki == _zapisnici[i]->_brojStavki)
  232.                 {
  233.                     return false;
  234.                 }
  235.                 if (_zapisnici[i]->_brojStavki == 0)
  236.                 {
  237.                     return false;
  238.                 }
  239.                 break;
  240.             }
  241.         }
  242.         //uslovi za prikazivanje (printanje) funkcije
  243.         cout << crt;
  244.         cout << "Datum ispita: ";
  245.         for (int i = MAX - 1; i >= 0; i--)
  246.         {
  247.             if (_zapisnici[i] != nullptr)
  248.             {
  249.                 _zapisnici[i]->_datum.Ispis();
  250.                 cout << endl;
  251.                 cout << "Predmet: ";
  252.                 cout << _zapisnici[i]->_predmet;
  253.                 cout << crt;
  254.                 cout << "IZVJESTAJ O ODRZANOM ISPITU";
  255.                 cout << crt;
  256.                 cout << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
  257.                 for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
  258.                 {
  259.                     _zapisnici[i]->_stavke[j].IspisPrintaj();
  260.                 }
  261.                 int brojacPolozenih = 0;
  262.                 for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
  263.                 {
  264.                     if (_zapisnici[i]->_stavke[j]._ocjena > 5)
  265.                     {
  266.                         brojacPolozenih++;
  267.                     }
  268.                 }
  269.                 cout << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
  270.                 cout << "PROSJECNA OCJENA: ";
  271.                 cout<<_zapisnici[i]->GetProsjecnaOcjena();
  272.                 cout << crt;
  273.                 cout << "*** komisijski ispit: ako student pristupa èetvrti put i dalje (raèunajuæi i poništene rezultate)" << endl;
  274.                 break;
  275.             }
  276.         }
  277.         return true;
  278.     }
  279. };
  280. /*dodaje podatke o novom studentu u fakultet */
  281. //ne dodaje studenta jer je broj indeksa zauzet
  282. //fakultet, imePrezime, broj indeksa
  283. void dodaj_student(Fakultet &fakultet, const char *ime_prezime, int broj_indexa)
  284. {
  285.     for (int i = 0; i < MAX; i++)
  286.     {
  287.         if (fakultet._studenti[i] == nullptr)
  288.         {
  289.             fakultet._studenti[i] = new Student;
  290.             fakultet._studenti[i]->Unos(ime_prezime, broj_indexa);
  291.             cout << i << ": " << "Dodan: ";
  292.             fakultet._studenti[i]->Ispis();
  293.             return;
  294.         }
  295.         else if (fakultet._studenti[i]->_brojIndeksa == broj_indexa)
  296.         {
  297.             cout << i << ": " << "Broj indeksa je zauzet kod: ";
  298.             fakultet._studenti[i]->Ispis();
  299.             return;
  300.         }
  301.     }
  302. }
  303. /*kraira novi zapisnik*/
  304. //fakultet, datum, predmet, ects krediti
  305. void kreiraj_zapisnik(Fakultet & fakultet, int dan, int mjesec, int godina, const char * predmet, int ects)
  306. {
  307.     Datum datum;
  308.     datum.Unos(dan, mjesec, godina);
  309.     for (int i = 0; i < MAX; i++)
  310.     {
  311.         if (fakultet._zapisnici[i] == nullptr)
  312.         {
  313.             fakultet._zapisnici[i] = new IspitniZapisnik;
  314.             fakultet._zapisnici[i]->Unos(datum, predmet, ects);
  315.             cout << i << ": " << "Dodan zapisnik-> ";
  316.             fakultet._zapisnici[i]->Ispis();
  317.             return;
  318.         }
  319.     }
  320. }
  321. ///*dodaje stavku na posljednji kreiran zapisnik, a ects studenta (_polozioECTS) uveæa ako je student položio ispit. */
  322. ///*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  323. bool dodaj_stavku_na_zapisnik(Fakultet & fakultet, int index, int ocjena)
  324. {
  325.     char * imePrezime = nullptr;
  326.     int ectsStudenta;
  327.     int size = 0;
  328.     ZapisnikStavka stavka;
  329.     Student * studnet = nullptr;
  330.  
  331.     for (int i = 0; i < MAX; i++)
  332.     {
  333.         if (fakultet._studenti[i]->_brojIndeksa == index)
  334.         {
  335.             size = strlen(fakultet._studenti[i]->_imePrezime) + 1;
  336.             imePrezime = new char[size];
  337.             strcpy_s(imePrezime, size, fakultet._studenti[i]->_imePrezime);
  338.             ectsStudenta = fakultet._studenti[i]->_polozioECTS;
  339.             studnet = fakultet._studenti[i];
  340.             break;
  341.         }
  342.     }
  343.     for (int i = MAX - 1; i >= 0; i--)
  344.     {
  345.         if (fakultet._zapisnici[i] != nullptr)
  346.         {
  347.             for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
  348.             {
  349.                 if (fakultet._zapisnici[i]->_stavke[j]._student->_brojIndeksa == index)
  350.                 {
  351.                     fakultet._zapisnici[i]->_stavke[j]._ocjena = ocjena;
  352.                     return false;
  353.                 }
  354.             }
  355.             break;
  356.         }
  357.     }
  358.     studnet->Unos(imePrezime, index);
  359.     for (int i = MAX - 1; i >= 0; i--)
  360.     {
  361.         if (fakultet._zapisnici[i] != nullptr)
  362.         {
  363.             stavka.Unos(studnet, ocjena, false);
  364.             fakultet._zapisnici[i]->dodajZapisnikStavku(stavka);
  365.             for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
  366.             {
  367.                 if (fakultet._zapisnici[i]->_stavke[j]._ocjena > 5)
  368.                 {
  369.                     fakultet._zapisnici[i]->_stavke[j]._student->DodajECTS(fakultet._zapisnici[i]->_stavke[j]._student->_polozioECTS);
  370.                 }
  371.             }
  372.             delete[] imePrezime; imePrezime = nullptr;
  373.             return true;
  374.         }
  375.     }
  376.     delete[] imePrezime; imePrezime = nullptr;
  377.     return false;
  378. }
  379. /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  380. funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  381. bool ponisti_stavku_rezultat(Fakultet & fakultet, int index)
  382. {
  383.     for (int i = MAX - 1; i >= 0; i--)
  384.     {
  385.         if (fakultet._zapisnici[i] != nullptr)
  386.         {
  387.             for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
  388.             {
  389.                 if (fakultet._zapisnici[i]->_stavke[j]._student->_brojIndeksa == index)
  390.                 {
  391.                     for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
  392.                     {
  393.                         fakultet._zapisnici[i]->_stavke[j]._ponisteno = true;//ponistiti stavke za dati broj indeksa
  394.                         fakultet._studenti[i]->UmanjiECTS(fakultet._zapisnici[i]->_ects);//za studnetov broj indeksa umanji ects bodove
  395.                         return true; //vrati true, tj ako ima taj broj indeksa ponisti i umanji ects
  396.                     }
  397.                 }
  398.             }
  399.         }
  400.     }
  401.     return false;//ako nema tog broja ineksa na posaljednjem vrati false i ne radi nista
  402.  
  403. }
  404. int main() {
  405.     Fakultet fakultet;
  406.  
  407.     /*dodaje podatke o novom studentu u fakultet */
  408.     //fakultet, imePrezime, broj indeksa
  409.     dodaj_student(fakultet, "A. Joldic", 16001);
  410.     dodaj_student(fakultet, "D. Music", 15251);
  411.     dodaj_student(fakultet, "E. Babovic    ", 16014);
  412.     dodaj_student(fakultet, "E. Junuz", 16015);
  413.     dodaj_student(fakultet, "J. Azemovic", 16014);//ne dodaje studenta jer je broj indeksa zauzet
  414.  
  415.     /*kraira novi zapisnik*/
  416.     //fakultet, datum, predmet, ects krediti
  417.     kreiraj_zapisnik(fakultet, 6, 9, 2018, "Programiranje II", 7);
  418.  
  419.     /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta (_polozioECTS) uveæa ako je student položio ispit. */
  420.  
  421.     if (dodaj_stavku_na_zapisnik(fakultet, 16001, 5))
  422.         cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  423.  
  424.     /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  425.     if (!dodaj_stavku_na_zapisnik(fakultet, 16001, 6))
  426.         cout << "Student vec dodat na zapisnik. Ocjena je ispravljena!" << endl;
  427.  
  428.     dodaj_stavku_na_zapisnik(fakultet, 15251, 5);
  429.     //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  430.     dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
  431.     //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  432.     dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
  433.     //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  434.  
  435.     kreiraj_zapisnik(fakultet, 7, 9, 2018, "Raèunarske mreze", 5);
  436.     //naredne stavke se dodaju na novi zapisnik
  437.     dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
  438.     //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  439.     dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
  440.     //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  441.  
  442.  
  443.     /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  444.     funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  445.  
  446.     if (ponisti_stavku_rezultat(fakultet, 16001))
  447.         cout << "Stavka (rezultat) uspjesno ponisten!" << endl;
  448.  
  449.     if (!ponisti_stavku_rezultat(fakultet, 19001))
  450.         cout << "Student nije pronadjen!" << endl;
  451.  
  452.     /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  453.     zapisnik se nece prikazati ukoliko ne posjeduje niti jednu stavku ili su sve stavke poništene. prilikom kreiranja zapisnika
  454.     iskoristiti funkciju GetProsjecnaOcjena i njenu lambda implementaciju*/
  455.     if (fakultet.printaj())
  456.         cout << "Ispitni zapisnik uspjesno prikazan!" << endl;
  457.     fakultet.Dealociraj();
  458.  
  459.     system("PAUSE");
  460.     return 0;
  461. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement