Advertisement
wiuu23

PR2-Ispit-globalneFunkcije, zapisnici, studenti, fakultet...

Sep 16th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.22 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.     }
  47.     char * getDatumKaoNizKaraktera()
  48.     {
  49.         char * niz = new char[13];
  50.         char dan[3], mjesec[3], godina[5];
  51.         _itoa_s(_dan, dan, 3, 10);
  52.         _itoa_s(_mjesec, mjesec, 3, 10);
  53.         _itoa_s(_godina, godina, 5, 10);
  54.  
  55.         strcpy_s(niz, 13, dan);
  56.         strcat_s(niz, 13, "-");
  57.         strcat_s(niz, 13, mjesec);
  58.         strcat_s(niz, 13, "-");
  59.         strcat_s(niz, 13, godina);
  60.  
  61.         return niz;
  62.     }
  63. };
  64. struct Student {
  65.     char _imePrezime[20];
  66.     int _brojIndeksa;
  67.     int _polozioECTS;
  68.  
  69.     void Unos(char* naziv, float cijena)
  70.     {
  71.         strcpy_s(_imePrezime, naziv);
  72.         _brojIndeksa = cijena;
  73.         _polozioECTS = 0;
  74.     }
  75.     void DodajECTS(float ects)
  76.     {
  77.         _polozioECTS += ects;
  78.     }
  79.     void UmanjiECTS(float ects)
  80.     {
  81.         _polozioECTS -= ects;
  82.     }
  83.     void Ispis()
  84.     {
  85.         cout << _imePrezime << ", Indeks: " << _brojIndeksa << ", ECTS: " << _polozioECTS << " " << endl;
  86.     }
  87. };
  88.  
  89. struct ZapisnikStavka {
  90.     int _ocjena;
  91.     Student* _student; //ZapisnikStavka će pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
  92.     bool _ponisteno;
  93.     bool _komisijskoPolaganje;
  94.  
  95.     void Unos(Student* proizvod, int ocjena, bool komisijskoPolaganje)
  96.     {
  97.         _ocjena = ocjena;
  98.         _student = proizvod;
  99.         _komisijskoPolaganje = komisijskoPolaganje;
  100.         _ponisteno = false;
  101.     }
  102.  
  103.     void Ispis()
  104.     {
  105.         cout << _student->_imePrezime << "\t" << _ocjena << "\t" << _student->_brojIndeksa << "\t";
  106.         if (_ponisteno)
  107.             cout << " Ponisteno";
  108.         cout << endl;
  109.     }
  110. };
  111. struct IspitniZapisnik {
  112.     Datum _datum;
  113.     ZapisnikStavka ** _stavke;//svaki put se dodaje po jedna stavka
  114.     int _brojStavki;
  115.     int _ects;
  116.     char _predmet[20];
  117.     void Unos(Datum datum, char* predmet, int ects)
  118.     {
  119.         _datum = datum;
  120.         _brojStavki = 0;
  121.         _stavke = nullptr;
  122.         _ects = ects;
  123.         strcpy_s(_predmet, predmet);
  124.     }
  125.     //Datum ispita : 07.09.2017
  126.     //Predmet : Programiranje II
  127.     //  IZVJESTAJ O ODRZANOM ISPITU
  128.     //  Br indeksa Ime prezime Komisijsko*** Ocjena
  129.     //  16001   A.Joldic    DA  5
  130.     //  15251   D.Music NE  7 Ponisteno
  131.     //  16014   E.Babovic   DA  8
  132.     //  UKUPNO POLOZILO : 2
  133.     //  PROSJECNA OCJENA : 6.67
  134.     //  *** komisijski ispit : ako student pristupa četvrti put i dalje(računajući i poništene rezultate)
  135.     void Ispis()
  136.     {
  137.         cout << "Datum ispita: ";
  138.         _datum.Ispis();
  139.         cout << "Naziv predmeta: " << _predmet << endl;
  140.         cout << "IZVJESTAJ O ODRZANOM ISPITU" << endl;
  141.         cout << "Br indeksa\tIme i prezime\tKomisijsko\tOcjena" << endl;
  142.         for (int i = 0; i < _brojStavki; i++)
  143.         {
  144.             cout << _stavke[i]->_student->_brojIndeksa << "\t" << _stavke[i]->_student->_imePrezime << "\t" << _stavke[i]->_komisijskoPolaganje
  145.                 << "\t" << _stavke[i]->_ocjena << endl;
  146.         }
  147.     }
  148.     /*Prosjecnu ocjenu izračunati koristeći lambda funkciju koja se poziva koristeći objekat
  149.     tipa auto. u prosjek računati i poništene rezultate (stavke)*/
  150.     float GetProsjecnaOcjena()
  151.     {
  152.         auto prosjek = [&]()
  153.         {
  154.             float suma = 0;
  155.             float prosjekA = 0;
  156.             for (int i = 0; i < _brojStavki; i++)
  157.             {
  158.                 suma += _stavke[i]->_ocjena;
  159.             }
  160.             prosjekA = suma / _brojStavki;
  161.             return prosjekA;
  162.         };
  163.         return prosjek();
  164.     }
  165. };
  166. const int Max = 100;
  167.  
  168. /*unutar objekta tipa Fakultet ce se cuvati podaci o svim studentima i ispitnim zapisnicima, a dodaju se pomocu globalnih funkcija*/
  169. struct Fakultet
  170. {
  171.     //umjesto brojaca koristiti default.ne vrijednosti
  172.     Student* Studenti[Max] = { NULL };
  173.     IspitniZapisnik* Zapisnici[Max] = { NULL };
  174.  
  175.     void Dealociraj()
  176.     {
  177.         for (size_t i = 0; i < Max; i++) {
  178.             delete Studenti[i]; Studenti[i] = NULL;
  179.         }
  180.         for (size_t i = 0; i < Max; i++)
  181.         {
  182.             delete Zapisnici[i]; Zapisnici[i] = NULL;
  183.         }
  184.     }
  185. };
  186. /*dodaje podatke o novom studentu u fakultet */
  187. //fakultet, imePrezime, broj indeksa
  188. void dodaj_student(Fakultet & fakultet, char * imePrezime, int brojIndkesa)
  189. {
  190.     for (int i = 0; i < Max; i++)
  191.     {
  192.         if (fakultet.Studenti[i] != nullptr)//ako nije prazan niz, u njemu vec nesto postoji provjeri imal isti broj indeksa vec unutra
  193.         {
  194.             if (fakultet.Studenti[i]->_brojIndeksa == brojIndkesa)
  195.             {
  196.                 cout << "Student vec postoji. " << endl;
  197.                 return;
  198.             }
  199.         }
  200.     }
  201.     for (int i = 0; i < Max; i++)
  202.     {
  203.         if (fakultet.Studenti[i] == nullptr)//niz je prazan, dodaj novog studenta u njega, popuni niz
  204.         {
  205.             fakultet.Studenti[i] = new Student;
  206.             fakultet.Studenti[i]->Unos(imePrezime, brojIndkesa);
  207.             cout << "Student je dodan." << endl;
  208.             return;
  209.         }
  210.     }
  211. }
  212. /*kraira novi zapisnik*/
  213. //fakultet, datum, predmet, ects krediti
  214. void kreiraj_zapisnik(Fakultet & fakultet, int dan, int mjesec, int godina, char * predmet, int ectsKrediti)
  215. {
  216.     for (int i = 0; i < Max; i++)
  217.     {
  218.         if (fakultet.Zapisnici[i] != nullptr)//1. nije prazan niz, vrsi provjeru
  219.         {
  220.             if (strcmp(fakultet.Zapisnici[i]->_predmet, predmet) == 0)
  221.             {
  222.                 cout << "Zapisnik vec postoji... " << endl;
  223.                 return;
  224.             }
  225.  
  226.         }
  227.     }
  228.     for (int i = 0; i < Max; i++)
  229.     {
  230.         if (fakultet.Zapisnici[i] == nullptr)//2. niz je prazan, idemo ga puniti
  231.         {
  232.             fakultet.Zapisnici[i] = new IspitniZapisnik;
  233.             Datum datum; //potrebna nam je strukutra datum zbog unosa datuma
  234.             datum.Unos(dan, mjesec, godina);
  235.             fakultet.Zapisnici[i]->Unos(datum, predmet, ectsKrediti);
  236.             cout << "Zapisnik uspjesno dodan. " << endl;
  237.             return;
  238.         }
  239.     }
  240. }
  241. /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  242. /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  243. bool dodaj_stavku_na_zapisnik(Fakultet & fakultet, int brojIndeksa, int ocjena)
  244. {
  245.     //- gleda po broj indkesa
  246.     int pozicijaPosljednjegZapisnika = -1;
  247.     int pozicijaPosljednjegStudenta = -1;
  248.  
  249.     for (int i = 0; i < Max; i++)
  250.     {
  251.         //1. provjera da li je niz pun ili prazan, u ovom slucaju niz nam je potreban popunjen
  252.         if (fakultet.Studenti[i] != nullptr && fakultet.Studenti[i]->_brojIndeksa == brojIndeksa)//niz studenata nije prazan i pozicija je =-1, pamti poziciju
  253.             pozicijaPosljednjegStudenta = i;
  254.         if (fakultet.Zapisnici[i] != nullptr)//niz zapisika nije prazan moze se dodavati na posljednji kreirani,
  255.             pozicijaPosljednjegZapisnika = i;                                     //da je niz zapisnika prazan, ne bi postojao zadnji kreirani i ne bi se
  256.     }                                                                             //moglo dodavati i pozicija je =-1, pamti poziciju
  257.                                                                                   //2. studenta nema u zapisniku, ne mozes mu modifikovati ocjenu
  258.     if (pozicijaPosljednjegStudenta == -1)
  259.     {
  260.         cout << "Takav student nije pronadjen.. " << endl;
  261.         return false;
  262.     }
  263.     //*3. uslov zadatka: ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  264.     for (int i = 0; i < fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki; i++)
  265.     {
  266.         if (fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke[i]->_student->_brojIndeksa == brojIndeksa)
  267.         {
  268.             fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke[i]->_ocjena == ocjena;
  269.             return false;
  270.         }
  271.     }
  272.  
  273.     //4. dodajemo stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  274.     ZapisnikStavka ** temp = new ZapisnikStavka *[fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki + 1];
  275.     for (int i = 0; i < fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki; i++)
  276.     {
  277.         temp[i] = new ZapisnikStavka;
  278.         temp[i]->Unos(fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke[i]->_student,
  279.             fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke[i]->_ocjena,
  280.             fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke[i]->_komisijskoPolaganje);
  281.     }
  282.     temp[fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki] = new ZapisnikStavka;
  283.     temp[fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki]->Unos(fakultet.Studenti[pozicijaPosljednjegStudenta], ocjena, true);
  284.  
  285.     delete[] fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke;
  286.     fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_stavke = temp;
  287.     fakultet.Zapisnici[pozicijaPosljednjegZapisnika]->_brojStavki++;
  288.     return true;
  289. }
  290. /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  291. funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  292. bool ponisti_stavku_rezultat(Fakultet & fakultet, int brojIndeksa)
  293. {
  294.     return true;
  295. }
  296. /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  297. * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je pasiti u tekstualni fajl.
  298. * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt. zapisnik se nece
  299. prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
  300. //Datum ispita : 07.09.2017
  301. //Predmet : Programiranje II
  302. //  IZVJESTAJ O ODRZANOM ISPITU
  303. //  Br indeksa Ime prezime Komisijsko*** Ocjena
  304. //  16001   A.Joldic    DA  5
  305. //  15251   D.Music NE  7 Ponisteno
  306. //  16014   E.Babovic   DA  8
  307. //  UKUPNO POLOZILO : 2
  308. //  PROSJECNA OCJENA : 6.67
  309. //  *** komisijski ispit : ako student pristupa četvrti put i dalje(računajući i poništene rezultate)
  310. bool printaj(Fakultet & fakultet)
  311. {
  312.     float suma = 0;
  313.     int brojacPolozenih = 0;
  314.     bool ponisteno = true;
  315.     for (int i = 0; i < Max; i++)
  316.     {
  317.         ponisteno = true;
  318.         if (fakultet.Zapisnici[i] != nullptr)
  319.         {
  320.             brojacPolozenih = 0;
  321.             suma = 0;
  322.             if (fakultet.Zapisnici[i]->_brojStavki == 0)
  323.                 return false;
  324.             for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  325.             {
  326.                 if (fakultet.Zapisnici[i]->_stavke[j]->_ponisteno == false)
  327.                     ponisteno = false;
  328.                 if (fakultet.Zapisnici[i]->_stavke[j]->_ocjena > 5)
  329.                     brojacPolozenih++;
  330.  
  331.                 suma += fakultet.Zapisnici[i]->_stavke[j]->_ocjena;
  332.             }
  333.  
  334.         }
  335.         if (ponisteno)
  336.             return false;
  337.  
  338.         fakultet.Zapisnici[i]->Ispis();
  339.         cout << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
  340.         cout << "PROSJECNA OCJENA:" << suma / fakultet.Zapisnici[i]->_brojStavki << endl;
  341.     }
  342.     //////////////////////////////////spasavanje u .txt
  343.     char nazivFajla[20];
  344.     for (int i = 0; i < Max; i++)
  345.     {
  346.         strcpy_s(nazivFajla, fakultet.Zapisnici[i]->_predmet);
  347.         strcat_s(nazivFajla, "_");
  348.         strcat_s(nazivFajla, fakultet.Zapisnici[i]->_datum.getDatumKaoNizKaraktera());
  349.     }
  350.     strcat_s(nazivFajla, ".txt");
  351.     ofstream upis(nazivFajla, ios::out);
  352.     for (int i = 0; i < Max; i++)
  353.     {
  354.         fakultet.Zapisnici[i]->Ispis();
  355.         upis << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
  356.         upis << "PROSJECNA OCJENA:" << suma / fakultet.Zapisnici[i]->_brojStavki << endl;
  357.     }
  358.     cout << "Fajl uspjeno upisan pod nazivom: " << nazivFajla << endl;
  359.     upis.close();
  360.     return true;
  361. }
  362. void main() {
  363.     Fakultet fakultet;
  364.  
  365.     /*dodaje podatke o novom studentu u fakultet */
  366.     //fakultet, imePrezime, broj indeksa
  367.     dodaj_student(fakultet, "A. Joldic", 16001);
  368.     dodaj_student(fakultet, "D. Music", 15251);
  369.     dodaj_student(fakultet, "E. Babovic ", 16014);
  370.     dodaj_student(fakultet, "E. Junuz", 16015);
  371.     dodaj_student(fakultet, "J. Azemovic", 16014);//ne dodaje studenta jer je broj indeksa zauzet
  372.                                                   /*kraira novi zapisnik*/
  373.                                                   //fakultet, datum, predmet, ects krediti
  374.     kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7);
  375.  
  376.     /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  377.  
  378.     if (dodaj_stavku_na_zapisnik(fakultet, 16001, 5))
  379.         cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  380.  
  381.     /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  382.     if (!dodaj_stavku_na_zapisnik(fakultet, 16001, 6))
  383.         cout << "Student vec dodat na zapisnik. Ocjena je ispravljena!" << endl;
  384.  
  385.     dodaj_stavku_na_zapisnik(fakultet, 15251, 5);
  386.     dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
  387.     dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
  388.  
  389.     kreiraj_zapisnik(fakultet, 7, 9, 2017, "Računarske mreze", 5);
  390.     //naredne stavke se dodaju na novi zapisnik
  391.     dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
  392.     dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
  393.  
  394.  
  395.     /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  396.     funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  397.  
  398.     if (ponisti_stavku_rezultat(fakultet, 16001))
  399.         cout << "Stavka (rezultat) uspjesno ponisten!" << endl;
  400.  
  401.     if (!ponisti_stavku_rezultat(fakultet, 19001))
  402.         cout << "Student nije pronadjen!" << endl;
  403.  
  404.     /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  405.     * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je pasiti u tekstualni fajl.
  406.     * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt. zapisnik se nece
  407.     prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
  408.     if (printaj(fakultet))
  409.         cout << "Ispitni zapisnik uspjesno prikazan i spasen u fajl!" << endl;
  410.     fakultet.Dealociraj();
  411.  
  412.     system("PAUSE");
  413. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement