MartinSRB

Chocolate brownie

Dec 13th, 2021 (edited)
778
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_NAZIV (20 + 1)
  6. #define MAX_PROIZVODJAC (12 + 1)
  7.  
  8. typedef struct brownie_st{
  9.     char naziv[MAX_NAZIV];
  10.     unsigned int kolicina;
  11.     double cena;
  12.     char proizvodjac[MAX_PROIZVODJAC];
  13.     struct brownie_st *right;
  14.     struct brownie_st *left;
  15. }BROWNIE;
  16.  
  17. void tree_init(BROWNIE**);
  18. void delete_tree(BROWNIE**);
  19. BROWNIE* make_brownie(char*,unsigned int,double,char*);
  20. void add_to_tree(BROWNIE**,BROWNIE*);
  21.  
  22. FILE* safe_open(char*,char*);
  23. void load(FILE*,BROWNIE**);
  24. void save(FILE*,BROWNIE*,char*,double*,BROWNIE**);
  25.  
  26. int main(int argc,char** argv){
  27.     if(argc != 4){
  28.         printf("nepravilan poziv programa.");
  29.         return EXIT_FAILURE;
  30.     }else{
  31.         BROWNIE *koren,
  32.                 *max    = NULL;
  33.         FILE    *file = safe_open(argv[1],"r");
  34.         double ukupno = 0;
  35.         tree_init(&koren);
  36.         load(file,&koren);
  37.         fclose(file);
  38.         file = safe_open(argv[2],"w");
  39.         save(file,koren,argv[3],&ukupno,&max);
  40.         fprintf(file,"\nUkupna cena namirnica je %.3lf.",ukupno);
  41.         if(max != NULL){
  42.             fprintf(file,"\nNamirnica sa najvecom gramazom proizvodjaca %s je: %s",argv[3],max->naziv);
  43.         }
  44.         fclose(file);
  45.         delete_tree(&koren);
  46.         return EXIT_SUCCESS;
  47.     }
  48. }
  49.  
  50. void tree_init(BROWNIE** koren){
  51.     *koren = NULL;
  52.     return;
  53. }
  54.  
  55. void delete_tree(BROWNIE** koren){
  56.     if(*koren != NULL){
  57.         delete_tree(&(*koren)->left);
  58.         delete_tree(&(*koren)->right);
  59.         free(*koren);
  60.     }
  61.     return;
  62. }
  63.  
  64. BROWNIE* make_brownie(char* naziv,unsigned int kolicina,double cena,char* proizvodjac){
  65.     BROWNIE* new = (BROWNIE*)malloc(sizeof(BROWNIE));
  66.     if(new == NULL){
  67.         printf("nije moguce zauzeti memoriju.");
  68.         exit(EXIT_FAILURE);
  69.     }
  70.     strcpy(new->naziv,naziv);
  71.     strcpy(new->proizvodjac,proizvodjac);
  72.     new->kolicina = kolicina;
  73.     new->cena = cena;
  74.     new->left = NULL;
  75.     new->right = NULL;
  76.     return new;
  77. }
  78. //s1<s2=<=-1
  79. void add_to_tree(BROWNIE** koren,BROWNIE* new){
  80.     if(*koren == NULL){
  81.         *koren = new;
  82.     }else{
  83.         if(strcmp((*koren)->naziv,new->proizvodjac) > 0){
  84.             add_to_tree(&(*koren)->right,new);
  85.         }else{
  86.             add_to_tree(&(*koren)->left,new);
  87.         }
  88.     }
  89.     return;
  90. }
  91.  
  92. FILE* safe_open(char* name,char* mode){
  93.     FILE* f = fopen(name,mode);
  94.     if(f == NULL){
  95.         printf("nije moguce fajl %s.",name);
  96.         exit(EXIT_FAILURE);
  97.     }
  98.     return f;
  99. }
  100.  
  101. void load(FILE* f,BROWNIE** koren){
  102.     char naziv[MAX_NAZIV],
  103.          proizvodac[MAX_PROIZVODJAC];
  104.     unsigned int kolicina;
  105.     double cena;
  106.     while(fscanf(f,"%s %u %lf %s",
  107.                                 naziv,
  108.                                 &kolicina,
  109.                                 &cena,
  110.                                 proizvodac) != EOF){
  111.         add_to_tree(koren,make_brownie(naziv,kolicina,cena,proizvodac));
  112.     }
  113.     return;
  114. }
  115.  
  116. void save(FILE* f,BROWNIE* koren,char* param,double* ukupno,BROWNIE** max){
  117.     if(koren != NULL){
  118.         save(f,koren->left,param,ukupno,max);
  119.         fprintf(f,"%s %u %.3lf\n",koren->naziv,koren->kolicina,koren->cena*(koren->kolicina/100.));
  120.         *ukupno += koren->cena*(koren->kolicina/100.);
  121.         if(strcmp(koren->proizvodjac,param) == 0){
  122.             if(*max == NULL){
  123.                     *max = koren;
  124.             }else{
  125.                 if((*max)->kolicina < koren->kolicina){
  126.                     *max = koren;
  127.                 }
  128.             }
  129.         }
  130.         save(f,koren->right,param,ukupno,max);
  131.     }
  132.     return;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment