Advertisement
MartinSRB

Домаћи

Jan 10th, 2022 (edited)
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define EXIT_NO_MEMORY   2
  6. #define EXIT_NO_IN_FILE  3
  7. #define EXIT_NO_OUT_FILE 4
  8.  
  9. #define MAX_NAME         (20 + 1)
  10. #define MAX_SURNAME      (30 + 1)
  11.  
  12. typedef struct musterija_st{
  13.     char ime[MAX_NAME];
  14.     char prezime[MAX_SURNAME];
  15.     unsigned int br_artikala;
  16.     double pazar;
  17.     struct musterija_st *left;
  18.     struct musterija_st *right;
  19. }MUSTERIJA;
  20.  
  21. void tree_init(MUSTERIJA**);
  22. void destroy_tree(MUSTERIJA**);
  23. MUSTERIJA* make_musterija(char*,char*,unsigned int,double);
  24. void add_to_tree(MUSTERIJA**,MUSTERIJA*);
  25.  
  26. FILE* safe_open(char*,char*,int);
  27. void load(FILE*,MUSTERIJA**);
  28. void save_fast(FILE*,MUSTERIJA*,double*,int);
  29. void fprint_(FILE*);
  30. void fprint_sum(FILE*,double);
  31. void save(FILE*,MUSTERIJA*,double*,int);
  32.  
  33. int main(int argc, char** argv){
  34.     if(argc != 4){
  35.         printf("Nepravilan poziv programa.\n");
  36.         return EXIT_FAILURE;
  37.     }else{
  38.         MUSTERIJA *koren;
  39.         FILE      *file = safe_open(argv[1],"r",EXIT_NO_IN_FILE);
  40.         double     sum  = 0;
  41.         tree_init(&koren);
  42.         load(file,&koren);
  43.         fclose(file);
  44.         file = safe_open(argv[2],"w",EXIT_NO_OUT_FILE);
  45.         save_fast(file,koren,&sum,atoi(argv[3]));
  46.         fprint_(file);
  47.         fprint_sum(file,sum);
  48.         fprintf(file,"\n\n");
  49.         sum = 0;
  50.         save(file,koren,&sum,atoi(argv[3]));
  51.         fprint_(file);
  52.         fprint_sum(file,sum);
  53.         fclose(file);
  54.         destroy_tree(&koren);
  55.         return EXIT_SUCCESS;
  56.     }
  57. }
  58.  
  59. void tree_init(MUSTERIJA** koren){
  60.     *koren = NULL;
  61.     return;
  62. }
  63.  
  64. void destroy_tree(MUSTERIJA** koren){
  65.     if(*koren != NULL){
  66.         destroy_tree(&(*koren)->left);
  67.         destroy_tree(&(*koren)->right);
  68.         free(*koren);
  69.         *koren = NULL;
  70.     }
  71.     return;
  72. }
  73.  
  74. MUSTERIJA* make_musterija(char* name,char* sname,unsigned int br_art,double pazar){
  75.     MUSTERIJA* new = (MUSTERIJA*)malloc(sizeof(MUSTERIJA));
  76.     if(new == NULL){
  77.         printf("Nema dovoljno memorije.\n");
  78.         exit(EXIT_NO_MEMORY);
  79.     }
  80.     strcpy(new->ime,name);
  81.     strcpy(new->prezime,sname);
  82.     new->br_artikala = br_art;
  83.     new->pazar       = pazar;
  84.     new->left        = NULL;
  85.     new->right       = NULL;
  86.     return new;
  87. }
  88.  
  89. void add_to_tree(MUSTERIJA** koren,MUSTERIJA* new){
  90.     if(*koren == NULL){
  91.         *koren = new;
  92.     }else{
  93.         if((*koren)->br_artikala > new->br_artikala){
  94.             add_to_tree(&(*koren)->left,new);
  95.         }else{
  96.             add_to_tree(&(*koren)->right,new);
  97.         }
  98.     }
  99.     return;
  100. }
  101.  
  102. FILE* safe_open(char* name,char* mode,int err_code){
  103.     FILE* f = fopen(name,mode);
  104.     if(f == NULL){
  105.         printf("Nije moguce ucitati fajl %s.\n",name);
  106.         exit(err_code);
  107.     }
  108.     return f;
  109. }
  110.  
  111. void load(FILE* file,MUSTERIJA** koren){
  112.     char ime[MAX_NAME],
  113.          prezime[MAX_SURNAME];
  114.     unsigned int br_artikala;
  115.     double pazar;
  116.     while(fscanf(file,"%s %s %u %lf",
  117.                                      ime,
  118.                                      prezime,
  119.                                      &br_artikala,
  120.                                      &pazar) != EOF){
  121.         add_to_tree(koren,make_musterija(ime,prezime,br_artikala,pazar));
  122.     }
  123.     return;
  124. }
  125.  
  126. void save_fast(FILE* file,MUSTERIJA* koren,double* sum,int br_art){
  127.     if(koren != NULL){
  128.         save_fast(file,koren->left,sum,br_art);
  129.         if(koren->br_artikala < br_art){
  130.             fprintf(file,"%7.2lf %-9s %s\n",
  131.                                        koren->pazar,
  132.                                        koren->ime,
  133.                                        koren->prezime);
  134.             *sum += koren->pazar;
  135.         }
  136.         save_fast(file,koren->right,sum,br_art);
  137.     }
  138.     return;
  139. }
  140.  
  141. void fprint_(FILE* file){
  142.     int i = 0;
  143.     for(;i < 30; i++){
  144.         fprintf(file,"-");
  145.     }
  146.     fprintf(file,"\n");
  147.     return;
  148. }
  149.  
  150. void fprint_sum(FILE* file,double sum){
  151.     fprintf(file,"%7.2lf",sum);
  152.     return;
  153. }
  154.  
  155. void save(FILE* file,MUSTERIJA* koren,double* sum,int br_art){
  156.     if(koren != NULL){
  157.         save(file,koren->left,sum,br_art);
  158.         if(koren->br_artikala >= br_art){
  159.             fprintf(file,"%7.2lf %-9s %s\n",
  160.                                        koren->pazar,
  161.                                        koren->ime,
  162.                                        koren->prezime);
  163.             *sum += koren->pazar;
  164.         }
  165.         save(file,koren->right,sum,br_art);
  166.     }
  167.     return;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement