Advertisement
adnanj

PRII - Ispit od 7. 9. 2017. god.

Sep 8th, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. /*
  7. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  8. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  9. 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
  10. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  11. 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)
  12. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  13. */
  14. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  15. #pragma warning(disable:4996)
  16.  
  17. /*
  18. u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
  19.  
  20. Datum ispita: 07.09.2017
  21. Predmet: Programiranje II
  22. IZVJESTAJ O ODRZANOM ISPITU
  23. Br indeksa Ime prezime Komisijsko*** Ocjena
  24. 16001   A. Joldic   DA  5
  25. 15251   D. Music    NE  7 Ponisteno
  26. 16014   E. Babovic  DA  8
  27. UKUPNO POLOZILO:    2
  28. PROSJECNA OCJENA:   6.67
  29. *** komisijski ispit: ako student pristupa četvrti put i dalje (računajući i poništene rezultate)
  30. */
  31.  
  32. char * crt = "\n-------------------------------------------\n";
  33. struct Datum {
  34.     int _dan;
  35.     int _mjesec;
  36.     int _godina;
  37.     void Unos(int d, int m, int g) {
  38.         _dan = d;
  39.         _mjesec = m;
  40.         _godina = g;
  41.     }
  42.     void Ispis() {
  43.         cout << _dan << "." << _mjesec << "." << _godina << " ";
  44.     }
  45.  
  46.     char * ToCharArray()
  47.     {
  48.         char dan[3], mjesec[3], godina[5];
  49.         _itoa_s(_dan, dan, 10);
  50.         _itoa_s(_mjesec, mjesec, 10);
  51.         _itoa_s(_godina, godina, 10);
  52.         int velicina = strlen(dan) + strlen(mjesec) + strlen(godina) + 3;
  53.         char * datumKaoChar = new char[velicina];
  54.         strcpy_s(datumKaoChar, strlen(godina) + 1, godina);
  55.         strcat_s(datumKaoChar, velicina, "-");
  56.         strcat_s(datumKaoChar, velicina, mjesec);
  57.         strcat_s(datumKaoChar, velicina, "-");
  58.         strcat_s(datumKaoChar, velicina, dan);
  59.         return datumKaoChar;
  60.     }
  61. };
  62. struct Student {
  63.     char _imePrezime[20];
  64.     int _brojIndeksa;
  65.     int _polozioECTS;
  66.  
  67.     void Unos(char* naziv, int brojIndeksa) {
  68.         strcpy_s(_imePrezime, naziv);
  69.         _brojIndeksa = brojIndeksa;
  70.         _polozioECTS = 0;
  71.     }
  72.     void DodajECTS(float ects) {
  73.         _polozioECTS += ects;
  74.     }
  75.     void UmanjiECTS(float ects) {
  76.         _polozioECTS -= ects;
  77.     }
  78.     void Ispis() {
  79.         cout << _imePrezime << ", Indeks: " << _brojIndeksa << ", ECTS: " << _polozioECTS << " " << endl;
  80.     }
  81. };
  82.  
  83. struct ZapisnikStavka {
  84.     int _ocjena;
  85.     Student* _student; //ZapisnikStavka će pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
  86.     bool _ponisteno;
  87.     bool _komisijskoPolaganje;
  88.  
  89.     void Unos(Student* proizvod, int ocjena, bool komisijskoPolaganje) {
  90.         _ocjena = ocjena;
  91.         _student = proizvod;
  92.         _komisijskoPolaganje = komisijskoPolaganje;
  93.         _ponisteno = false;
  94.     }
  95.  
  96.     void Ispis() {
  97.         //Funkcija je izmijenjena/prilagođena
  98.         cout << left << setw(13) << _student->_brojIndeksa << setw(17) << _student->_imePrezime << setw(11) << (_komisijskoPolaganje ? "DA" : "NE") << _ocjena << setw(8) << (_ponisteno ? " (ponisteno)" : "");
  99.     }
  100. };
  101. struct IspitniZapisnik {
  102.     Datum _datum;
  103.     ZapisnikStavka ** _stavke;//svaki put se dodaje po jedna stavka
  104.     int _brojStavki;
  105.     int _ects;
  106.     char _predmet[20];
  107.     void Unos(Datum datum, char* predmet, int ects) {
  108.         _datum = datum;
  109.         _brojStavki = 0;
  110.         _stavke = nullptr;
  111.         _ects = ects;
  112.         strcpy_s(_predmet, predmet);
  113.     }
  114.     /*Prosjecnu ocjenu izračunati koristeći lambda funkciju koja se poziva koristeći objekat
  115.     tipa auto. u prosjek računati i poništene rezultate (stavke)*/
  116.     float GetProsjecnaOcjena() {
  117.         auto izracunajProsjek = [](ZapisnikStavka ** stavke, int brojStavki) -> float {
  118.             float suma = 0;
  119.             for (size_t i = 0; i < brojStavki; i++)
  120.                 suma += stavke[i]->_ocjena;
  121.             return suma / brojStavki;
  122.         };
  123.         return izracunajProsjek(_stavke, _brojStavki);
  124.     }
  125.  
  126.     void Dealociraj()
  127.     {
  128.         for (size_t i = 0; i < _brojStavki; i++)
  129.             delete _stavke[i];
  130.         delete[] _stavke; _stavke = NULL;
  131.     }
  132. };
  133. const int Max = 100;
  134.  
  135. /*unutar objekta tipa Fakultet ce se cuvati podaci o svim studentima i ispitnim zapisnicima, a dodaju se pomocu globalnih funkcija*/
  136. struct Fakultet {
  137.     //umjesto brojaca koristiti default.ne vrijednosti
  138.     Student* Studenti[Max] = { NULL };
  139.     IspitniZapisnik* Zapisnici[Max] = { NULL };
  140.  
  141.     void Dealociraj() {
  142.         for (size_t i = 0; Studenti[i] != NULL; i++) {
  143.             delete Studenti[i]; Studenti[i] = NULL;
  144.         }
  145.         for (size_t i = 0; Zapisnici[i] != NULL; i++) {
  146.             Zapisnici[i]->Dealociraj();
  147.             delete Zapisnici[i]; Zapisnici[i] = NULL;  
  148.         }
  149.     }
  150. };
  151.  
  152. bool dodaj_student(Fakultet &fakultet, char * imePrezime, int brojIndeksa)
  153. {
  154.     for (size_t i = 0; fakultet.Studenti[i] != NULL; i++)
  155.         if (fakultet.Studenti[i]->_brojIndeksa == brojIndeksa)
  156.         {
  157.             cout << "GRESKA: Student " << imePrezime << " (" << brojIndeksa << ") nije dodan jer je broj indeksa zauzet!" << endl;
  158.             return false;
  159.         }
  160.  
  161.     for (size_t i = 0; i < Max; i++)
  162.         if (fakultet.Studenti[i] == NULL)
  163.         {
  164.             fakultet.Studenti[i] = new Student;
  165.             fakultet.Studenti[i]->Unos(imePrezime, brojIndeksa);
  166.             cout << "Student " << imePrezime << " (" << brojIndeksa << ") je uspjesno dodan na fakultet!" << endl;
  167.             return true;
  168.         }
  169.     return false;
  170. }
  171.  
  172. bool kreiraj_zapisnik(Fakultet &fakultet, int dan, int mjesec, int godina, char * nazivPredmeta, int ECTS)
  173. {
  174.     for (size_t i = 0; i < Max; i++)
  175.         if (fakultet.Zapisnici[i] == NULL)
  176.         {
  177.             fakultet.Zapisnici[i] = new IspitniZapisnik;
  178.             Datum temp; temp.Unos(dan, mjesec, godina);
  179.             fakultet.Zapisnici[i]->Unos(temp, nazivPredmeta, ECTS);
  180.             cout << "Uspjesno dodan ispitni zapisnik za predmet " << nazivPredmeta << " na dan " << dan << ". " << mjesec << ". " << godina << "!" << endl;
  181.             return true;
  182.         }
  183.     return false;
  184. }
  185.  
  186. bool dodaj_stavku_na_zapisnik(Fakultet &fakultet, int brojIndeksa, int ocjena)
  187. {
  188.     Student * student = NULL;
  189.     for (size_t i = 0; fakultet.Studenti[i] != NULL && student == NULL; i++)
  190.         if (fakultet.Studenti[i]->_brojIndeksa == brojIndeksa)
  191.             student = fakultet.Studenti[i];
  192.  
  193.     if (student == NULL)
  194.     {
  195.         cout << "GRESKA: Student s brojem indeksa " << brojIndeksa << " nije pronadjen na fakultetu!" << endl;
  196.         return false;
  197.     }
  198.  
  199.     int indeksPosljednjegZapisnika = -1;
  200.  
  201.     for (size_t i = 0; fakultet.Zapisnici[i] != NULL; i++)
  202.         indeksPosljednjegZapisnika = i;
  203.  
  204.     if (indeksPosljednjegZapisnika == -1)
  205.     {
  206.         cout << "GRESKA: Nije pronadjen niti jedan zapisnik na fakultetu!" << endl;
  207.         return false;
  208.     }
  209.  
  210.     //Provjeravamo je li student već na spisku, ako jeste, tada se radi o modifikaciji ocjene
  211.     for (size_t i = 0; i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki; i++)
  212.         if (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_student->_brojIndeksa == brojIndeksa)
  213.         {
  214.             fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ocjena = ocjena;
  215.             return false;
  216.         }
  217.  
  218.     //Zahvaljujući posljednjem ispitnom zapisniku imamo informaciju o tome na koji predmet student izlazi, te možemo prebrojati koliko je puta izišao na ispit iz tog predmeta
  219.     int ukupnoPolaganja = 0;
  220.  
  221.     for (size_t i = 0; fakultet.Zapisnici[i] != NULL; i++)
  222.         for (size_t j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
  223.             if (strcmp(fakultet.Zapisnici[i]->_predmet, fakultet.Zapisnici[indeksPosljednjegZapisnika]->_predmet) == 0 && fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa == brojIndeksa)
  224.                 ukupnoPolaganja++;
  225.  
  226.     ZapisnikStavka ** temp = new ZapisnikStavka*[fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki + 1];
  227.  
  228.     for (size_t i = 0; i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki; i++)
  229.         temp[i] = fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i];
  230.  
  231.     delete[] fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke;
  232.     fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke = temp;
  233.     fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki] = new ZapisnikStavka;
  234.     fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki++]->Unos(student, ocjena, ukupnoPolaganja >= 4);
  235.     if (ocjena > 5)
  236.         student->DodajECTS(fakultet.Zapisnici[indeksPosljednjegZapisnika]->_ects);
  237.     return true;
  238. }
  239.  
  240. bool ponisti_stavku_rezultat(Fakultet &fakultet, int brojIndeksa)
  241. {
  242.     int indeksPosljednjegZapisnika = -1;
  243.  
  244.     for (size_t i = 0; fakultet.Zapisnici[i] != NULL; i++)
  245.         indeksPosljednjegZapisnika = i;
  246.  
  247.     if (indeksPosljednjegZapisnika == -1)
  248.     {
  249.         cout << "GRESKA: Nije pronadjen niti jedan zapisnik na fakultetu!" << endl;
  250.         return false;
  251.     }
  252.  
  253.     for (size_t i = 0; i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki; i++)
  254.         if (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_student->_brojIndeksa == brojIndeksa)
  255.         {
  256.             fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ponisteno = true;
  257.             fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_student->UmanjiECTS(fakultet.Zapisnici[indeksPosljednjegZapisnika]->_ects);
  258. fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki--;
  259.             return true;
  260.         }
  261.     return false;
  262. }
  263.  
  264. bool printaj(Fakultet &fakultet)
  265. {
  266.     int indeksPosljednjegZapisnika = -1;
  267.  
  268.     for (size_t i = 0; fakultet.Zapisnici[i] != NULL; i++)
  269.         indeksPosljednjegZapisnika = i;
  270.  
  271.     if (indeksPosljednjegZapisnika == -1)
  272.     {
  273.         cout << "GRESKA: Nije pronadjen niti jedan zapisnik na fakultetu!" << endl;
  274.         return false;
  275.     }
  276.  
  277.     int ukupnoPolozilo = 0, ukupnoPonistenih = 0;
  278.     float prosjecnaOcjena = fakultet.Zapisnici[indeksPosljednjegZapisnika]->GetProsjecnaOcjena();
  279.     cout << crt << "Datum ispita: ";
  280.     fakultet.Zapisnici[indeksPosljednjegZapisnika]->_datum.Ispis();
  281.     cout << endl << "Predmet: " << fakultet.Zapisnici[indeksPosljednjegZapisnika]->_predmet << crt;
  282.     cout << "\tIZVJESTAJ O ODRZANOM ISPITU" << crt;
  283.     cout << "Br. indeksa" << setw(13) << "Ime prezime" << setw(13) << "Komisijsko" << setw(8) << "Ocjena" << endl;
  284.     for (size_t i = 0; i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki; i++)
  285.     {
  286.         fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->Ispis();
  287.  
  288.         if (i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki - 1)
  289.             cout << endl;
  290.  
  291.         if (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ocjena > 5)
  292.             ukupnoPolozilo++;
  293.         if (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ponisteno)
  294.             ukupnoPonistenih++;
  295.     }
  296.     cout << crt;
  297.     cout << "Ukupno polozilo: " << ukupnoPolozilo << endl;
  298.     cout << "Prosjecna ocjena: " << prosjecnaOcjena << crt;
  299.  
  300.     if (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki == 0 || fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki == ukupnoPonistenih)
  301.         return false;
  302.  
  303.     char * datumKaoChar = fakultet.Zapisnici[indeksPosljednjegZapisnika]->_datum.ToCharArray();
  304.     int brojKarakteraPredmet = strlen(fakultet.Zapisnici[indeksPosljednjegZapisnika]->_predmet), brojKarakteraDatum = strlen(datumKaoChar), ukupnoKaraktera = brojKarakteraPredmet + brojKarakteraDatum + 6;
  305.     char * nazivDatoteke = new char[ukupnoKaraktera];
  306.     strcpy_s(nazivDatoteke, brojKarakteraPredmet + 1, fakultet.Zapisnici[indeksPosljednjegZapisnika]->_predmet);
  307.     strcat_s(nazivDatoteke, ukupnoKaraktera, "_");
  308.     strcat_s(nazivDatoteke, ukupnoKaraktera, datumKaoChar);
  309.     strcat_s(nazivDatoteke, ukupnoKaraktera, ".txt");
  310.  
  311.     ofstream upis(nazivDatoteke);
  312.  
  313.     if (upis.fail())
  314.     {
  315.         cout << "GRESKA: Doslo je do greske prilikom otvaranja datoteke " << nazivDatoteke << "!" << endl;
  316.         return false;
  317.     }
  318.  
  319.     upis << crt << "Datum ispita: " << datumKaoChar;
  320.     upis << endl << "Predmet: " << fakultet.Zapisnici[indeksPosljednjegZapisnika]->_predmet << crt;
  321.     upis << "\tIZVJESTAJ O ODRZANOM ISPITU" << crt;
  322.     upis << "Br. indeksa" << setw(13) << "Ime prezime" << setw(13) << "Komisijsko" << setw(8) << "Ocjena" << endl;
  323.     for (size_t i = 0; i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki; i++)
  324.     {
  325.         upis << left << setw(13)
  326.             << fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_student->_brojIndeksa << setw(17)
  327.             << fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_student->_imePrezime << setw(11)
  328.             << (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_komisijskoPolaganje ? "DA" : "NE")
  329.             << fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ocjena << setw(8)
  330.             << (fakultet.Zapisnici[indeksPosljednjegZapisnika]->_stavke[i]->_ponisteno ? " (ponisteno)" : "");
  331.  
  332.         if (i < fakultet.Zapisnici[indeksPosljednjegZapisnika]->_brojStavki - 1)
  333.             upis << endl;
  334.     }
  335.     upis << crt;
  336.     upis << "Ukupno polozilo: " << ukupnoPolozilo << endl;
  337.     upis << "Prosjecna ocjena: " << prosjecnaOcjena << crt;
  338.  
  339.     upis.close();
  340.     return true;
  341. }
  342.  
  343. void main() {
  344.     Fakultet fakultet;
  345.  
  346.     /*dodaje podatke o novom studentu u fakultet */
  347.     //fakultet, imePrezime, broj indeksa
  348.     dodaj_student(fakultet, "A. Joldic", 16001);
  349.     dodaj_student(fakultet, "D. Music", 15251);
  350.     dodaj_student(fakultet, "E. Babovic", 16014);
  351.     dodaj_student(fakultet, "E. Junuz", 16015);
  352.     dodaj_student(fakultet, "J. Azemovic", 16014);//ne dodaje studenta jer je broj indeksa zauzet
  353.                                                   /*kraira novi zapisnik*/
  354.                                                   //fakultet, datum, predmet, ects krediti
  355.     kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7);
  356.  
  357.     //*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
  358.  
  359.     if (dodaj_stavku_na_zapisnik(fakultet, 16001, 5))
  360.         cout << "Stavka (rezultat) uspjesno dodata!" << endl;
  361.  
  362.     /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
  363.     if (!dodaj_stavku_na_zapisnik(fakultet, 16001, 6))
  364.         cout << "Student vec dodat na zapisnik. Ocjena je ispravljena!" << endl;
  365.  
  366.     dodaj_stavku_na_zapisnik(fakultet, 15251, 5);
  367.     dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
  368.     dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
  369.  
  370.     kreiraj_zapisnik(fakultet, 7, 9, 2017, "Računarske mreze", 5);
  371.     //naredne stavke se dodaju na novi zapisnik
  372.     dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
  373.     dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
  374.  
  375.  
  376.     /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
  377.     funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
  378.  
  379.     if (ponisti_stavku_rezultat(fakultet, 16001))
  380.         cout << "Stavka (rezultat) uspjesno ponisten!" << endl;
  381.  
  382.     if (!ponisti_stavku_rezultat(fakultet, 19001))
  383.         cout << "Student nije pronadjen!" << endl;
  384.  
  385.     /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
  386.     * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je pasiti u tekstualni fajl.
  387.     * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt. zapisnik se nece
  388.     prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
  389.     if (printaj(fakultet))
  390.         cout << "Ispitni zapisnik uspjesno prikazan i spasen u fajl!" << endl;
  391.     fakultet.Dealociraj();
  392. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement