Advertisement
Guest User

Ispit-strukture podataka

a guest
Sep 4th, 2015
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #define _CRT_SECURE_NO_WARNINGS
  6.  
  7. typedef struct _artikal
  8. {
  9.     char sifra[7];
  10.     char naziv[16];
  11.     float cijena;
  12.     struct _artikal* next;
  13. } artikal;
  14.  
  15. typedef struct _kosarica
  16. {
  17.     char sifra[7];
  18.     float kolicina;
  19.     struct _kosarica* next;
  20. }kosarica;
  21.  
  22. void CreateArtikal(artikal*);
  23. void InsertArtikal(artikal*, char*, char*, float);
  24. void PrintArtikal(artikal*);
  25. void CreateKosarica(kosarica*);
  26. void InsertKosarica(kosarica*, char*, float);
  27. void PrintKosarica(kosarica*);
  28. void Solution(artikal*, kosarica*);
  29.  
  30. int main()
  31. {
  32.  
  33.     artikal A;
  34.     kosarica K;
  35.     A.next = NULL;
  36.     K.next = NULL;
  37.  
  38.     CreateArtikal(&A);
  39.     PrintArtikal(A.next);
  40.     printf("\n\n");
  41.     CreateKosarica(&K);
  42.     PrintKosarica(K.next);
  43.     printf("\n\n");
  44.     Solution(A.next, K.next);
  45. }
  46.  
  47. void CreateArtikal(artikal* A)
  48. {
  49.     FILE* fp;
  50.     char sifra[7];
  51.     char naziv[16];
  52.     float cijena =0;
  53.     errno_t err; //zanemari ovo, ne radi i fopen bez ovoga jer je VS2015
  54.  
  55.     // fp = fopen("artikli.txt", "r") - ODKOMENTIRAJ OVO
  56.  
  57.     if (err= fopen_s(&fp, "artikli.txt","r" ) ) //ti pises samo if(!fp)
  58.     {
  59.         perror("Greska pri otvaranju datoteke!\n");
  60.         return;
  61.     }
  62.  
  63.     else
  64.     {
  65.         while (!feof(fp))
  66.         {
  67.             fscanf_s(fp, "%s %s %f", sifra, 7, naziv,16, &cijena); //citamo sifru, naziv i cijenu iz datoteke
  68.             InsertArtikal(A, sifra, naziv, cijena); //za svaki redak datoteke posebno ulazimo u funkciju za unos
  69.         }
  70.     }
  71.  
  72.     fclose(fp);
  73. }
  74. void InsertArtikal(artikal* A, char* sifra, char* naziv, float cijena)
  75. {
  76.     artikal* noviartikal;
  77.  
  78.     while (A->next) //idemo do kraja liste, umećemo novi element na kraj
  79.     {
  80.         A = A->next;
  81.     }
  82.  
  83.     noviartikal = (artikal*)malloc(sizeof(artikal)); //alokacija memorije
  84.  
  85.     if (!noviartikal)
  86.     {
  87.         perror("Neuspjesna alokacija!\n");
  88.         return;
  89.     }
  90.     else
  91.     {
  92.         strcpy_s(noviartikal->sifra, strlen(sifra)+1 ,sifra); //ako pises strcpy bez _s, izbaci ovo srednje sa strlen, to je ono duljina ka i kod scanf_s
  93.         strcpy_s(noviartikal->naziv, strlen(naziv)+1, naziv);
  94.         noviartikal->cijena = cijena;
  95.         noviartikal->next = NULL;
  96.  
  97.         A->next = noviartikal;
  98.     }
  99. }
  100. void PrintArtikal(artikal* A)
  101. {
  102.     while (A)
  103.     {
  104.         printf("%s\t%s\t%f\n", A->sifra, A->naziv, A->cijena);
  105.         A = A->next;
  106.     }
  107. }
  108.  
  109. void CreateKosarica(kosarica* K)
  110. {
  111.     FILE* fp;
  112.     char sifra[7];
  113.     float kolicina =0;
  114.     errno_t err; //zanemari ovo, ne radi i fopen bez ovoga jer je VS2015
  115.  
  116.     // fp = fopen("kosarica.txt", "r") - ODKOMENTIRAJ OVO
  117.  
  118.     if (err = fopen_s(&fp, "kosarica.txt", "r")) //ti pises samo if(!fp)
  119.     {
  120.         perror("Greska pri otvaranju datoteke!\n");
  121.         return;
  122.     }
  123.  
  124.     else
  125.     {
  126.         while (!feof(fp))
  127.         {
  128.             fscanf_s(fp, "%s %f", sifra, 7, &kolicina); //citamo sifru i kolicinu iz datoteke
  129.             InsertKosarica(K, sifra, kolicina); //za svaki redak datoteke posebno ulazimo u funkciju za unos, tamo cemo provjeravat sta se ponavlja
  130.         }
  131.     }
  132.  
  133.     fclose(fp);
  134. }
  135.  
  136. void InsertKosarica(kosarica* K, char* sifra, float kolicina)
  137. {
  138.     kosarica* novakosarica;
  139.     kosarica *temp; //triba nam neki element s kojim cemo setat po listi da vidimo ponavlja li se neki od elemenata
  140.     temp = K; //postavaljamo temp na pocetak
  141.  
  142.     novakosarica = (kosarica*)malloc(sizeof(kosarica));
  143.  
  144.     if (!novakosarica)
  145.     {
  146.         perror("Greska pri alokaciji memorije!\n");
  147.         return;
  148.     }
  149.     else
  150.     {
  151.         novakosarica->next = NULL;
  152.         strcpy_s(novakosarica->sifra, strlen(sifra) + 1, sifra);
  153.         novakosarica->kolicina = kolicina;
  154.  
  155.         while (temp->next && strcmp(temp->sifra, novakosarica->sifra)) //dok temp nije NULL i dok sifra
  156.         {
  157.             temp = temp->next;
  158.         }
  159.  
  160.         if (!strcmp(temp->sifra, novakosarica->sifra)) // provjera jesmo li iz gornje petlje izašli jer smo pronašli "duplu šifru"
  161.         {
  162.             temp->kolicina = temp->kolicina + novakosarica->kolicina; //ako je sifra novekosarice pronadjena, onda cemo pribrojit tu kolicinu pronadjenoj
  163.  
  164.         }
  165.         else // ode ulazimo ako smo iz while petlje izašli jer smo dosli do kraja liste tj nismo pronasli ponavljajucu sifru. Tad tribamo uvezat taj element jer dotad ne postoji u listi kosarice
  166.         {
  167.             temp->next = novakosarica;
  168.         }
  169.  
  170.     }
  171. }
  172.  
  173. void PrintKosarica (kosarica* K)
  174. {
  175.     while (K)
  176.     {
  177.         printf("%s\t%f\n", K->sifra, K->kolicina);
  178.         K = K->next;
  179.     }
  180. }
  181.  
  182. void Solution(artikal* A, kosarica* K)
  183. {
  184.     artikal* pocetak; // ic cemo za svaki element kosarice prolistat cilu listu artikala. Kad pridjemo na drugi element kosarice, moramo se vratit na pocetak artikala i pocet opet listat. Za to nam sluzi ovaj element- da uvik vratimo artikal na pocetak
  185.     pocetak = A;
  186.     float ukupno = 0; //varijabla koju koristimo za zbrojit sve cijene
  187.     while (K)
  188.     {
  189.         A = pocetak;
  190.         while (A)
  191.         {
  192.             if (!strcmp(A->sifra, K->sifra))
  193.             {
  194.                 printf("%s\t %f\t %f\n", A->naziv, K->kolicina, K->kolicina*A->cijena);
  195.                 ukupno = ukupno + (K->kolicina*A->cijena);
  196.             }
  197.             A = A->next;
  198.         }
  199.         K = K->next;
  200.  
  201.     }
  202.  
  203.     printf("****************************************\n");
  204.     printf("\n\t\tUkupno: %f", ukupno);
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement