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šna0,4kg
sira0,1l
ulja0,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 poziva programa:
./pekara 120 < sirovine-stdinout.txt
Primer ulazne datoteke sirovine-stdinout.txt
:
4
brasno 100 69.99 66.99
sir 60 527.99 473.99
ulje 30 205.00 192.00
so 10 41.99 38.99
Ispis programa na standardnom izlazu:
Unesite broj sirovina: 1. sirovina: 2. sirovina: 3. sirovina: 4. sirovina:
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
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
16void ucitaj_sirovine(SIROVINE *sirovine, int *pn);
17void ispisi_cene(SIROVINE *sirovine, int n, unsigned kolicina);
18double izracunaj_kolicinu_sirovine(char *naziv_sirovine, unsigned kolicina);
19double izracunaj_cenu(double kolicina_sirovine, unsigned limit_za_velikoprodaju,
20 double maloprodajna_cena, double velikoprodajna_cena);
21
22int main(int argc, char **argv) {
23 SIROVINE sirovine[MAX_NIZ];
24 int n;
25
26 if(argc != 2) {
27 printf("Primer poziva programa: %s 120 < sirovine-stdinout.txt\n", argv[0]);
28 exit(EXIT_FAILURE);
29 }
30
31 ucitaj_sirovine(sirovine, &n);
32
33 printf("\n\n");
34 unsigned kolicina = atoi(argv[1]);
35 ispisi_cene(sirovine, n, kolicina);
36
37 return EXIT_SUCCESS;
38}
39
40void ucitaj_sirovine(SIROVINE *sirovine, int *pn) {
41 int i;
42
43 do
44 {
45 printf("Unesite broj sirovina: ");
46 scanf("%d", pn);
47 } while (*pn <= 0 || *pn > MAX_SIROVINA);
48
49 for (i = 0; i < *pn; i++)
50 {
51 printf("%d. sirovina: ", i + 1);
52
53 scanf("%s %u %lf %lf",
54 sirovine[i].naziv_sirovine,
55 &sirovine[i].limit_za_velikoprodaju,
56 &sirovine[i].maloprodajna_cena,
57 &sirovine[i].velikoprodajna_cena);
58 }
59}
60
61void ispisi_cene(SIROVINE *sirovine, int n, unsigned kolicina) {
62 int i;
63 double kolicina_sirovine, cena_sirovine;
64
65 for(i = 0;i < n;i++) {
66 kolicina_sirovine = izracunaj_kolicinu_sirovine(
67 sirovine[i].naziv_sirovine,
68 kolicina
69 );
70 cena_sirovine = izracunaj_cenu(
71 kolicina_sirovine,
72 sirovine[i].limit_za_velikoprodaju,
73 sirovine[i].maloprodajna_cena,
74 sirovine[i].velikoprodajna_cena
75 );
76 printf("%6s %5.2lf %8.2lf\n", sirovine[i].naziv_sirovine, kolicina_sirovine, cena_sirovine);
77 }
78}
79
80double izracunaj_kolicinu_sirovine(char *naziv_sirovine, unsigned kolicina) {
81 double udeo_sirovine;
82
83 if(strcmp(naziv_sirovine, "brasno") == 0) {
84 udeo_sirovine = 0.6;
85 } else if(strcmp(naziv_sirovine, "sir") == 0) {
86 udeo_sirovine = 0.4;
87 } else if(strcmp(naziv_sirovine, "ulje") == 0) {
88 udeo_sirovine = 0.1;
89 } else if(strcmp(naziv_sirovine, "so") == 0) {
90 udeo_sirovine = 0.02;
91 } else {
92 udeo_sirovine = 0; // Nepoznata sirovina se nece ubrajati u proracun
93 }
94
95 return udeo_sirovine * kolicina;
96}
97
98double izracunaj_cenu(double kolicina_sirovine, unsigned limit_za_velikoprodaju,
99 double maloprodajna_cena, double velikoprodajna_cena) {
100
101 double izabrana_cena = kolicina_sirovine < limit_za_velikoprodaju ? maloprodajna_cena : velikoprodajna_cena;
102 return kolicina_sirovine * izabrana_cena;
103}
104