Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct Adresa /*struktura adresa*/
- {
- char ime[31], prezime[31], email[48], odsjek[10];
- int godina_studija;
- };
- void clean_buff() /*funkcija za ciscenje buffera*/
- {
- char z;
- while(z != '\n')
- z = getchar();
- }
- void unos(char* string, int vel) /*funkcija za unos stringa*/
- {
- int i = 0;
- char c;
- do
- {
- c = getchar();
- string[i] = c;
- i++;
- }
- while(c != '\n' && i < vel);
- string[i - 1] = '\0';
- if(i == vel)
- clean_buff();
- }
- void ispis_string(char* string) /*funkcija za ispis stringa*/
- {
- int i = 0;
- while(*(string + i) != '\0')
- {
- printf("%c", *(string + i));
- i++;
- }
- }
- int ucitaj(struct Adresa niz[]) /*funkcija za ucitavanje file-a adresar.tct u strukturu*/
- {
- FILE *f;
- int broj_studenata = 0;
- f=fopen("adresar.txt", "r");
- if(f == NULL)
- return -1;
- 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)
- broj_studenata++; /*sve dok funkcija ucitava podatke o studentu varijabla broj_studenata raste*/
- fclose(f);
- return broj_studenata; /*funkcija vraca broj studenata u datoteci*/
- }
- int obrisi_adresu(struct Adresa niz[], int vel, char* adresa) /*funkcija koja brise podatke od studenta sa email adresom "adresa"*/
- {
- int i, j;
- for(i = 0; i < vel; i++)
- {
- if(strcmp(niz[i].email, adresa) == 0) /*funkcija provjerava da li ima studenata sa email adreom "adresa"*/
- {
- 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*/
- niz[j] = niz[j + 1];
- return 1; /*ako je student izbrisan funkcija vraca 1*/
- }
- }
- return 0; /*u slucaju da u nizu nije pronadjen niti jedan student sa adresom "adresa" funkcija vraca 0*/
- }
- void pretvori_u_mala_slova(char* string, int vel) /*funkcija koja string slova pretvara u string samo malih slova*/
- {
- int i;
- for(i = 0; i < vel; i++)
- {
- if(string[i] >= 'A' && string[i] <= 'Z')
- string[i] += 32;
- }
- }
- void odredi_adresu(struct Adresa niz[],int vel, struct Adresa *novi) /*funkcija za odredjivanje adrese*/
- {
- int broj = 1, i = 0, j = 0, k = 0, broj_cifara = 0, pom_broj = 0;
- char sufiks[12]="@etf.unsa.ba"; /*sufiks, vrijedi za svaki mail*/
- novi[0].email[i] = novi[0].ime[i];
- 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*/
- {
- if((novi[0].prezime[i] >= 'A' && novi[0].prezime[i] <= 'Z') || (novi[0].prezime[i] >= 'a' && novi[0].prezime[i] <= 'z'))
- {
- i++;
- novi[0].email[i] = novi[0].prezime[j];
- }
- j++;
- }
- j = 0;
- i++;
- 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*/
- 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*/
- {
- while(novi[0].email[j] != '\0')
- {
- if(novi[0].email[j] != niz[k].email[j])
- break;
- j++;
- }
- if(j == i && niz[k].email[j] >= '0' && niz[k].email[j] <= '9')
- broj++; /*ako ima brojac raste*/
- j = 0;
- }
- pom_broj = broj;
- while(pom_broj != 0) /*broji broj cifara broja radi lakseg unosa u string*/
- {
- broj_cifara++;
- pom_broj /= 10;
- }
- pom_broj = broj_cifara;
- while(broj != 0) /*upisuje broj u string email*/
- {
- novi[0].email[i + broj_cifara -1] = broj % 10 + 48;
- broj/=10;
- broj_cifara--;
- }
- i += pom_broj;
- i--;
- for(j = 0; j < 12; j++) /*gore dobivenom stringu dodaje sufiks*/
- {
- i++;
- novi[0].email[i] = sufiks[j];
- }
- novi[0].email[i+1] = '\0';
- }
- 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*/
- {
- int i = 0, i_zamjena, red_broj = vel;
- char email[48];
- if(dodaj == 0) /*zamjena studenta jer je dodaj = 0*/
- {
- printf("Unesite email adresu: ");
- unos(email, 48); /*unos email adrese*/
- for(i_zamjena=0; i_zamjena<vel; i_zamjena++) /*provjerava da li ima studenata sa unesenom email adresom u adresaru*/
- if(strcmp(email, niz[i_zamjena].email) == 0)
- break;
- if(i_zamjena == vel) /*ako nema ispisuje odgovarajucu poruku*/
- {
- printf("U adresaru nema studenta sa takvom adresom.\n");
- return vel;
- }
- printf("Trenutni podaci su: "); /*ako ima ispisuje trenutne podatke*/
- ispis_string(niz[i_zamjena].ime);
- printf(" ");
- ispis_string(niz[i_zamjena].prezime);
- printf(" ");
- ispis_string(niz[i_zamjena].odsjek);
- printf("%d\n", niz[i_zamjena].godina_studija);
- red_broj = i_zamjena;
- }
- printf("Unesite ime: "); /*i u slucaju dodavanja i u slucaju izmjene trazi se unos imena, przimena ...*/
- unos(niz[red_broj].ime, 31);
- printf("Unesite prezime: ");
- unos(niz[red_broj].prezime, 31);
- for(;;)
- {
- printf("Godina studija: "); /*unos godine studija*/
- scanf("%d", &niz[red_broj].godina_studija);
- if(niz[red_broj].godina_studija > 3 || niz[red_broj].godina_studija < 1) /*ako unesena godina studija nije u odg. granicama trazi ponovni unos*/
- printf("Neispravna godina studija! Unesite ponovo.\n");
- else
- break;
- }
- getchar(); /*sluzi da pokupi enter u bufferu*/
- for(;;)
- {
- printf("Odsjek:"); /*unos odsjeka*/
- unos(niz[red_broj].odsjek, 10);
- for(;;)
- {
- if(odsjek[i][0] == '\0') /*ukoliko ne postoji unseni odsjek trazi ponovan unos*/
- break;
- if(strcmp(niz[red_broj].odsjek, odsjek[i]) == 0) /*ukoliko je odsjek poznat izlazi iz petlji i nastavlja dalje*/
- goto exit;
- i++;
- }
- i = 0;
- printf("Nepoznat odsjek! Unesite ponovo.\n");
- }
- exit:
- if(dodaj == 1) /*ukoliko je rijec o dodavanju studenta potrebno je odrediti adresu sto rade sljedece naredbe*/
- {
- odredi_adresu(niz, red_broj, niz+red_broj);
- printf("Dodan student sa email adresom: ");
- ispis_string(niz[vel].email);
- printf("\n");
- }
- else /*ukoliko je rijec o izmjeni funkcija ispisuje odg poruku*/
- {
- printf("Student izmjenjen.\n");
- return vel;
- }
- return red_broj + 1;
- }
- void zapisi(struct Adresa niz[], int vel) /*funkcija za zapisivanje u datoteku*/
- {
- FILE *f;
- int i = 0;
- f = fopen("adresar.txt", "w"); /*otvara file adresar.txt za pisanje, ili ako ga nema kreira novi*/
- if(f == NULL)
- {
- printf("Zapis�u�datoteku�nije�uspio���prekidam�rad.");
- exit(1);
- }
- for(i=0; i<vel; i++) /*unos strukture u datoteku*/
- fprintf(f, "%-31s%-31s%-48s%-10s%d\n", niz[i].ime, niz[i].prezime, niz[i].email, niz[i].odsjek, niz[i].godina_studija);
- fclose(f);
- }
- int pretraga(struct Adresa niz[], int vel, char* tekst) /*funkcija za pretragu*/
- {
- int i;
- for(i = 0; i < vel; i++)
- {
- 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*/
- return i;
- if(strstr(niz[i].prezime, tekst) != 0)
- return i;
- }
- return -1;
- }
- void ispis(struct Adresa niz[], int vel, int godina_studija, char* odsjek) /*funkcija za ispis na osnovu godine studija i odsjeka*/
- {
- int i, red_br = 1, pom_var = 0;
- for(i = 0; i < vel; i++)
- {
- 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*/
- {
- pom_var = 1; /*ukoliko ima studenara sa unesenim smjerom i godinom studija pomocna varijabla se postavlja u vrijednost 1*/
- printf("%d. ", red_br);
- ispis_string(niz[i].prezime);
- printf(" ");
- ispis_string(niz[i].ime);
- printf(" (");
- ispis_string(odsjek);
- printf("%d) - ", godina_studija);
- ispis_string(niz[i].email);
- printf("\n");
- red_br++;
- }
- }
- if(pom_var == 0) /*ako je pom_var = 0 to znaci da nema studenata sa unesenim podacima*/
- printf("Ne postoje studenti sa unesenim podacima.\n");
- }
- int main()
- {
- struct Adresa ETF_Email_adresar[1000];
- int meni, vel = 0, obrisi, godina_studija, redni_broj_pretraga = 1, index_pretraga = 0, kraj_pretrage = 0;
- 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*/
- char adresa[48], unos_o[10], t_pretraga[31];
- printf("Dobro dosli u ETF Email adresar.\n");
- vel = ucitaj(ETF_Email_adresar); /*na pocetku programa se ucitava file "adresar" i odredjuje se velicina strukture*/
- if(vel == -1)
- {
- vel = 0;
- printf("Datoteka adresar.txt ne postoji.\n"); /*ukoliko datoteka ne postoji program ispisuje odg poruku i velicinu postavlja na 0*/
- }
- else
- printf("Datoteka adresar.txt uspjesno ucitana.\n"); /*ukoliko je uspjesno ucitana ispisuje odg poruku*/
- for(;;) /*petlja za meni*/
- {
- printf("\nIzaberite:\n");
- printf("\t1. dodavanje\n\t2. promjena\n\t3. brisanje\n\t4. pretraga\n\t5. ispis\n\t6. kraj rada\n");
- unos:
- printf("Vas izbor je:");
- scanf("%d", &meni);
- getchar();
- if(meni == 1) /*dodaj*/
- {
- if(vel == 1000) /*ako je struktura popunjena program ispisuje poruku*/
- {
- printf("U adresaru vise nema mjesta.");
- continue;
- }
- vel = dodaj_studenta(ETF_Email_adresar, vel, odsjek, 1); /*ukoliko ima mjesta poziva se funkcija dodaj*/
- }
- else if(meni == 2) /*izmjena*/
- {
- dodaj_studenta(ETF_Email_adresar, vel, odsjek, 0); /*poziva se funkcija dodaj ali kao izmjena jer je varijabla dodaj = 0*/
- }
- else if(meni == 3) /*brisanje*/
- {
- printf("Unesite adresu: "); /*trazi se unos adres*/
- unos(adresa, 48);
- obrisi = obrisi_adresu(ETF_Email_adresar, vel, adresa); /*poziva se funkcija obrisi_adresu*/
- if(obrisi == 1)
- printf("Adresa je obrisana."); /*ako je adresa obrisana, obrisi_adresu vraca 1*/
- else
- printf("Adresa ne postoji."); /*ukoliko adresa ne postoji funkcija vraca 0*/
- vel -= obrisi;
- }
- else if(meni == 4) /*pretraga*/
- {
- printf("Unesite dio imena ili prezimena: "); /*program od korisnika trazi unos rijeci*/
- unos(t_pretraga, 30);
- while(1)
- {
- if(index_pretraga == vel)
- break;
- 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*/
- index_pretraga += kraj_pretrage; /*uveceva index pretrage za index nadjenog studenta*/
- if(kraj_pretrage == -1)
- {
- if(redni_broj_pretraga == 1) /*ako nije pronadjen niti jedan student program ispisuje odg poruku*/
- printf("Nije pronadjen nijedan student.\n");
- break;
- }
- else /*ukoliko je pronadjen neki student njegovi podaci se ispisuju na ekran*/
- {
- if(redni_broj_pretraga == 1) /*ukoliko je pronadjeni student prvi program ispisuje odg poruku*/
- printf("Pronadjeni su sljedeci studenti:\n");
- printf("%d. ", redni_broj_pretraga);
- ispis_string(ETF_Email_adresar[index_pretraga].prezime);
- printf(" ");
- ispis_string(ETF_Email_adresar[index_pretraga].ime);
- printf(" (");
- ispis_string(ETF_Email_adresar[index_pretraga].odsjek);
- printf("%d) - ", ETF_Email_adresar[index_pretraga].godina_studija);
- ispis_string(ETF_Email_adresar[index_pretraga].email);
- printf("\n");
- redni_broj_pretraga++;
- }
- index_pretraga++; /*index pretraga raste za jedan kako bi provjeravali sljedeceg studenta*/
- }
- index_pretraga = 0;
- redni_broj_pretraga = 1;
- }
- else if(meni == 5) /*ispis*/
- {
- printf("Godina studija: "); /*program od korisnika trazi unos godine studija i smjer koji i ispisuje studenta sa takvim osobinama*/
- scanf("%d", &godina_studija);
- getchar();
- printf("Odsjek: ");
- unos(unos_o, 10);
- ispis(ETF_Email_adresar, vel, godina_studija, unos_o);
- }
- else if(meni == 6) /*kraj programa*/
- {
- printf("Kraj rada.\nDovidjenja i vidimo se uskoro!");
- break;
- }
- else /*ako broj nije nije od 1 do 6 trazi se ponovan unos*/
- {
- printf("Pogresan izbor! Unesite ponovo.\n");
- goto unos;
- }
- if(meni >= 1 && meni <= 3)
- zapisi(ETF_Email_adresar, vel); /*poslije svake izmjene struktura se zapisuje u datoteku*/
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement