Advertisement
limun11

5.1 Globalne-Stavke-Rjesenje

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