Advertisement
Guest User

Untitled

a guest
Apr 27th, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <conio.h>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7. char * crt = "\n========================================\n";
  8.  
  9. enum NacinStudiranja { REDOVAN, DL };
  10. enum GodinaStudija { prva = 1, druga, treca, cetvrta };
  11. enum Odgovori { TACNO, NETACNO };
  12.  
  13. int brojPitanja = 5;
  14. struct Student {
  15. int _brojIndeksa;
  16. char _imePrezime[30];
  17. bool _radioTest;
  18. NacinStudiranja _nacin;
  19. GodinaStudija _godina;
  20. Odgovori *_odgovori = new Odgovori[brojPitanja];
  21. char *password;
  22. };
  23. struct Pitanja {
  24. int rbPitanja;
  25. char *pitanje;
  26. Odgovori odg;
  27. };
  28. struct Admin {
  29. char *username;
  30. char *password;
  31. };
  32.  
  33. char *PrikaziPitanje(Pitanja pitanja) {
  34. if (pitanja.rbPitanja <= 5) {
  35. if (pitanja.rbPitanja == 1)
  36. return "Enumeracije i unije su sinonimi ?";
  37. else if (pitanja.rbPitanja == 2)
  38. return "Moguce je kreirati anonimnu uniju ?";
  39. else if (pitanja.rbPitanja == 3)
  40. return "Svi clanovi unije koriste istu memorijsku lokaciju ?";
  41. else if (pitanja.rbPitanja == 4)
  42. return"Svi clanovi strukture koriste istu memorijsku lokaciju ?";
  43. else if (pitanja.rbPitanja == 5)
  44. return "Unija moze biti deklarisana unutar strukture ?";
  45. }
  46. else
  47. return pitanja.pitanje;
  48. }
  49. Odgovori GetTacanOdgovor(Pitanja pitanja) {
  50. if (pitanja.rbPitanja <= 5) {
  51. if (pitanja.rbPitanja == 1)
  52. return NETACNO;
  53. else if (pitanja.rbPitanja == 2)
  54. return TACNO;
  55. else if (pitanja.rbPitanja == 3)
  56. return TACNO;
  57. else if (pitanja.rbPitanja == 4)
  58. return NETACNO;
  59. else if (pitanja.rbPitanja == 5)
  60. return TACNO;
  61. }
  62. else
  63. return pitanja.odg;
  64. }
  65. int GetUspjehStudenta(Odgovori odgovori[], Pitanja *pitanja) {
  66. if (odgovori == nullptr)
  67. return -1;
  68. int brojacTacnih = 0;
  69. for (int i = 0;i < brojPitanja;i++)
  70. if (odgovori[i] == GetTacanOdgovor(pitanja[i]))
  71. brojacTacnih++;
  72. return brojacTacnih;
  73. }
  74. void inicijalizirajPitanja(Pitanja *&pitanja) { // za postojeca pitanja
  75. for (int i = 0; i < brojPitanja; i++) {
  76. pitanja[i].rbPitanja = i + 1;
  77. pitanja[i].pitanje = PrikaziPitanje(pitanja[i]);
  78. pitanja[i].odg = GetTacanOdgovor(pitanja[i]);
  79. }
  80. }
  81. char *ucitajPitanje() {
  82. char *p = new char[300];
  83. cin.getline(p, 300);
  84. return p;
  85. }
  86. void dodajPitanja(Pitanja &pitanja, int i) {
  87. int unos;
  88. Odgovori temp;
  89. pitanja.rbPitanja = i + 1;
  90. cout << "Unesite pitanje" << endl;
  91. pitanja.pitanje = ucitajPitanje();
  92. do {
  93. cout << "Unesite tacan odgovor (1.Tacno, 2.Netacno)" << endl;
  94. cin >> unos;
  95. unos--;
  96. temp = (Odgovori)unos;
  97. cin.ignore();
  98. } while (temp != TACNO && temp != NETACNO);
  99. pitanja.odg = (Odgovori)unos;
  100. }
  101. void PokreniTest(Student & student, Pitanja *pitanja) {
  102. int unos;
  103. Odgovori temp;
  104. for (int i = 0;i < brojPitanja;i++) {
  105. cout << crt << PrikaziPitanje(pitanja[i]) << crt;
  106. do {
  107. cout << "Odgovor (1.Tacno,2.Netacno): ";
  108. cin >> unos;
  109. unos--;
  110. temp = (Odgovori)unos;
  111. cin.ignore();
  112. } while (temp != TACNO && temp != NETACNO);
  113. student._odgovori[i] = temp;
  114. }
  115. student._radioTest = true;
  116. }
  117. char *ucitajPassword() {
  118. char *p = new char[24];
  119. int poz = 0;
  120. for (int i = 0; i < 24; i++) {
  121. p[i] = _getch();
  122. if (p[i] == 8)
  123. {
  124. if (i != 0) {
  125. cout << "\b \b";
  126. p[--i] = NULL; // zadnji karakter unesen je backspace pa iz tog razloga p[--i]
  127. i--;
  128. }
  129. else
  130. cout << " ";
  131. }
  132. else if (p[i] != 13 && p[i] != 8) { // 13 je ASCII za enter ,a 8 je ASCII za backspace
  133. cout << "*";
  134. }
  135. else if (p[i] == 13)
  136. {
  137. p[i] = '\0';
  138. break;
  139. }
  140. }
  141. return p;
  142. }
  143. void UnosPodataka(Student *& niz, int max) {
  144. int unos;
  145. char pomocna;
  146. for (int i = 0;i < max;i++) {
  147. cout << crt << "\t::STUDENT " << i + 1 << "::" << crt;
  148. cout << "Unesite ime i prezime: ";
  149. cin.getline(niz[i]._imePrezime, 30);
  150. cout << "Unesite broj indeksa: ";
  151. cin >> niz[i]._brojIndeksa;
  152. cout << "Nacin studiranja (1.Redovan, 2.DL): ";
  153. cin >> unos;
  154. niz[i]._nacin = (NacinStudiranja)--unos;
  155. cin.ignore();
  156. cout << "Godinu studija (1,2,3,4): ";
  157. cin >> unos;
  158. niz[i]._godina = (GodinaStudija)unos;
  159. cin.ignore();
  160. cout << "Unesite password" << endl;
  161. niz[i].password = ucitajPassword();
  162. cout << "\nDa li zelite vidjeti password koji ste ukucali (y / n)" << endl;
  163. cin >> pomocna;
  164. if (pomocna == 'y')
  165. cout << niz[i].password << endl;
  166. cin.ignore();
  167. niz[i]._radioTest = false;
  168. //tek smo kreirali studenta
  169. //tako da je sigurno da test nije radjen
  170. }
  171. }
  172. void Pretraga(Student * niz, int max, Pitanja *pitanja) {
  173. //definisati funkciju(e) koja(e) ce omoguciti pretragu po:
  174. //1. godini studija
  175. //2. nacinu studiranja
  176. //3. rezultatima ostvarenim na testu
  177. //Nove funkcionalnosti dodati u funkciju PrikaziMeni
  178. int pomocna;
  179. bool provjera = false;
  180. cout << "Po cemu zelite pretragu: \n1.Godini studija\n2.Nacinu Studiranja\n3.Rezultatima ostvarenim na testu" << endl;
  181. cin >> pomocna;
  182. cin.ignore();
  183. if (pomocna == 1)
  184. {
  185. GodinaStudija temp;
  186. int pomocna2;
  187. cout << "Unesite godinu studija( 1,2,3,4)" << endl;
  188. do {
  189. cin >> pomocna2;
  190. cin.ignore();
  191. } while (pomocna2 < 1 || pomocna2>4);
  192. temp = (GodinaStudija)pomocna2;
  193. cout << "Studenti koji zadovoljavaju pretragu: " << endl;
  194. for (int i = 0; i < max; i++)
  195. if (temp == niz[i]._godina) {
  196. cout << niz[i]._imePrezime << "\t" << niz[i]._brojIndeksa << endl;
  197. provjera = true;
  198. }
  199. }
  200. else if (pomocna == 2)
  201. {
  202. NacinStudiranja temp;
  203. int pomocna2;
  204. cout << "Unesite nacin studiranja (0. Redovan, 1. DL)" << endl;
  205. do {
  206. cin >> pomocna2;
  207. cin.ignore();
  208. } while (pomocna2 != 0 && pomocna2 != 1);
  209. temp = (NacinStudiranja)pomocna2;
  210. cout << "Studenti koji zadovoljavaju pretragu: " << endl;
  211. for (int i = 0; i < max; i++)
  212. if (temp == niz[i]._nacin) {
  213. cout << niz[i]._imePrezime << "\t" << niz[i]._brojIndeksa << endl;
  214. provjera = true;
  215. }
  216. }
  217. else if (pomocna == 3)
  218. {
  219. int unos, pomocna2;
  220. cout << "Unesite procenat i ispisati ce vam sve studente sa tim ili vecim procentom" << endl;
  221. do {
  222. cin >> unos;
  223. } while (unos < 0 || unos>100);
  224. cout << "Studenti koji zadovoljavaju pretragu: " << endl;
  225. for (int i = 0; i < max; i++)
  226. {
  227. if (niz[i]._radioTest != false) {
  228. pomocna2 = ((GetUspjehStudenta(niz[i]._odgovori, pitanja))*100.0) / brojPitanja;
  229. if (pomocna2 >= unos) {
  230. cout << niz[i]._imePrezime << "\t" << niz[i]._brojIndeksa << "\t" << pomocna2 << endl;
  231. provjera = true;
  232. }
  233. }
  234. }
  235. if (provjera == false)
  236. cout << "Nema studenata po toj pretrazi" << endl;
  237. }
  238. else
  239. cout << "Nepostojeci unos" << endl;
  240.  
  241.  
  242. }
  243. int GlavniMeni() {
  244. int izbor;
  245. do {
  246. cout << crt << "\t::MAIN MENU::" << crt;
  247. cout << "1. Admin login" << endl;
  248. cout << "2. Student login" << endl;
  249. cout << "3. Exit" << endl;
  250. cin >> izbor;
  251. } while (izbor < 1 || izbor>3);
  252. cin.ignore();
  253. return izbor;
  254. }
  255. int StudentMeni() {
  256. int izbor;
  257. do {
  258. cout << crt << "\t::STUDENT MENU::" << crt;
  259. cout << "1. Pokreni test" << endl;
  260. cout << "2. Prikazi rezultate" << endl;
  261. cout << "3. Pretraga" << endl;
  262. cout << "4. Logout (back to main menu)" << crt;
  263. cout << "Unesite izbor: ";
  264. cin >> izbor;
  265. } while (izbor < 1 || izbor>4);
  266. cin.ignore();
  267. return izbor;
  268. }
  269. int AdminMeni() {
  270. int izbor;
  271. do {
  272. cout << crt << "\t::ADMIN MENU::" << crt;
  273. cout << "1. Dodaj nova pitanja i definisi tacne odgovore" << endl;
  274. cout << "2. Omoguci studentu ponovo polaganje testa" << endl;
  275. cout << "3. Unos podataka studentima " << endl;
  276. cout << "4. Logout (back to main menu)" << endl;
  277. cin >> izbor;
  278. } while (izbor < 1 || izbor>4);
  279. cin.ignore();
  280. return izbor;
  281. }
  282. bool provjeriLoginST(Student *niz, int max) {
  283. int indeks;
  284. cout << "Unesite broj indeksa:";
  285. cin >> indeks;
  286. cin.ignore();
  287. cout << "\nUnesite password: ";
  288. char *password = ucitajPassword();
  289. for (int i = 0; i < max; i++)
  290. if ((strcmp(password, niz[i].password) == 0) && (indeks == niz[i]._brojIndeksa))
  291. return true;
  292. return false;
  293. }
  294. bool provjeriLoginAdmin(Admin admin) {
  295. char *user = new char[20];
  296. cout << "\nUnesite username:";
  297. cin.getline(user, 20);
  298. cout << endl << "Unesite password:";
  299. char *password = ucitajPassword();
  300.  
  301. if ((strcmp(user, admin.username) == 0) && (strcmp(password, admin.password) == 0))
  302. return true;
  303.  
  304. return false;
  305. }
  306. int PrikaziStudente(Student * niz, int max, int izbor)
  307. {
  308. int unos;
  309. bool provjera = false;
  310. if (izbor == 1)
  311. {
  312. cout << "Studenti koji nisu radili test:" << endl;
  313. for (int i = 0;i < max;i++) {
  314. if (niz[i]._radioTest == false) {
  315. cout << i + 1 << ". " << niz[i]._imePrezime << endl;
  316. provjera = true;
  317. }
  318. }
  319. if (provjera == true) {
  320. do {
  321. cout << crt << "Unesite redni broj studenta: ";
  322. cin >> unos;
  323. } while ((niz[unos - 1]._radioTest == true) || (unos<1 || unos>max));
  324. unos--;
  325. return unos;
  326. }
  327. }
  328. else if (izbor == 2)
  329. {
  330. cout << "Ovi studenti su radili ispit - izaberi studenta" << endl;
  331. for (int i = 0; i < max; i++)
  332. {
  333. if (niz[i]._radioTest == true)
  334. {
  335. cout << i + 1 << "." << niz[i]._imePrezime << endl;
  336. provjera = true;
  337. }
  338. }
  339. if (provjera == true)
  340. {
  341. do {
  342. cout << crt << "Unesite redni broj studenta: ";
  343. cin >> unos;
  344. } while ((niz[unos - 1]._radioTest == false) || (unos<1 || unos>max));
  345. unos--;
  346. return unos;
  347. }
  348. }
  349. if (provjera == false && izbor == 1)
  350. cout << "Svi studenti su radili ispit" << endl;
  351.  
  352.  
  353. return -1;
  354. }
  355. int ispis(Student *niz, int max) {
  356. int unos;
  357. for (int i = 0; i < max; i++) {
  358. cout << i + 1 << ". " << niz[i]._imePrezime << niz[i]._brojIndeksa << endl;
  359. }
  360. cout << "Unesite redni broj studenta" << endl;
  361. do {
  362. cin >> unos;
  363. } while (unos<1 || unos>max);
  364. unos--;
  365. return unos;
  366. }
  367. void popravni(Student *niz, int max) {
  368. int pomocna = PrikaziStudente(niz, max, 2);
  369. niz[pomocna]._radioTest = false;
  370. }
  371. bool baremJedanRadioTest(Student *niz, int max) {
  372. for (int i = 0; i < max; i++)
  373. if (niz[i]._radioTest == true)
  374. return true;
  375.  
  376. return false;
  377. }
  378. void dealocirajPitanja(Pitanja *&questions) {
  379. delete[]questions;
  380. questions = nullptr;
  381. }
  382. void dealocirajStudent(Student *&niz, int max) {
  383. for (int i = 0; i < max; i++)
  384. {
  385. delete[]niz[i].password;
  386. delete[]niz[i]._odgovori;
  387. }
  388. delete[]niz;
  389. niz = nullptr;
  390. }
  391.  
  392. //dodati provjeru koja ce onemoguciti korisnika da unese redni
  393. //broj studenta koji ne zadovoljava kriterije - u zavisnosti od izbora
  394. //na taj nacin cemo biti u mogucnosti da izbacimo nepotrebne provjere
  395. //u main funkciji
  396. //dodati sljedece funkcionalnosti:
  397. //1.administratoru omoguciti da unosi pitanja te definise tacne odgovore
  398. //2.administratoru dati prava da studentu ponovo omoguci polaganje testa
  399. //3.uvesti username/password na osnovu koga ce se studenti logirati
  400. //4.odvojiti administratorske funkcije (meni) od korisnickih
  401. void main() {
  402. int max, izbor, student, glavniIzbor, adminIzbor, unosDodajPitanja;
  403. int brojPokusaja = 3;
  404. bool prvoPokretanje = false;
  405. bool provjeraLogin = false;
  406. Student *niz = nullptr;
  407. Pitanja *questions = new Pitanja[brojPitanja];
  408. inicijalizirajPitanja(questions);
  409. Admin admin;
  410. admin.username = "admin";
  411. admin.password = "password";
  412.  
  413. do {
  414. glavniIzbor = GlavniMeni();
  415. if (glavniIzbor == 1) { // za admina
  416. brojPokusaja = 3;
  417. do {
  418. cout << "\nBroj pokusaja : " << brojPokusaja << endl;
  419. provjeraLogin = provjeriLoginAdmin(admin);
  420. if (provjeraLogin == true)
  421. break;
  422. else
  423. brojPokusaja--;
  424. if (brojPokusaja == 0) {
  425. cout << "\nPogresno ste unijeli username ili password 3 puta." << endl;
  426. system("pause");
  427. }
  428. system("cls");
  429. } while (brojPokusaja > 0);
  430. if (provjeraLogin == true) {
  431. do {
  432. adminIzbor = AdminMeni();
  433. if (adminIzbor == 1) { // dodaj pitanja i odgovore
  434. cout << "Koliko pitanja zelite dodati" << endl;
  435. int pomocna = brojPitanja;
  436. cin >> unosDodajPitanja;
  437. cin.ignore();
  438. if (questions != nullptr)
  439. dealocirajPitanja(questions); // dealociranje prethodnih
  440.  
  441. brojPitanja += unosDodajPitanja;
  442. questions = new Pitanja[brojPitanja];
  443. inicijalizirajPitanja(questions);
  444. for (int i = pomocna; i < brojPitanja; i++)
  445. dodajPitanja(questions[i], i);
  446. }
  447. else if (adminIzbor == 2) {
  448. if (niz ==nullptr) {
  449. cout << "Prvo morate dodati studente da biste im pristupili" << endl;
  450. }
  451. else if (baremJedanRadioTest(niz, max) == true)
  452. popravni(niz, max);
  453. else
  454. cout << "Niko nije radio test" << endl; //ponovo polaganje testa
  455. }
  456. else if (adminIzbor == 3)
  457. {
  458. if (niz != nullptr)
  459. cout << "Vec ste dodali podatke za studente" << endl;
  460. else {
  461. do {
  462. cout << "Unesite broj studenata: ";
  463. cin >> max;
  464. } while (max <= 0);
  465. niz = new Student[max];
  466. cin.ignore();
  467. system("cls");
  468. UnosPodataka(niz, max);
  469. }
  470. }
  471. system("pause");
  472. system("cls");
  473. } while (adminIzbor != 4);
  474. }
  475. }
  476. else if (glavniIzbor == 2) { // za studenta
  477. if (niz == nullptr)
  478. cout << "Prvo morate dodati studente da biste im pristupili" << endl;
  479. else
  480. {
  481. brojPokusaja = 3;
  482. do {
  483. cout << "\nBroj pokusaja : " << brojPokusaja << endl;
  484. if (provjeriLoginST(niz, max) == true)
  485. break;
  486. else
  487. brojPokusaja--;
  488. } while (brojPokusaja > 0);
  489. do {
  490. izbor = StudentMeni();
  491. if (izbor == 1) {
  492. student = PrikaziStudente(niz, max, izbor);
  493. PokreniTest(niz[student], questions);
  494. }
  495. if (izbor == 2) {
  496. if (baremJedanRadioTest(niz, max) == false)
  497. cout << "Niko nije radio test" << endl;
  498. else {
  499. student = PrikaziStudente(niz, max, izbor);
  500. int brojTacnih = GetUspjehStudenta(niz[student]._odgovori, questions);
  501. cout << crt << "Uspjeh studenta " << brojTacnih << "/" << brojPitanja << " ili " << (brojTacnih*100.0) / brojPitanja << "%" << crt;
  502. }
  503. }
  504. if (izbor == 3)
  505. Pretraga(niz, max, questions);
  506.  
  507. system("pause");
  508. system("cls");
  509. } while (izbor != 4);
  510. }
  511. }
  512. } while (glavniIzbor != 3);
  513.  
  514. cout << "ćao" << endl;
  515. if(niz!=nullptr)
  516. dealocirajStudent(niz, max);
  517. if(questions!=nullptr)
  518. dealocirajPitanja(questions);
  519.  
  520. system("pause");
  521. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement