Advertisement
wiuu23

PR2-Ispit-VER2: globalneFunkcije, zapisnici, studenti...

Sep 20th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  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. /*
  17. u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
  18.  
  19. Datum ispita: 07.09.2017
  20. Predmet: Programiranje II
  21. IZVJESTAJ O ODRZANOM ISPITU
  22. Br indeksa Ime prezime Komisijsko*** Ocjena
  23. 16001   A. Joldic   DA  5
  24. 15251   D. Music    NE  7 Ponisteno
  25. 16014   E. Babovic  DA  8
  26. UKUPNO POLOZILO:    2
  27. PROSJECNA OCJENA:   6.67
  28. *** komisijski ispit: ako student pristupa četvrti put i dalje (računajući i poništene rezultate)
  29. */
  30.  
  31. char * crt = "\n-------------------------------------------\n";
  32. struct Datum
  33. {
  34.     int _dan;
  35.     int _mjesec;
  36.     int _godina;
  37.     void Unos(int d, int m, int g)
  38.     {
  39.         _dan = d;
  40.         _mjesec = m;
  41.         _godina = g;
  42.     }
  43.     void Ispis()
  44.     {
  45.         cout << _dan << "." << _mjesec << "." << _godina << " ";
  46.         cout << endl;
  47.     }
  48.     char * datumKaoNizKaraktera()
  49.     {
  50.         char dan[3], mjeses[3], godina[5];
  51.         _itoa_s(_dan, dan, 10);
  52.         _itoa_s(_mjesec, mjeses, 10);
  53.         _itoa_s(_godina, godina, 10);
  54.         int size = 13;
  55.         char * niz = new char[size];
  56.        
  57.         strcpy_s(niz, size, godina);
  58.         strcat_s(niz, size, "-");
  59.         strcat_s(niz, size, mjeses);
  60.         strcat_s(niz, size, "-");
  61.         strcat_s(niz, size, dan);
  62.  
  63.         return niz;
  64.     }
  65. };
  66. struct Student
  67. {
  68.     char _imePrezime[20];
  69.     int _brojIndeksa;
  70.     int _polozioECTS;
  71.  
  72.     void Unos(char* naziv, float cijena)
  73.     {
  74.         strcpy_s(_imePrezime, naziv);
  75.         _brojIndeksa = cijena;
  76.         _polozioECTS = 0;
  77.     }
  78.     void DodajECTS(float ects)
  79.     {
  80.         _polozioECTS += ects;
  81.     }
  82.     void UmanjiECTS(float ects)
  83.     {
  84.         _polozioECTS -= ects;
  85.     }
  86.     void Ispis()
  87.     {
  88.         cout << _imePrezime << ", Indeks: " << _brojIndeksa << ", ECTS: " << _polozioECTS << " " << endl;
  89.     }
  90. };
  91.  
  92. struct ZapisnikStavka
  93. {
  94.     int _ocjena;
  95.     Student* _student; //ZapisnikStavka će pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
  96.     bool _ponisteno;
  97.     bool _komisijskoPolaganje;
  98.  
  99.     void IspisKomisijkogPolaganja()
  100.     {
  101.         if (_komisijskoPolaganje)
  102.         {
  103.             cout << "Da";
  104.         }
  105.         else
  106.         {
  107.             cout << "Ne.";
  108.         }
  109.     }
  110.     void Unos(Student* proizvod, int ocjena, bool komisijskoPolaganje)
  111.     {
  112.         _ocjena = ocjena;
  113.         _student = proizvod;
  114.         _komisijskoPolaganje = komisijskoPolaganje;
  115.         _ponisteno = false;
  116.     }
  117.  
  118.     void Ispis()
  119.     {
  120.         cout << _student->_imePrezime << "\t" << _ocjena << "\t" << _student->_brojIndeksa << "\t";
  121.         if (_ponisteno)
  122.             cout << " Ponisteno";
  123.         cout << endl;
  124.     }
  125.  
  126. };
  127. struct IspitniZapisnik
  128. {
  129.     Datum _datum;
  130.     ZapisnikStavka ** _stavke;//svaki put se dodaje po jedna stavka
  131.     int _brojStavki;
  132.     int _ects;
  133.     char _predmet[20];
  134.     bool dodajzapisnikStavku(Student * student, int ocjena, bool komisijkaPolaganja)
  135.     {
  136.         ZapisnikStavka ** temp = new ZapisnikStavka *[_brojStavki + 1];
  137.         for (int i = 0; i < _brojStavki; i++)
  138.         {
  139.             temp[i] = new ZapisnikStavka;
  140.             temp[i]->Unos(_stavke[i]->_student, _stavke[i]->_ocjena, _stavke[i]->_komisijskoPolaganje);
  141.         }
  142.         temp[_brojStavki] = new ZapisnikStavka;
  143.         temp[_brojStavki]->Unos(student, ocjena, komisijkaPolaganja);
  144.  
  145.         delete[]_stavke;
  146.         _stavke = temp;
  147.         _brojStavki++;
  148.         return true;
  149.     }
  150.     void Unos(Datum datum, char* predmet, int ects)
  151.     {
  152.         _datum = datum;
  153.         _brojStavki = 0;
  154.         _stavke = nullptr;
  155.         _ects = ects;
  156.         strcpy_s(_predmet, predmet);
  157.     }
  158.     /*Prosjecnu ocjenu izračunati koristeći lambda funkciju koja se poziva koristeći objekat
  159.     tipa auto. u prosjek računati i poništene rezultate (stavke)*/
  160.     float GetProsjecnaOcjena()
  161.     {
  162.         auto lambda = [&]()
  163.         {
  164.             float ocjena = 0;
  165.             float prosjek;
  166.             for (int i = 0; i < _brojStavki; i++)
  167.             {
  168.                 if (_stavke[i]->_ponisteno == false)
  169.                 {
  170.                     ocjena += _stavke[i]->_ocjena;
  171.                 }
  172.                 prosjek = ocjena / _brojStavki;
  173.             }
  174.             return prosjek;
  175.         };
  176.         return lambda();
  177.     }
  178. };
  179. const int Max = 100;
  180.  
  181. /*unutar objekta tipa Fakultet ce se cuvati podaci o svim studentima i ispitnim zapisnicima, a dodaju se pomocu globalnih funkcija*/
  182. struct Fakultet
  183. {
  184.     //umjesto brojaca koristiti default.ne vrijednosti
  185.     Student* Studenti[Max] = { NULL };
  186.     IspitniZapisnik* Zapisnici[Max] = { NULL };
  187.  
  188.     void Dealociraj()
  189.     {
  190.         for (size_t i = 0; i < Max; i++) {
  191.             delete Studenti[i]; Studenti[i] = NULL;
  192.         }
  193.         for (size_t i = 0; i < Max; i++)
  194.         {
  195.             delete Zapisnici[i]; Zapisnici[i] = NULL;
  196.         }
  197.     }
  198. };
  199. /*dodaje podatke o novom studentu u fakultet */
  200. //fakultet, imePrezime, broj indeksa
  201. //ne dodaje studenta jer je broj indeksa zauzet -> uporediti po int broj indeksa
  202. void dodaj_student(Fakultet & fakultet, char * imePrezime, int brojIndeksa)
  203. {
  204.     for (int i = 0; i < Max; i++)
  205.     {
  206.         if (fakultet.Studenti[i] != nullptr)
  207.         {
  208.             if (fakultet.Studenti[i]->_brojIndeksa == brojIndeksa)
  209.             {
  210.                 cout << "Student s istim index-om vec nadjen." << endl;
  211.                 return;
  212.             }
  213.         }
  214.     }
  215.     for (int i = 0; i < Max; i++)
  216.     {
  217.         if (fakultet.Studenti[i] == nullptr)
  218.         {
  219.             fakultet.Studenti[i] = new Student;
  220.             fakultet.Studenti[i]->Unos(imePrezime, brojIndeksa);
  221.             cout << "Student je dodan. " << endl;
  222.             return;
  223.         }
  224.     }
  225. }
  226. /*kraira novi zapisnik*/
  227. //fakultet, datum, predmet, ects krediti
  228. void kreiraj_zapisnik(Fakultet & fakultet, int dan, int mjesec, int godina, char * predmet, int ects)
  229. {
  230.     for (int i = 0; i < Max; i++)
  231.     {
  232.         if (fakultet.Zapisnici[i] != nullptr)
  233.         {
  234.             if (strcmp(fakultet.Zapisnici[i]->_predmet, predmet) == 0)
  235.             {
  236.                 cout << "Zapisnik vec postoji. " << endl;
  237.                 return;
  238.             }
  239.         }
  240.     }
  241.     for (int i = 0; i < Max; i++)
  242.     {
  243.         if (fakultet.Zapisnici[i] == nullptr)
  244.         {
  245.             Datum datum;
  246.             datum.Unos(dan, mjesec, godina);
  247.             fakultet.Zapisnici[i] = new IspitniZapisnik;
  248.             fakultet.Zapisnici[i]->Unos(datum, predmet, ects);
  249.             cout << "Zapisnik je uspjesno kreiran. " << endl;
  250.             return;
  251.         }
  252.     }
  253. }
  254. /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  255. /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  256. bool dodaj_stavku_na_zapisnik(Fakultet & fakultet, int index, int ocjena)
  257. {
  258.     Student * temp = nullptr;
  259.     //priprema terena za ostatak rada:
  260.     for (int i = 0; i < Max; i++)
  261.     {
  262.         if (fakultet.Studenti[i] != nullptr)
  263.         {
  264.             if (fakultet.Studenti[i]->_brojIndeksa == index)
  265.             {
  266.                 temp = fakultet.Studenti[i];
  267.                 break;
  268.             }
  269.         }
  270.     }
  271.     for (int i = Max - 1; i >= 0; i--)
  272.     {
  273.         if (fakultet.Zapisnici[i] != nullptr && temp != nullptr)
  274.         {
  275.             for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  276.             {
  277.                 //provjera da li je student vec dodan
  278.                 if (fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa == index)
  279.                 {
  280.                     //ako je student vec dodan modifikuj ocjenu
  281.                     //"Student dodan, modifikovanje ocjene: ";
  282.                     fakultet.Zapisnici[i]->_stavke[j]->_ocjena = ocjena;
  283.                     //studentova nova ocjena ako je veca od 5 (ako je polozio) dodaj ects tog predmeta
  284.                     if (ocjena > 5)
  285.                     {
  286.                         //cout << "Student je polozio ispit, ects uvecani. " << endl;
  287.                         temp->DodajECTS(fakultet.Zapisnici[i]->_ects);
  288.                     }
  289.                     return false;
  290.                 }
  291.             }
  292.             //dodajemo novi ispitni zapisnik i potrebno je uvecati ects
  293.             fakultet.Zapisnici[i]->dodajzapisnikStavku(temp, ocjena, false);
  294.             if (ocjena > 5)
  295.                 temp->DodajECTS(fakultet.Zapisnici[i]->_ects); // dodajemo studentu ects bodove
  296.             return true;
  297.         }
  298.     }
  299. }
  300. /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  301. funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  302. bool ponisti_stavku_rezultat(Fakultet & fakultet, int index)
  303. {
  304.     for (int i = Max - 1; i >= 0; i--)
  305.     {
  306.         if (fakultet.Zapisnici[i] != nullptr)
  307.         {
  308.             for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  309.             {
  310.                 if (fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa == index)
  311.                 {
  312.                     fakultet.Zapisnici[i]->_stavke[j]->_ponisteno = true;
  313.                     fakultet.Zapisnici[i]->_stavke[j]->_student->UmanjiECTS(fakultet.Zapisnici[i]->_ects);
  314.                     return true;
  315.                 }
  316.             }
  317.         }
  318.     }
  319.     return false;
  320. }
  321. /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  322. * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je spasiti u tekstualni fajl.
  323. * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt.
  324. zapisnik se nece prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
  325. bool printaj(Fakultet & fakultet)
  326. {
  327.     for (int i = Max - 1; i >= 0; i--)
  328.     {
  329.         bool svePonistene = true;
  330.         if (fakultet.Zapisnici[i] != nullptr)
  331.         {
  332.             if (fakultet.Zapisnici[i]->_brojStavki == 0)
  333.             {
  334.                 cout << "Zapisnik ne posjeduje niti jednu stavku. " << endl;
  335.                 return false;
  336.             }
  337.             for (size_t j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  338.                 if (!fakultet.Zapisnici[i]->_stavke[j]->_ponisteno) svePonistene = false;
  339.             {
  340.                 if (svePonistene)
  341.                 {
  342.                     cout << "Sve stavke su ponistene. " << endl;
  343.                     return false;
  344.                 }
  345.             }
  346.         }
  347.     }
  348.  
  349.     int brojacPolozenih = 0;
  350.     float sumaOcjena = 0;
  351.     float prosjek = 0;
  352.     for (int i = Max - 1; i >= 0; i--)
  353.     {
  354.         brojacPolozenih = 0, sumaOcjena = 0, prosjek = 0;
  355.         if (fakultet.Zapisnici[i] != nullptr)
  356.         {
  357.             cout << "Datum ispita: ";
  358.             fakultet.Zapisnici[i]->_datum.Ispis();
  359.             cout << "Predmet: ";
  360.             cout << fakultet.Zapisnici[i]->_predmet << endl;
  361.             cout << "IZVJESTAJ O ODRZANOM ISPITU" << endl;
  362.             cout << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
  363.             for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  364.             {
  365.                 cout << fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_student->_imePrezime << "\t";
  366.                 fakultet.Zapisnici[i]->_stavke[j]->IspisKomisijkogPolaganja();
  367.                 cout << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_ocjena << endl;
  368.  
  369.                 if (fakultet.Zapisnici[i]->_stavke[j]->_ocjena > 5)
  370.                     brojacPolozenih++;
  371.                 sumaOcjena += fakultet.Zapisnici[i]->_stavke[j]->_ocjena;
  372.                 prosjek = sumaOcjena / fakultet.Zapisnici[i]->_brojStavki;
  373.             }
  374.             cout << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
  375.             cout << "PROSJECNA OCJENA: " << prosjek;
  376.             cout << crt;
  377.         }
  378.     }
  379.     ////////////////////////////////upisivanje u .txt
  380.     //* naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt.
  381.     for (int i = Max - 1; i >= 0; i--)
  382.     {
  383.         if (fakultet.Zapisnici[i] != nullptr)
  384.         {
  385.             int size = strlen(fakultet.Zapisnici[i]->_predmet) + 16;
  386.             char  * niz = new char[size];
  387.             strcpy_s(niz, size, fakultet.Zapisnici[i]->_predmet);
  388.             strcat_s(niz, size, "_");
  389.             strcat_s(niz, size, fakultet.Zapisnici[i]->_datum.datumKaoNizKaraktera());
  390.             strcat_s(niz, size, ".txt");
  391.  
  392.             ofstream upis(niz);
  393.             if (upis.fail())
  394.             {
  395.                 cout << "Greska prilikom upisa u fajl";
  396.                 return false;
  397.             }
  398.             int brojacPolozenihUpis = 0;
  399.             float sumaOcjenaUpis = 0;
  400.             float prosjekUpis = 0;
  401.  
  402.             brojacPolozenihUpis = 0, sumaOcjenaUpis = 0, prosjekUpis = 0;
  403.             upis << "Datum ispita: ";
  404.             upis << fakultet.Zapisnici[i]->_datum._dan << "." << fakultet.Zapisnici[i]->_datum._mjesec << "." << fakultet.Zapisnici[i]->_datum._godina << endl;
  405.             upis << "Predmet: ";
  406.             upis << fakultet.Zapisnici[i]->_predmet << endl;
  407.             upis << "IZVJESTAJ O ODRZANOM ISPITU" << endl;
  408.             upis << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
  409.             for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  410.             {
  411.                 upis << fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_student->_imePrezime << "\t";
  412.                 //fakultet.Zapisnici[i]->_stavke[j]->IspisKomisijkogPolaganja();
  413.                 upis << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_ocjena << endl;
  414.  
  415.                 if (fakultet.Zapisnici[i]->_stavke[j]->_ocjena > 5)
  416.                     brojacPolozenihUpis++;
  417.                 sumaOcjenaUpis += fakultet.Zapisnici[i]->_stavke[j]->_ocjena;
  418.                 prosjekUpis = sumaOcjenaUpis / fakultet.Zapisnici[i]->_brojStavki;
  419.             }
  420.             upis << "UKUPNO POLOZILO: " << brojacPolozenihUpis << endl;
  421.             upis << "PROSJECNA OCJENA: " << prosjekUpis;
  422.             upis << crt;
  423.  
  424.             upis.close();
  425.             cout << "Uspjesno: " << niz << endl;
  426.             delete[] niz;
  427.         }
  428.     }
  429.     return true;
  430. }
  431. void main() {
  432.     Fakultet fakultet;
  433.  
  434.     /*dodaje podatke o novom studentu u fakultet */
  435.     //fakultet, imePrezime, broj indeksa
  436.     dodaj_student(fakultet, "A. Joldic", 16001);
  437.     dodaj_student(fakultet, "D. Music", 15251);
  438.     dodaj_student(fakultet, "E. Babovic ", 16014);
  439.     dodaj_student(fakultet, "E. Junuz", 16015);
  440.     dodaj_student(fakultet, "J. Azemovic", 16014);//ne dodaje studenta jer je broj indeksa zauzet
  441.                                                   /*kraira novi zapisnik*/
  442.                                                   //fakultet, datum, predmet, ects krediti
  443.     cout << crt;
  444.  
  445.     kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7);
  446.     kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7); // testni poziv za funkciju kreiraj_zapisnik
  447.     cout << crt;
  448.     /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  449.  
  450.     if (dodaj_stavku_na_zapisnik(fakultet, 16001, 5))
  451.         cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  452.  
  453.     /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  454.     if (!dodaj_stavku_na_zapisnik(fakultet, 16001, 6))
  455.         cout << "Student vec dodat na zapisnik. Ocjena je ispravljena!" << endl;
  456.  
  457.     dodaj_stavku_na_zapisnik(fakultet, 15251, 5);
  458.     dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
  459.     dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
  460.  
  461.     kreiraj_zapisnik(fakultet, 7, 9, 2017, "Racunarske mreze", 5);
  462.     cout << crt;
  463.     //naredne stavke se dodaju na novi zapisnik
  464.     dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
  465.     dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
  466.     cout << crt;
  467.  
  468.  
  469.     /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  470.     funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  471.  
  472.     if (ponisti_stavku_rezultat(fakultet, 16001))
  473.         cout << "Stavka (rezultat) uspjesno ponisten!" << endl;
  474.  
  475.     if (!ponisti_stavku_rezultat(fakultet, 19001))
  476.         cout << "Student nije pronadjen!" << endl;
  477.     cout << crt;
  478.     /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  479.     * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je pasiti u tekstualni fajl.
  480.     * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt. zapisnik se nece
  481.     prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
  482.     if (printaj(fakultet))
  483.         cout << "Ispitni zapisnik uspjesno prikazan i spasen u fajl!" << endl;
  484.     cout << crt;
  485.     fakultet.Dealociraj();
  486.     system("PAUSE");
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement