Pita sa sirom

Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>

Napisati program koji izračunava iznose sirovina pekari koja je specijalizovana za pravljenje pita sa sirom. Iz ulazne datoteke učitati sledeće podatke u statički niz struktura, gde se struktura sastoji iz sledećih polja:

  • naziv_sirovine (jedna reč, do 30 karaktera)

  • limit_za_velikoprodaju (neoznačena, celobrojna vrednost)

  • maloprodajna_cena (realan broj)

  • velikoprodajna_cena (realan broj)

Za pravljenje jednog kilograma pite sa sirom neophodno je:

  • 0,6kg brašna

  • 0,4kg sira

  • 0,1l ulja

  • 0,02kg soli

Program prima ime ulazne i izlazne datoteke, kao i broj kilograma pite koju je potrebno napraviti kao neoznačenu, celobrojnu vrednost. U izlaznu datoteku za svaku sirovinu ispisati naziv, potrebnu količinu u kilogramima izračunatu na osnovu udela i cenu. Prilikom upisa u izlaznu datoteku, koristiti format ispisa %6s %5.2lf %8.2lf. Ukoliko je potrebna količina sirovine za zadatu kilažu pite manja od limita za velikoprodaju, cena sirovine računa se po maloprodajnoj ceni. U slučaju da je potrebna količina veća ili jednaka limitu za velikoprodaju, cena sirovine računa se po velikoprodajnoj ceni.

U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0 (EXIT_SUCCESS). Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:

  • U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa sa status kodom 1 (EXIT_FAILURE)

  • Ako program ne može da otvori ulazni fajl, izaći sa status kodom 2

  • Ako program ne može da otvori izlazni fajl, izaći sa status kodom 3

Primer poziva programa:

./pekara sirovine.txt cene.txt 120

Primer ulazne datoteke sirovine.txt:

brasno 100  69.99  66.99
sir     60 527.99 473.99
ulje    30 205.00 192.00
so      10  41.99  38.99

Primer izlazne datoteke cene.txt:

brasno 72.00  5039.28
   sir 48.00 25343.52
  ulje 12.00  2460.00
    so  2.40   100.78

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_NIZ 30
  6
  7#define MAX_SIROVINA 31
  8
  9typedef struct sirovine_st {
 10    char naziv_sirovine[MAX_SIROVINA];
 11    unsigned limit_za_velikoprodaju;
 12    double maloprodajna_cena;
 13    double velikoprodajna_cena;
 14} SIROVINE;
 15
 16FILE *safe_fopen(char *naziv, char *rezim, int kod_greske);
 17void ucitaj_sirovine(FILE *pulazna, SIROVINE *sirovine, int *pn);
 18void ispisi_cene(FILE *pizlazna, SIROVINE *sirovine, int n, unsigned kolicina);
 19double izracunaj_kolicinu_sirovine(char *naziv_sirovine, unsigned kolicina);
 20double izracunaj_cenu(double kolicina_sirovine, unsigned limit_za_velikoprodaju,
 21                      double maloprodajna_cena, double velikoprodajna_cena);
 22
 23int main(int argc, char **argv) {
 24    SIROVINE sirovine[MAX_NIZ];
 25    int n;
 26    FILE *pulazna, *pizlazna;
 27
 28    if(argc != 4) {
 29        printf("Primer poziva programa: %s sirovine.txt cene.txt 120\n", argv[0]);
 30        exit(EXIT_FAILURE);
 31    }
 32
 33    pulazna = safe_fopen(argv[1], "r", 2);
 34    ucitaj_sirovine(pulazna, sirovine, &n);
 35    fclose(pulazna);
 36
 37    pizlazna = safe_fopen(argv[2], "w", 3);
 38    unsigned kolicina = atoi(argv[3]);
 39    ispisi_cene(pizlazna, sirovine, n, kolicina);
 40    fclose(pizlazna);
 41
 42    return EXIT_SUCCESS;
 43}
 44
 45FILE *safe_fopen(char *naziv, char *rezim, int kod_greske) {
 46    FILE *fp = fopen(naziv, rezim);
 47
 48    if(fp == NULL) {
 49        printf("Datoteka %s nije uspesno otvorena!\n", naziv);
 50        exit(kod_greske);
 51    }
 52
 53    return fp;
 54}
 55
 56void ucitaj_sirovine(FILE *pulazna, SIROVINE *sirovine, int *pn) {
 57    int i = 0;
 58
 59    while(fscanf(pulazna, "%s %u %lf %lf",
 60                 sirovine[i].naziv_sirovine,
 61                 &sirovine[i].limit_za_velikoprodaju,
 62                 &sirovine[i].maloprodajna_cena,
 63                 &sirovine[i].velikoprodajna_cena) != EOF) {
 64        i++;
 65    }
 66
 67    *pn = i;
 68}
 69
 70void ispisi_cene(FILE *pizlazna, SIROVINE *sirovine, int n, unsigned kolicina) {
 71    int i;
 72    double kolicina_sirovine, cena_sirovine;
 73
 74    for(i = 0;i < n;i++) {
 75        kolicina_sirovine = izracunaj_kolicinu_sirovine(
 76                                sirovine[i].naziv_sirovine,
 77                                kolicina
 78                            );
 79        cena_sirovine = izracunaj_cenu(
 80                            kolicina_sirovine,
 81                            sirovine[i].limit_za_velikoprodaju,
 82                            sirovine[i].maloprodajna_cena,
 83                            sirovine[i].velikoprodajna_cena
 84                        );
 85        fprintf(pizlazna, "%6s %5.2lf %8.2lf\n", sirovine[i].naziv_sirovine, kolicina_sirovine, cena_sirovine);
 86    }
 87}
 88
 89double izracunaj_kolicinu_sirovine(char *naziv_sirovine, unsigned kolicina) {
 90    double udeo_sirovine;
 91
 92    if(strcmp(naziv_sirovine, "brasno") == 0) {
 93        udeo_sirovine = 0.6;
 94    } else if(strcmp(naziv_sirovine, "sir") == 0) {
 95        udeo_sirovine = 0.4;
 96    } else if(strcmp(naziv_sirovine, "ulje") == 0) {
 97        udeo_sirovine = 0.1;
 98    } else if(strcmp(naziv_sirovine, "so") == 0) {
 99        udeo_sirovine = 0.02;
100    } else {
101        udeo_sirovine = 0;      // Nepoznata sirovina se nece ubrajati u proracun
102    }
103
104    return udeo_sirovine * kolicina;
105}
106
107double izracunaj_cenu(double kolicina_sirovine, unsigned limit_za_velikoprodaju,
108                      double maloprodajna_cena, double velikoprodajna_cena) {
109
110    double izabrana_cena = kolicina_sirovine < limit_za_velikoprodaju ? maloprodajna_cena : velikoprodajna_cena;
111    return kolicina_sirovine * izabrana_cena;
112}
113