Advertisement
Guest User

Neira

a guest
Jan 25th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct Adresa /*struktura adresa*/
  6. {
  7. char ime[31], prezime[31], email[48], odsjek[10];
  8. int godina_studija;
  9. };
  10.  
  11.  
  12. void clean_buff() /*funkcija za ciscenje buffera*/
  13. {
  14. char z;
  15.  
  16. while(z != '\n')
  17. z = getchar();
  18. }
  19.  
  20. void unos(char* string, int vel) /*funkcija za unos stringa*/
  21. {
  22. int i = 0;
  23. char c;
  24.  
  25. do
  26. {
  27. c = getchar();
  28. string[i] = c;
  29. i++;
  30. }
  31. while(c != '\n' && i < vel);
  32.  
  33. string[i - 1] = '\0';
  34.  
  35. if(i == vel)
  36. clean_buff();
  37. }
  38. void ispis_string(char* string) /*funkcija za ispis stringa*/
  39. {
  40. int i = 0;
  41.  
  42. while(*(string + i) != '\0')
  43. {
  44. printf("%c", *(string + i));
  45. i++;
  46. }
  47. }
  48.  
  49. int ucitaj(struct Adresa niz[]) /*funkcija za ucitavanje file-a adresar.tct u strukturu*/
  50. {
  51. FILE *f;
  52. int broj_studenata = 0;
  53. f=fopen("adresar.txt", "r");
  54. if(f == NULL)
  55. return -1;
  56.  
  57. while(fscanf(f, "%31s%31s%48s%10s%d\n", niz[broj_studenata].ime, niz[broj_studenata].prezime, niz[broj_studenata].email, niz[broj_studenata].odsjek, &niz[broj_studenata].godina_studija) == 5 && broj_studenata<1000)
  58. broj_studenata++; /*sve dok funkcija ucitava podatke o studentu varijabla broj_studenata raste*/
  59.  
  60. fclose(f);
  61. return broj_studenata; /*funkcija vraca broj studenata u datoteci*/
  62. }
  63.  
  64.  
  65. int obrisi_adresu(struct Adresa niz[], int vel, char* adresa) /*funkcija koja brise podatke od studenta sa email adresom "adresa"*/
  66. {
  67. int i, j;
  68. for(i = 0; i < vel; i++)
  69. {
  70. if(strcmp(niz[i].email, adresa) == 0) /*funkcija provjerava da li ima studenata sa email adreom "adresa"*/
  71. {
  72. for(j = i; j< vel; j++) /*u slucaju da ima pomjera niz studenata ulijevo za jedan od tog studenta do kraja niza i na taj nacin brise datog studenta*/
  73. niz[j] = niz[j + 1];
  74. return 1; /*ako je student izbrisan funkcija vraca 1*/
  75. }
  76. }
  77. return 0; /*u slucaju da u nizu nije pronadjen niti jedan student sa adresom "adresa" funkcija vraca 0*/
  78. }
  79.  
  80. void pretvori_u_mala_slova(char* string, int vel) /*funkcija koja string slova pretvara u string samo malih slova*/
  81. {
  82. int i;
  83.  
  84. for(i = 0; i < vel; i++)
  85. {
  86. if(string[i] >= 'A' && string[i] <= 'Z')
  87. string[i] += 32;
  88. }
  89. }
  90.  
  91. void odredi_adresu(struct Adresa niz[],int vel, struct Adresa *novi) /*funkcija za odredjivanje adrese*/
  92. {
  93. int broj = 1, i = 0, j = 0, k = 0, broj_cifara = 0, pom_broj = 0;
  94. char sufiks[12]="@etf.unsa.ba"; /*sufiks, vrijedi za svaki mail*/
  95.  
  96. novi[0].email[i] = novi[0].ime[i];
  97.  
  98. while(novi[0].prezime[j] != '\0') /*sljedece komande sluze da pridruze stringu novi[0].email prvo slovo imena i slova prezimena studenta za koji treba odrediti email*/
  99. {
  100. if((novi[0].prezime[i] >= 'A' && novi[0].prezime[i] <= 'Z') || (novi[0].prezime[i] >= 'a' && novi[0].prezime[i] <= 'z'))
  101. {
  102. i++;
  103. novi[0].email[i] = novi[0].prezime[j];
  104. }
  105. j++;
  106. }
  107. j = 0;
  108. i++;
  109. pretvori_u_mala_slova(novi[0].email, i); /*posto adresa treba biti sastavljena od malih slova string novi[0].email se pretvara u mala slova*/
  110.  
  111. for(k = 0; k < vel; k++) /*sljedece komande provjeravaju da li u se u nizu struktura nalazi jos studenata sa istim prvim slovom imena i slovima prezimena*/
  112. {
  113. while(novi[0].email[j] != '\0')
  114. {
  115. if(novi[0].email[j] != niz[k].email[j])
  116. break;
  117. j++;
  118. }
  119. if(j == i && niz[k].email[j] >= '0' && niz[k].email[j] <= '9')
  120. broj++; /*ako ima brojac raste*/
  121. j = 0;
  122. }
  123. pom_broj = broj;
  124.  
  125. while(pom_broj != 0) /*broji broj cifara broja radi lakseg unosa u string*/
  126. {
  127. broj_cifara++;
  128. pom_broj /= 10;
  129. }
  130. pom_broj = broj_cifara;
  131.  
  132. while(broj != 0) /*upisuje broj u string email*/
  133. {
  134. novi[0].email[i + broj_cifara -1] = broj % 10 + 48;
  135. broj/=10;
  136. broj_cifara--;
  137. }
  138. i += pom_broj;
  139. i--;
  140. for(j = 0; j < 12; j++) /*gore dobivenom stringu dodaje sufiks*/
  141. {
  142. i++;
  143. novi[0].email[i] = sufiks[j];
  144. }
  145. novi[0].email[i+1] = '\0';
  146. }
  147. int dodaj_studenta(struct Adresa niz[], int vel, char odsjek[][10], int dodaj) /*funkcija koja sluzi za dodavanje studenta, a ujedno i za izmjenu tj. varijabla dodaj = 1 ako dodajemo studenta, a = 0 ako mijenjamo studenta*/
  148. {
  149. int i = 0, i_zamjena, red_broj = vel;
  150. char email[48];
  151. if(dodaj == 0) /*zamjena studenta jer je dodaj = 0*/
  152. {
  153. printf("Unesite email adresu: ");
  154. unos(email, 48); /*unos email adrese*/
  155. for(i_zamjena=0; i_zamjena<vel; i_zamjena++) /*provjerava da li ima studenata sa unesenom email adresom u adresaru*/
  156. if(strcmp(email, niz[i_zamjena].email) == 0)
  157. break;
  158. if(i_zamjena == vel) /*ako nema ispisuje odgovarajucu poruku*/
  159. {
  160. printf("U adresaru nema studenta sa takvom adresom.\n");
  161. return vel;
  162. }
  163. printf("Trenutni podaci su: "); /*ako ima ispisuje trenutne podatke*/
  164. ispis_string(niz[i_zamjena].ime);
  165. printf(" ");
  166. ispis_string(niz[i_zamjena].prezime);
  167. printf(" ");
  168. ispis_string(niz[i_zamjena].odsjek);
  169. printf("%d\n", niz[i_zamjena].godina_studija);
  170. red_broj = i_zamjena;
  171. }
  172.  
  173. printf("Unesite ime: "); /*i u slucaju dodavanja i u slucaju izmjene trazi se unos imena, przimena ...*/
  174. unos(niz[red_broj].ime, 31);
  175. printf("Unesite prezime: ");
  176. unos(niz[red_broj].prezime, 31);
  177.  
  178. for(;;)
  179. {
  180. printf("Godina studija: "); /*unos godine studija*/
  181. scanf("%d", &niz[red_broj].godina_studija);
  182. if(niz[red_broj].godina_studija > 3 || niz[red_broj].godina_studija < 1) /*ako unesena godina studija nije u odg. granicama trazi ponovni unos*/
  183. printf("Neispravna godina studija! Unesite ponovo.\n");
  184. else
  185. break;
  186. }
  187.  
  188. getchar(); /*sluzi da pokupi enter u bufferu*/
  189.  
  190. for(;;)
  191. {
  192. printf("Odsjek:"); /*unos odsjeka*/
  193. unos(niz[red_broj].odsjek, 10);
  194. for(;;)
  195. {
  196. if(odsjek[i][0] == '\0') /*ukoliko ne postoji unseni odsjek trazi ponovan unos*/
  197. break;
  198. if(strcmp(niz[red_broj].odsjek, odsjek[i]) == 0) /*ukoliko je odsjek poznat izlazi iz petlji i nastavlja dalje*/
  199. goto exit;
  200. i++;
  201. }
  202. i = 0;
  203. printf("Nepoznat odsjek! Unesite ponovo.\n");
  204. }
  205. exit:
  206. if(dodaj == 1) /*ukoliko je rijec o dodavanju studenta potrebno je odrediti adresu sto rade sljedece naredbe*/
  207. {
  208. odredi_adresu(niz, red_broj, niz+red_broj);
  209. printf("Dodan student sa email adresom: ");
  210. ispis_string(niz[vel].email);
  211. printf("\n");
  212. }
  213. else /*ukoliko je rijec o izmjeni funkcija ispisuje odg poruku*/
  214. {
  215. printf("Student izmjenjen.\n");
  216. return vel;
  217. }
  218. return red_broj + 1;
  219. }
  220.  
  221. void zapisi(struct Adresa niz[], int vel) /*funkcija za zapisivanje u datoteku*/
  222. {
  223. FILE *f;
  224. int i = 0;
  225.  
  226. f = fopen("adresar.txt", "w"); /*otvara file adresar.txt za pisanje, ili ako ga nema kreira novi*/
  227. if(f == NULL)
  228. {
  229. printf("Zapis�u�datoteku�nije�uspio���prekidam�rad.");
  230. exit(1);
  231. }
  232.  
  233. for(i=0; i<vel; i++) /*unos strukture u datoteku*/
  234. fprintf(f, "%-31s%-31s%-48s%-10s%d\n", niz[i].ime, niz[i].prezime, niz[i].email, niz[i].odsjek, niz[i].godina_studija);
  235.  
  236. fclose(f);
  237. }
  238.  
  239. int pretraga(struct Adresa niz[], int vel, char* tekst) /*funkcija za pretragu*/
  240. {
  241. int i;
  242.  
  243. for(i = 0; i < vel; i++)
  244. {
  245. if(strstr(niz[i].ime, tekst) != 0) /*u slucaju da je string koji korisnik unese "tekst" sadrzan u imenu ili prezimenu program vraca index prvog clana sa takvom osobinom*/
  246. return i;
  247. if(strstr(niz[i].prezime, tekst) != 0)
  248. return i;
  249. }
  250.  
  251. return -1;
  252. }
  253.  
  254. void ispis(struct Adresa niz[], int vel, int godina_studija, char* odsjek) /*funkcija za ispis na osnovu godine studija i odsjeka*/
  255. {
  256. int i, red_br = 1, pom_var = 0;
  257.  
  258. for(i = 0; i < vel; i++)
  259. {
  260. if(strcmp(niz[i].odsjek, odsjek) == 0 && niz[i].godina_studija == godina_studija) /*ukoliko studentu u adresaru odgovara godina studija i smjer podaci studenta se ispisuju na ekranu*/
  261. {
  262. pom_var = 1; /*ukoliko ima studenara sa unesenim smjerom i godinom studija pomocna varijabla se postavlja u vrijednost 1*/
  263. printf("%d. ", red_br);
  264. ispis_string(niz[i].prezime);
  265. printf(" ");
  266. ispis_string(niz[i].ime);
  267. printf(" (");
  268. ispis_string(odsjek);
  269. printf("%d) - ", godina_studija);
  270. ispis_string(niz[i].email);
  271. printf("\n");
  272. red_br++;
  273. }
  274. }
  275. if(pom_var == 0) /*ako je pom_var = 0 to znaci da nema studenata sa unesenim podacima*/
  276. printf("Ne postoje studenti sa unesenim podacima.\n");
  277. }
  278. int main()
  279. {
  280. struct Adresa ETF_Email_adresar[1000];
  281. int meni, vel = 0, obrisi, godina_studija, redni_broj_pretraga = 1, index_pretraga = 0, kraj_pretrage = 0;
  282. char odsjek[10][10]= {"AE", "EE", "RI", "TK"}; /*u zadatku se trazilo da se smjerovi mogu mijenjati u jednoj liniji koda, to je ova linija*/
  283. char adresa[48], unos_o[10], t_pretraga[31];
  284.  
  285. printf("Dobro dosli u ETF Email adresar.\n");
  286. vel = ucitaj(ETF_Email_adresar); /*na pocetku programa se ucitava file "adresar" i odredjuje se velicina strukture*/
  287. if(vel == -1)
  288. {
  289. vel = 0;
  290. printf("Datoteka adresar.txt ne postoji.\n"); /*ukoliko datoteka ne postoji program ispisuje odg poruku i velicinu postavlja na 0*/
  291. }
  292. else
  293. printf("Datoteka adresar.txt uspjesno ucitana.\n"); /*ukoliko je uspjesno ucitana ispisuje odg poruku*/
  294.  
  295. for(;;) /*petlja za meni*/
  296. {
  297. printf("\nIzaberite:\n");
  298. printf("\t1. dodavanje\n\t2. promjena\n\t3. brisanje\n\t4. pretraga\n\t5. ispis\n\t6. kraj rada\n");
  299.  
  300. unos:
  301. printf("Vas izbor je:");
  302. scanf("%d", &meni);
  303. getchar();
  304.  
  305. if(meni == 1) /*dodaj*/
  306. {
  307. if(vel == 1000) /*ako je struktura popunjena program ispisuje poruku*/
  308. {
  309. printf("U adresaru vise nema mjesta.");
  310. continue;
  311. }
  312. vel = dodaj_studenta(ETF_Email_adresar, vel, odsjek, 1); /*ukoliko ima mjesta poziva se funkcija dodaj*/
  313. }
  314. else if(meni == 2) /*izmjena*/
  315. {
  316. dodaj_studenta(ETF_Email_adresar, vel, odsjek, 0); /*poziva se funkcija dodaj ali kao izmjena jer je varijabla dodaj = 0*/
  317. }
  318. else if(meni == 3) /*brisanje*/
  319. {
  320. printf("Unesite adresu: "); /*trazi se unos adres*/
  321. unos(adresa, 48);
  322. obrisi = obrisi_adresu(ETF_Email_adresar, vel, adresa); /*poziva se funkcija obrisi_adresu*/
  323. if(obrisi == 1)
  324. printf("Adresa je obrisana."); /*ako je adresa obrisana, obrisi_adresu vraca 1*/
  325. else
  326. printf("Adresa ne postoji."); /*ukoliko adresa ne postoji funkcija vraca 0*/
  327. vel -= obrisi;
  328. }
  329. else if(meni == 4) /*pretraga*/
  330. {
  331. printf("Unesite dio imena ili prezimena: "); /*program od korisnika trazi unos rijeci*/
  332. unos(t_pretraga, 30);
  333. while(1)
  334. {
  335. if(index_pretraga == vel)
  336. break;
  337. kraj_pretrage = pretraga(ETF_Email_adresar + index_pretraga, vel, t_pretraga); /*program poziva funkciju pretraga i ako se data rijec nalazi u imenu ili prezimenu nekog studenta funkcija vraca index tog studenta*/
  338. index_pretraga += kraj_pretrage; /*uveceva index pretrage za index nadjenog studenta*/
  339. if(kraj_pretrage == -1)
  340. {
  341. if(redni_broj_pretraga == 1) /*ako nije pronadjen niti jedan student program ispisuje odg poruku*/
  342. printf("Nije pronadjen nijedan student.\n");
  343. break;
  344. }
  345. else /*ukoliko je pronadjen neki student njegovi podaci se ispisuju na ekran*/
  346. {
  347. if(redni_broj_pretraga == 1) /*ukoliko je pronadjeni student prvi program ispisuje odg poruku*/
  348. printf("Pronadjeni su sljedeci studenti:\n");
  349. printf("%d. ", redni_broj_pretraga);
  350. ispis_string(ETF_Email_adresar[index_pretraga].prezime);
  351. printf(" ");
  352. ispis_string(ETF_Email_adresar[index_pretraga].ime);
  353. printf(" (");
  354. ispis_string(ETF_Email_adresar[index_pretraga].odsjek);
  355. printf("%d) - ", ETF_Email_adresar[index_pretraga].godina_studija);
  356. ispis_string(ETF_Email_adresar[index_pretraga].email);
  357. printf("\n");
  358. redni_broj_pretraga++;
  359. }
  360. index_pretraga++; /*index pretraga raste za jedan kako bi provjeravali sljedeceg studenta*/
  361. }
  362. index_pretraga = 0;
  363. redni_broj_pretraga = 1;
  364. }
  365. else if(meni == 5) /*ispis*/
  366. {
  367. printf("Godina studija: "); /*program od korisnika trazi unos godine studija i smjer koji i ispisuje studenta sa takvim osobinama*/
  368. scanf("%d", &godina_studija);
  369. getchar();
  370. printf("Odsjek: ");
  371. unos(unos_o, 10);
  372. ispis(ETF_Email_adresar, vel, godina_studija, unos_o);
  373. }
  374. else if(meni == 6) /*kraj programa*/
  375. {
  376. printf("Kraj rada.\nDovidjenja i vidimo se uskoro!");
  377. break;
  378. }
  379. else /*ako broj nije nije od 1 do 6 trazi se ponovan unos*/
  380. {
  381. printf("Pogresan izbor! Unesite ponovo.\n");
  382. goto unos;
  383. }
  384. if(meni >= 1 && meni <= 3)
  385. zapisi(ETF_Email_adresar, vel); /*poslije svake izmjene struktura se zapisuje u datoteku*/
  386. }
  387. return 0;
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement