Pice¶
Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>
Dat je niz od maksimalno 20 pica. Učitati n pica ako su opisane sledećim podacima:
naziv
(jedna reč, do 30 karaktera)cena
(u dinarima, realna vrednost)precnik
(u cm, celobrojna vrednost)vegetarijanska
(jedna reč, do 2 karaktera, "da" ili "ne")pun_naziv
(više reči, određeno opisom u zadatku)
Ispisati prosečnu cenu pice. Ispisati sve nazive pica veće od površine zadate argumentom komandne linije. Površina pice nalazi se formulom:
Pi proceniti na 2 decimale.
Formirati string od naziva, veličine pice i reči vegetarijanska
ako je pica vegetarijanska. Veličine pice mogu biti:
mala
- ako je prečnik manji od 25srednja
- ako je prečnik između 25 i 40velika
- ako je prečnik veći od 40
Formirano ime upisati u polje pun_naziv
i ispisati ga. Ispisati koliko ima vegetarijanskih pica.
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 nije pronađena pice površine veće od unete argumentom komandne linije, izaći sa status kodom
2
Primer poziva programa:
./a.out 500.00 < pice.txt
Primer ulazne datoteke pice.txt
:
6
Kapricoza 739.99 32 ne
Madjarica 800.00 32 ne
Margarita 350.00 24 da
Mediteran 1529.99 50 ne
Tuna 1350.00 52 ne
Vegetarijana 379.99 24 da
Ispis programa na standardnom izlazu:
Prosecna pica kosta: 858.33 dinara.
Pice koje su vece od unete povrsine: Kapricoza Madjarica Mediteran Tuna
Kapricoza srednja
Madjarica srednja
Margarita mala vegetarijanska
Mediteran velika
Tuna velika
Vegetarijana mala vegetarijanska
Ima 2 vegetarijanskih pica u ponudi.
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_PICA 20
6#define MAX_NAZIV 31
7#define MAX_VEGE 3
8#define MAX_SREDJEN_NAZIV 54
9
10
11typedef struct pica_st {
12 char naziv[MAX_NAZIV];
13 double cena;
14 int precnik;
15 char vege[MAX_VEGE];
16 char pun_naziv[MAX_SREDJEN_NAZIV];
17} PICA;
18
19void ucitaj_pice(PICA *, int *);
20double suma_cena(PICA *, int);
21double prosek_cena(PICA *, int);
22void ispisi_vece(PICA *, int, double);
23int sredjeni_nazivi(PICA *, int);
24
25int main(int argc, char **argv) {
26
27 PICA pice[MAX_PICA];
28 int n, i;
29
30 if(argc != 2) {
31 printf("Primer poziva: %s 500.00\n", argv[0]);
32 exit(1);
33 }
34
35 ucitaj_pice(pice, &n);
36 double prosek = prosek_cena(pice, n);
37 printf("Prosecna pica kosta: %.2lf dinara.\n", prosek);
38
39 double trazena_povrsina = atof(argv[1]);
40 ispisi_vece(pice, n, trazena_povrsina);
41
42 int br_veg = sredjeni_nazivi(pice, n);
43 printf("\n");
44 for(i = 0; i < n; i++) {
45 printf("%s\n", pice[i].pun_naziv);
46 }
47 printf("\nIma %d vegetarijanskih pica u ponudi.\n", br_veg);
48
49 return 0;
50}
51
52void ucitaj_pice(PICA *p, int *pn) {
53
54 int i;
55
56 do {
57 scanf("%d", pn);
58 } while (*pn <= 0 || *pn > MAX_PICA);
59
60 for (i = 0; i < *pn; i++) {
61 scanf("%s %lf %d %s", p[i].naziv, &p[i].cena, &p[i].precnik, p[i].vege);
62 }
63}
64
65double suma_cena(PICA *p, int n) {
66 int i;
67 double suma = 0;
68
69 for(i = 0; i < n; i++) {
70 suma += p[i].cena;
71 }
72
73 return suma;
74}
75
76double prosek_cena(PICA *p, int n) {
77 return suma_cena(p, n) / n;
78}
79
80void ispisi_vece(PICA *p, int n, double povrsina) {
81 int i;
82 int nadjena = 0;
83 printf("Pice koje su vece od unete povrsine: ");
84 for(i = 0; i < n; i++) {
85 float temp = p[i].precnik * p[i].precnik * 3.14 / 4;
86 if(temp > povrsina) {
87 printf("%s ", p[i].naziv);
88 nadjena = 1;
89 }
90 }
91 printf("\n");
92
93 if (nadjena == 0) {
94 printf("Nije pronadjena pica veca od unete povrsine!\n");
95 exit(2);
96 }
97}
98
99int sredjeni_nazivi(PICA *p, int n) {
100 int i, j, br_veg = 0;
101 for(i = 0; i < n; i++) {
102 char naziv[MAX_SREDJEN_NAZIV];
103 strcpy(naziv, p[i].naziv);
104 if (p[i].precnik < 25) {
105 strcat(naziv, " mala");
106 } else if (p[i].precnik <= 40) {
107 strcat(naziv, " srednja");
108 } else {
109 strcat(naziv, " velika");
110 }
111
112 if (strcmp(p[i].vege, "da") == 0) {
113 strcat(naziv, " vegetarijanska");
114 br_veg++;
115 }
116 strcpy(p[i].pun_naziv, naziv);
117 }
118
119 return br_veg;
120}