Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /**
  6. 3. (25p) Napisati program koji učitava podatke o broju rođenih beba, dečaka i devojčica po
  7. mesecima u jednom gradu i smešta ih u listu. podaci se u fajlu nalaze u obliku: mesec godina broj
  8. rođenih dečaka i broj rođenih devojčica, svi podaci su razdvojeni spejsom. Primer: 2 2018 120 150 (u
  9. februaru 2018. rođeno je 120 dečaka i 150 devojčica).
  10. Napraviti meni sa interakciju preko konzole sa slededim opcijama.
  11. a) (7p) učitavanje podataka, unosi se naziv fajla koji sadrži opisane podatke i učitava se u listu
  12. uređenu nerastuce po godini i mesecu,
  13. b) (8p) ispis broja meseci u kome je rođeno više od određenog broja dece, unosi se broj i treba
  14. ispisati koliko ima meseci u kojima je ukupan broj rođenih vedi od unetog broja, ovu funkcionalnost
  15. je potrebno implementirati na dva načina, iterativno i rekurzivno,
  16. c) (10p) ispis broja rođenih dečaka i devojčica u jednoj godini sortirano po ukupnom broju rođenih,
  17. posmatra se broj rođenih u jednoj godini i ispisuje se broj rođenih dečaka, broj rođenih devojčica i
  18. godina sortirano po ukupnom broju rođenih u godini (dozvoljeno je praviti nove strukture podataka).
  19. */
  20.  
  21. typedef struct Beba Beba;
  22.  
  23. struct Beba {
  24.     int mesec, godina, brm, brz;
  25.     Beba *sl;
  26. };
  27.  
  28. char buffer[1000];  // privremeni spremnik za citanje sa standardnog ulaza
  29.  
  30. int meni() {
  31.     int op = 0;
  32.     printf("Meni: \n");
  33.     printf("1: Ucitavanje podataka\n");
  34.     printf("2: Ispis broja meseci limitirano\n");
  35.     printf("3: Ispis broja rodjenih sortirano\n");
  36.     printf("4: Izlaz\n");
  37.  
  38.     while(op < 1 || op > 4) {
  39.         printf("Unesite opciju: ");
  40.         gets(buffer);
  41.         op = atoi(buffer);
  42.     }
  43.  
  44.     return op;
  45. }
  46.  
  47. Beba *napravi(int mesec, int godina, int brm, int brz) {
  48.     Beba *t = calloc(1, sizeof *t);
  49.     t->mesec = mesec;
  50.     t->godina = godina;
  51.     t->brm = brm;
  52.     t->brz = brz;
  53.     return t;
  54. }
  55.  
  56. Beba *ucitavanje() {
  57.     FILE *f;
  58.     printf("Unesite naziv datoteke: ");
  59.     gets(buffer);
  60.     f = fopen(buffer, "r");
  61.  
  62.     // Ako je f NULL, ne mozemo da citamo
  63.     if(!f) {
  64.         printf("Datoteka sa unetim nazivom ne moze biti otvorena za citanje.\n");
  65.         return NULL;
  66.     }
  67.     else {
  68.         Beba *l = NULL;  // pocetak liste
  69.         int m, g, brm, brz;  // mesec, godina, broj muske i broj zenske dece
  70.  
  71.         while(fscanf(f, "%d%d%d%d", &m, &g, &brm, &brz) == 4) {
  72.             Beba *n = napravi(m, g, brm, brz);
  73.             // Ako je lista prazna, dodajemo novi element na pocetak
  74.             if(!l) {
  75.                 l = n;
  76.             }
  77.             else {
  78.                 // Provera da li treba da se doda na pocetak (po godini i mesecu)
  79.                 if(l->godina < n->godina || (l->godina == n->godina && l->mesec < n->mesec)) {
  80.                     n->sl = l;
  81.                     l = n;
  82.                 }
  83.                 else {
  84.                     // Ako ne treba na pocetak, onda treba da se doda dublje u listu
  85.                     Beba *tmp = l;
  86.                     // Trazimo odgovarajuce mesto
  87.                     while(tmp->sl && (tmp->sl->godina > n->godina ||
  88.                                       (tmp->sl->godina == n->godina && tmp->sl->mesec > n->mesec))) {
  89.                         tmp = tmp->sl;
  90.                     }
  91.                     // Dodajemo n tako da bude tmp->n->sl
  92.                     n->sl = tmp->sl;
  93.                     tmp->sl = n;
  94.                 }
  95.             }
  96.         }
  97.         // Obavezno zatvoriti datoteku!
  98.         fclose(f);
  99.         return l;
  100.     }
  101. }
  102. // Vraca ukupan broj meseci iterativno
  103. int broj_meseci_it(Beba *l, int d) {
  104.     Beba *t = l;
  105.     int ukupno = 0;
  106.  
  107.     while(t) {
  108.         if(t->brm + t->brz > d) {
  109.             ukupno ++;
  110.         }
  111.  
  112.         t = t->sl;
  113.     }
  114.  
  115.     return ukupno;
  116. }
  117. // Vraca ukupan broj meseci rekurzivno
  118. int broj_meseci_rek(Beba *l, int d) {
  119.     if(!l) return 0;
  120.     // Ovaj skraceni zapis znaci: izracunaj broj meseci u ostatku liste i dodaj:
  121.                             // - Ako je granicni uslov ispunjen: 1
  122.                             // - Ako granicni uslov nije ispunjen: 0
  123.     return broj_meseci_rek(l->sl, d) + (l->brm + l->brz > d ? 1 : 0);
  124. }
  125.  
  126. // Pomocna funkcija koja poziva i broj_meseci_it i broj_meseci_rek u jednom
  127. void broj_meseci(Beba *l) {
  128.     int d;
  129.     printf("Unesite najmanji broj dece za pretragu: ");
  130.     gets(buffer);
  131.     d = atoi(buffer);
  132.     printf("Broj meseci sa vise od %d rodjene dece (it): %d\n", d, broj_meseci_it(l, d));
  133.     printf("Broj meseci sa vise od %d rodjene dece (rek): %d\n", d, broj_meseci_rek(l, d));
  134. }
  135.  
  136. void sortirano(Beba *l) {
  137.     // Za novu pomocnu listu l2 mozemo koristiti istu strukturu podataka, samo zanemariti mesec
  138.     Beba *l2 = NULL, *tmp;
  139.  
  140.     // za svaki unos
  141.     for(tmp = l; tmp; tmp = tmp->sl)
  142.     {
  143.         int postoji = 0;
  144.  
  145.         // Vidi da li unos sa tom godinom vec postoji u l2, ako postoji preskoci
  146.         for(Beba *tmp2 = l2; !postoji && tmp2; tmp2 = tmp2->sl)
  147.         {
  148.             if(tmp->godina == tmp2->godina) {
  149.                 postoji = 1;
  150.             }
  151.         }
  152.  
  153.         if(!postoji) {
  154.             // Ako ne postoji, prebroj ukupan broj unosa za tu godinu u celoj listi l i dodaj u l2
  155.             // um i uz su privremeni brojaci za ukupan broj muske i zenske dece u toj godini
  156.             int um = 0, uz = 0;
  157.  
  158.             // Dovoljno je da proveravamo od tmp, jer u svim prethodnim elementima liste l se nije pojavila ta godina
  159.             for(Beba *tmp2 = tmp; tmp2; tmp2 = tmp2->sl) {
  160.                 if(tmp2->godina == tmp->godina) {
  161.                     um += tmp2->brm;3
  162.                     uz += tmp2->brz;
  163.                 }
  164.             }
  165.  
  166.             // Napravi cvor i umetni ga u listu, po slicnom principu kao u unosu
  167.             Beba *n = napravi(0, tmp->godina, um, uz);
  168.  
  169.             if(!l2) {
  170.                 l2 = n;
  171.             }
  172.             else {
  173.                 if(l2->brm + l2->brz > n->brm + n->brz) {
  174.                     n->sl = l2;
  175.                     l2 = n;
  176.                 }
  177.                 else {
  178.                     Beba *tmp2 = l2;
  179.  
  180.                     while(tmp2->sl && tmp2->sl->brm + tmp2->sl->brz < n->brm + n->brz) {
  181.                         tmp2 = tmp2->sl;
  182.                     }
  183.  
  184.                     n->sl = tmp2->sl;
  185.                     tmp2->sl = n;
  186.                 }
  187.             }
  188.         }
  189.     }
  190.  
  191.     // Odmah ispisujemo listu l2 i ujedno je brisemo
  192.     tmp = l2;
  193.  
  194.     while(tmp) {
  195.         printf("Godina %d. decaka: %d, devojcica: %d\n", tmp->godina, tmp->brm, tmp->brz);
  196.         tmp = tmp->sl;
  197.         free(l2);
  198.         l2 = tmp;
  199.     }
  200. }
  201.  
  202. int main() {
  203.     int op = meni();
  204.     Beba *l = 0;
  205.  
  206.     while(1) {
  207.         switch(op) {
  208.             case 1: {
  209.                     // U normalnim okolnostima bismo prvo obrisali listu
  210.                     // mada se to nije trazilo na ispitu (i nije uradjeno ovde)!
  211.                     l = ucitavanje();
  212.                     break;
  213.                 }
  214.  
  215.             case 2: {
  216.                     broj_meseci(l);
  217.                     break;
  218.                 }
  219.  
  220.             case 3: {
  221.                     sortirano(l);
  222.                     break;
  223.                 }
  224.  
  225.             case 4: {
  226.                     Beba *tmp = l;
  227.                     // Ispis (provera ucitavanja) i brisanje liste
  228.                     while(tmp) {
  229.                         printf("%d.%d. decaka: %d, devojcica: %d\n", tmp->mesec, tmp->godina, tmp->brm, tmp->brz);
  230.                         l = tmp->sl;
  231.                         free(tmp);
  232.                         tmp = l;
  233.                     }
  234.  
  235.                     return 0;
  236.                 }
  237.         }
  238.         op = meni();
  239.     }
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement