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}