Advertisement
aed1oN

ETF Email adresar

Jan 24th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX_STD 1000
  4.  
  5. struct Adresa {
  6.     char ime[31], prezime[31];
  7.     char email[48], odsjek[10];
  8.     int godina_studija;
  9. };
  10.  
  11. typedef struct Adresa Adresa;
  12.  
  13. // prototipovi funkcija
  14. void meni();
  15. void jedan(Adresa *, int *);
  16. void dva(Adresa *, int );
  17. void tri(Adresa *, int *);
  18. void cetiri(Adresa *, int);
  19. void pet(Adresa *, int);
  20. void unesi(char *, int);
  21. void zapisi(Adresa *, int);
  22. void odredi_adresu(Adresa *, int, Adresa *);
  23. void ispis(Adresa *, int, int, char *);
  24. int obrisi_adresu(Adresa *, int, const char *);
  25. int ucitaj(Adresa *);
  26. int pretraga(Adresa *, int, const char *);
  27. int podstring(const char *, const char *);
  28. char *intUString(char *, int);
  29.  
  30. int main() {
  31.     meni();
  32.     return 0;
  33. }
  34.  
  35. void meni() {
  36.     int opcija, ucitano;
  37.     Adresa studenti[MAX_STD];
  38.     printf("Dobro dosli u ETF Email adresar.\n");
  39.     ucitano = ucitaj(studenti);
  40.     if (ucitano) {
  41.         printf("Datoteka adresar.txt uspjesno ucitana.\n");
  42.     }
  43.     do {
  44.         printf("Izaberite:\n1. dodavanje\n2. promjena\n3. brisanje\n4. pretraga\n");
  45.         printf("5. ispis\n6. kraj rada\n");
  46. greska:     printf("Vas izbor je: ");
  47.             scanf("%d", &opcija);
  48.             switch (opcija) {
  49.                 case 1:
  50.                     jedan(studenti, &ucitano);
  51.                     break;
  52.                 case 2:
  53.                     dva(studenti, ucitano);
  54.                     break;
  55.                 case 3:
  56.                     tri(studenti, &ucitano);
  57.                     break;
  58.                 case 4:
  59.                     cetiri(studenti, ucitano);
  60.                     break;
  61.                 case 5:
  62.                     pet(studenti, ucitano);
  63.                     break;
  64.                 case 6:
  65.                     printf("Kraj rada.\nDovidjenja i vidimo se uskoro!");
  66.                     return;
  67.                 default:
  68.                         printf("Pogresan izbor! Unesite ponovo.\n");
  69.                         goto greska;
  70.             }
  71.     } while (1);
  72. }
  73.  
  74.  
  75. void jedan(Adresa *studenti, int *vel) {
  76.     printf("Unesite ime: ");
  77.     unesi(studenti[*vel].ime, 30);
  78.     printf("Unesite prezime: ");
  79.     unesi(studenti[*vel].prezime, 30);
  80.     do {
  81.         printf("Godina studija: ");
  82.         scanf("%d", &studenti[*vel].godina_studija);
  83.         if (studenti[*vel].godina_studija < 1 || studenti[*vel].godina_studija > 3)
  84.             printf("Neispravna godina studija! Unesite ponovo.\n");
  85.     } while (studenti[*vel].godina_studija < 1 || studenti[*vel].godina_studija > 3);
  86.     do {
  87.         printf("Odsjek: ");
  88.         unesi(studenti[*vel].odsjek, 10);
  89.         if  (strcmp(studenti[*vel].odsjek, "RI") && strcmp(studenti[*vel].odsjek, "AE") &&
  90.              strcmp(studenti[*vel].odsjek, "TK") && strcmp(studenti[*vel].odsjek, "EE"))
  91.                 printf("Nepoznat odsjek! Unesite ponovo.\n");
  92.     } while (strcmp(studenti[*vel].odsjek, "RI") && strcmp(studenti[*vel].odsjek, "AE") &&
  93.              strcmp(studenti[*vel].odsjek, "TK") && strcmp(studenti[*vel].odsjek, "EE"));
  94.     odredi_adresu(studenti, *vel, &studenti[*vel]);
  95.     (*vel)++;
  96.     zapisi(studenti, *vel);
  97.     printf("Dodan student sa email adresom: %s\n", studenti[*vel - 1].email);
  98. }
  99.  
  100. void dva(Adresa *studenti, int vel) {
  101.     int i;
  102.     char mailKor[48];
  103.     printf("Unesite email adresu: ");
  104.     unesi(mailKor, 48);
  105.     for (i = 0; i < vel; i++) {
  106.         if (!strcmp(mailKor, studenti[i].email)) {
  107.             printf("Trenutni podaci su: %s %s %s%d\n", studenti[i].ime, studenti[i].prezime, studenti[i].odsjek, studenti[i].godina_studija);
  108.             printf("Unesite ime: ");
  109.             unesi(studenti[i].ime, 30);
  110.             printf("Unesite prezime: ");
  111.             unesi(studenti[i].prezime, 30);
  112.             do {
  113.                 printf("Godina studija: ");
  114.                 scanf("%d", &studenti[i].godina_studija);
  115.                 if (studenti[i].godina_studija < 1 || studenti[i].godina_studija > 3)
  116.                     printf("Neispravna godina studija! Unesite ponovo.\n");
  117.             } while (studenti[i].godina_studija < 1 || studenti[i].godina_studija > 3);
  118.             do {
  119.                 printf("Odsjek: ");
  120.                 unesi(studenti[i].odsjek, 10);
  121.                 if  (strcmp(studenti[i].odsjek, "RI") && strcmp(studenti[i].odsjek, "AE") &&
  122.                      strcmp(studenti[i].odsjek, "TK") && strcmp(studenti[i].odsjek, "EE"))
  123.                         printf("Nepoznat odsjek! Unesite ponovo.\n");
  124.             } while (strcmp(studenti[i].odsjek, "RI") && strcmp(studenti[i].odsjek, "AE") &&
  125.                      strcmp(studenti[i].odsjek, "TK") && strcmp(studenti[i].odsjek, "EE"));
  126.             break;
  127.         }
  128.     }
  129.     if (i == vel) {
  130.         printf("U adresaru nema studenta sa takvom adresom.\n");
  131.         return;
  132.     }
  133.     zapisi(studenti, vel);
  134.     printf("Izmijenjen student.\n");
  135. }
  136.  
  137. void tri(Adresa *studenti, int *velicina) {
  138.     int obrisano;
  139.     char mailKor[48];
  140.     printf("Unesite email adresu: ");
  141.     unesi(mailKor, 48);
  142.     obrisano = obrisi_adresu(studenti, *velicina, mailKor);
  143.     if (obrisano) {
  144.         printf("Obrisan student.\n");
  145.         (*velicina)--;
  146.         zapisi(studenti, *velicina);
  147.     } else {
  148.         printf("U adresaru nema studenta sa takvom adresom.\n");
  149.     }
  150. }
  151.  
  152. void cetiri(Adresa *studenti, int velicina) {
  153.     char tekst[30], postoji;
  154.     printf("Unesite dio imena ili prezimena: ");
  155.     unesi(tekst, 30);
  156.     postoji = pretraga(studenti, velicina, tekst);
  157.     if (postoji == -1) {
  158.         printf("Nije pronadjen nijedan student.\n");
  159.     }
  160. }
  161.  
  162. void pet(Adresa *studenti, int velicina) {
  163.     char korOdsjek[10];
  164.     int godinaStudija;
  165.     do {
  166.         printf("Godina studija: ");
  167.         scanf("%d", &godinaStudija);
  168.         if (godinaStudija < 1 || godinaStudija > 3)
  169.             printf("Neispravna godina studija! Unesite ponovo.\n");
  170.     } while (godinaStudija < 1 || godinaStudija > 3);
  171.     do {
  172.         printf("Odsjek: ");
  173.         unesi(korOdsjek, 10);
  174.         if  (strcmp(korOdsjek, "RI") && strcmp(korOdsjek, "AE") &&
  175.              strcmp(korOdsjek, "TK") && strcmp(korOdsjek, "EE"))
  176.                 printf("Nepoznat odsjek! Unesite ponovo.\n");
  177.     } while (strcmp(korOdsjek, "RI") && strcmp(korOdsjek, "AE") &&
  178.              strcmp(korOdsjek, "TK") && strcmp(korOdsjek, "EE"));
  179.     ispis(studenti, velicina, godinaStudija, korOdsjek);
  180. }
  181.  
  182. void unesi(char *string, int velicina) {
  183.     int i = 0;
  184.     char c = getchar();
  185.     if (c == '\n') c = getchar();
  186.     while (i < velicina - 1 && c != '\n') {
  187.         string[i] = c;
  188.         i++;
  189.         c = getchar();
  190.     }
  191.     string[i] = '\0';
  192. }
  193.  
  194. void zapisi(Adresa *niz, int vel) {
  195.     int i, j = 0, tmp;
  196.     char c;
  197.     if (vel >= 1000) vel = 999;
  198.     FILE *datoteka;
  199.     datoteka = fopen("adresar.txt", "w");
  200.     if (!datoteka) {
  201.         printf("Greska pri otvaranju datoteke adresar.txt\n");
  202.         return;
  203.     }
  204.     for (i = 0; i < vel; i++) {
  205.         while (niz[i].ime[j] != '\0') {
  206.             c = niz[i].ime[j];
  207.             fputc(c, datoteka);
  208.             j++;
  209.         }
  210.         if (j < 30) {
  211.             tmp = 30 - j; // tmp sluzi da popunimo razmake poslije imena i prezimena
  212.             for (j = 0; j < tmp; j++) {
  213.                 fputc(' ', datoteka);
  214.             }
  215.         }
  216.         j = 0;
  217.         while (niz[i].prezime[j] != '\0') {
  218.             c = niz[i].prezime[j];
  219.             fputc(c, datoteka);
  220.             j++;
  221.         }
  222.         if (j < 30) {
  223.             tmp = 30 - j;
  224.             for (j = 0; j < tmp; j++) {
  225.                 fputc(' ', datoteka);
  226.             }
  227.         }
  228.         fprintf(datoteka, "%-48s%-10s%d\n", niz[i].email, niz[i].odsjek, niz[i].godina_studija);
  229.         if (ferror(datoteka)) {
  230.             printf("Zapis u datoteku nije uspio - prekidam rad.\n");
  231.             fclose(datoteka);
  232.             return;
  233.         }
  234.         j = 0;
  235.     }
  236.     fclose(datoteka);
  237. }
  238.  
  239. void odredi_adresu(Adresa *studenti, int vel, Adresa *student) {
  240.     char adresa[48] = {"@etf.unsa.ba"};
  241.     char imePrezime[61], broj[5];
  242.     char *pokNaIme = imePrezime, *pokNaBroj, *pokNaAdresu, *adresaPoc = adresa, *adresaAt;
  243.     int i, brojac = 1, prosiriZa, brojCifara;
  244.     strcpy(imePrezime, student->ime);
  245.     while (*pokNaIme != '\0' && *pokNaIme >= 'A' && *pokNaIme <= 'Z') pokNaIme++;
  246.     *pokNaIme = '\0';
  247.     strcat(imePrezime, student->prezime);
  248.     pokNaIme = imePrezime;
  249.     while (*pokNaIme != '\0') {
  250.         if (*pokNaIme >= 'A' && *pokNaIme <= 'Z') {
  251.             *pokNaIme += 32;
  252.         }
  253.         pokNaIme++;
  254.     }
  255.     // prosirivanje stringa adresa
  256.     prosiriZa = strlen(imePrezime);
  257.     pokNaAdresu = adresa;
  258.     pokNaIme = imePrezime;
  259.     while (*pokNaAdresu != '\0') pokNaAdresu++;
  260.     while (pokNaAdresu > adresaPoc) {
  261.         *(pokNaAdresu + prosiriZa) = *pokNaAdresu;
  262.         pokNaAdresu--;
  263.     }
  264.     *(pokNaAdresu + prosiriZa) = *pokNaAdresu;
  265.     while (*pokNaIme != '\0') *pokNaAdresu++ = *pokNaIme++;
  266.     // generisanje broja i ubacivanje u string
  267.     for (i = 0; i < vel; i++) {
  268.         if (!strncmp(studenti[i].email, imePrezime, strlen(imePrezime))) {
  269.             brojac++;
  270.         }
  271.     }
  272.     pokNaAdresu = adresa;  
  273.     pokNaBroj = intUString(broj, brojac);
  274.     brojCifara = strlen(broj);
  275.     while (*pokNaAdresu != '\0' && *pokNaAdresu != '@') pokNaAdresu++;
  276.     pokNaAdresu -= brojCifara;
  277.     adresaAt = pokNaAdresu;
  278.     while (*pokNaAdresu != '\0') pokNaAdresu++;
  279.     while (pokNaAdresu > adresaAt) {
  280.         *(pokNaAdresu + brojCifara) = *pokNaAdresu;
  281.         pokNaAdresu--;
  282.     }
  283.     *(pokNaAdresu + brojCifara) = *pokNaAdresu;
  284.     pokNaAdresu++;
  285.     while (*pokNaBroj != '\0') *pokNaAdresu++ = *pokNaBroj++;
  286.     strcpy(student->email, adresaPoc);
  287. }
  288.  
  289. void ispis(Adresa *studenti, int vel, int godStudija, char *korOdsjek) {
  290.     int i, ima = 0, red = 1;
  291.     for (i = 0; i < vel; i++) {
  292.         if (!strcmp(korOdsjek, studenti[i].odsjek) && godStudija == studenti[i].godina_studija) {
  293.             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);
  294.             red++;
  295.             ima = 1;
  296.         }  
  297.     }
  298.     if (!ima) {
  299.         printf("Nije pronadjen nijedan student.\n");
  300.     }
  301. }
  302.  
  303. int obrisi_adresu(Adresa *studenti, int vel, const char *adresa) {
  304.     int i, j, izvrseno = 0;
  305.     for (i = 0; i < vel; i++) {
  306.         if (!strcmp(studenti[i].email, adresa)) {
  307.             for (j = i; j < vel - 1; j++) {
  308.                 studenti[j] = studenti[j + 1];
  309.             }
  310.             vel--;
  311.             izvrseno = 1;
  312.             break;
  313.         }
  314.     }
  315.     if (!izvrseno) {
  316.         return 0;
  317.     } else {
  318.         return 1;
  319.     }
  320. }
  321.  
  322. int ucitaj(Adresa *studenti) {
  323.     FILE *ulaz;
  324.     long pos;
  325.     int i = 0, j = 0, izvrseno = 0;
  326.     char c = 'a', tmp;
  327.     ulaz = fopen("adresar.txt", "r");
  328.     if (!ulaz) {
  329.         printf("Greska pri otvaranju datoteke adresar.txt.\n");
  330.         return 0;
  331.     }
  332.     while (i < MAX_STD && c != EOF) {
  333.         while (j < 30 && c != EOF) {
  334.             c = fgetc(ulaz);
  335.             studenti[i].ime[j] = c;
  336.             j++;
  337.             tmp = fgetc(ulaz);
  338.             if (c == ' ' && tmp == ' ') break;
  339.             studenti[i].ime[j] = tmp;
  340.             j++;
  341.         }
  342.         studenti[i].ime[j] = '\0';
  343.         // ako ime ima vise od 30 slova preskacemo ostalo
  344.         if (j >= 30 ) {
  345.             while (c < 'A' || c > 'Z') {
  346.                 c = fgetc(ulaz);
  347.             }
  348.         }
  349.         // ukoliko pokupimo razmake u string ime nakon posljednjeg slova brisemo ih
  350.         j--;
  351.         if (studenti[i].ime[j] == ' ') {
  352.             while (studenti[i].ime[j] == ' ') j--;
  353.             j++;
  354.             studenti[i].ime[j] = '\0';
  355.         }
  356.         j = 0;
  357.         // preskacemo sve razmake izmedju imena i prezimena
  358.         while (c == ' ') {
  359.             c = fgetc(ulaz);
  360.         }
  361.         studenti[i].prezime[j] = c;
  362.         j++;
  363.         while (j < 30 && c != EOF) {
  364.             c = fgetc(ulaz);
  365.             studenti[i].prezime[j] = c;
  366.             j++;
  367.             tmp = fgetc(ulaz);
  368.             if (c == ' ' && tmp == ' ') break;
  369.             studenti[i].prezime[j] = tmp;
  370.             j++;
  371.         }
  372.         studenti[i].prezime[j] = '\0';
  373.         // ako prezime ima vise od 30 slova preskacemo ostalo
  374.         pos = ftell(ulaz);
  375.         pos--;
  376.         if (j >= 30 ) {
  377.             while (c != '\n') {
  378.                 c = fgetc(ulaz);
  379.             }
  380.             fseek(ulaz, pos, SEEK_SET);
  381.         }
  382.         // ukoliko pokupimo razmake u string prezime nakon posljednjeg slova brisemo ih
  383.         j--;
  384.         if (studenti[i].prezime[j] == ' ') {
  385.             while (studenti[i].prezime[j] == ' ') j--;
  386.             j++;
  387.             studenti[i].prezime[j] = '\0';
  388.         }
  389.         j = 0;
  390.         //preskacemo razmake izmedju prezimena i email adrese
  391.         while (c == ' ') {
  392.             c = fgetc(ulaz);
  393.             izvrseno = 1;
  394.         }
  395.         if (izvrseno) {
  396.             pos = ftell(ulaz);
  397.             pos--;
  398.             fseek(ulaz, pos, SEEK_SET);
  399.         }
  400.         fscanf(ulaz, "%48s%10s%d", studenti[i].email, studenti[i].odsjek, &studenti[i].godina_studija);
  401.         /* treba provjeriti da li je email adresa ispravna
  402.         */
  403.         c = fgetc(ulaz);
  404.         if (c == '\n') {
  405.             c = fgetc(ulaz);
  406.             pos = ftell(ulaz);
  407.             pos--;
  408.             fseek(ulaz, pos, SEEK_SET);
  409.         }
  410.         i++;
  411.     }
  412.     fclose(ulaz);
  413.     return i;
  414. }
  415.  
  416. int pretraga(Adresa *studenti, int velicina, const char *tekst) {
  417.     int i, index, red = 1;
  418.     for (i = 0; i < velicina; i++) {
  419.         if (podstring(studenti[i].ime, tekst) || podstring(studenti[i].prezime, tekst)) {
  420.             index = i;
  421.             break;
  422.         }
  423.     }
  424.     if (i != velicina) {
  425.         printf("Pronadjeni su sljedeci studenti:\n");
  426.         for (i = 0; i < velicina; i++) {
  427.             if (podstring(studenti[i].ime, tekst) || podstring(studenti[i].prezime, tekst)) {
  428.                 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);
  429.                 red++;
  430.             }
  431.         }
  432.         return index;
  433.     } else {
  434.         return -1;
  435.     }
  436. }
  437.  
  438. int podstring(const char *prvi, const char *drugi) {
  439.     // kopiramo u pomocni string zbog velikih slova    
  440.     char imePrezime[30];
  441.     char *pokNaIme = imePrezime;
  442.     const char *cpy1, *cpy2;
  443.     strcpy(imePrezime, prvi);
  444.     while (*pokNaIme != '\0') {
  445.         if (*pokNaIme >= 'A' && *pokNaIme <= 'Z') {
  446.             *pokNaIme += 32;
  447.         }
  448.         cpy1 = pokNaIme;
  449.         cpy2 = drugi;
  450.         while (*cpy1++ == *cpy2++) {
  451.             if (*cpy2 == '\0') {
  452.                 return 1;
  453.             }
  454.         }
  455.         pokNaIme++;
  456.     }
  457.     return 0;
  458. }
  459.  
  460. char *intUString(char *s, int broj) {
  461.     char *poc = s;
  462.     int tmp = broj;
  463.     do {
  464.         tmp /= 10;
  465.         s++;
  466.     } while (tmp != 0);
  467.     *s-- = '\0';
  468.         do {
  469.         *s-- = broj % 10 + '0';
  470.         broj /= 10;
  471.     } while (broj != 0);
  472.     return poc;
  473. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement