MartinSRB

Bang for buck

Dec 13th, 2021 (edited)
1,407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_NAZIV (20 + 1)
  6.  
  7. typedef struct vatromet_st{
  8.     char naziv[MAX_NAZIV];
  9.     unsigned int glasnoca;
  10.     unsigned int cena;
  11.     struct vatromet_st *left;
  12.     struct vatromet_st *right;
  13. }VATROMET;
  14.  
  15. void tree_init(VATROMET**);
  16. void delete_tree(VATROMET**);
  17. VATROMET* make_vatromet(char*,unsigned int,unsigned int);
  18. void add_to_tree(VATROMET**,VATROMET*);
  19.  
  20. FILE* safe_open(char*,char*);
  21. void load(FILE*,VATROMET**);
  22. void save(FILE*,VATROMET*,unsigned int,VATROMET**);
  23.  
  24. int main(int argc,char** argv){
  25.     if(argc != 4){
  26.         printf("Nepravilan poziv programa.");
  27.         return EXIT_FAILURE;
  28.     }else{
  29.         VATROMET* koren,
  30.                 * odnos = NULL;
  31.         FILE    * file = safe_open(argv[2],"r");
  32.         tree_init(&koren);
  33.         load(file,&koren);
  34.         fclose(file);
  35.         file = safe_open(argv[3],"w");
  36.         save(file,koren,atoi(argv[1]),&odnos);
  37.         fprintf(file,"\nNajbolji vatromet sa odnosom glasnoce prema ceni od %.2f je:\n%u %s %u",(float)odnos->glasnoca/odnos->cena,odnos->cena,odnos->naziv,odnos->glasnoca);
  38.         fclose(file);
  39.         delete_tree(&koren);
  40.         return EXIT_SUCCESS;
  41.     }
  42. }
  43.  
  44. void tree_init(VATROMET** koren){
  45.     *koren = NULL;
  46. }
  47.  
  48. void delete_tree(VATROMET** koren){
  49.     if(*koren != NULL){
  50.         delete_tree(&(*koren)->left);
  51.         delete_tree(&(*koren)->right);
  52.         free(*koren);
  53.     }
  54. }
  55.  
  56. VATROMET* make_vatromet(char* naziv,unsigned int glasnoca,unsigned int cena){
  57.     VATROMET* new = (VATROMET*)malloc(sizeof(VATROMET));
  58.     if(new == NULL){
  59.         printf("Nije moguce zauzeti memoriju.");
  60.         exit(EXIT_FAILURE);
  61.     }
  62.     strcpy(new->naziv,naziv);
  63.     new->glasnoca = glasnoca;
  64.     new->cena     = cena;
  65.     new->left     = NULL;
  66.     new->right    = NULL;
  67.     return new;
  68. }
  69.  
  70. void add_to_tree(VATROMET** koren,VATROMET* new){
  71.     if(*koren == NULL){
  72.         *koren = new;
  73.     }else{
  74.         if((*koren)->cena > new->cena){
  75.             add_to_tree(&(*koren)->left,new);
  76.         }else{
  77.             add_to_tree(&(*koren)->right,new);
  78.         }
  79.     }
  80.     return;
  81. }
  82.  
  83. FILE* safe_open(char* name,char* mode){
  84.     FILE* f = fopen(name,mode);
  85.     if(f == NULL){
  86.         printf("Nije moguce otvoriti datoteku %s.",name);
  87.         exit(EXIT_FAILURE);
  88.     }
  89.     return f;
  90. }
  91.  
  92. void load(FILE* f,VATROMET** koren){
  93.     char naziv[MAX_NAZIV];
  94.     unsigned int glasnoca,
  95.                  cena;
  96.     while(fscanf(f,"%s %u %u",
  97.                             naziv,
  98.                             &glasnoca,
  99.                             &cena) != EOF){
  100.         add_to_tree(koren,make_vatromet(naziv,glasnoca,cena));
  101.     }
  102.     return;
  103. }
  104.  
  105. void save(FILE* f,VATROMET* koren,unsigned int max_glasnoca,VATROMET** odnos){
  106.     if(koren != NULL){
  107.         save(f,koren->left,max_glasnoca,odnos);
  108.         if(koren->glasnoca <= max_glasnoca){
  109.             fprintf(f,"%u %s %u\n",koren->cena,koren->naziv,koren->glasnoca);
  110.             if(*odnos == NULL){
  111.                 *odnos = koren;
  112.             }else{
  113.                 if( ((*odnos)->glasnoca/(*odnos)->cena) < (koren->glasnoca/koren->cena) ){
  114.                     *odnos = koren;
  115.                 }
  116.             }
  117.         }
  118.         save(f,koren->right,max_glasnoca,odnos);
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment