Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
- 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- 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
- 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
- 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)
- 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
- */
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #pragma warning(disable:4996)
- /*
- u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
- Datum ispita: 07.09.2017
- Predmet: Programiranje II
- IZVJESTAJ O ODRZANOM ISPITU
- Br indeksa Ime prezime Komisijsko*** Ocjena
- 16001 A. Joldic DA 5
- 15251 D. Music NE 7 Ponisteno
- 16014 E. Babovic DA 8
- UKUPNO POLOZILO: 2
- PROSJECNA OCJENA: 6.67
- *** komisijski ispit: ako student pristupa četvrti put i dalje (računajući i poništene rezultate)
- */
- char * crt = "\n-------------------------------------------\n";
- struct Datum
- {
- int _dan;
- int _mjesec;
- int _godina;
- void Unos(int d, int m, int g)
- {
- _dan = d;
- _mjesec = m;
- _godina = g;
- }
- void Ispis()
- {
- cout << _dan << "." << _mjesec << "." << _godina << " ";
- cout << endl;
- }
- char * datumKaoNizKaraktera()
- {
- char dan[3], mjeses[3], godina[5];
- _itoa_s(_dan, dan, 10);
- _itoa_s(_mjesec, mjeses, 10);
- _itoa_s(_godina, godina, 10);
- int size = 13;
- char * niz = new char[size];
- strcpy_s(niz, size, godina);
- strcat_s(niz, size, "-");
- strcat_s(niz, size, mjeses);
- strcat_s(niz, size, "-");
- strcat_s(niz, size, dan);
- return niz;
- }
- };
- struct Student
- {
- char _imePrezime[20];
- int _brojIndeksa;
- int _polozioECTS;
- void Unos(char* naziv, float cijena)
- {
- strcpy_s(_imePrezime, naziv);
- _brojIndeksa = cijena;
- _polozioECTS = 0;
- }
- void DodajECTS(float ects)
- {
- _polozioECTS += ects;
- }
- void UmanjiECTS(float ects)
- {
- _polozioECTS -= ects;
- }
- void Ispis()
- {
- cout << _imePrezime << ", Indeks: " << _brojIndeksa << ", ECTS: " << _polozioECTS << " " << endl;
- }
- };
- struct ZapisnikStavka
- {
- int _ocjena;
- Student* _student; //ZapisnikStavka će pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
- bool _ponisteno;
- bool _komisijskoPolaganje;
- void IspisKomisijkogPolaganja()
- {
- if (_komisijskoPolaganje)
- {
- cout << "Da";
- }
- else
- {
- cout << "Ne.";
- }
- }
- void Unos(Student* proizvod, int ocjena, bool komisijskoPolaganje)
- {
- _ocjena = ocjena;
- _student = proizvod;
- _komisijskoPolaganje = komisijskoPolaganje;
- _ponisteno = false;
- }
- void Ispis()
- {
- cout << _student->_imePrezime << "\t" << _ocjena << "\t" << _student->_brojIndeksa << "\t";
- if (_ponisteno)
- cout << " Ponisteno";
- cout << endl;
- }
- };
- struct IspitniZapisnik
- {
- Datum _datum;
- ZapisnikStavka ** _stavke;//svaki put se dodaje po jedna stavka
- int _brojStavki;
- int _ects;
- char _predmet[20];
- bool dodajzapisnikStavku(Student * student, int ocjena, bool komisijkaPolaganja)
- {
- ZapisnikStavka ** temp = new ZapisnikStavka *[_brojStavki + 1];
- for (int i = 0; i < _brojStavki; i++)
- {
- temp[i] = new ZapisnikStavka;
- temp[i]->Unos(_stavke[i]->_student, _stavke[i]->_ocjena, _stavke[i]->_komisijskoPolaganje);
- }
- temp[_brojStavki] = new ZapisnikStavka;
- temp[_brojStavki]->Unos(student, ocjena, komisijkaPolaganja);
- delete[]_stavke;
- _stavke = temp;
- _brojStavki++;
- return true;
- }
- void Unos(Datum datum, char* predmet, int ects)
- {
- _datum = datum;
- _brojStavki = 0;
- _stavke = nullptr;
- _ects = ects;
- strcpy_s(_predmet, predmet);
- }
- /*Prosjecnu ocjenu izračunati koristeći lambda funkciju koja se poziva koristeći objekat
- tipa auto. u prosjek računati i poništene rezultate (stavke)*/
- float GetProsjecnaOcjena()
- {
- auto lambda = [&]()
- {
- float ocjena = 0;
- float prosjek;
- for (int i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i]->_ponisteno == false)
- {
- ocjena += _stavke[i]->_ocjena;
- }
- prosjek = ocjena / _brojStavki;
- }
- return prosjek;
- };
- return lambda();
- }
- };
- const int Max = 100;
- /*unutar objekta tipa Fakultet ce se cuvati podaci o svim studentima i ispitnim zapisnicima, a dodaju se pomocu globalnih funkcija*/
- struct Fakultet
- {
- //umjesto brojaca koristiti default.ne vrijednosti
- Student* Studenti[Max] = { NULL };
- IspitniZapisnik* Zapisnici[Max] = { NULL };
- void Dealociraj()
- {
- for (size_t i = 0; i < Max; i++) {
- delete Studenti[i]; Studenti[i] = NULL;
- }
- for (size_t i = 0; i < Max; i++)
- {
- delete Zapisnici[i]; Zapisnici[i] = NULL;
- }
- }
- };
- /*dodaje podatke o novom studentu u fakultet */
- //fakultet, imePrezime, broj indeksa
- //ne dodaje studenta jer je broj indeksa zauzet -> uporediti po int broj indeksa
- void dodaj_student(Fakultet & fakultet, char * imePrezime, int brojIndeksa)
- {
- for (int i = 0; i < Max; i++)
- {
- if (fakultet.Studenti[i] != nullptr)
- {
- if (fakultet.Studenti[i]->_brojIndeksa == brojIndeksa)
- {
- cout << "Student s istim index-om vec nadjen." << endl;
- return;
- }
- }
- }
- for (int i = 0; i < Max; i++)
- {
- if (fakultet.Studenti[i] == nullptr)
- {
- fakultet.Studenti[i] = new Student;
- fakultet.Studenti[i]->Unos(imePrezime, brojIndeksa);
- cout << "Student je dodan. " << endl;
- return;
- }
- }
- }
- /*kraira novi zapisnik*/
- //fakultet, datum, predmet, ects krediti
- void kreiraj_zapisnik(Fakultet & fakultet, int dan, int mjesec, int godina, char * predmet, int ects)
- {
- for (int i = 0; i < Max; i++)
- {
- if (fakultet.Zapisnici[i] != nullptr)
- {
- if (strcmp(fakultet.Zapisnici[i]->_predmet, predmet) == 0)
- {
- cout << "Zapisnik vec postoji. " << endl;
- return;
- }
- }
- }
- for (int i = 0; i < Max; i++)
- {
- if (fakultet.Zapisnici[i] == nullptr)
- {
- Datum datum;
- datum.Unos(dan, mjesec, godina);
- fakultet.Zapisnici[i] = new IspitniZapisnik;
- fakultet.Zapisnici[i]->Unos(datum, predmet, ects);
- cout << "Zapisnik je uspjesno kreiran. " << endl;
- return;
- }
- }
- }
- /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
- /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
- bool dodaj_stavku_na_zapisnik(Fakultet & fakultet, int index, int ocjena)
- {
- Student * temp = nullptr;
- //priprema terena za ostatak rada:
- for (int i = 0; i < Max; i++)
- {
- if (fakultet.Studenti[i] != nullptr)
- {
- if (fakultet.Studenti[i]->_brojIndeksa == index)
- {
- temp = fakultet.Studenti[i];
- break;
- }
- }
- }
- for (int i = Max - 1; i >= 0; i--)
- {
- if (fakultet.Zapisnici[i] != nullptr && temp != nullptr)
- {
- for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
- {
- //provjera da li je student vec dodan
- if (fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa == index)
- {
- //ako je student vec dodan modifikuj ocjenu
- //"Student dodan, modifikovanje ocjene: ";
- fakultet.Zapisnici[i]->_stavke[j]->_ocjena = ocjena;
- //studentova nova ocjena ako je veca od 5 (ako je polozio) dodaj ects tog predmeta
- if (ocjena > 5)
- {
- //cout << "Student je polozio ispit, ects uvecani. " << endl;
- temp->DodajECTS(fakultet.Zapisnici[i]->_ects);
- }
- return false;
- }
- }
- //dodajemo novi ispitni zapisnik i potrebno je uvecati ects
- fakultet.Zapisnici[i]->dodajzapisnikStavku(temp, ocjena, false);
- if (ocjena > 5)
- temp->DodajECTS(fakultet.Zapisnici[i]->_ects); // dodajemo studentu ects bodove
- return true;
- }
- }
- }
- /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
- funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
- bool ponisti_stavku_rezultat(Fakultet & fakultet, int index)
- {
- for (int i = Max - 1; i >= 0; i--)
- {
- if (fakultet.Zapisnici[i] != nullptr)
- {
- for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
- {
- if (fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa == index)
- {
- fakultet.Zapisnici[i]->_stavke[j]->_ponisteno = true;
- fakultet.Zapisnici[i]->_stavke[j]->_student->UmanjiECTS(fakultet.Zapisnici[i]->_ects);
- return true;
- }
- }
- }
- }
- return false;
- }
- /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
- * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je spasiti u tekstualni fajl.
- * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt.
- zapisnik se nece prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
- bool printaj(Fakultet & fakultet)
- {
- for (int i = Max - 1; i >= 0; i--)
- {
- bool svePonistene = true;
- if (fakultet.Zapisnici[i] != nullptr)
- {
- if (fakultet.Zapisnici[i]->_brojStavki == 0)
- {
- cout << "Zapisnik ne posjeduje niti jednu stavku. " << endl;
- return false;
- }
- for (size_t j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
- if (!fakultet.Zapisnici[i]->_stavke[j]->_ponisteno) svePonistene = false;
- {
- if (svePonistene)
- {
- cout << "Sve stavke su ponistene. " << endl;
- return false;
- }
- }
- }
- }
- int brojacPolozenih = 0;
- float sumaOcjena = 0;
- float prosjek = 0;
- for (int i = Max - 1; i >= 0; i--)
- {
- brojacPolozenih = 0, sumaOcjena = 0, prosjek = 0;
- if (fakultet.Zapisnici[i] != nullptr)
- {
- cout << "Datum ispita: ";
- fakultet.Zapisnici[i]->_datum.Ispis();
- cout << "Predmet: ";
- cout << fakultet.Zapisnici[i]->_predmet << endl;
- cout << "IZVJESTAJ O ODRZANOM ISPITU" << endl;
- cout << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
- for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
- {
- cout << fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_student->_imePrezime << "\t";
- fakultet.Zapisnici[i]->_stavke[j]->IspisKomisijkogPolaganja();
- cout << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_ocjena << endl;
- if (fakultet.Zapisnici[i]->_stavke[j]->_ocjena > 5)
- brojacPolozenih++;
- sumaOcjena += fakultet.Zapisnici[i]->_stavke[j]->_ocjena;
- prosjek = sumaOcjena / fakultet.Zapisnici[i]->_brojStavki;
- }
- cout << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
- cout << "PROSJECNA OCJENA: " << prosjek;
- cout << crt;
- }
- }
- ////////////////////////////////upisivanje u .txt
- //* naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt.
- for (int i = Max - 1; i >= 0; i--)
- {
- if (fakultet.Zapisnici[i] != nullptr)
- {
- int size = strlen(fakultet.Zapisnici[i]->_predmet) + 16;
- char * niz = new char[size];
- strcpy_s(niz, size, fakultet.Zapisnici[i]->_predmet);
- strcat_s(niz, size, "_");
- strcat_s(niz, size, fakultet.Zapisnici[i]->_datum.datumKaoNizKaraktera());
- strcat_s(niz, size, ".txt");
- ofstream upis(niz);
- if (upis.fail())
- {
- cout << "Greska prilikom upisa u fajl";
- return false;
- }
- int brojacPolozenihUpis = 0;
- float sumaOcjenaUpis = 0;
- float prosjekUpis = 0;
- brojacPolozenihUpis = 0, sumaOcjenaUpis = 0, prosjekUpis = 0;
- upis << "Datum ispita: ";
- upis << fakultet.Zapisnici[i]->_datum._dan << "." << fakultet.Zapisnici[i]->_datum._mjesec << "." << fakultet.Zapisnici[i]->_datum._godina << endl;
- upis << "Predmet: ";
- upis << fakultet.Zapisnici[i]->_predmet << endl;
- upis << "IZVJESTAJ O ODRZANOM ISPITU" << endl;
- upis << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
- for (int j = 0; j < fakultet.Zapisnici[i]->_brojStavki; j++)
- {
- upis << fakultet.Zapisnici[i]->_stavke[j]->_student->_brojIndeksa << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_student->_imePrezime << "\t";
- //fakultet.Zapisnici[i]->_stavke[j]->IspisKomisijkogPolaganja();
- upis << "\t" << fakultet.Zapisnici[i]->_stavke[j]->_ocjena << endl;
- if (fakultet.Zapisnici[i]->_stavke[j]->_ocjena > 5)
- brojacPolozenihUpis++;
- sumaOcjenaUpis += fakultet.Zapisnici[i]->_stavke[j]->_ocjena;
- prosjekUpis = sumaOcjenaUpis / fakultet.Zapisnici[i]->_brojStavki;
- }
- upis << "UKUPNO POLOZILO: " << brojacPolozenihUpis << endl;
- upis << "PROSJECNA OCJENA: " << prosjekUpis;
- upis << crt;
- upis.close();
- cout << "Uspjesno: " << niz << endl;
- delete[] niz;
- }
- }
- return true;
- }
- void main() {
- Fakultet fakultet;
- /*dodaje podatke o novom studentu u fakultet */
- //fakultet, imePrezime, broj indeksa
- dodaj_student(fakultet, "A. Joldic", 16001);
- dodaj_student(fakultet, "D. Music", 15251);
- dodaj_student(fakultet, "E. Babovic ", 16014);
- dodaj_student(fakultet, "E. Junuz", 16015);
- dodaj_student(fakultet, "J. Azemovic", 16014);//ne dodaje studenta jer je broj indeksa zauzet
- /*kraira novi zapisnik*/
- //fakultet, datum, predmet, ects krediti
- cout << crt;
- kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7);
- kreiraj_zapisnik(fakultet, 6, 9, 2017, "Programiranje 2", 7); // testni poziv za funkciju kreiraj_zapisnik
- cout << crt;
- /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta uveća ako je student položio ispit. */
- if (dodaj_stavku_na_zapisnik(fakultet, 16001, 5))
- cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- /*ako je student vec dodat u zapisnik, onda se vrsi samo modifikacija njegove ocjene*/
- if (!dodaj_stavku_na_zapisnik(fakultet, 16001, 6))
- cout << "Student vec dodat na zapisnik. Ocjena je ispravljena!" << endl;
- dodaj_stavku_na_zapisnik(fakultet, 15251, 5);
- dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
- dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
- kreiraj_zapisnik(fakultet, 7, 9, 2017, "Racunarske mreze", 5);
- cout << crt;
- //naredne stavke se dodaju na novi zapisnik
- dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
- dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
- cout << crt;
- /*u posljednjem zapisniku stavku za studenta 16001 ponistiti, a studentu umanjiti ects bodove.
- funkcija vraca false u slucaju da se student ne nalazi na posljednjem zapisniku*/
- if (ponisti_stavku_rezultat(fakultet, 16001))
- cout << "Stavka (rezultat) uspjesno ponisten!" << endl;
- if (!ponisti_stavku_rezultat(fakultet, 19001))
- cout << "Student nije pronadjen!" << endl;
- cout << crt;
- /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
- * pored prikazivanja, identican sadrzaj ispitnog zapisnika je potrebno je pasiti u tekstualni fajl.
- * naziv fajla treba biti Predmet_datum.txt, npr. ProgramiranjeII_2017-09-01.txt. zapisnik se nece
- prikazati niti sacuvati u fajl ukoliko ne posjeduje niti jednu stavku ili su sve stavke ponistene*/
- if (printaj(fakultet))
- cout << "Ispitni zapisnik uspjesno prikazan i spasen u fajl!" << endl;
- cout << crt;
- fakultet.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement