Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #define MAX_STD 1000
- struct Adresa {
- char ime[31], prezime[31];
- char email[48], odsjek[10];
- int godina_studija;
- };
- typedef struct Adresa Adresa;
- // prototipovi funkcija
- void meni();
- void jedan(Adresa *, int *);
- void dva(Adresa *, int );
- void tri(Adresa *, int *);
- void cetiri(Adresa *, int);
- void pet(Adresa *, int);
- void unesi(char *, int);
- void zapisi(Adresa *, int);
- void odredi_adresu(Adresa *, int, Adresa *);
- void ispis(Adresa *, int, int, char *);
- int obrisi_adresu(Adresa *, int, const char *);
- int ucitaj(Adresa *);
- int pretraga(Adresa *, int, const char *);
- int podstring(const char *, const char *);
- char *intUString(char *, int);
- int main() {
- meni();
- return 0;
- }
- void meni() {
- int opcija, ucitano;
- Adresa studenti[MAX_STD];
- printf("Dobro dosli u ETF Email adresar.\n");
- ucitano = ucitaj(studenti);
- if (ucitano) {
- printf("Datoteka adresar.txt uspjesno ucitana.\n");
- }
- do {
- printf("Izaberite:\n1. dodavanje\n2. promjena\n3. brisanje\n4. pretraga\n");
- printf("5. ispis\n6. kraj rada\n");
- greska: printf("Vas izbor je: ");
- scanf("%d", &opcija);
- switch (opcija) {
- case 1:
- jedan(studenti, &ucitano);
- break;
- case 2:
- dva(studenti, ucitano);
- break;
- case 3:
- tri(studenti, &ucitano);
- break;
- case 4:
- cetiri(studenti, ucitano);
- break;
- case 5:
- pet(studenti, ucitano);
- break;
- case 6:
- printf("Kraj rada.\nDovidjenja i vidimo se uskoro!");
- return;
- default:
- printf("Pogresan izbor! Unesite ponovo.\n");
- goto greska;
- }
- } while (1);
- }
- void jedan(Adresa *studenti, int *vel) {
- printf("Unesite ime: ");
- unesi(studenti[*vel].ime, 30);
- printf("Unesite prezime: ");
- unesi(studenti[*vel].prezime, 30);
- do {
- printf("Godina studija: ");
- scanf("%d", &studenti[*vel].godina_studija);
- if (studenti[*vel].godina_studija < 1 || studenti[*vel].godina_studija > 3)
- printf("Neispravna godina studija! Unesite ponovo.\n");
- } while (studenti[*vel].godina_studija < 1 || studenti[*vel].godina_studija > 3);
- do {
- printf("Odsjek: ");
- unesi(studenti[*vel].odsjek, 10);
- if (strcmp(studenti[*vel].odsjek, "RI") && strcmp(studenti[*vel].odsjek, "AE") &&
- strcmp(studenti[*vel].odsjek, "TK") && strcmp(studenti[*vel].odsjek, "EE"))
- printf("Nepoznat odsjek! Unesite ponovo.\n");
- } while (strcmp(studenti[*vel].odsjek, "RI") && strcmp(studenti[*vel].odsjek, "AE") &&
- strcmp(studenti[*vel].odsjek, "TK") && strcmp(studenti[*vel].odsjek, "EE"));
- odredi_adresu(studenti, *vel, &studenti[*vel]);
- (*vel)++;
- zapisi(studenti, *vel);
- printf("Dodan student sa email adresom: %s\n", studenti[*vel - 1].email);
- }
- void dva(Adresa *studenti, int vel) {
- int i;
- char mailKor[48];
- printf("Unesite email adresu: ");
- unesi(mailKor, 48);
- for (i = 0; i < vel; i++) {
- if (!strcmp(mailKor, studenti[i].email)) {
- printf("Trenutni podaci su: %s %s %s%d\n", studenti[i].ime, studenti[i].prezime, studenti[i].odsjek, studenti[i].godina_studija);
- printf("Unesite ime: ");
- unesi(studenti[i].ime, 30);
- printf("Unesite prezime: ");
- unesi(studenti[i].prezime, 30);
- do {
- printf("Godina studija: ");
- scanf("%d", &studenti[i].godina_studija);
- if (studenti[i].godina_studija < 1 || studenti[i].godina_studija > 3)
- printf("Neispravna godina studija! Unesite ponovo.\n");
- } while (studenti[i].godina_studija < 1 || studenti[i].godina_studija > 3);
- do {
- printf("Odsjek: ");
- unesi(studenti[i].odsjek, 10);
- if (strcmp(studenti[i].odsjek, "RI") && strcmp(studenti[i].odsjek, "AE") &&
- strcmp(studenti[i].odsjek, "TK") && strcmp(studenti[i].odsjek, "EE"))
- printf("Nepoznat odsjek! Unesite ponovo.\n");
- } while (strcmp(studenti[i].odsjek, "RI") && strcmp(studenti[i].odsjek, "AE") &&
- strcmp(studenti[i].odsjek, "TK") && strcmp(studenti[i].odsjek, "EE"));
- break;
- }
- }
- if (i == vel) {
- printf("U adresaru nema studenta sa takvom adresom.\n");
- return;
- }
- zapisi(studenti, vel);
- printf("Izmijenjen student.\n");
- }
- void tri(Adresa *studenti, int *velicina) {
- int obrisano;
- char mailKor[48];
- printf("Unesite email adresu: ");
- unesi(mailKor, 48);
- obrisano = obrisi_adresu(studenti, *velicina, mailKor);
- if (obrisano) {
- printf("Obrisan student.\n");
- (*velicina)--;
- zapisi(studenti, *velicina);
- } else {
- printf("U adresaru nema studenta sa takvom adresom.\n");
- }
- }
- void cetiri(Adresa *studenti, int velicina) {
- char tekst[30], postoji;
- printf("Unesite dio imena ili prezimena: ");
- unesi(tekst, 30);
- postoji = pretraga(studenti, velicina, tekst);
- if (postoji == -1) {
- printf("Nije pronadjen nijedan student.\n");
- }
- }
- void pet(Adresa *studenti, int velicina) {
- char korOdsjek[10];
- int godinaStudija;
- do {
- printf("Godina studija: ");
- scanf("%d", &godinaStudija);
- if (godinaStudija < 1 || godinaStudija > 3)
- printf("Neispravna godina studija! Unesite ponovo.\n");
- } while (godinaStudija < 1 || godinaStudija > 3);
- do {
- printf("Odsjek: ");
- unesi(korOdsjek, 10);
- if (strcmp(korOdsjek, "RI") && strcmp(korOdsjek, "AE") &&
- strcmp(korOdsjek, "TK") && strcmp(korOdsjek, "EE"))
- printf("Nepoznat odsjek! Unesite ponovo.\n");
- } while (strcmp(korOdsjek, "RI") && strcmp(korOdsjek, "AE") &&
- strcmp(korOdsjek, "TK") && strcmp(korOdsjek, "EE"));
- ispis(studenti, velicina, godinaStudija, korOdsjek);
- }
- void unesi(char *string, int velicina) {
- int i = 0;
- char c = getchar();
- if (c == '\n') c = getchar();
- while (i < velicina - 1 && c != '\n') {
- string[i] = c;
- i++;
- c = getchar();
- }
- string[i] = '\0';
- }
- void zapisi(Adresa *niz, int vel) {
- int i, j = 0, tmp;
- char c;
- if (vel >= 1000) vel = 999;
- FILE *datoteka;
- datoteka = fopen("adresar.txt", "w");
- if (!datoteka) {
- printf("Greska pri otvaranju datoteke adresar.txt\n");
- return;
- }
- for (i = 0; i < vel; i++) {
- while (niz[i].ime[j] != '\0') {
- c = niz[i].ime[j];
- fputc(c, datoteka);
- j++;
- }
- if (j < 30) {
- tmp = 30 - j; // tmp sluzi da popunimo razmake poslije imena i prezimena
- for (j = 0; j < tmp; j++) {
- fputc(' ', datoteka);
- }
- }
- j = 0;
- while (niz[i].prezime[j] != '\0') {
- c = niz[i].prezime[j];
- fputc(c, datoteka);
- j++;
- }
- if (j < 30) {
- tmp = 30 - j;
- for (j = 0; j < tmp; j++) {
- fputc(' ', datoteka);
- }
- }
- fprintf(datoteka, "%-48s%-10s%d\n", niz[i].email, niz[i].odsjek, niz[i].godina_studija);
- if (ferror(datoteka)) {
- printf("Zapis u datoteku nije uspio - prekidam rad.\n");
- fclose(datoteka);
- return;
- }
- j = 0;
- }
- fclose(datoteka);
- }
- void odredi_adresu(Adresa *studenti, int vel, Adresa *student) {
- char adresa[48] = {"@etf.unsa.ba"};
- char imePrezime[61], broj[5];
- char *pokNaIme = imePrezime, *pokNaBroj, *pokNaAdresu, *adresaPoc = adresa, *adresaAt;
- int i, brojac = 1, prosiriZa, brojCifara;
- strcpy(imePrezime, student->ime);
- while (*pokNaIme != '\0' && *pokNaIme >= 'A' && *pokNaIme <= 'Z') pokNaIme++;
- *pokNaIme = '\0';
- strcat(imePrezime, student->prezime);
- pokNaIme = imePrezime;
- while (*pokNaIme != '\0') {
- if (*pokNaIme >= 'A' && *pokNaIme <= 'Z') {
- *pokNaIme += 32;
- }
- pokNaIme++;
- }
- // prosirivanje stringa adresa
- prosiriZa = strlen(imePrezime);
- pokNaAdresu = adresa;
- pokNaIme = imePrezime;
- while (*pokNaAdresu != '\0') pokNaAdresu++;
- while (pokNaAdresu > adresaPoc) {
- *(pokNaAdresu + prosiriZa) = *pokNaAdresu;
- pokNaAdresu--;
- }
- *(pokNaAdresu + prosiriZa) = *pokNaAdresu;
- while (*pokNaIme != '\0') *pokNaAdresu++ = *pokNaIme++;
- // generisanje broja i ubacivanje u string
- for (i = 0; i < vel; i++) {
- if (!strncmp(studenti[i].email, imePrezime, strlen(imePrezime))) {
- brojac++;
- }
- }
- pokNaAdresu = adresa;
- pokNaBroj = intUString(broj, brojac);
- brojCifara = strlen(broj);
- while (*pokNaAdresu != '\0' && *pokNaAdresu != '@') pokNaAdresu++;
- pokNaAdresu -= brojCifara;
- adresaAt = pokNaAdresu;
- while (*pokNaAdresu != '\0') pokNaAdresu++;
- while (pokNaAdresu > adresaAt) {
- *(pokNaAdresu + brojCifara) = *pokNaAdresu;
- pokNaAdresu--;
- }
- *(pokNaAdresu + brojCifara) = *pokNaAdresu;
- pokNaAdresu++;
- while (*pokNaBroj != '\0') *pokNaAdresu++ = *pokNaBroj++;
- strcpy(student->email, adresaPoc);
- }
- void ispis(Adresa *studenti, int vel, int godStudija, char *korOdsjek) {
- int i, ima = 0, red = 1;
- for (i = 0; i < vel; i++) {
- if (!strcmp(korOdsjek, studenti[i].odsjek) && godStudija == studenti[i].godina_studija) {
- printf("%d. %s %s (%s%d) - %s\n", red, studenti[i].prezime, studenti[i].ime, studenti[i].odsjek, studenti[i].godina_studija, studenti[i].email);
- red++;
- ima = 1;
- }
- }
- if (!ima) {
- printf("Nije pronadjen nijedan student.\n");
- }
- }
- int obrisi_adresu(Adresa *studenti, int vel, const char *adresa) {
- int i, j, izvrseno = 0;
- for (i = 0; i < vel; i++) {
- if (!strcmp(studenti[i].email, adresa)) {
- for (j = i; j < vel - 1; j++) {
- studenti[j] = studenti[j + 1];
- }
- vel--;
- izvrseno = 1;
- break;
- }
- }
- if (!izvrseno) {
- return 0;
- } else {
- return 1;
- }
- }
- int ucitaj(Adresa *studenti) {
- FILE *ulaz;
- long pos;
- int i = 0, j = 0, izvrseno = 0;
- char c = 'a', tmp;
- ulaz = fopen("adresar.txt", "r");
- if (!ulaz) {
- printf("Greska pri otvaranju datoteke adresar.txt.\n");
- return 0;
- }
- while (i < MAX_STD && c != EOF) {
- while (j < 30 && c != EOF) {
- c = fgetc(ulaz);
- studenti[i].ime[j] = c;
- j++;
- tmp = fgetc(ulaz);
- if (c == ' ' && tmp == ' ') break;
- studenti[i].ime[j] = tmp;
- j++;
- }
- studenti[i].ime[j] = '\0';
- // ako ime ima vise od 30 slova preskacemo ostalo
- if (j >= 30 ) {
- while (c < 'A' || c > 'Z') {
- c = fgetc(ulaz);
- }
- }
- // ukoliko pokupimo razmake u string ime nakon posljednjeg slova brisemo ih
- j--;
- if (studenti[i].ime[j] == ' ') {
- while (studenti[i].ime[j] == ' ') j--;
- j++;
- studenti[i].ime[j] = '\0';
- }
- j = 0;
- // preskacemo sve razmake izmedju imena i prezimena
- while (c == ' ') {
- c = fgetc(ulaz);
- }
- studenti[i].prezime[j] = c;
- j++;
- while (j < 30 && c != EOF) {
- c = fgetc(ulaz);
- studenti[i].prezime[j] = c;
- j++;
- tmp = fgetc(ulaz);
- if (c == ' ' && tmp == ' ') break;
- studenti[i].prezime[j] = tmp;
- j++;
- }
- studenti[i].prezime[j] = '\0';
- // ako prezime ima vise od 30 slova preskacemo ostalo
- pos = ftell(ulaz);
- pos--;
- if (j >= 30 ) {
- while (c != '\n') {
- c = fgetc(ulaz);
- }
- fseek(ulaz, pos, SEEK_SET);
- }
- // ukoliko pokupimo razmake u string prezime nakon posljednjeg slova brisemo ih
- j--;
- if (studenti[i].prezime[j] == ' ') {
- while (studenti[i].prezime[j] == ' ') j--;
- j++;
- studenti[i].prezime[j] = '\0';
- }
- j = 0;
- //preskacemo razmake izmedju prezimena i email adrese
- while (c == ' ') {
- c = fgetc(ulaz);
- izvrseno = 1;
- }
- if (izvrseno) {
- pos = ftell(ulaz);
- pos--;
- fseek(ulaz, pos, SEEK_SET);
- }
- fscanf(ulaz, "%48s%10s%d", studenti[i].email, studenti[i].odsjek, &studenti[i].godina_studija);
- /* treba provjeriti da li je email adresa ispravna
- */
- c = fgetc(ulaz);
- if (c == '\n') {
- c = fgetc(ulaz);
- pos = ftell(ulaz);
- pos--;
- fseek(ulaz, pos, SEEK_SET);
- }
- i++;
- }
- fclose(ulaz);
- return i;
- }
- int pretraga(Adresa *studenti, int velicina, const char *tekst) {
- int i, index, red = 1;
- for (i = 0; i < velicina; i++) {
- if (podstring(studenti[i].ime, tekst) || podstring(studenti[i].prezime, tekst)) {
- index = i;
- break;
- }
- }
- if (i != velicina) {
- printf("Pronadjeni su sljedeci studenti:\n");
- for (i = 0; i < velicina; i++) {
- if (podstring(studenti[i].ime, tekst) || podstring(studenti[i].prezime, tekst)) {
- printf("%d. %s %s (%s%d) - %s\n", red, studenti[i].prezime, studenti[i].ime, studenti[i].odsjek, studenti[i].godina_studija, studenti[i].email);
- red++;
- }
- }
- return index;
- } else {
- return -1;
- }
- }
- int podstring(const char *prvi, const char *drugi) {
- // kopiramo u pomocni string zbog velikih slova
- char imePrezime[30];
- char *pokNaIme = imePrezime;
- const char *cpy1, *cpy2;
- strcpy(imePrezime, prvi);
- while (*pokNaIme != '\0') {
- if (*pokNaIme >= 'A' && *pokNaIme <= 'Z') {
- *pokNaIme += 32;
- }
- cpy1 = pokNaIme;
- cpy2 = drugi;
- while (*cpy1++ == *cpy2++) {
- if (*cpy2 == '\0') {
- return 1;
- }
- }
- pokNaIme++;
- }
- return 0;
- }
- char *intUString(char *s, int broj) {
- char *poc = s;
- int tmp = broj;
- do {
- tmp /= 10;
- s++;
- } while (tmp != 0);
- *s-- = '\0';
- do {
- *s-- = broj % 10 + '0';
- broj /= 10;
- } while (broj != 0);
- return poc;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement