Paste za zube¶
Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>
Ulazna datoteka paste.txt
sadrži podatke o pastama za zube u sledećem formatu:
naziv
(jedna reč, do 30 karaktera)cena
(u dinarima, realna vrednost)velicina
(u ml, celobrojna vrednost)decija
(jedna reč, do 2 karaktera, "da" ili "ne")
Učitati podatke u statički niz dužine do 20, potom ispisati prosečnu cenu paste za zube. Ispisati sve nazive pasta za zube veće od veličine zadate argumentom komandne linije, potom ispisati naziv najjeftinije od njih. Izlaznu datoteku sredjeni_nazivi.txt
popuniti nazivima pasti takvim da su sva slova izmenjena u velika, znak _
zamenjen razmakom, a u slučaju da je pasta dečija na kraju naziva dodato za decu
.
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 pasta za zube veličine veće od unete argumentima komandne linije, izaći sa status kodom
2
Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom
3
Ako program ne može da otvori izlaznu datoteku, izaći sa status kodom
4
Primer poziva programa:
./a.out 100
Primer ulazne datoteke paste.txt
:
Naturokosmetik 199.99 50 da
Sensodyne 769.99 150 ne
Paradontax_Ultra_Clean 599.99 150 ne
Curapox_Enzycal 789.99 75 ne
Dontodent_Kids 119.00 100 da
Colgate_Max_Fresh 419.99 125 ne
Ispis programa na standardnom izlazu:
Prosecna pasta za zube kosta: 483.16 dinara.
Paste za zube od bar 100ml: Sensodyne Paradontax_Ultra_Clean Colgate_Max_Fresh
Najjefinija od njih je: Colgate_Max_Fresh!
Izlazna datoteka:
NATUROKOSMETIK za decu
SENSODYNE
PARADONTAX ULTRA CLEAN
CURAPOX ENZYCAL
DONTODENT KIDS za decu
COLGATE MAX FRESH
Dat je niz od maksimalno 20 pasti za zube. Učitati n pasti ako su opisane sledećim podacima:
naziv
(jedna reč, do 30 karaktera)cena
(u dinarima, realna vrednost)velicina
(u ml, celobrojna vrednost)decija
(jedna reč, do 2 karaktera, "da" ili "ne")pun_naziv
(više reči, određeno opisom u zadatku)
Ispisati prosečnu cenu paste za zube. Ispisati sve nazive pasta za zube veće od veličine zadate argumentom komandne linije, potom ispisati naziv najjeftinije od njih. Polje pun_naziv
popuniti nazivima pasti takvim da su sva slova izmenjena u velika, znak _
zamenjen razmakom, a u slučaju da je pasta dečija na kraju naziva dodato za decu
.
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 pasta za zube veličine veće od unete argumentima komandne linije, izaći sa status kodom
2
Primer poziva programa:
./a.out 100 < paste-stdinout.txt
Primer ulazne datoteke paste-stdinout.txt
:
6
Naturokosmetik 199.99 50 da
Sensodyne 769.99 150 ne
Paradontax_Ultra_Clean 599.99 150 ne
Curapox_Enzycal 789.99 75 ne
Dontodent_Kids 119.00 100 da
Colgate_Max_Fresh 419.99 125 ne
Ispis programa na standardnom izlazu:
Prosecna pasta za zube kosta: 483.16 dinara.
Paste za zube od bar 100ml: Sensodyne Paradontax_Ultra_Clean Colgate_Max_Fresh
Najjefinija od njih je: Colgate_Max_Fresh!
NATUROKOSMETIK za decu
SENSODYNE
PARADONTAX ULTRA CLEAN
CURAPOX ENZYCAL
DONTODENT KIDS za decu
COLGATE MAX FRESH
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_PASTA 20
6#define MAX_NAZIV 31
7#define MAX_DECIJA 3
8#define MAX_SREDJEN_NAZIV 39
9
10typedef struct pasta_st
11{
12 char naziv[MAX_NAZIV];
13 double cena;
14 int velicina;
15 char decija[MAX_DECIJA];
16} PASTA;
17
18FILE *safe_fopen(char *, char *, int);
19void ucitaj_paste(FILE *, PASTA *, int *);
20double suma_cena(PASTA *, int);
21double prosek_cena(PASTA *, int);
22void ispisi_vece(PASTA *, int, int);
23void sredjeni_nazivi(FILE *, PASTA *, int);
24
25int main(int argc, char **argv)
26{
27
28 PASTA paste[MAX_PASTA];
29 int n, trazena_velicina;
30 double prosek;
31 FILE *ulazna, *izlazna;
32
33 if(argc != 2)
34 {
35 printf("Primer poziva: %s 100\n", argv[0]);
36 exit(1);
37 }
38
39 ulazna = safe_fopen("paste.txt", "r", 3);
40 ucitaj_paste(ulazna, paste, &n);
41 fclose(ulazna);
42
43 prosek = prosek_cena(paste, n);
44 printf("Prosecna pasta za zube kosta: %.2lf dinara.\n", prosek);
45
46 trazena_velicina = atoi(argv[1]);
47 ispisi_vece(paste, n, trazena_velicina);
48
49 izlazna = safe_fopen("sredjeni_nazivi.txt", "w", 4);
50 sredjeni_nazivi(izlazna, paste, n);
51 fclose(izlazna);
52
53 return 0;
54}
55
56FILE *safe_fopen(char *ime, char *rezim, int kod_greske)
57{
58 FILE *pf = fopen(ime, rezim);
59
60 if (pf == NULL)
61 {
62 printf("Greska pri otvaranju %s!\n", ime);
63 exit(kod_greske);
64 }
65
66 return pf;
67}
68
69void ucitaj_paste(FILE *pf, PASTA *p, int *pn)
70{
71
72 int i = 0;
73
74 while(fscanf(pf, "%s %lf %d %s", p[i].naziv, &p[i].cena, &p[i].velicina, p[i].decija) != EOF)
75 {
76 i++;
77 }
78
79 *pn = i;
80}
81
82double suma_cena(PASTA *p, int n) {
83 int i;
84 double suma = 0;
85
86 for(i = 0; i < n; i++)
87 {
88 suma += p[i].cena;
89 }
90
91 return suma;
92}
93
94double prosek_cena(PASTA *p, int n) {
95 return suma_cena(p, n) / n;
96}
97
98void ispisi_vece(PASTA *p, int n, int velicina) {
99 int i, nadjena = 0;
100 PASTA *najjeftinija = NULL;
101
102 printf("Paste za zube od bar %dml: ", velicina);
103 for(i = 0; i < n; i++)
104 {
105 if(p[i].velicina > velicina)
106 {
107 printf("%s ", p[i].naziv);
108 nadjena = 1;
109 if (najjeftinija == NULL || najjeftinija->cena > p[i].cena)
110 {
111 najjeftinija = &p[i];
112 }
113 }
114 }
115 printf("\n");
116 if (nadjena)
117 {
118 printf("Najjefinija od njih je: %s!\n", najjeftinija->naziv);
119 }
120 else
121 {
122 printf("Nije nadjena pasta za zube veca od unete velicine!\n");
123 exit(2);
124 }
125}
126
127void sredjeni_nazivi(FILE *pf, PASTA *p, int n) {
128 int i, j;
129 for(i = 0; i < n; i++)
130 {
131 char naziv[MAX_SREDJEN_NAZIV];
132 strcpy(naziv, p[i].naziv);
133 for(j = 0; j < strlen(naziv); j++)
134 {
135 if (naziv[j] >= 'a' && naziv[j] <= 'z')
136 {
137 naziv[j] -= 32;
138 }
139 if (naziv[j] == '_')
140 {
141 naziv[j] = ' ';
142 }
143 }
144 if (strcmp(p[i].decija, "da") == 0)
145 {
146 strcat(naziv, " za decu");
147 }
148 fputs(naziv, pf);
149 fputs("\n", pf);
150 }
151}
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_PASTA 20
6#define MAX_NAZIV 31
7#define MAX_DECIJA 3
8#define MAX_SREDJEN_NAZIV 39
9
10typedef struct pasta_st
11{
12 char naziv[MAX_NAZIV];
13 double cena;
14 int velicina;
15 char decija[MAX_DECIJA];
16 char pun_naziv[MAX_SREDJEN_NAZIV];
17} PASTA;
18
19void ucitaj_paste(PASTA *, int *);
20double suma_cena(PASTA *, int);
21double prosek_cena(PASTA *, int);
22void ispisi_vece(PASTA *, int, int);
23void sredjeni_nazivi(PASTA *, int);
24
25int main(int argc, char **argv)
26{
27
28 PASTA paste[MAX_PASTA];
29 int n, trazena_velicina;
30 double prosek;
31
32 if(argc != 2)
33 {
34 printf("Primer poziva: %s 100\n", argv[0]);
35 exit(1);
36 }
37
38 ucitaj_paste(paste, &n);
39
40 prosek = prosek_cena(paste, n);
41 printf("Prosecna pasta za zube kosta: %.2lf dinara.\n", prosek);
42
43 trazena_velicina = atoi(argv[1]);
44 ispisi_vece(paste, n, trazena_velicina);
45
46 sredjeni_nazivi(paste, n);
47
48 return 0;
49}
50
51void ucitaj_paste(PASTA *p, int *pn)
52{
53 int i;
54
55 do {
56 scanf("%d", pn);
57 } while(*pn <= 0 || *pn > MAX_PASTA);
58
59 for(i = 0; i < *pn; i++)
60 {
61 scanf("%s %lf %d %s", p[i].naziv, &p[i].cena, &p[i].velicina, p[i].decija);
62 }
63
64 *pn = i;
65}
66
67double suma_cena(PASTA *p, int n) {
68 int i;
69 double suma = 0;
70
71 for(i = 0; i < n; i++)
72 {
73 suma += p[i].cena;
74 }
75
76 return suma;
77}
78
79double prosek_cena(PASTA *p, int n) {
80 return suma_cena(p, n) / n;
81}
82
83void ispisi_vece(PASTA *p, int n, int velicina) {
84 int i, nadjena = 0;
85 PASTA *najjeftinija = NULL;
86
87 printf("Paste za zube od bar %dml: ", velicina);
88 for(i = 0; i < n; i++)
89 {
90 if(p[i].velicina > velicina)
91 {
92 printf("%s ", p[i].naziv);
93 nadjena = 1;
94 if (najjeftinija == NULL || najjeftinija->cena > p[i].cena)
95 {
96 najjeftinija = &p[i];
97 }
98 }
99 }
100 printf("\n");
101 if (nadjena)
102 {
103 printf("Najjefinija od njih je: %s!\n", najjeftinija->naziv);
104 }
105 else
106 {
107 printf("Nije nadjena pasta za zube veca od unete velicine!\n");
108 exit(2);
109 }
110}
111
112void sredjeni_nazivi(PASTA *p, int n) {
113 int i, j;
114 for(i = 0; i < n; i++)
115 {
116 strcpy(p[i].pun_naziv, p[i].naziv);
117 for(j = 0; j < strlen(p[i].pun_naziv); j++)
118 {
119 if (p[i].pun_naziv[j] >= 'a' && p[i].pun_naziv[j] <= 'z')
120 {
121 p[i].pun_naziv[j] -= 32;
122 }
123 if (p[i].pun_naziv[j] == '_')
124 {
125 p[i].pun_naziv[j] = ' ';
126 }
127 }
128 if (strcmp(p[i].decija, "da") == 0)
129 {
130 strcat(p[i].pun_naziv, " za decu");
131 }
132 puts(p[i].pun_naziv);
133 }
134}