Vina¶
Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>
Dat je niz od maksimalno 30 vina. Učitati n vina ako su vina opisana sledećim podacima:
naziv
(jedna reč, do 30 karaktera)osnovna_cena
(u dinarima, celobrojna vrednost)kolicina
(u litrima, realna vrednost)godiste
(celobrojna vrednost)tip
(jedna reč, do 10 karaktera)
Izmeniti naziv tako da se umesto _
koristi prazan prostor, prvo slovo uveća, ostala umanje. Ispisati nazive svih vina tipa unetog pomoću argumenta komandne linije. Proceniti cenu vina formulom:
Gde je tip
koeficijent određen vrednošću polja tip
i ima vrednosti:
crveno
- 0.66roze
- 1belo
- 1.33
Ispisati cene vina.
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đeno vino tipa unetog argumentom komandne linije, izaći sa status kodom
2
Ako tip nekog od vina nije
belo
,crveno
iliroze
, izaći sa status kodom3
Primer poziva programa:
./a.out belo < vina.txt
Primer ulazne datoteke vina.txt
:
7
VRANAC 1000 1 2020 crveno
FRESCOBALDI_CICINIS 1500 1 2020 belo
PINOT_NOIR 1200 1.5 2017 crveno
ALEXANDRIA 300 0.75 2021 roze
ZDREBCEVA_KRV 300 1 2024 crveno
REGINA 500 0.7 2022 roze
STARI_GRAD 200 1 2021 belo
Ispis programa na standardnom izlazu:
Vina datog tipa:
Frescobaldi Cicinis
Stari Grad
Vranac 2121.21
Frescobaldi Cicinis 1428.57
Pinot Noir 4318.18
Alexandria 450.00
Zdrebceva Krv 454.55
Regina 490.00
Stari Grad 375.94
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_VINA 20
6#define MAX_NAZIV 31
7#define MAX_TIP 11
8
9typedef struct vino_st {
10 char naziv[MAX_NAZIV];
11 int osnovna_cena;
12 double kolicina;
13 int godiste;
14 char tip[MAX_TIP];
15} VINO;
16
17void ucitaj_vina(VINO *, int *);
18void izmena_naziva(VINO *, int);
19void ispis_po_tipu(VINO *v, int n, char *tip);
20void nadji_cene(VINO *v, int n);
21
22int main(int argc, char **argv) {
23
24 VINO vina[MAX_VINA];
25 int n;
26
27 if(argc != 2) {
28 printf("Primer poziva: %s belo\n", argv[0]);
29 exit(1);
30 }
31
32 ucitaj_vina(vina, &n);
33 izmena_naziva(vina, n);
34 ispis_po_tipu(vina, n, argv[1]);
35 nadji_cene(vina, n);
36
37 return 0;
38}
39
40void ucitaj_vina(VINO *v, int *pn) {
41
42 int i;
43
44 do {
45 scanf("%d", pn);
46 } while (*pn <= 0 || *pn > MAX_VINA);
47
48 for (i = 0; i < *pn; i++) {
49 scanf("%s %d %lf %d %s", v[i].naziv, &v[i].osnovna_cena, &v[i].kolicina, &v[i].godiste, v[i].tip);
50 }
51}
52
53void izmena_naziva(VINO *v, int n) {
54 int i, j;
55
56 for(i = 0; i < n; i++) {
57 int prvo_slovo = 1;
58 for(j = 0; j < strlen(v[i].naziv); j++) {
59 if ((v[i].naziv[j] >= 'A') && (v[i].naziv[j] <= 'Z') && (prvo_slovo == 0)) {
60 v[i].naziv[j] += 32;
61 } else if ((v[i].naziv[j] >= 'a') && (v[i].naziv[j]) <= 'z' && (prvo_slovo == 1)) {
62 v[i].naziv[j] -= 32;
63 }
64
65 prvo_slovo = 0;
66 if (v[i].naziv[j] == '_') {
67 v[i].naziv[j] = ' ';
68 prvo_slovo = 1;
69 }
70 }
71 }
72}
73
74void ispis_po_tipu(VINO *v, int n, char *tip) {
75 int i, nadjeno = 0;
76 printf("Vina datog tipa:\n");
77 for(i = 0; i < n; i++) {
78 if (strcmp(v[i].tip, tip) == 0) {
79 printf("%s\n", v[i].naziv);
80 nadjeno = 1;
81 }
82 }
83 printf("\n");
84 if (!nadjeno) {
85 printf("Nije nadjeno vino datog tipa.\n");
86 exit(2);
87 }
88}
89
90void nadji_cene(VINO *v, int n) {
91 int i;
92 for(i = 0; i < n; i++) {
93 double tip = 0;
94 if (strcmp(v[i].tip, "belo") == 0) {
95 tip = 1.33;
96 } else if (strcmp(v[i].tip, "roze") == 0) {
97 tip = 1;
98 } else if (strcmp(v[i].tip, "crveno") == 0) {
99 tip = 0.66;
100 } else {
101 printf("Tip vina %s je neispravan: %s\n", v[i].naziv, v[i].tip);
102 exit(3);
103 }
104
105 double cena = (v[i].osnovna_cena + (2024 - v[i].godiste) * 100) * v[i].kolicina / tip;
106 printf("%s %.2lf\n", v[i].naziv, cena);
107 }
108
109}