SP - Zadatak 1 - ATP Liste


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

Glavna datoteka
primjer operacija nad listom


Copy this code and paste it in your HTML
  1. #include <iostream>
  2. #include "lista_polje.h"
  3. //#include "lista_pok.h"
  4. using namespace std;
  5.  
  6. bool Dodaj(Lista*);
  7. void IspisListe(Lista*);
  8. void Pretrazi_Datum(Lista*);
  9. bool BrisanjeUnosa(Lista*);
  10. bool BrisanjeVrste(Lista*);
  11. void Sortiranje(Lista*);
  12.  
  13. int main() {
  14. Lista* L = new Lista;
  15. InitL(L);
  16.  
  17. short izb;
  18. do {
  19. cout << "____________________________________________________________________" << endl;
  20. cout << endl << "IZBORNIK" << endl;
  21. cout << "____________________________________________________________________" << endl;
  22. cout << " 1. Dodavanje zivotinje" << endl;
  23. cout << " 2. Ispis liste zivotinja" << endl;
  24. cout << " 3. Ispis svih zivotinja dostavljenih nakon 23.rujna 2012." << endl << endl;
  25. cout << " 5. Brisati unos prema nazivu zivotinje" << endl;
  26. cout << " 6. Brisati sve zivotinje odredjene vrste" << endl;
  27. cout << " 7. Sortiranje liste" << endl << endl;
  28. cout << " 9. Izlaz iz programa" << endl;
  29. cout << "____________________________________________________________________" << endl;
  30. cout << "Odabir: ";
  31. cin >> izb;
  32.  
  33. switch(izb) {
  34. case 1:
  35. if(Dodaj(L) ) cout << endl << "Zapis uspjesno dodan u listu." << endl;
  36. cout << "____________________________________________________________________" << endl;
  37. break;
  38. case 2:
  39. IspisListe(L);
  40. cout << "____________________________________________________________________" << endl;
  41. break;
  42. case 3:
  43. Pretrazi_Datum(L);
  44. cout << "____________________________________________________________________" << endl;
  45. break;
  46.  
  47. case 5:
  48. if(BrisanjeUnosa(L) ) cout << "Unos je uspjesno obrisan." << endl;
  49. cout << "____________________________________________________________________" << endl;
  50. break;
  51. case 6:
  52. if(BrisanjeVrste(L) ) cout << "Brisanje uspjesno obavljeno." << endl;
  53. cout << "____________________________________________________________________" << endl;
  54. break;
  55. case 7:
  56. Sortiranje(L);
  57. cout << "____________________________________________________________________" << endl;
  58. break;
  59.  
  60. case 9: break;
  61. default:
  62. cout << "Pogresan unos." << endl;
  63. cout << "____________________________________________________________________" << endl;
  64. }
  65. cout << endl;
  66. } while(izb!=9);
  67.  
  68. delete L;
  69.  
  70. return 0;
  71. }
  72.  
  73. bool Dodaj(Lista* L) {
  74. cout << "Dodavanje nove zivotinje u listu" << endl << endl;
  75. static int sifra = 1;
  76.  
  77. // kreiranje novog zapisa (**sifra - automatski)
  78. Zivotinja* nova = new Zivotinja;
  79. while(1) {
  80. nova->sifra = sifra++;
  81. cout << "Sifra(*auto): " << nova->sifra << endl;
  82.  
  83. // unesi podatke
  84. cin.ignore();
  85. cout << "Naziv: ";
  86. cin.getline(nova->naziv, 50);
  87. cout << "Vrsta: ";
  88. cin.getline(nova->vrsta, 50);
  89.  
  90. cout << "Cijena: ";
  91. cin >> nova->cijena;
  92.  
  93. // unosa datuma
  94. while(1) {
  95. cout << "Datum dostave (dd mm gggg): ";
  96. cin >> nova->dat_dostave.dan >> nova->dat_dostave.mjesec;
  97. cin >> nova->dat_dostave.godina;
  98. if(nova->dat_dostave.dan>=1 && nova->dat_dostave.dan<=31 &&
  99. nova->dat_dostave.mjesec>=1 && nova->dat_dostave.mjesec<=12 &&
  100. nova->dat_dostave.godina>=1000 && nova->dat_dostave.dan<=9999)
  101. break;
  102. cout << "Pogresan unos. dan(1-31) mjesec(1-12) godina(1000-9999)" << endl;
  103. }
  104.  
  105. // potvrda unosa
  106. char dn;
  107. cout << "Potvrda unosa? (d/n)";
  108. cin >> dn;
  109. if(dn=='d' || dn=='D') break;
  110. cout << endl << "Ponovni unos" << endl << endl;
  111. }
  112.  
  113. // dodavanje zapisa
  114. return InsertL(*nova, EndL(L), L);
  115. }
  116.  
  117. void IspisListe(Lista* L) {
  118. cout << "Ispis liste zivotinja od kraja" << endl << endl;
  119.  
  120. // ispis liste kraj --> pocetak
  121. for(Element tren=EndL(L); (tren=PreviousL(tren, L))!=ERROR_CODE; )
  122. cout << RetrieveL(tren, L) << endl;
  123. }
  124.  
  125. void Pretrazi_Datum(Lista* L) {
  126. Zivotinja z1;
  127. int br = 0;
  128.  
  129. // pretrazi listu pocetak..kraj
  130. for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) {
  131. z1 = RetrieveL(tren, L);
  132. int dd=(z1.dat_dostave.godina*10000)+(z1.dat_dostave.mjesec*100)+z1.dat_dostave.dan;
  133.  
  134. // ispisi ako je datum dostave > 23.09.2012.
  135. if(dd>20120923){
  136. cout << z1 << endl;
  137. br++;
  138. }
  139. }
  140.  
  141. // ispisi broj zivotinja sa datumom > 23.09.2012.
  142. cout << "Ukupan broj ispisanih zivotinja: " << br << endl;
  143. }
  144.  
  145. bool StrJednako(char* s1, char* s2, int n, int n2) {
  146. if(n != n2) return false;
  147. for(int i=0; i<n; i++)
  148. if(s1[i] != s2[i]) return false;
  149. return true;
  150. }
  151.  
  152. bool BrisanjeUnosa(Lista* L) {
  153. cout << "Brisanje unosa prema nazivu zivotinje" << endl;
  154.  
  155. // unesi naziv
  156. char naziv[50];
  157. cin.ignore();
  158. cout << "Naziv: ";
  159. cin.getline(naziv, 50);
  160.  
  161. // pretrazi listu $->naziv
  162. Zivotinja z1;
  163. for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) {
  164. z1 = RetrieveL(tren, L);
  165.  
  166. // ako je naziv pronadjen
  167. if(StrJednako(naziv, z1.naziv, strlen(naziv), strlen(z1.naziv) ) ) {
  168. cout << "Zivotinja je pronadjena: " << endl;
  169. cout << z1 << endl;
  170.  
  171. // potvrda brisanja
  172. char dn;
  173. while(1) {
  174. cout << endl << "Izbrisati unos? (d/n): ";
  175. cin >> dn;
  176.  
  177. // brisanje
  178. if(dn=='d' || dn=='D')
  179. if(DeleteL(LocateL(z1, L), L) == -1) return 0;
  180. else return 1;
  181.  
  182. // ne brisanje
  183. if(dn=='n' || dn=='N') return 0;
  184. cout << "Pogresan unos." << endl;
  185. }
  186. }
  187. }
  188.  
  189. return 0;
  190. }
  191.  
  192. bool BrisanjeVrste(Lista* L) {
  193. cout << "Brisanje svih zivotinja odredjene vrste" << endl;
  194.  
  195. // unesi vrstu
  196. char vrsta[50];
  197. cin.ignore();
  198. cout << "Vrsta: ";
  199. cin.getline(vrsta, 50);
  200.  
  201. // potvrda unosa
  202. char dn;
  203. while(1) {
  204. cout << endl << "Izbrisati sve zivotinje vrste '" << vrsta << "' iz liste? (d/n): ";
  205. cin >> dn;
  206. if(dn=='d' || dn=='D') break;
  207. if(dn=='n' || dn=='N') return 0;
  208. cout << "Pogresan unos." << endl;
  209. }
  210.  
  211. // pretrazivanje liste $->vrsta
  212. int br = 0;
  213. Zivotinja z1;
  214. for(Element tren=FirstL(L); tren!=EndL(L); ) {
  215. z1 = RetrieveL(tren, L);
  216.  
  217. // ako je vrsta pronadjena
  218. if(StrJednako(vrsta, z1.vrsta, strlen(vrsta), strlen(z1.vrsta) ) )
  219.  
  220. // brisanje elementa liste
  221. if(DeleteL(LocateL(z1, L), L) ) {
  222. br++;
  223. continue;
  224. }
  225.  
  226. // nastavka pretrazivanja liste
  227. tren = NextL(tren, L);
  228. }
  229.  
  230. // ispis broja izbrisanih unosa
  231. cout << "Broj uspjesno izbrisanih unosa: " << br << endl;
  232. if(br) return 1;
  233. else return 0;
  234. }
  235.  
  236. int BrojElemenata(Lista* L) {
  237. int br=0;
  238. for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) br++;
  239. return br;
  240. }
  241.  
  242. bool Provjera(Zivotinja z1, Zivotinja z2) {
  243. // ako je cijena manja
  244. if(z1.cijena<z2.cijena) return true;
  245.  
  246. // ako je cijena ista i naziv veci 0
  247. // ako je cijena ista i naziv manji 1
  248. if(z1.cijena==z2.cijena) {
  249. int manji = (strlen(z1.naziv)<strlen(z2.naziv)) ? strlen(z1.naziv) : strlen(z2.naziv);
  250. for(int i=0; i<manji; i++)
  251. if(z1.naziv[i]>z2.naziv[i]) return false;
  252. else if(z1.naziv[i]<z2.naziv[i]) return true;
  253. }
  254.  
  255. return false;
  256. }
  257.  
  258. void Spoji(Zivotinja p[], int i, int k, int j) {
  259. int poc1=i, poc2=k+1, c=0;
  260. Zivotinja* p2 = new Zivotinja[j-i+1];
  261.  
  262. while(poc1<=k && poc2<=j)
  263. if(Provjera(p[poc1], p[poc2]) ) p2[c++]=p[poc1++];
  264. else p2[c++]=p[poc2++];
  265.  
  266. if(poc1>k)
  267. while(poc2<=j) p2[c++]=p[poc2++];
  268. else
  269. while(poc1<=k) p2[c++]=p[poc1++];
  270.  
  271. for(int m=i; m<=j; m++) p[m]=p2[m-i];
  272.  
  273. delete[] p2;
  274. }
  275. void MerSort(Zivotinja polje[], int i, int j) {
  276. if(i<j) {
  277. int k = (i+j) / 2;
  278. MerSort(polje, i, k);
  279. MerSort(polje, k+1, j);
  280. Spoji(polje, i, k, j);
  281. }
  282. }
  283. void MerSort(Zivotinja polje[], int n) {
  284. MerSort(polje, 0, n-1);
  285. }
  286.  
  287. void Sortiranje(Lista* L) {
  288. cout << "Sortiranje liste" << endl;
  289. int broj_el=BrojElemenata(L), i=0;
  290.  
  291. // slozi novo polje od liste
  292. Zivotinja* polje = new Zivotinja[broj_el];
  293. for(Element nova=FirstL(L); nova!=EndL(L); nova=NextL(nova, L) )
  294. polje[i++] = RetrieveL(nova, L);
  295.  
  296. // izbrisi elemente liste
  297. DeleteAllL(L);
  298.  
  299. // sortiraj
  300. MerSort(polje, broj_el);
  301.  
  302. // napravi listu od polja (obrnuti redoslijed)
  303. for(int i=0; i<broj_el; i++)
  304. InsertL(polje[i], FirstL(L), L);
  305.  
  306. // izbrisi polje
  307. delete[] polje;
  308. }
  309.  
  310. // hackerma3x (2012)

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.