Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Izvršiti definiciju funkcija na naèin koji odgovara opisu(komentarima) datom neposredno uz pozive ili nazive funkcija.7
- //Možete dati komentar na bilo koju liniju code - a koju smatrate da bi trebalo unaprijediti ili da æe eventualno uzrokovati grešku prilikom kompajliranja.Takoðer,
- //možete dodati dodatne funkcije koje æe vam olakšati implementaciju programa.
- #include <iostream>
- 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.2018
- 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)
- */
- const char * crt = "\n-------------------------------------------\n";
- const int MAX = 100;
- char * AlocirajNizKaraktera(const char * sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char * temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- struct Datum {
- int _dan, _mjesec, _godina;
- void Unos(int d, int m, int g) {
- _dan = d;
- _mjesec = m;
- _godina = g;
- }
- void Ispis() {
- cout << _dan << "." << _mjesec << "." << _godina << " ";
- }
- };
- struct Student {
- char * _imePrezime;
- int _brojIndeksa;
- int _polozioECTS;
- void Unos(const char* ime, float indeks) {
- _imePrezime = AlocirajNizKaraktera(ime);
- _brojIndeksa = indeks;
- _polozioECTS = 0;
- }
- void Dealociraj()
- {
- delete[] _imePrezime; _imePrezime = nullptr;
- }
- 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;
- //ZapisnikStavka æe pokazivati na objekat tipa student koji se nalazi u instanci tipa Fakultet, pa nije potrebno vršiti nove alokacije
- Student* _student;
- bool _ponisteno;
- bool _komisijskoPolaganje;
- void Unos(Student* student, int ocjena, bool komisijskoPolaganje) {
- _ocjena = ocjena;
- _student = student;
- _komisijskoPolaganje = komisijskoPolaganje;
- _ponisteno = false;
- }
- void Ispis() {
- cout << _student->_imePrezime << "\t" << _ocjena << "\t" << _student->_brojIndeksa << "\t";
- if (_ponisteno)
- cout << " Ponisteno";
- cout << endl;
- }
- void IspisPrintaj()
- {
- cout << _student->_brojIndeksa << "\t\t" << _student->_imePrezime << "\t" << _komisijskoPolaganje << "\t\t" << _ocjena << endl;
- }
- void Dealociraj()
- {
- _student->Dealociraj();
- delete[] _student;
- _student = nullptr;
- }
- };
- struct IspitniZapisnik {
- Datum _datum;
- ZapisnikStavka * _stavke;//svaki put se dodaje po jedna stavka
- int _brojStavki;
- int _ects;
- char * _predmet;
- bool dodajZapisnikStavku(ZapisnikStavka stavka)
- {
- ZapisnikStavka * temp = new ZapisnikStavka[_brojStavki + 1];
- for (int i = 0; i < _brojStavki; i++)
- {
- temp[i].Unos(_stavke[i]._student, _stavke[i]._ocjena, _stavke[i]._komisijskoPolaganje);
- temp[i]._ponisteno = _stavke[i]._ponisteno;
- }
- temp[_brojStavki].Unos(stavka._student, stavka._ocjena, stavka._komisijskoPolaganje);
- temp[_brojStavki]._ponisteno = stavka._ponisteno;
- delete[] _stavke;
- _stavke = temp;
- _brojStavki++;
- return true;
- }
- void Unos(Datum & datum, const char* predmet, int ects) {
- _datum = datum;
- _brojStavki = 0;
- _stavke = nullptr;
- _ects = ects;
- _predmet = AlocirajNizKaraktera(predmet);
- }
- void Dealociraj() {
- delete[] _predmet; _predmet = nullptr;
- delete[] _stavke; _stavke = nullptr;
- }
- /*Prosjecnu ocjenu izraèunati koristeæi lambda funkciju. u prosjek raèunati i poništene rezultate (stavke)*/
- float GetProsjecnaOcjena()
- {
- auto lambda = [&]()
- {
- int suma = 0;
- float prosjek = 0;
- for (int i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i]._ponisteno==true || _stavke[i]._ponisteno == false)
- {
- suma += _stavke[i]._ocjena;
- }
- }
- prosjek = float(suma) / _brojStavki;
- return prosjek;
- };
- return lambda();
- }
- void Ispis()
- {
- cout << "Datum: ";
- _datum.Ispis();
- cout << "Predmet: " << _predmet << " " << "Ects: " << _ects << endl;
- }
- };
- /*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] = { nullptr };
- IspitniZapisnik* _zapisnici[MAX] = { nullptr };
- void Dealociraj() {
- for (size_t i = 0; i < MAX; i++)
- {
- if (_studenti[i] != nullptr && _zapisnici[i] != nullptr)
- {
- _studenti[i]->Dealociraj();
- _zapisnici[i]->Dealociraj();
- delete _studenti[i]; _studenti[i] = NULL;
- delete _zapisnici[i]; _zapisnici[i] = NULL;
- }
- }
- }
- /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
- zapisnik se nece prikazati ukoliko ne posjeduje niti jednu stavku ili su sve stavke poništene.
- prilikom kreiranja zapisnika iskoristiti funkciju GetProsjecnaOcjena i njenu lambda implementaciju*/
- /*
- u nastavku je prikazan primjer ispitnog zapisnika (izvještaj o održanom ispitu) sa detaljima/stavkama
- -------------------------------------------
- Datum ispita: 07.09.2018
- 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)
- */
- bool printaj()
- {
- //uslovi za ne prikazivanje (printanje) funkcije
- int brojPonistenihStavki = 0;
- for (int i = MAX - 1; i >= 0; i--)
- {
- if (_zapisnici[i] != nullptr)
- {
- for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
- {
- if (_zapisnici[i]->_stavke[j]._ponisteno == true)
- {
- brojPonistenihStavki++;
- }
- }
- if (brojPonistenihStavki == _zapisnici[i]->_brojStavki)
- {
- return false;
- }
- if (_zapisnici[i]->_brojStavki == 0)
- {
- return false;
- }
- break;
- }
- }
- //uslovi za prikazivanje (printanje) funkcije
- cout << crt;
- cout << "Datum ispita: ";
- for (int i = MAX - 1; i >= 0; i--)
- {
- if (_zapisnici[i] != nullptr)
- {
- _zapisnici[i]->_datum.Ispis();
- cout << endl;
- cout << "Predmet: ";
- cout << _zapisnici[i]->_predmet;
- cout << crt;
- cout << "IZVJESTAJ O ODRZANOM ISPITU";
- cout << crt;
- cout << "Br indeksa \tIme prezime \tKomisijsko*** \tOcjena" << endl;
- for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
- {
- _zapisnici[i]->_stavke[j].IspisPrintaj();
- }
- int brojacPolozenih = 0;
- for (int j = 0; j < _zapisnici[i]->_brojStavki; j++)
- {
- if (_zapisnici[i]->_stavke[j]._ocjena > 5)
- {
- brojacPolozenih++;
- }
- }
- cout << "UKUPNO POLOZILO: " << brojacPolozenih << endl;
- cout << "PROSJECNA OCJENA: ";
- cout<<_zapisnici[i]->GetProsjecnaOcjena();
- cout << crt;
- cout << "*** komisijski ispit: ako student pristupa èetvrti put i dalje (raèunajuæi i poništene rezultate)" << endl;
- break;
- }
- }
- return true;
- }
- };
- /*dodaje podatke o novom studentu u fakultet */
- //ne dodaje studenta jer je broj indeksa zauzet
- //fakultet, imePrezime, broj indeksa
- void dodaj_student(Fakultet &fakultet, const char *ime_prezime, int broj_indexa)
- {
- for (int i = 0; i < MAX; i++)
- {
- if (fakultet._studenti[i] == nullptr)
- {
- fakultet._studenti[i] = new Student;
- fakultet._studenti[i]->Unos(ime_prezime, broj_indexa);
- cout << i << ": " << "Dodan: ";
- fakultet._studenti[i]->Ispis();
- return;
- }
- else if (fakultet._studenti[i]->_brojIndeksa == broj_indexa)
- {
- cout << i << ": " << "Broj indeksa je zauzet kod: ";
- fakultet._studenti[i]->Ispis();
- return;
- }
- }
- }
- /*kraira novi zapisnik*/
- //fakultet, datum, predmet, ects krediti
- void kreiraj_zapisnik(Fakultet & fakultet, int dan, int mjesec, int godina, const char * predmet, int ects)
- {
- Datum datum;
- datum.Unos(dan, mjesec, godina);
- for (int i = 0; i < MAX; i++)
- {
- if (fakultet._zapisnici[i] == nullptr)
- {
- fakultet._zapisnici[i] = new IspitniZapisnik;
- fakultet._zapisnici[i]->Unos(datum, predmet, ects);
- cout << i << ": " << "Dodan zapisnik-> ";
- fakultet._zapisnici[i]->Ispis();
- return;
- }
- }
- }
- ///*dodaje stavku na posljednji kreiran zapisnik, a ects studenta (_polozioECTS) 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)
- {
- char * imePrezime = nullptr;
- int ectsStudenta;
- int size = 0;
- ZapisnikStavka stavka;
- Student * studnet = nullptr;
- for (int i = 0; i < MAX; i++)
- {
- if (fakultet._studenti[i]->_brojIndeksa == index)
- {
- size = strlen(fakultet._studenti[i]->_imePrezime) + 1;
- imePrezime = new char[size];
- strcpy_s(imePrezime, size, fakultet._studenti[i]->_imePrezime);
- ectsStudenta = fakultet._studenti[i]->_polozioECTS;
- studnet = fakultet._studenti[i];
- break;
- }
- }
- 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]._ocjena = ocjena;
- return false;
- }
- }
- break;
- }
- }
- studnet->Unos(imePrezime, index);
- for (int i = MAX - 1; i >= 0; i--)
- {
- if (fakultet._zapisnici[i] != nullptr)
- {
- stavka.Unos(studnet, ocjena, false);
- fakultet._zapisnici[i]->dodajZapisnikStavku(stavka);
- for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
- {
- if (fakultet._zapisnici[i]->_stavke[j]._ocjena > 5)
- {
- fakultet._zapisnici[i]->_stavke[j]._student->DodajECTS(fakultet._zapisnici[i]->_stavke[j]._student->_polozioECTS);
- }
- }
- delete[] imePrezime; imePrezime = nullptr;
- return true;
- }
- }
- delete[] imePrezime; imePrezime = nullptr;
- return false;
- }
- /*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)
- {
- for (int j = 0; j < fakultet._zapisnici[i]->_brojStavki; j++)
- {
- fakultet._zapisnici[i]->_stavke[j]._ponisteno = true;//ponistiti stavke za dati broj indeksa
- fakultet._studenti[i]->UmanjiECTS(fakultet._zapisnici[i]->_ects);//za studnetov broj indeksa umanji ects bodove
- return true; //vrati true, tj ako ima taj broj indeksa ponisti i umanji ects
- }
- }
- }
- }
- }
- return false;//ako nema tog broja ineksa na posaljednjem vrati false i ne radi nista
- }
- int 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
- kreiraj_zapisnik(fakultet, 6, 9, 2018, "Programiranje II", 7);
- /*dodaje stavku na posljednji kreiran zapisnik, a ects studenta (_polozioECTS) 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);
- //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- dodaj_stavku_na_zapisnik(fakultet, 16015, 6);
- //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- dodaj_stavku_na_zapisnik(fakultet, 16014, 8);
- //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- kreiraj_zapisnik(fakultet, 7, 9, 2018, "Raèunarske mreze", 5);
- //naredne stavke se dodaju na novi zapisnik
- dodaj_stavku_na_zapisnik(fakultet, 16015, 5);
- //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- dodaj_stavku_na_zapisnik(fakultet, 16014, 10);
- //cout << "Stavka (rezultat) uspjesno dodata!" << endl;
- /*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;
- /* funkcija printaj prikazuje posljednji ispitni zapisnik u formatu prikazanom na pocetku zadatka.
- zapisnik se nece prikazati ukoliko ne posjeduje niti jednu stavku ili su sve stavke poništene. prilikom kreiranja zapisnika
- iskoristiti funkciju GetProsjecnaOcjena i njenu lambda implementaciju*/
- if (fakultet.printaj())
- cout << "Ispitni zapisnik uspjesno prikazan!" << endl;
- fakultet.Dealociraj();
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement