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
.
Program realizovati tako da sve funkcije koje imaju veze isključivo sa listom (inicijalizacija, dodavanje, brisanje...) budu odvojene u jedan par datoteka koje predstavljaju zaglavlje i implementaciju.
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#include "lista.h"
6
7FILE* open_file(char* ime, char* mode) {
8
9 FILE* fp = fopen(ime, mode);
10 if(fp==NULL)
11 {
12 printf("Greska pri otvaranju datoteke %s\n", ime);
13 exit(2);
14 }
15 return fp;
16}
17
18void read(FILE* in, CVOR** glava, float povrsina) {
19 char kategorija[MAX_KATEGORIJA], naziv[MAX_NAZIV];
20 float cena;
21 while(fscanf(in, "%s %s %f", kategorija, naziv, &cena)
22 !=EOF)
23 {
24 CVOR* new = create_node(kategorija, naziv, cena, povrsina);
25 add_sorted(glava, new);
26 }
27}
28
29void write(FILE* out, CVOR* glava, CVOR* najblizi) {
30 while(glava != NULL)
31 {
32 fprintf(out, "%12s %12s %12.2f$ %12.2f$\n", glava->kategorija, glava->naziv,
33 glava->cena, glava->ukupna_cena);
34 glava = glava->sledeci;
35 }
36 if(najblizi == NULL){
37 fprintf(out, "\nNe postoji materijal te kategorije\n");
38 }
39 else{
40 fprintf(out, "\nMaterijal kategorije %s najblizi zeljenoj vrednosti je %s\n",najblizi->kategorija, najblizi->naziv);
41 }
42}
43
44CVOR* nadji_najblizi(CVOR* glava, char* kategorija, float zeljeno){
45 CVOR* tmp = glava;
46 CVOR* najblizi = NULL;
47 while(tmp != NULL)
48 {
49 if(!strcmp(tmp->kategorija, kategorija)){
50 if(najblizi == NULL){
51 najblizi = tmp;
52 }
53 if(fabs(zeljeno - najblizi->ukupna_cena) > fabs(zeljeno - tmp->ukupna_cena)){
54 najblizi = tmp;
55 }
56 }
57 tmp = tmp->sledeci;
58 }
59 return najblizi;
60}
61
62
63int main(int argc, char* argv[]) {
64
65 if(argc!=6)
66 {
67 printf("Primer poziva programa: ./a.out input.txt output.txt 3.5 1200 Drvo\n");
68 exit(1);
69 }
70
71 FILE* in = open_file(argv[1], "r");
72 FILE* out = open_file(argv[2], "w");
73 CVOR* glava;
74 init(&glava);
75 read(in, &glava, atof(argv[3]));
76 CVOR* najblizi = nadji_najblizi(glava,argv[5],atof(argv[4]));
77 write(out, glava, najblizi);
78
79 fclose(in);
80 fclose(out);
81 clear(&glava);
82 return 0;
83}
1#ifndef LISTA_H
2#define LISTA_H
3#define MAX_KATEGORIJA 21
4#define MAX_NAZIV 21
5typedef struct cvor_st{
6 char kategorija[MAX_KATEGORIJA];
7 char naziv[MAX_NAZIV];
8 float cena;
9 float ukupna_cena;
10 struct cvor_st* sledeci;
11}CVOR;
12
13void init(CVOR** glava);
14CVOR* create_node(char* kategorija, char* naziv, float cena, float povrsina);
15void add_sorted(CVOR** glava, CVOR* novi);
16void clear(CVOR** glava);
17
18#endif
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include "lista.h"
5
6void init(CVOR** glava) {
7 *glava = NULL;
8}
9
10CVOR* create_node(char* kategorija, char* naziv, float cena, float povrsina) {
11 CVOR* tmp = malloc(sizeof(CVOR));
12 if(tmp==NULL)
13 {
14 printf("Ne moze se zauzeti memorija\n");
15 exit(3);
16 }
17 strcpy(tmp->kategorija, kategorija);
18 strcpy(tmp->naziv, naziv);
19 tmp->cena = cena;
20 tmp->ukupna_cena = cena * povrsina;
21 tmp->sledeci = NULL;
22 return tmp;
23}
24
25void add_sorted(CVOR** glava, CVOR* novi) {
26
27 CVOR* trenutni;
28 if(*glava==NULL || (*glava)->cena >= novi->cena)
29 {
30 novi->sledeci = *glava;
31 *glava = novi;
32 } else
33 {
34 trenutni = *glava;
35 while(trenutni->sledeci!=NULL && trenutni->sledeci->cena < novi->cena)
36 {
37 trenutni = trenutni->sledeci;
38 }
39 novi->sledeci = trenutni->sledeci;
40 trenutni->sledeci = novi;
41 }
42}
43
44void clear(CVOR** glava) {
45 CVOR *tmp;
46 while(*glava != NULL)
47 {
48 tmp = *glava;
49 *glava = (*glava)->sledeci;
50 tmp->sledeci = NULL;
51 free(tmp);
52 }
53}
1.PHONY: clean
2a.out: lista.o resenje.o
3 gcc lista.o resenje.o
4resenje.o: resenje.c
5 gcc -c resenje.c
6lista.o: lista.c
7 gcc -c lista.c
8clean:
9 rm *.o a.out