Materijali kuhinje¶
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