Advertisement
Guest User

Zadatak „Ponovo radi bioskop”

a guest
Dec 18th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_NAZIV_GRAD 2+1
  6. #define MAX_NAZIV_BIOSKOP 10+1
  7. #define MAX_NAZIV_FILM 8+1
  8. #define MAX_NAZIV_ZANR 9+1
  9.  
  10. typedef struct projekcija_st {
  11.     char grad[MAX_NAZIV_GRAD];
  12.     char bioskop[MAX_NAZIV_BIOSKOP];
  13.     char film[MAX_NAZIV_FILM];
  14.     char zanr[MAX_NAZIV_ZANR];
  15.     double cena;
  16.     struct projekcija_st *left;
  17.     struct projekcija_st *right;
  18. } PROJEKCIJA;
  19.  
  20. void init_tree(PROJEKCIJA **root) {
  21.     *root = NULL;
  22. }
  23.  
  24. void add_to_tree(PROJEKCIJA *new, PROJEKCIJA **root) {
  25.     if(*root == NULL) { // tree is empty
  26.         *root = new;
  27.     } else if (new->cena <= (*root)->cena) {
  28.         add_to_tree(new, &((*root)->left));
  29.     } else {
  30.         add_to_tree(new, &((*root)->right));
  31.     }
  32. }
  33.  
  34. PROJEKCIJA *create_new_item(char grad[], char bioskop[], char film[],
  35. char zanr[], double cena) {
  36.     PROJEKCIJA *new = (PROJEKCIJA *)malloc(sizeof(PROJEKCIJA));
  37.     if (new == NULL) {
  38.         printf("Not enough RAM!\n");
  39.         exit(21);
  40.     }
  41.  
  42.     strcpy(new->grad, grad);
  43.     strcpy(new->bioskop, bioskop);
  44.     strcpy(new->film, film);
  45.     strcpy(new->zanr, zanr);
  46.     new->cena = cena;
  47.  
  48.     new->left = NULL;
  49.     new->right = NULL;
  50.  
  51.     return new;
  52. }
  53.  
  54. void read_tree_from(FILE *in, PROJEKCIJA **root) {
  55.     char tmp_grad[MAX_NAZIV_GRAD];
  56.     char tmp_bioskop[MAX_NAZIV_BIOSKOP];
  57.     char tmp_film[MAX_NAZIV_FILM];
  58.     char tmp_zanr[MAX_NAZIV_ZANR];
  59.     double tmp_cena;
  60.  
  61.     while(fscanf(
  62.         in, "%s %s %s %s %lf",
  63.          tmp_grad,
  64.          tmp_bioskop,
  65.          tmp_film,
  66.          tmp_zanr,
  67.         &tmp_cena
  68.     ) != EOF) {
  69.         PROJEKCIJA *new = create_new_item(
  70.             tmp_grad, tmp_bioskop, tmp_film, tmp_zanr, tmp_cena
  71.         );
  72.         add_to_tree(new, root);
  73.     }
  74. }
  75.  
  76. void save_item_to(FILE *out, PROJEKCIJA *x) {
  77.     fprintf(
  78.         out, "%2s %-10s %-8s %-9s %6.2f\n",
  79.         x->grad, x->bioskop, x->film, x->zanr, x->cena
  80.     );
  81. }
  82.  
  83. void save_tree_to(FILE *out, PROJEKCIJA *root) {
  84.     if(root != NULL) {
  85.         save_tree_to(out, root->left);
  86.         save_item_to(out, root);
  87.         save_tree_to(out, root->right);
  88.     }
  89. }
  90.  
  91. void destroy_tree(PROJEKCIJA **root) {
  92.     if(*root != NULL) {
  93.         destroy_tree(&((*root)->left));
  94.         destroy_tree(&((*root)->right));
  95.         free(*root);
  96.         *root = NULL;
  97.     }
  98. }
  99.  
  100. FILE *safe_fopen(char *filename, char *mode, int error_code) {
  101.     FILE *fp = fopen(filename, mode);
  102.     if (fp == NULL) {
  103.         printf("Can't open '%s'!\n", filename);
  104.         exit(error_code);
  105.     }
  106.     return fp;
  107. }
  108.  
  109. PROJEKCIJA *get_najpovoljnija_projekcija(PROJEKCIJA *root, char grad[],
  110. char zanr[]) {
  111.     if (root == NULL) { // tree is empty
  112.         return NULL;
  113.     }
  114.  
  115.     PROJEKCIJA *best = NULL;
  116.     if (strcmp(root->grad, grad) == 0 && strcmp(root->zanr, zanr) == 0) {
  117.         // Gledamo samo projekcije koje su OK
  118.         best = root;
  119.     }
  120.  
  121.     PROJEKCIJA *left = get_najpovoljnija_projekcija(root->left, grad, zanr);
  122.     if (left != NULL) {
  123.         // Nadjena OK projekcija u levom podstablu
  124.         if (best == NULL || left->cena < best->cena) {
  125.             // Nadjena povoljnija projekcija, koja je OK
  126.             best = left;
  127.         }
  128.     }
  129.  
  130.     // Posto stablo nije uredjeno po sva 3 kriterijuma, postoji mogucnost da se
  131.     // trazena projekcija nalazi i u desnom podstablu
  132.     PROJEKCIJA *right = get_najpovoljnija_projekcija(root->right, grad, zanr);
  133.     if (right != NULL) {
  134.         // Nadjena OK projekcija u desnom podstablu
  135.         if (best == NULL || right->cena < best->cena) {
  136.             // Nadjena povoljnija projekcija, koja je OK
  137.             best = right;
  138.         }
  139.     }
  140.  
  141.     return best;
  142. }
  143.  
  144. int main(int arg_num, char *args[]) {
  145.     if (arg_num != 5) {
  146.         printf("USAGE: %s GRAD ZANR IN_FILENAME OUT_FILENAME\n", args[0]);
  147.         exit(11);
  148.     }
  149.  
  150.     char *grad = args[1];
  151.     char *zanr = args[2];
  152.     char *in_filename = args[3];
  153.     char *out_filename = args[4];
  154.  
  155.     FILE *in  = safe_fopen(in_filename,  "r", 1);
  156.     FILE *out = safe_fopen(out_filename, "w", 2);
  157.  
  158.     PROJEKCIJA *root;
  159.     init_tree(&root);
  160.  
  161.     read_tree_from(in, &root);
  162.     save_tree_to(out, root);
  163.  
  164.     PROJEKCIJA *best = get_najpovoljnija_projekcija(root, grad, zanr);
  165.     if (best == NULL) {
  166.         fprintf(
  167.             out, "\nNiko ne projektuje %s filmove u %s!\n",
  168.             zanr, grad
  169.         );
  170.     } else {
  171.         fprintf(
  172.             out, "\nNajpovoljnija projekcija za %s filmove u %s je:\n%s %.2f\n",
  173.             zanr, grad, best->film, best->cena
  174.         );
  175.     }
  176.  
  177.     destroy_tree(&root);
  178.  
  179.     fclose(in);
  180.     fclose(out);
  181.  
  182.     return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement