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}