Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- 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)
- char * crt = "\n-------------------------------\n";
- struct Kandidat {
- char * _imePrezime;
- char _JMBG[14];
- void Unos(char * ip, char * jmbg) {
- _imePrezime = new char[strlen(ip) + 1];
- strcpy_s(_imePrezime, strlen(ip) + 1, ip);
- // Preporuka je korištenje funkcije "strncpy_s" koja kopira prvih "n" karaktera, time sprječavajući prekoračenje.
- strcpy_s(_JMBG, jmbg); // -> strncpy_s(_JMBG, jmbg, 13);
- }
- void Dealociraj() {
- delete[] _imePrezime; _imePrezime = nullptr;
- }
- void Ispis() {
- cout << _imePrezime << " " << _JMBG << " ";
- }
- };
- struct Pitanje {
- char * _tekstPitanja;
- char * _odgovori[10];//maksimalno 10 odgovora
- int _tacni[10];
- /*lokacije tacnih odgovora - svako pitanje moze imati jedan ili vise tacnih odgovora, a njihove lokacije se pohranjuju u niz _tacni*/
- int _bodova;
- /*ako pitanje ima vise tacnih odgovora, onda se broj osvojenih bodova (tokom izrade testa) odredjuje na osnovu broj tacnih odgovora
- (npr. ako pitanje nosi 5 boda i ima 2 tacna odgovora, a student oznaci 1 tacan odgovor onda ce osvojeni broj bodova na tom pitanju
- iznositi 2.5. drugim rijecima, vrijednost ovog atributa je bitna zbog odredjivanja uspjeha kandidata prilikom izrade ispita)*/
- void Unos(char * tekstPitanja, int bodova) {
- _tekstPitanja = new char[strlen(tekstPitanja) + 1];
- strcpy_s(_tekstPitanja, strlen(tekstPitanja) + 1, tekstPitanja);
- /*umjesto dodavanja brojaca iskoristite defaultne vrijednosti clanova niza kako biste manipulisali njihovim vrijednostima (dodavanje, uklanjanje)*/
- for (size_t i = 0; i < 10; i++) {
- _odgovori[i] = nullptr;
- _tacni[i] = -1;
- }
- _bodova = bodova;
- }
- void Ispis(int redniBroj = 0)
- {
- cout << crt;
- if (redniBroj == 0)
- cout << _tekstPitanja;
- else
- cout << redniBroj << ". " << _tekstPitanja;
- cout << crt;
- for (int i = 0; _odgovori[i] != nullptr; i++)
- {
- cout << i + 1 << ". " << _odgovori[i];
- if (_odgovori[i + 1] != nullptr)
- cout << endl;
- }
- cout << crt;
- }
- void Dealociraj() {
- delete[] _tekstPitanja; _tekstPitanja = nullptr;
- for (size_t i = 0; i < 10; i++)
- {
- if (_odgovori[i] == nullptr)
- break;
- delete[] _odgovori[i]; _odgovori[i] = nullptr;
- }
- }
- bool AddOdgovor(char * odgovor, bool tacan)
- {
- for (size_t i = 0; i < 10; i++)
- {
- if (_odgovori[i] == nullptr)
- {
- int vel = strlen(odgovor) + 1;
- _odgovori[i] = new char[vel];
- strcpy_s(_odgovori[i], vel, odgovor);
- if (tacan)
- for (size_t j = 0; j < 10; j++)
- if (_tacni[j] == -1) { _tacni[j] = i; break; }
- return true;
- }
- else if (strcmp(_odgovori[i], odgovor) == 0)
- return false;
- }
- return false;
- }
- bool RemoveOdgovor(int lokacija)
- {
- lokacija--;
- int tacan = VratiLokacijuAkoJeTacan(lokacija), brojTacnihOdgovora(0), brojOdgovora(0);
- PostaviBrojTacnihOdgovoraIBrojOdgovora(brojTacnihOdgovora, brojOdgovora);
- if (lokacija < 0 || lokacija >= 10 || _odgovori[lokacija] == nullptr || tacan != -1 && brojTacnihOdgovora == 1)
- return false;
- delete[] _odgovori[lokacija];
- for (int i = lokacija; i < brojOdgovora; i++)
- _odgovori[i] = _odgovori[i + 1];
- if(tacan != -1)
- for (int i = tacan; i < brojTacnihOdgovora; i++)
- _tacni[i] = _tacni[i + 1];
- return true;
- }
- void PostaviBrojTacnihOdgovoraIBrojOdgovora(int& brojTacnih, int& brojOdgovora)
- {
- for (size_t i = 0; i < 10; i++)
- {
- if (_tacni[i] != -1)
- brojTacnih++;
- if (_odgovori[i] != nullptr)
- brojOdgovora++;
- }
- }
- int VratiLokacijuAkoJeTacan(int lokacija) // funkcija vraća lokaciju odgovora u nizu _tacni ako je odgovor tačan, u suprotnom -1
- {
- for (int i = 0; i < 10; i++) if (_tacni[i] == lokacija) return i;
- return -1;
- }
- };
- struct PrijemniIspit {
- //kandidati prijavljeni za prijemni ispit
- Kandidat * _prijavljeniKandidati[100];
- /*uspjeh ostvaren na prijemnom ispitu za svakog pojedinog kandidata(prijemnom ispitu moze pristupiti maksimalno 100 kandidata i za svakog od
- njih se cuva ostvareni uspjeh u okviru niza _uspjehKandidata (nakon sto urade ispit tj. nakon sto odgovore na pitanja)*/
- float * _uspjehKandidata[100];
- //prag prolaznosti na prijemnom ispitu npr. 60 procenata
- float _pragProlaznosti;
- float _kazneniBodovi;
- /*vrijednost kazenog boda (npr. 0.30) se mnozi sa svakim netacnim odgovorom na pitanje i oduzima od osvojenih bodova za to pitanje
- (npr. ako pitanje nosi 5 bodova i ima 2 tacna odgovora, a student odabere 1 tacan i 2 netacna odgovora, broj osvojenih bodova ce biti
- 1.9 (1 tacan = 2.5; 2 netacna * 0.30 kaznenih = 0.6; 2.5 - 0.6 = 1.9)*/
- void Unos(float pragProlaznosti, float kazneniBodovi) {
- _pragProlaznosti = pragProlaznosti;
- _kazneniBodovi = kazneniBodovi;
- /*umjesto dodavanja brojaca iskoristite defaultne vrijednosti clanova niza kako biste manipulisali njihovim vrijednostima (dodavanje, uklanjanje)*/
- for (size_t i = 0; i < 100; i++)
- {
- _prijavljeniKandidati[i] = nullptr;
- _uspjehKandidata[i] = nullptr;
- }
- }
- void Dealociraj()
- {
- for (size_t i = 0; i < 100; i++)
- {
- if (_prijavljeniKandidati[i] == nullptr)
- break;
- _prijavljeniKandidati[i]->Dealociraj();
- delete _prijavljeniKandidati[i];
- delete _uspjehKandidata[i];
- }
- }
- bool DodajKandidata(Kandidat k)
- {
- for (int i = 0; i < 100; i++)
- {
- if (_prijavljeniKandidati[i] == nullptr)
- {
- _prijavljeniKandidati[i] = new Kandidat;
- _prijavljeniKandidati[i]->Unos(k._imePrezime, k._JMBG);
- return true;
- }
- else if (strcmp(_prijavljeniKandidati[i]->_JMBG, k._JMBG) == 0)
- return false;
- }
- return false;
- }
- bool PokreniIspit(char * JMBG, Pitanje * pitanja, int brojPitanja)
- {
- int indeks(-1);
- for (int i = 0; _prijavljeniKandidati[i] != nullptr && indeks == -1; i++)
- if (strcmp(_prijavljeniKandidati[i]->_JMBG, JMBG) == 0)
- indeks = i;
- if (indeks == -1 || _uspjehKandidata[indeks] != nullptr) return false;
- float osvojeniBodovi(0), maksimalnoBodova(0), procenat(0);
- for (size_t i = 0; i < brojPitanja; i++)
- {
- pitanja[i].Ispis(i + 1);
- int brojTacnihOdgovora(0), brojOdgovora(0);
- pitanja[i].PostaviBrojTacnihOdgovoraIBrojOdgovora(brojTacnihOdgovora, brojOdgovora);
- if (brojTacnihOdgovora == 0)
- {
- cout << "GRESKA: Pitanje nema definisane tacne odgovore." << crt;
- continue;
- }
- else {
- cout << (brojTacnihOdgovora == 1 ? "Vrsta -> jedan tacan" : "Vrsta -> vise tacnih") << crt;
- int * odgovoriKorisnika = new int[brojOdgovora], brojUnesenih(0), odgovorKorisnika(0), brojTacnoOdgovorenih(0), brojNetacnoOdgovorenih(0);
- do {
- cout << (brojTacnihOdgovora == 1? "Unesite odgovor" : "Unesite odgovore") << " (0 - prekid): ";
- cin >> odgovorKorisnika;
- if (odgovorKorisnika == 0)
- break;
- if (odgovorKorisnika <= 0 || odgovorKorisnika > brojOdgovora)
- {
- cout << "GRESKA: Odgovor mora biti u rasponu od 1 do " << brojOdgovora << "." << endl;
- continue;
- }
- bool vecOdabrao(false);
- for (size_t j = 0; j < brojUnesenih; j++)
- if (odgovorKorisnika - 1 == odgovoriKorisnika[j])
- vecOdabrao = true;
- if (vecOdabrao)
- {
- cout << "GRESKA: Vec ste odabrali navedeni odgovor." << endl;
- continue;
- }
- odgovoriKorisnika[brojUnesenih++] = --odgovorKorisnika;
- } while (brojUnesenih < brojOdgovora && brojTacnihOdgovora > 1 || brojUnesenih == 0);
- for (size_t j = 0; j < brojUnesenih; j++)
- {
- bool tacnoOdgovoren(false);
- for (size_t k = 0; pitanja[i]._tacni[k] != -1 && !tacnoOdgovoren; k++)
- if (odgovoriKorisnika[j] == pitanja[i]._tacni[k])
- tacnoOdgovoren = true;
- if (tacnoOdgovoren) brojTacnoOdgovorenih++;
- else brojNetacnoOdgovorenih++;
- }
- osvojeniBodovi += pitanja[i]._bodova * ((float)brojTacnoOdgovorenih / brojTacnihOdgovora) - (brojNetacnoOdgovorenih * _kazneniBodovi);
- maksimalnoBodova += pitanja[i]._bodova;
- }
- }
- procenat = osvojeniBodovi / maksimalnoBodova * 100;
- cout << crt << "\t.::REZULTATI::." << crt;
- cout << "Osvojeni bodovi: " << setw(11) << osvojeniBodovi << endl;
- cout << "Maksimalno bodova: " << setw(9) << maksimalnoBodova << endl;
- cout << "Osvojeni procenat: " << setw(8) << setprecision(4) << procenat << "%" << crt;
- if (procenat >= _pragProlaznosti)
- cout << "Uspjesno ste polozili ispit!" << crt;
- else
- cout << "Zao nam je, niste polozili!" << crt;
- _uspjehKandidata[indeks] = new float(procenat);
- return true;
- }
- };
- int main() {
- Kandidat jasmin, adel;
- jasmin.Unos("Jasmin Azemovic", "1111111111111");
- adel.Unos("Adel Handzic", "222222222222");
- int brojPitanja = 3;
- Pitanje * pitanja = new Pitanje[brojPitanja];
- //parametri: tekstPitanja, brojBodova
- pitanja[0].Unos("U kojem gradu se nalazi FIT?", 4);
- /*dodaje novi odgovor u listu ponudjenih odgovora. onemoguciti ponavljanje odgovora, te voditi racuna da vise odgovora moze biti tacno*/
- //parametri: tekstOdgovora,daLiJeTacanTajOdgovor
- if (pitanja[0].AddOdgovor("Mostar", true))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[0].AddOdgovor("Sarajevo", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (!pitanja[0].AddOdgovor("Sarajevo", false))//Sarajevo je vec dodano
- cout << "Odgovor nije uspjesno dodan!" << crt;
- if (pitanja[0].AddOdgovor("Tuzla", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[0].AddOdgovor("Fojnica", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[0].AddOdgovor("Zenica", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- /*
- na osnovu primljene lokacije uklanja podatke o ponudjenom odgovoru. prilikom uklanjanja ocuvati redoslijed dodavanja odgovora.
- onemoguciti uklanjanje svih tacnih odgovora tj. osigurati da pitanje u svakom momentu posjeduje najmanje jedan tacan odgovor
- */
- if (pitanja[0].RemoveOdgovor(4))//uklanja odgovor Fojnica
- cout << "Odgovor uspjesno uklonjen!" << crt;
- /*
- -------------------------------
- 1. U kojem gradu se nalazi FIT?
- -------------------------------
- 1. Mostar
- 2. Sarajevo
- 3. Tuzla
- 4. Zenica
- -------------------------------
- */
- pitanja[0].Ispis();//prethodno je prikazan ocekivani ispis pitanja
- pitanja[1].Unos("Odaberite tacne odgovore.", 5);
- if (pitanja[1].AddOdgovor("FIT se nalazi u Mostaru", true))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[1].AddOdgovor("FIT je clanica UNMO-a", true))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[1].AddOdgovor("U Mostaru je uvijek jako vruce", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- pitanja[2].Unos("Studij na FIT-u traje 4 godine?", 2);
- if (pitanja[2].AddOdgovor("Ne", true))
- cout << "Odgovor uspjesno dodan!" << crt;
- if (pitanja[2].AddOdgovor("Da", false))
- cout << "Odgovor uspjesno dodan!" << crt;
- /*....*/
- PrijemniIspit prijemni2017;
- //parametri: pragProlaznosti, kazneniBodovi
- prijemni2017.Unos(55, 0.30);
- /*dodaje novog kandidata u listu prijavljenih. onemoguciti dodavanje kandidata sa istim jmbg-om*/
- if (prijemni2017.DodajKandidata(jasmin))
- cout << "Kandidat uspjesno dodan" << crt;
- if (prijemni2017.DodajKandidata(adel))
- cout << "Kandidat uspjesno dodan" << crt;
- /*kandidatu sa JMBG 1111111111111 pokrece ispit na nacin da mu se prikazuju pitanja, od njega zahtijevaju odgovori,
- te izracunava ostvareni uspjeh (da li je polozio ili ne, te sa kojim procentom uspjesnosti). prilikom izracuvanja uspjesnosti
- voditi racuna o kaznenim bodovima. po okoncanju ispita, uspjeh kandidata se pohranjuje u niz _uspjehKandidata. za pokretanje
- ispita kandidat prethodno mora biti dodan u listu. po vlastitoj zelji implementirajte naci oznacavanja veceg broja tacnih
- odgovoran na postavljeno pitanje (jedno pitanje moze imati vise tacnih odgovora)*/
- if (prijemni2017.PokreniIspit("1111111111111", pitanja, brojPitanja))
- cout << "Ispit uspjesno okoncan!" << crt;
- jasmin.Dealociraj();
- adel.Dealociraj();
- for (size_t i = 0; i < brojPitanja; i++)
- pitanja[i].Dealociraj();
- delete[] pitanja;
- prijemni2017.Dealociraj();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement