Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
- struct Datum {
- int * _dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g) {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
- void Dealociraj() { delete _dan; delete _mjesec; delete _godina; _dan = nullptr; _godina = nullptr; _mjesec = nullptr; }
- void DaLiJePrestupna(int brDana[], int &godina){
- if (godina % 4 == 0 && godina % 100 != 0 && godina % 400 == 0)
- brDana[1] = 29;
- else
- brDana[1] = 28;
- }
- bool StarijiOd7Dana(Datum *datum){
- int brDana[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, brojac = 0;
- int dan = *datum->_dan, mjesec = *datum->_mjesec, godina = *datum->_godina;
- while (brojac < 7){
- if (godina == *_godina && mjesec == *_mjesec && dan == *_dan)
- return false;
- else
- {
- if (dan == 0){
- mjesec--;
- dan = brDana[mjesec - 1];
- }
- if (mjesec == 0){
- godina--;
- DaLiJePrestupna(brDana, godina);
- mjesec = 12;
- dan = brDana[mjesec - 1];
- }
- brojac++;
- dan--;
- }
- }
- }
- };
- struct ObavezeNaPredmetu {
- VrstaObaveze * _vrstaObaveze;
- Datum * _datumIzvrsenja;
- char * _napomena;
- int _ocjena; // 5 - 10
- void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena) {
- _vrstaObaveze = new VrstaObaveze(vrsta);
- _datumIzvrsenja = new Datum;
- _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
- _ocjena = ocjena;
- int size = strlen(napomena) + 1;
- _napomena = new char[size];
- strcpy_s(_napomena, size, napomena);
- }
- void Ispis() {
- cout << *_vrstaObaveze << " " << _ocjena << " " << _napomena;
- _datumIzvrsenja->Ispis();
- cout << endl;
- }
- void Dealociraj() {
- _datumIzvrsenja->Dealociraj();
- delete _vrstaObaveze; _vrstaObaveze = nullptr;
- delete _datumIzvrsenja; _datumIzvrsenja = nullptr;
- delete[] _napomena; _napomena = nullptr;
- }
- };
- struct PolozeniPredmet {
- Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
- char * _nazivPredmeta;
- ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];
- int _trenutnoIzvrsenihObaveza;
- int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
- /*
- 1. Unos - na osnovu vrijednosti primljenog parametra izvrsiti inicijalizaciju odgovarajucih atributa*/
- void Unos(char *naziv){
- _nazivPredmeta = new char[strlen(naziv) + 1];
- strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
- _trenutnoIzvrsenihObaveza = 0;
- _konacnaOcjena = 5;
- _datumPolaganja.Unos(0, 0, 0);
- }
- /*2. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.Potrebno je onemoguciti dodavanje identicnih
- obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana.Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili jeprethodno
- dodana obaveza(identicne vrste) imala ocjenu 5. Ukoliko je moguce, osigurati prosirenje niza na nacin da prihvati vise od 10 obaveza.*/
- bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum d, int ocjena, char *napomena){
- if (_trenutnoIzvrsenihObaveza > 0){
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (obaveza == *_listaIzvrsenihObaveza[i]->_vrstaObaveze && _listaIzvrsenihObaveza[i]->_ocjena>5){
- if (obaveza != Seminarski)
- return false;
- }
- }
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (!_listaIzvrsenihObaveza[i]->_datumIzvrsenja->StarijiOd7Dana(&d)){
- return false;
- }
- }
- }
- if (_trenutnoIzvrsenihObaveza >= 10)
- return false;
- else{
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza, &d, ocjena, napomena);
- _trenutnoIzvrsenihObaveza++;
- return true;
- }
- }
- /*FormirajKonacnuOcjenu - konacna ocjene predstavlja prosjecnu ocjenu na predmetu, a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna
- ispita.Ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno(ocjenom vecom od 5) ocijenjena najmanje dva seminarska rada.U slucaju
- da bilo koji od navedenih uslova nije zadovoljenkonacna ocjena treba biti postavljena na vrijednost 5. Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u
- napomeni od dvije obaveze stoji rijec 'prepisivao' ili 'izbacen'.Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, kao datum polaganja je potrebno
- postaviti na vrijednost datuma posljednje izvrsene obaveze koja je usla u formiranje ocjene.*/
- int FormirajKonacnuOcjenu(){
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") == 0)
- return _konacnaOcjena;
- if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") == 0)
- return _konacnaOcjena;
- }
- for (int i = 0; i <_trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni){
- _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
- _datumPolaganja = *_listaIzvrsenihObaveza[i]->_datumIzvrsenja;
- return _konacnaOcjena;
- }
- }
- int brParcijalnih = 0, brSeminarskih = 0, zbirOcjena = 0;
- Datum temp;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 || *_listaIzvrsenihObaveza[i]->_vrstaObaveze ==Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena>5){
- brParcijalnih++;
- zbirOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
- temp = *_listaIzvrsenihObaveza[i]->_datumIzvrsenja;
- }
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5){
- brSeminarskih++;
- }
- }
- if (brParcijalnih == 2 && brSeminarskih >= 2){
- if (zbirOcjena % 2 != 0)
- _konacnaOcjena = (zbirOcjena / 2) + 1;
- else
- _konacnaOcjena = zbirOcjena / 2;
- }
- if (_konacnaOcjena > 5){
- _datumPolaganja = temp;
- }
- return _konacnaOcjena;
- }
- // 4. Ispis – ispsuje vrijednosti svih atributa strukture
- void Ispis(){
- cout << "Datum polaganja: "; _datumPolaganja.Ispis();
- cout << endl << "Naziv predmeta: " << _nazivPredmeta << endl;
- cout << "Lista Izvrsenih obaveza: \n";
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i]->Ispis();
- }
- cout << "Trenutno izvrsenih obaveza: " << _trenutnoIzvrsenihObaveza << endl;
- cout << "Konacna ocjena: " << _konacnaOcjena << endl;
- }
- void Dealociraj() {
- delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
- _datumPolaganja.Dealociraj();
- for (int i = 0; i < _trenutnoIzvrsenihObaveza - 1; i++)
- _listaIzvrsenihObaveza[i]->Dealociraj();
- }
- };
- //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i konacne ocjena npr."Programiranje II_6"
- void UpisiUBinarniFajl(PolozeniPredmet predmet){
- char nazivfajla[30];
- char *ocjena = new char[30];
- _itoa_s(predmet._konacnaOcjena, ocjena, sizeof(ocjena), 10);
- strcpy_s(nazivfajla, strlen(predmet._nazivPredmeta) + 1, predmet._nazivPredmeta);
- strcat_s(nazivfajla, "_");
- strcat_s(nazivfajla, ocjena);
- strcat_s(nazivfajla, ".dat");
- ofstream upis(nazivfajla, ios::binary | ios::out);
- if (!upis.fail()){
- upis.write(reinterpret_cast<char*>(&predmet), sizeof(predmet));
- upis.close();
- }
- else
- cout << "Doslo je do greske prilikom kreiranja fajla!" << endl;
- delete ocjena; ocjena = nullptr;
- }
- //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
- void UcitajIzBinarnogFajla(PolozeniPredmet &predmet, char *fajl){
- char temp[30];
- strcpy_s(temp, strlen(fajl) + 1, fajl);
- strcat_s(temp, ".dat");
- ifstream ispis(temp, ios::binary | ios::in);
- if (!ispis.fail()){
- ispis.read(reinterpret_cast<char*>(&predmet), sizeof(predmet));
- ispis.close();
- }
- else
- cout << "Doslo je do greske prilikom otvaranja fajla!" << endl;
- }
- //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj obaveza kod koji je student ostvario negativnu ocjenu
- int PretragaRekurzivno(PolozeniPredmet *predmet, int max, int brojac){
- if (max == -1)
- return brojac;
- else
- if (predmet->_listaIzvrsenihObaveza[max]->_ocjena == 5)
- return PretragaRekurzivno(predmet, max - 1, brojac + 1);
- else
- return PretragaRekurzivno(predmet, max - 1, brojac);
- }
- void main(){
- /*
- 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. IB130030.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
- */
- Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
- datumIntegralni;
- datumSeminarski1.Unos(10, 6, 2016);
- datumSeminarski2.Unos(18, 6, 2016);
- datumParcijalni1.Unos(22, 3, 2016);
- datumParcijalni2.Unos(22, 6, 2016);
- //polozeni predmet
- PolozeniPredmet prII, prII_FromFile;
- prII.Unos("Programiranje II");
- if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen"))
- cout << "Parcijalni 1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka"))
- cout << "Parcijalni 2...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
- cout << "Seminarski1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
- cout << "Seminarski2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- datumParcijalni2.Unos(22, 7, 2016);
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
- cout << "Parcijalni 2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- //rekurzija
- int brojac = 0;
- cout << "Broj negativnih- ocjena je: " << PretragaRekurzivno(&prII, prII._trenutnoIzvrsenihObaveza-1, brojac) << endl;
- //manipulacija fajlovima
- UpisiUBinarniFajl(prII);
- prII.Ispis();
- UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_6");
- prII_FromFile.Ispis();
- system("PAUSE>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement