Cvetići¶
Autor zadatka: Sanja Špica <sanjaspica@uns.ac.rs>
Iz zadate ulazne datoteke učitati podatke u jednostruko spregnutu listu, gde
struktura cvecara_st
sadrži sledeća polja:
naziv cvećare (jedna reč, do 20 karaktera)
vrste cveća (jedna reč, do 20 karaktera)
cena cveća (pozitivan realan broj)
Naravno, struktura cvecara_st
sadrži i polja potrebna za pravilno
formiranje jednostruko spregnute liste.
Na osnovu zadate vrste cveća vrsta_cveca
iz formirane liste ispisati podatke na
standardni izlaz (terminal), u sledećem rasporedu polja strukture cvecara_st
:
cena (zaokružena na 2 decimale, koristiti "%6.2f" format specifikator)
naziv vrste cveća
naziv cvećare
i potom na standardni izlaz (terminal) ispisati informaciju u kojoj cvećari je zadati cvet najpovoljniji i koja je njegova cena(zaokružena na 2 decimale).
Primer poziva programa:
./cvece Orhideja cvecare.txt
sa vrsta_cveca=Orhideja
i zadatim ulazom u datoteci cvecare.txt
:
Cvecara_Flowers Ruza 150.00
Cvecara_Flowers Orhideja 800.00
Cvecara_Flowers Ljiljan 720.00
Cvecara_Sun Ruza 200.00
Cvecara_Sun Orhideja 890.00
Cvecara_Sun Ljiljan 740.00
Cvecara_Green Ruza 260.00
Cvecara_Green Orhideja 650.00
Cvecara_Green Ljiljan 720.00
i očekivanim izlazom
150.00 Ruza Cvecara_Flowers
800.00 Orhideja Cvecara_Flowers
720.00 Ljiljan Cvecara_Flowers
200.00 Ruza Cvecara_Sun
890.00 Orhideja Cvecara_Sun
740.00 Ljiljan Cvecara_Sun
260.00 Ruza Cvecara_Green
650.00 Orhideja Cvecara_Green
720.00 Ljiljan Cvecara_Green
Cvecara sa najpovoljnijim cvetom Orhideja je Cvecara_Green, njena cena je 650.00
sa vrsta_cveca=Kala
:
U trenutno raspolozivim cvecarama ne postoji cvet Kala!
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_CVECE 11
6#define MAX_CVECARA 21
7
8typedef struct cvece_st
9{
10 char cvecara[MAX_CVECARA];
11 char vrsta_cveca[MAX_CVECE];
12 double cena;
13 struct cvece_st *sledeci;
14} CVECE;
15
16FILE *safe_fopen(char *filename, char *mode);
17void ucitaj(FILE *in, CVECE **glava);
18void inicijalizacija(CVECE **glava);
19CVECE *napravi_cvor(char *cvecara, char *vrsta_cveca, double *cena);
20void dodaj_cvor(CVECE **glava, CVECE *novi);
21CVECE *najpovoljniji_cvet(CVECE *glava, char cvecara[], char vrsta_cveca[]);
22void ispis(CVECE *glava);
23void obrisi_listu(CVECE **glava);
24
25int main(int BrArg, char **argv)
26{
27 if (BrArg != 3)
28 {
29 printf("Greska prilikom poziva programa\n");
30 exit(EXIT_FAILURE);
31 }
32
33 char cvecara[MAX_CVECARA];
34 char *vrsta_cveca = argv[1];
35 FILE *in = safe_fopen(argv[2], "r");
36
37 CVECE *glava;
38 inicijalizacija(&glava);
39
40 ucitaj(in, &glava);
41 ispis(glava);
42
43 CVECE *najpovoljniji = najpovoljniji_cvet(glava, cvecara, vrsta_cveca);
44 if (najpovoljniji == NULL)
45 {
46 printf(
47 "\nU trenutno raspolozivim cvecarama ne postoji cvet %s!\n",
48 vrsta_cveca);
49 }
50 else
51 {
52 printf(
53 "\nCvecara sa najpovoljnijim cvetom %s je %s, njena cena je %.2lf\n",
54 vrsta_cveca,
55 najpovoljniji->cvecara,
56 najpovoljniji->cena);
57 }
58 obrisi_listu(&glava);
59
60 fclose(in);
61
62 return 0;
63}
64FILE *safe_fopen(char *filename, char *mode)
65{
66 FILE *fp = fopen(filename, mode);
67
68 if (fp == NULL)
69 {
70 printf("Nije moguce otvoriti datoteku %s!\n", filename);
71 exit(EXIT_FAILURE);
72 }
73
74 return fp;
75}
76
77void ucitaj(FILE *in, CVECE **glava)
78{
79 char cvecara[MAX_CVECARA];
80 char vrsta_cveca[MAX_CVECE];
81 double cena;
82
83 while (fscanf(in, "%s %s %lf", cvecara, vrsta_cveca, &cena) != EOF)
84 {
85 dodaj_cvor(glava, napravi_cvor(cvecara, vrsta_cveca, &cena));
86 }
87}
88void inicijalizacija(CVECE **glava)
89{
90 *glava = NULL;
91}
92CVECE *napravi_cvor(char *cvecara, char *vrsta_cveca, double *cena)
93{
94 CVECE *novi = (CVECE *)malloc(sizeof(CVECE));
95
96 if (novi == NULL)
97 {
98 printf("Greska prilikom zauzimanja memorije!\n");
99 exit(EXIT_FAILURE);
100 }
101 strcpy(novi->cvecara, cvecara);
102 strcpy(novi->vrsta_cveca, vrsta_cveca);
103 novi->cena = *cena;
104
105 novi->sledeci = NULL;
106
107 return novi;
108}
109void dodaj_cvor(CVECE **glava, CVECE *novi)
110{
111 if (*glava == NULL)
112 {
113 *glava = novi;
114 }
115 else
116 {
117 CVECE *tekuci = *glava;
118
119 while (tekuci->sledeci != NULL)
120 {
121 tekuci = tekuci->sledeci;
122 }
123
124 tekuci->sledeci = novi;
125 }
126}
127CVECE *najpovoljniji_cvet(CVECE *glava, char cvecara[], char vrsta_cveca[])
128{
129 if (glava == NULL)
130 {
131 return NULL;
132 }
133 CVECE *najpovoljniji = NULL;
134 while (glava != NULL)
135 {
136 if (strcmp(glava->vrsta_cveca, vrsta_cveca) == 0)
137 {
138 if (najpovoljniji == NULL)
139 {
140 najpovoljniji = glava;
141 }
142 else if (glava->cena < najpovoljniji->cena)
143 {
144 najpovoljniji = glava;
145 }
146 }
147 glava = glava->sledeci;
148 }
149
150 return najpovoljniji;
151}
152void ispis(CVECE *glava)
153{
154 CVECE *tekuci = glava;
155
156 while (tekuci != NULL)
157 {
158 printf(
159 "%6.2lf %s %s\n",
160 tekuci->cena,
161 tekuci->vrsta_cveca,
162 tekuci->cvecara);
163 tekuci = tekuci->sledeci;
164 }
165}
166void obrisi_listu(CVECE **glava)
167{
168 CVECE *tekuci;
169
170 while (*glava != NULL)
171 {
172 tekuci = *glava;
173 *glava = (*glava)->sledeci;
174 tekuci->sledeci = NULL;
175 free(tekuci);
176 }
177}