Materijali kuhinje¶
Autor zadatka: Mihajlo Marjanski <marjanski.mihajlo@uns.ac.rs>
Iz zadate ulazne datoteke učitati podatke u jednostruko spregnutu listu, gde struktura materijal_st sadrži sledeća polja:
kategorija (jedna reč, do 20 karaktera)
naziv (jedna reč, do 20 karaktera)
cena_po_m2 (realan broj)
Struktura materijal_st sadrži i polja potrebna za pravilno formiranje jednostruko spregnute liste.
Učitati materijale u jednostruko spregnutu listu i uraditi sledeće:
Sortirati materijale po ceni po kvadratu u rastućem redosledu pri dodavanju u listu
Sračunati ukupnu cenu materijala za kvadraturu koja se unosi kao argument komandne linije i ispisati sve materijale sa ukupnom cenom
Za količinu novca kao i kategoriju materijala koje se unose putem komandne linije pronaći i ispisati materijal čija je ukupna cena za datu kvadraturu najbliža zadatoj količini novca i koji pripada unetoj kategoriji
Ispis materijala formatirati na sledeći način:
%12s %12s %12.2f$ %12.2f$
U slučaju nedovoljnog ili suvišnog broja argumenata komandne linije, izaći iz programa sa status kodom
1
(EXIT_FAILURE
).U slučaju neuspešnog otvaranja fajla, izaći iz programa sa status kodom
2
.U slučaju neuspešnog zauzeća memorije prilikom kreiranja čvora liste, izaći iz programa sa status kodom
3
.
Primer poziva programa:
./a.out input.txt output.txt 3.5 80 Drvo
Primer ulazne datoteke input.txt
:
Mermer White 55.5
Mermer Green 70.0
Drvo Birch 24
Drvo Oak 22.2
Kvarc Beige 44
Kvarc Arctic 58
Ispis programa u izlaznu datoteku output.txt
:
Drvo Oak 22.20$ 77.70$
Drvo Birch 24.00$ 84.00$
Kvarc Beige 44.00$ 154.00$
Mermer White 55.50$ 194.25$
Kvarc Arctic 58.00$ 203.00$
Mermer Green 70.00$ 245.00$
Materijal kategorije Drvo najblizi zeljenoj vrednosti je Oak
Primer rešenja¶
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <math.h>
5
6#define MAX_KATEGORIJA 21
7#define MAX_NAZIV 21
8
9typedef struct cvor_st{
10 char kategorija[MAX_KATEGORIJA];
11 char naziv[MAX_NAZIV];
12 float cena;
13 float ukupna_cena;
14 struct cvor_st* sledeci;
15}CVOR;
16
17FILE* open_file(char* ime, char* mode) {
18
19 FILE* fp = fopen(ime, mode);
20 if(fp==NULL)
21 {
22 printf("Greska pri otvaranju datoteke %s\n", ime);
23 exit(2);
24 }
25 return fp;
26}
27
28void init(CVOR** glava) {
29 *glava = NULL;
30}
31
32CVOR* create_node(char* kategorija, char* naziv, float cena, float povrsina) {
33 CVOR* tmp = malloc(sizeof(CVOR));
34 if(tmp==NULL)
35 {
36 printf("Ne moze se zauzeti memorija\n");
37 exit(3);
38 }
39 strcpy(tmp->kategorija, kategorija);
40 strcpy(tmp->naziv, naziv);
41 tmp->cena = cena;
42 tmp->ukupna_cena = cena * povrsina;
43 tmp->sledeci = NULL;
44 return tmp;
45}
46
47void add_sorted(CVOR** glava, CVOR* novi) {
48
49 CVOR* trenutni;
50 if(*glava==NULL || (*glava)->cena >= novi->cena)
51 {
52 novi->sledeci = *glava;
53 *glava = novi;
54 } else
55 {
56 trenutni = *glava;
57 while(trenutni->sledeci!=NULL && trenutni->sledeci->cena < novi->cena)
58 {
59 trenutni = trenutni->sledeci;
60 }
61 novi->sledeci = trenutni->sledeci;
62 trenutni->sledeci = novi;
63 }
64}
65
66void read(FILE* in, CVOR** glava, float povrsina) {
67 char kategorija[MAX_KATEGORIJA], naziv[MAX_NAZIV];
68 float cena;
69 while(fscanf(in, "%s %s %f", kategorija, naziv, &cena)
70 !=EOF)
71 {
72 CVOR* new = create_node(kategorija, naziv, cena, povrsina);
73 add_sorted(glava, new);
74 }
75}
76
77void write(FILE* out, CVOR* glava, CVOR* najblizi) {
78 while(glava != NULL)
79 {
80 fprintf(out, "%12s %12s %12.2f$ %12.2f$\n", glava->kategorija, glava->naziv,
81 glava->cena, glava->ukupna_cena);
82 glava = glava->sledeci;
83 }
84 if(najblizi == NULL){
85 fprintf(out, "\nNe postoji materijal te kategorije\n");
86 }
87 else{
88 fprintf(out, "\nMaterijal kategorije %s najblizi zeljenoj vrednosti je %s\n",najblizi->kategorija, najblizi->naziv);
89 }
90}
91
92CVOR* nadji_najblizi(CVOR* glava, char* kategorija, float zeljeno){
93 CVOR* tmp = glava;
94 CVOR* najblizi = NULL;
95 while(tmp != NULL)
96 {
97 if(!strcmp(tmp->kategorija, kategorija)){
98 if(najblizi == NULL){
99 najblizi = tmp;
100 }
101 if(fabs(zeljeno - najblizi->ukupna_cena) > fabs(zeljeno - tmp->ukupna_cena)){
102 najblizi = tmp;
103 }
104 }
105 tmp = tmp->sledeci;
106 }
107 return najblizi;
108}
109
110void clear(CVOR** glava) {
111 CVOR *tmp;
112 while(*glava != NULL)
113 {
114 tmp = *glava;
115 *glava = (*glava)->sledeci;
116 tmp->sledeci = NULL;
117 free(tmp);
118 }
119}
120
121int main(int argc, char* argv[]) {
122
123 if(argc!=6)
124 {
125 printf("Primer poziva programa: ./a.out input.txt output.txt 3.5 1200 Drvo\n");
126 exit(1);
127 }
128
129 FILE* in = open_file(argv[1], "r");
130 FILE* out = open_file(argv[2], "w");
131 CVOR* glava;
132 init(&glava);
133 read(in, &glava, atof(argv[3]));
134 CVOR* najblizi = nadji_najblizi(glava,argv[5],atof(argv[4]));
135 write(out, glava, najblizi);
136
137 fclose(in);
138 fclose(out);
139 clear(&glava);
140 return 0;
141}