Posted By


Dhorvat on 11/12/12

Tagged


Statistics


Viewed 550 times
Favorited by 0 user(s)

SP_zadatak1_Davorin_Horvat


/ Published in: C++
Save to your folder(s)

Prvi zadatak; biblioteke (lista_poazivac.h, lista_polje.h), glavni program


Copy this code and paste it in your HTML
  1. //IMPLEMENTACIJA POMO�U POKAZIVA�A
  2. using namespace std;
  3. int sifra=1;
  4.  
  5. struct zivotinja {
  6. int Sifra;
  7. char Vrsta[30], Naziv[30];
  8. float Cijena;
  9. tm Datum;
  10. zivotinja *sljedeci;
  11. };
  12.  
  13. zivotinja *lista = new zivotinja;
  14.  
  15. void InitL(zivotinja *lista){
  16. lista -> sljedeci = NULL;
  17. }
  18.  
  19. int EndL(zivotinja *lista){
  20. zivotinja *tekuci = lista;
  21. int b = 1;
  22. while(tekuci -> sljedeci)
  23. {
  24. tekuci = tekuci -> sljedeci;
  25. b++;
  26. }
  27. return b;
  28. }
  29.  
  30. int FirstL (zivotinja *lista)
  31. {
  32. if(lista -> sljedeci == NULL)
  33. return EndL (lista);
  34. else
  35. return 0;
  36. }
  37.  
  38. int PreviousL (int pozicija, zivotinja *lista){
  39. if(pozicija == FirstL(lista))
  40. return -1;
  41. else
  42. return pozicija - 1;
  43. }
  44.  
  45.  
  46.  
  47. zivotinja RetrieveL(int pozicija, zivotinja *lista){
  48. zivotinja *tekuci = lista -> sljedeci;
  49. for(int i = 0; i < pozicija; i++)
  50. tekuci = tekuci -> sljedeci;
  51. return *tekuci;
  52. }
  53.  
  54. int LocateL(int v, zivotinja *lista){
  55. zivotinja *tekuci = lista -> sljedeci;
  56. int br = 0;
  57. while(tekuci)
  58. {
  59. br++;
  60. tekuci = tekuci -> sljedeci;
  61. }
  62. return br;
  63. }
  64.  
  65. zivotinja * NextL(int pozicija, zivotinja *lista){
  66. if(pozicija == EndL (lista))
  67. return NULL;
  68. else
  69. {
  70. zivotinja tekuci = RetrieveL (pozicija, lista);
  71. return tekuci.sljedeci;
  72. }
  73. }
  74.  
  75.  
  76. void Vrati(zivotinja element,int pozicija, zivotinja* lista) {
  77. zivotinja *tekuci = lista -> sljedeci;
  78. for(int i = 0;i < pozicija; i++)
  79. tekuci = tekuci -> sljedeci;
  80. tekuci -> Sifra = element.Sifra;
  81. tekuci -> Cijena = element.Cijena;
  82. strcpy (tekuci -> Naziv, element.Naziv);
  83. strcpy (tekuci -> Vrsta, element.Vrsta);
  84. tekuci -> Datum = element.Datum;
  85. }
  86.  
  87.  
  88.  
  89. void Reverse (zivotinja *lista)
  90. {
  91. if(lista -> sljedeci == NULL)
  92. return;
  93.  
  94. zivotinja *prosli = NULL, *trenutni = NULL, *sljedeci = NULL;
  95. trenutni = lista -> sljedeci;
  96. while(trenutni != NULL){
  97. sljedeci = trenutni -> sljedeci;
  98. trenutni -> sljedeci = prosli;
  99. prosli = trenutni;
  100. trenutni = sljedeci;
  101. }
  102. lista -> sljedeci = prosli;
  103. }
  104.  
  105. int InsertL (zivotinja *novi, int pozicija, zivotinja *lista){
  106. zivotinja *tekuci = lista;
  107.  
  108. for(int i = 1; i < pozicija; i++)
  109. tekuci = tekuci -> sljedeci;
  110. novi -> sljedeci = tekuci -> sljedeci;
  111. tekuci -> sljedeci = novi;
  112.  
  113. sifra++;
  114. if((tekuci -> sljedeci) -> Sifra == novi -> Sifra)
  115. return 1;
  116. else
  117. return 0;
  118. }
  119.  
  120.  
  121.  
  122. void DeleteL (int pozicija, zivotinja *lista){
  123. zivotinja *tekuci = lista->sljedeci;
  124. zivotinja *prethodni = lista;
  125.  
  126. for(int i = 0;i < pozicija; i++)
  127. {
  128. tekuci = tekuci -> sljedeci;
  129. prethodni = prethodni -> sljedeci;
  130. }
  131. prethodni -> sljedeci = tekuci -> sljedeci;
  132. delete tekuci;
  133. }
  134. void DeleteAllL (zivotinja *lista)
  135. {
  136. zivotinja *trenutni;
  137. while (lista -> sljedeci != NULL)
  138. {
  139. trenutni = lista -> sljedeci;
  140. lista -> sljedeci = lista -> sljedeci -> sljedeci;
  141. delete trenutni;
  142. }
  143. }
  144.  
  145.  
  146. //IMPLEMENTACIJA POMO�U POLJA
  147. using namespace std;
  148. int sifra=1;
  149. int kursor;
  150.  
  151. struct zivotinja {
  152. int Sifra;
  153. char Vrsta[50], Naziv[50];
  154. float Cijena;
  155. tm Datum;
  156. };
  157.  
  158. zivotinja lista[1000];
  159.  
  160. void InitL (zivotinja *lista)
  161. {
  162. kursor = 1;
  163. }
  164.  
  165. int EndL(zivotinja *lista)
  166. {
  167. return kursor;
  168. }
  169.  
  170. int FirstL (zivotinja *lista)
  171. {
  172. return 0;
  173. }
  174.  
  175. zivotinja * NextL(int pozicija, zivotinja *lista)
  176. {
  177. if(pozicija == EndL (lista))
  178. return lista;
  179. else
  180. return &lista[pozicija + 1];
  181. }
  182.  
  183. int PreviousL (int pozicija, zivotinja *lista)
  184. {
  185. if(pozicija == FirstL (lista))
  186. return -1;
  187. else
  188. return pozicija - 1;
  189. }
  190.  
  191. zivotinja RetrieveL(int pozicija, zivotinja *lista)
  192. {
  193. return *(lista + pozicija);
  194. }
  195.  
  196.  
  197. int InsertL(zivotinja *novi, int pozicija, zivotinja *lista)
  198. {
  199. --pozicija;
  200. (lista + pozicija) -> Sifra = novi -> Sifra;
  201. strcpy ((lista + pozicija) -> Naziv, novi -> Naziv);
  202. strcpy ((lista + pozicija) -> Vrsta, novi -> Vrsta);
  203. (lista + pozicija) -> Cijena = novi -> Cijena;
  204. (lista + pozicija) -> Datum.tm_mday = novi -> Datum.tm_mday;
  205. (lista + pozicija) -> Datum.tm_mon = novi -> Datum.tm_mon;
  206. (lista + pozicija) -> Datum.tm_year = novi -> Datum.tm_year;
  207. sifra++;
  208. kursor++;
  209. return((lista+pozicija) -> Sifra == novi -> Sifra);
  210. }
  211.  
  212. void Vrati(zivotinja element, int pozicija, zivotinja *lista)
  213. {
  214. lista[pozicija] = element;
  215. }
  216.  
  217. void Reverse (zivotinja * lista){
  218. int broj_elemenata = EndL (lista) - 1;
  219. for(int i=0;i<=broj_elemenata/2;i++)
  220. swap (lista[i], lista[broj_elemenata - i - 1]);
  221.  
  222. }
  223.  
  224. void DeleteL(int pozicija, zivotinja *lista){
  225. for(int i = pozicija; i < EndL (lista); i++)
  226. {
  227. lista[i].Sifra = lista[i + 1].Sifra;
  228. strcpy((lista + i) -> Naziv, (lista + i + 1) -> Naziv);
  229. strcpy((lista + i) -> Vrsta, (lista + i + 1) -> Vrsta);
  230. lista[i].Cijena = lista[i + 1].Cijena;
  231. (lista + i) -> Datum.tm_mday = (lista + i + 1) -> Datum.tm_mday;
  232. (lista + i) -> Datum.tm_mon = (lista + i + 1) -> Datum.tm_mon;
  233. (lista + i) -> Datum.tm_year = (lista + i + 1) -> Datum.tm_year;
  234. }
  235. kursor--;
  236. }
  237. void DeleteAllL (zivotinja *lista)
  238. {
  239. kursor = 0;
  240. }
  241.  
  242. //GLAVNI PROGRAM
  243. #include <iostream>
  244. //#include "lista_polje.h"
  245. #include "lista_pokazivac.h"
  246. #include "time.h"
  247. using namespace std;
  248.  
  249. void unos(char *znakovni_niz)
  250. {
  251. cin.getline(znakovni_niz, 30);
  252. if (cin.gcount()==1)
  253. cin.getline (znakovni_niz,30);
  254. };
  255.  
  256. int dodaj()
  257. {
  258. zivotinja *novi = new zivotinja;
  259. cout << "Sifra: " << sifra << endl;
  260. novi -> Sifra = sifra;
  261. cout << "Naziv: ";
  262. unos (novi -> Naziv);
  263. cout << "Vrsta: ";
  264. unos (novi -> Vrsta);
  265. cout << "Cijena: ";
  266. cin >> novi -> Cijena;
  267. cout << "Datum dostave: " << endl;
  268. cout << endl;
  269. do
  270. {
  271. cout << "Mjesec: ";
  272. cin >> novi -> Datum.tm_mon;
  273. if (!(novi -> Datum.tm_mon < 1 || novi -> Datum.tm_mon > 12))
  274. break;
  275. cout << "Pogresan unos!" << endl;
  276. }while(1);
  277. do
  278. {
  279. cout << "Dan: ";
  280. cin >> novi -> Datum.tm_mday;
  281. if (novi -> Datum.tm_mon == 1 || novi -> Datum.tm_mon == 3 || novi -> Datum.tm_mon == 5 ||
  282. novi -> Datum.tm_mon == 7 || novi -> Datum.tm_mon == 8 || novi -> Datum.tm_mon == 10 || novi -> Datum.tm_mon == 12)
  283. if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 31))
  284. break;
  285. if (novi -> Datum.tm_mon == 4 || novi -> Datum.tm_mon == 6 || novi -> Datum.tm_mon == 9 || novi -> Datum.tm_mon == 11)
  286. if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 30))
  287. break;
  288. if (novi -> Datum.tm_mon == 2)
  289. if (!(novi -> Datum.tm_mday < 0 || novi -> Datum.tm_mday > 29))
  290. break;
  291. cout << "Pogresan unos!" << endl;
  292. } while(1);
  293. cout << "Godina: ";
  294. do
  295. {
  296. cout << "Godina: (2000. - 2050.) ";
  297. cin >> novi -> Datum.tm_year;
  298. if (!(novi -> Datum.tm_year <= 2000 || novi -> Datum.tm_year >= 2050))
  299. break;
  300. cout << "Pogresan unos." << endl;
  301. }while(1);
  302. return (InsertL (novi, EndL (lista), lista));
  303. }
  304. void ispisi_listu()
  305. {
  306. zivotinja tekuci;
  307. for(int i = EndL(lista) - 1; i > 0; i--)
  308. {
  309. tekuci = RetrieveL (PreviousL (i, lista), lista);
  310. cout << "Sifra:\t" << tekuci.Sifra << endl;
  311. cout << "Naziv:\t" << tekuci.Naziv << endl;
  312. cout << "Vrsta:\t" << tekuci.Vrsta << endl;
  313. cout << "Cijena:\t" << tekuci.Cijena << endl;
  314. cout << "Datum dostave:\t" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon << "." << tekuci.Datum.tm_year << "." << endl << endl;
  315. cout << "-------------------------------------------" << endl;
  316. }
  317. }
  318. void pretrazi_listu() {
  319. zivotinja tekuci;
  320. int br=0;
  321. for(int i = EndL (lista) - 1; i > 0; i--)
  322. {
  323. tekuci = RetrieveL (PreviousL (i, lista), lista);
  324. if(!((tekuci.Datum.tm_year < 2012 && (tekuci.Datum.tm_mon + 1) < 9) && tekuci.Datum.tm_mday <= 23))
  325. {
  326. cout << "Sifra :" << tekuci.Sifra << endl;
  327. cout << "Naziv :" << tekuci.Naziv << endl;
  328. cout << "Vrsta :" << tekuci.Vrsta << endl;
  329. cout << "Cijena:" << tekuci.Cijena << endl;
  330. cout << "Datum :" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon + 1 << "." << tekuci.Datum.tm_year << "." << endl << endl;
  331. cout << "-----------------" << endl;
  332. br++;
  333. }
  334. }
  335. cout << "Zapisa s datumom poslije 23.9.2012.: " << br << endl;
  336. }
  337. int obrisi_prema_nazivu(){
  338. zivotinja tekuci;
  339. cout << "--- Svi Zapisi ---" << endl;
  340. ispisi_listu ();
  341. cout << "Unesite naziv zivotinje za brisanje: ";
  342. char naziv[30];
  343. bool nadjeno = false;
  344. unos (naziv);
  345. for(int i = EndL (lista) - 1; i > 0 && !nadjeno; i--)
  346. {
  347. tekuci = RetrieveL (PreviousL (i,lista), lista);
  348. if(strcmp(naziv,tekuci.Naziv)==0){
  349. cout << "--------------------------------" << endl << endl;
  350. cout << "Sifra:\t" << tekuci.Sifra << endl;
  351. cout << "Naziv:\t" << tekuci.Naziv << endl;
  352. cout << "Vrsta:\t" << tekuci.Vrsta << endl;
  353. cout << "Cijena:\t" << tekuci.Cijena << endl;
  354. cout << "Datum dostave:\t" << tekuci.Datum.tm_mday << "." << tekuci.Datum.tm_mon + 1 << "." << tekuci.Datum.tm_year << "." << endl << endl;
  355. nadjeno = true;
  356. char izbor;
  357. cout << "Jeste li sigurni da zelite obrisati ovja zapis? (d/n)";
  358. do
  359. {
  360. cin >>izbor;
  361. } while(izbor != 'd' && izbor != 'n');
  362. if(izbor == 'd')
  363. DeleteL (i-1, lista);
  364. else
  365. return 0;
  366. }
  367. }
  368. return nadjeno;
  369. }
  370. int obrisi_prema_vrsti(){
  371. zivotinja tekuci;
  372. cout << "--- Svi Zapisi ---" << endl;
  373. ispisi_listu ();
  374. cout << endl;
  375. cout << "Unesite vrstu: ";
  376. char vrsta[30];
  377. bool nadjeno = false;
  378. unos(vrsta);
  379. for(int i = EndL (lista) - 1; i > 0; i--){
  380. tekuci = RetrieveL (PreviousL (i,lista), lista);
  381. if(strcmp (vrsta, tekuci.Vrsta) == 0)
  382. {
  383. char izbor;
  384. if(!nadjeno)
  385. {
  386. cout << "Zelite li obrisati sve zapise ove vrste: (d/n)" << vrsta << endl;
  387. do
  388. {
  389. cin >>izbor;
  390. } while(izbor != 'd' && izbor != 'n');
  391. }
  392. if(izbor == 'd')
  393. DeleteL (i - 1, lista);
  394. nadjeno = true;
  395. }
  396. }
  397. return nadjeno;
  398. }
  399. void spoji(int i, int k, int j) {
  400. int I = i, J = k + 1, K = 0;
  401. zivotinja *b = new zivotinja [j - i + 1];
  402. zivotinja prvi, drugi;
  403. while(I <= k && J <= j)
  404. {
  405. prvi = RetrieveL (I, lista);
  406. drugi = RetrieveL (J, lista);
  407. if(prvi.Cijena > drugi.Cijena)
  408. {
  409. b[K++] = prvi;
  410. I++;
  411. }
  412. else if
  413. (prvi.Cijena < drugi.Cijena)
  414. {
  415. b[K++] = drugi;
  416. J++;
  417. }
  418. else if(strcmp (prvi.Naziv, drugi.Naziv) < 0)
  419. {
  420. b[K++] = drugi;
  421. J++;
  422. }
  423. else
  424. {
  425. b[K++] = prvi;
  426. I++;
  427. }
  428. }
  429. if(I > k) while(J <= j) {
  430. drugi = RetrieveL (J, lista);
  431. b[K++] = drugi;
  432. J++;
  433. }
  434. else while(I <= k) {
  435. prvi = RetrieveL (I, lista);
  436. b[K++] = prvi;
  437. I++;
  438. }
  439. for(int I = 0;I <= j - i; I++)
  440. Vrati (b[I], i + I, lista);
  441. delete [] b;
  442. }
  443. void MSort(int i, int j)
  444. {
  445. if(i < j)
  446. {
  447. int k = (i + j) / 2;
  448. MSort(i, k);
  449. MSort(k + 1, j);
  450. spoji(i, k, j);
  451. }
  452. }
  453. void sortiraj() {
  454. int br_elem = EndL(lista)-1;
  455. MSort(0,br_elem-1);
  456. Reverse(lista);
  457. }
  458. int main()
  459. {
  460. InitL (lista);
  461. int izbor = 0;
  462. do
  463. {
  464. system ("cls");
  465. cout << "--- I Z B O R ---" << endl;
  466. cout << "1) Dodaj zapis." << endl;
  467. cout << "2) Ispisi listu." << endl;
  468. cout << "3) Ispisi sve zapise nakon 23.9.2012." << endl;
  469. cout << "4) Brisanje pojedinacnog zapisa prema nazivu." << endl;
  470. cout << "5) Brisanje svih zapisa prema vrsti." << endl;
  471. cout << "6) Sortiraj listu." << endl;
  472. cout << "7) Obrisi sve zapise." << endl;
  473. cout << "9) Izlaz iz programa." << endl;
  474. cin >> izbor;
  475. cout << "--------------------" << endl;
  476. switch(izbor)
  477. {
  478. case 1:
  479. cout << (dodaj()? "Zapis uspjesno dodan!\n" : "Zapis nije dodan\n");
  480. system ("pause");
  481. break;
  482. case 2:
  483. ispisi_listu();
  484. system ("pause");
  485. break;
  486. case 3:
  487. pretrazi_listu();
  488. system ("pause");
  489. break;
  490. case 4:
  491. if(obrisi_prema_nazivu())
  492. cout << "Zapis izbrisan."<<endl<<endl;
  493. else cout << "Trazeni zapis ne postoji!" << endl;
  494. system ("pause");
  495. break;
  496. case 5:
  497. if(obrisi_prema_vrsti())
  498. cout << "Trazena vrsta je obrisana." << endl;
  499. else cout << "Trazena vrsta ne postoji!" << endl;
  500. system ("pause");
  501. break;
  502. case 6:
  503. sortiraj ();
  504. cout << "Lista sortirana." << endl;
  505. system ("pause");
  506. break;
  507. case 7:
  508. DeleteAllL (lista);
  509. cout << "Lista je obrisana." << endl;
  510. system ("pause");
  511. break;
  512. case 9:
  513. cout << "Izlaz iz programa." << endl;
  514. system ("pause");
  515. break;
  516. default:
  517. cout << "Pogresan unos!" << endl;
  518. system ("pause");
  519. }
  520. }while (izbor != 9);
  521. return 0;
  522. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.