Advertisement
Mixilino

listicaIgor

May 26th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.97 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. typedef struct prijava* PPRIJAVA;
  6. typedef struct polozili* PPOLOZILI;
  7.  
  8. typedef struct student {
  9.     char brojIndexa[15];
  10.     char fullName[40];
  11. }STUDENT;
  12. typedef struct predmet {
  13.     int sifraPredmeta;
  14.     char imePredmeta[50];
  15. }PREDMET;
  16. typedef struct prijava {
  17.     char brojIndexa[15];
  18.     int sifraPredmeta;
  19.     int ocena;
  20.     PPRIJAVA sled;
  21. }PRIJAVA;
  22. typedef struct polozili {
  23.     char brojIndexa[15];
  24.     char fullname[50];
  25.     double prosecna;
  26.     int brojPolozenihIspita;
  27.     PPOLOZILI sled;
  28. }POLOZILI;
  29.  
  30. void ubaciNaKraj(PPRIJAVA * glava, PPRIJAVA * rep, char brojIndexa[], int sifra, int ocena, STUDENT xs[], PREDMET xp[], int brojPredmeta, int brojStudenata);
  31. int provera(PPRIJAVA glava, PPRIJAVA rep, char brojIndexa[], int sifra, int ocena, STUDENT xs[], PREDMET xp[], int brojPredmeta, int brojStudenata);
  32. void ispisiPrijave(PPRIJAVA glava);
  33. void ubaciUPolozili(PPOLOZILI * pglava, PPRIJAVA glava, STUDENT xs[], int brojStudenata);
  34. void ispisiPolozili(PPOLOZILI glava);
  35. int brojNoda(PPOLOZILI glava);
  36. void ispisiPoloziliSortirano(PPOLOZILI glava);
  37.  
  38. int main(void) {
  39.     STUDENT xs[] = {
  40.                         { "2016_0001", "Andrej Andric" },
  41.                         { "2016_0002", "Sofija_Sofic" },
  42.                         { "2016_0003", "Jovan Jovic" },
  43.                         { "2016_0004", "Sara Saric" },
  44.                         { "2016_0005", "Milica Milic" }
  45.     };
  46.     PREDMET xp[] = {
  47.                     { 1,"Programiranje 1" },
  48.                     { 2,"Programiranje 2" },
  49.                     { 3,"UIS" },
  50.                     { 4,"Matematika" }
  51.                     };
  52.     int brojPredmeta = sizeof(xp) / sizeof(PREDMET);
  53.     int brojStudenata = sizeof(xs) / sizeof(STUDENT);
  54.     PPRIJAVA glava = NULL;
  55.     PPRIJAVA rep = NULL;
  56.  
  57.  
  58.     ubaciNaKraj(&glava, &rep, "2016_0005", 2, 10, xs, xp, brojPredmeta, brojStudenata);
  59.     ubaciNaKraj(&glava, &rep, "2016_0005", 3, 9, xs, xp, brojPredmeta, brojStudenata);
  60.  
  61.     ubaciNaKraj(&glava, &rep, "2016_0004", 2, 9, xs, xp, brojPredmeta, brojStudenata);
  62.  
  63.     ubaciNaKraj(&glava, &rep, "2016_0003", 2, 8, xs, xp, brojPredmeta, brojStudenata);
  64.     ubaciNaKraj(&glava, &rep, "2016_0003", 3, 9, xs, xp, brojPredmeta, brojStudenata);
  65.     ubaciNaKraj(&glava, &rep, "2016_0003", 1, 10, xs, xp, brojPredmeta, brojStudenata);
  66.  
  67.     ubaciNaKraj(&glava, &rep, "2016_0002", 1, 5, xs, xp, brojPredmeta, brojStudenata);
  68.     ubaciNaKraj(&glava, &rep, "2016_0002", 1, 8, xs, xp, brojPredmeta, brojStudenata);
  69.     ubaciNaKraj(&glava, &rep, "2016_0002", 2, 5, xs, xp, brojPredmeta, brojStudenata);
  70.     ubaciNaKraj(&glava, &rep, "2016_0002", 2, 6, xs, xp, brojPredmeta, brojStudenata);
  71.  
  72.     ubaciNaKraj(&glava, &rep, "2016_0001", 1, 7, xs, xp, brojPredmeta, brojStudenata);
  73.  
  74.     ispisiPrijave(glava);
  75.  
  76.     PPOLOZILI head = NULL;
  77.     ubaciUPolozili(&head, glava, xs, brojStudenata);
  78.     ispisiPolozili(head);
  79.     ispisiPoloziliSortirano(head);
  80.  
  81.     return 0;
  82. }
  83.  
  84. void ubaciNaKraj(PPRIJAVA * glava, PPRIJAVA * rep, char brojIndexa[], int sifra, int ocena, STUDENT xs[], PREDMET xp[], int brojPredmeta, int brojStudenata)
  85. {
  86.     int uslov = 0;
  87.     uslov = provera(*glava, *rep, brojIndexa, sifra, ocena, xs, xp, brojPredmeta, brojStudenata);
  88.     if (uslov) {
  89.         PPRIJAVA nova = malloc(sizeof(PRIJAVA));
  90.         strcpy(nova->brojIndexa, brojIndexa);
  91.         nova->sifraPredmeta = sifra;
  92.         nova->ocena = ocena;
  93.         nova->sled = NULL;
  94.  
  95.         if (*glava == NULL) {
  96.             *glava = nova;
  97.             *rep = nova;
  98.         }
  99.         else {
  100.             (*rep)->sled = nova;
  101.             *rep = nova;
  102.         }
  103.     }
  104. }
  105.  
  106. int provera(PPRIJAVA glava, PPRIJAVA rep, char brojIndexa[], int sifra, int ocena, STUDENT xs[], PREDMET xp[], int brojPredmeta, int brojStudenata)
  107. {
  108.     int uslov = 1;
  109.     int postojiStudent = 0;
  110.     for (int i = 0; i < brojStudenata; i++)
  111.     {
  112.         if (strcmp(brojIndexa, xs[i].brojIndexa) == 0) {
  113.             postojiStudent++;
  114.             break;
  115.         }
  116.     }
  117.     if (!postojiStudent) {
  118.         return 0;
  119.     }
  120.     int postojiPredmet = 0;
  121.     for (int i = 0; i < brojPredmeta; i++)
  122.     {
  123.         if (sifra == xp[i].sifraPredmeta) {
  124.             postojiPredmet++;
  125.             break;
  126.         }
  127.     }
  128.     if (!postojiStudent) {
  129.         return 0;
  130.     }
  131.     int polozio = 1;
  132.     PPRIJAVA curr = glava;
  133.     while (curr != NULL) {
  134.         if (strcmp(curr->brojIndexa, brojIndexa) == 0) {
  135.             if (curr->ocena > 5 && curr->sifraPredmeta == sifra) {
  136.                 polozio = 0;
  137.             }
  138.         }
  139.         curr = curr->sled;
  140.     }
  141.     if (!polozio) {
  142.         return 0;
  143.     }
  144.     return 1;
  145.    
  146.  
  147. }
  148.  
  149. void ispisiPrijave(PPRIJAVA glava)
  150. {
  151.     printf("PRIJAVE:\nBroj prijave\t\tbrojIndexa\tsifraPredmeta\tocena\n");
  152.     PPRIJAVA curr = glava;
  153.     int i = 1;
  154.     while (curr != NULL) {
  155.         printf("%d.\t\t\t %s\t%d\t\t%d\n", i, curr->brojIndexa, curr->sifraPredmeta, curr->ocena);
  156.         i++;
  157.         curr = curr->sled;
  158.     }
  159. }
  160.  
  161. void ubaciUPolozili(PPOLOZILI * pglava, PPRIJAVA glava, STUDENT xs[], int brojStudenata)
  162. {
  163.     PPRIJAVA curr = glava;
  164.     while (curr != NULL) {
  165.         if (curr->ocena == 5) {
  166.             curr = curr->sled;
  167.             continue;
  168.         }
  169.  
  170.         int status = 1;
  171.         PPOLOZILI tren = *pglava;
  172.         while (tren != NULL) {
  173.             if (strcmp(curr->brojIndexa, tren->brojIndexa) == 0) {
  174.                 status = 0;
  175.                 break;
  176.             }
  177.             tren = tren->sled;
  178.         }
  179.  
  180.         if (status == 1) {
  181.             PPOLOZILI novi = malloc(sizeof(POLOZILI));
  182.             strcpy(novi->brojIndexa, curr->brojIndexa);
  183.             novi->brojPolozenihIspita = 1;
  184.             for (int i = 0; i < brojStudenata; i++)
  185.             {
  186.                 if (strcmp(novi->brojIndexa, xs[i].brojIndexa) == 0) {
  187.                     strcpy(novi->fullname, xs[i].fullName);
  188.                 }
  189.             }
  190.             novi->prosecna = (double)curr->ocena;
  191.             novi->sled = *pglava;
  192.             *pglava = novi;
  193.         }
  194.  
  195.         else {
  196.             tren = *pglava;
  197.             while (strcmp(tren->brojIndexa, curr->brojIndexa) != 0) {
  198.                 tren = tren->sled;
  199.             }
  200.             int x = tren->prosecna * tren->brojPolozenihIspita++;
  201.             x += curr->ocena;
  202.             tren->prosecna = (double)x / tren->brojPolozenihIspita;
  203.         }
  204.  
  205.         curr = curr->sled;
  206.     }
  207. }
  208.  
  209. void ispisiPolozili(PPOLOZILI glava)
  210. {
  211.     printf("PRIJAVE:\nBroj prijave\t\tbrojIndexa\tStudent\t\tProsecna ocena\t Broj polozenih\n");
  212.     PPOLOZILI curr = glava;
  213.     int i = 1;
  214.     while (curr != NULL) {
  215.         printf("%d.\t\t\t %s\t%s\t\t%.2lf\t\t%d\n", i, curr->brojIndexa, curr->fullname, curr->prosecna,curr->brojPolozenihIspita);
  216.         i++;
  217.         curr = curr->sled;
  218.     }
  219. }
  220.  
  221. int brojNoda(PPOLOZILI glava)
  222. {
  223.     int i = 0;
  224.     PPOLOZILI curr = glava;
  225.     while (curr != NULL) {
  226.         i++;
  227.         curr = curr->sled;
  228.     }
  229.  
  230.     return i;
  231. }
  232.  
  233. void ispisiPoloziliSortirano(PPOLOZILI glava) {
  234.     POLOZILI niz[10];
  235.     int broj = brojNoda(glava);
  236.     PPOLOZILI curr = glava;
  237.     int i = 0;
  238.     while (curr != NULL) {
  239.         niz[i].prosecna = curr->prosecna;
  240.         niz[i].brojPolozenihIspita = curr->brojPolozenihIspita;
  241.         strcpy(niz[i].brojIndexa, curr->brojIndexa);
  242.         strcpy(niz[i].fullname, curr->fullname);
  243.         curr = curr->sled;
  244.         i++;
  245.     }
  246.    
  247.     for (int c = 0; c <broj - 1; c++)
  248.     {
  249.         for (int d = 0; d < broj - c - 1; d++)
  250.         {
  251.             if (niz[d].prosecna <= niz[d + 1].prosecna)
  252.             {
  253.                 if (niz[d].prosecna == niz[d + 1].prosecna && niz[d].brojPolozenihIspita>niz[d+1].brojPolozenihIspita) {
  254.                     continue;
  255.                 }
  256.                 POLOZILI swap = niz[d];
  257.                 niz[d] = niz[d + 1];
  258.                 niz[d + 1] = swap;
  259.             }
  260.         }
  261.     }
  262.     for (int i = 0; i < broj; i++)
  263.     {
  264.         printf("\n%d.\t\t\t %s\t%s\t\t%.2lf\t\t%d", i, niz[i].brojIndexa, niz[i].fullname, niz[i].prosecna, niz[i].brojPolozenihIspita);
  265.     }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement