Klime

Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>

Ime ulazne i izlazne datoteke učitati argumentom komandne linije. Ulazna datoteka sadrži podatke o klima uređajima:

  • naziv (jedna reč, do 30 karaktera)

  • proizvodjac (jedna reč, do 30 karaktera)

  • cena (ceo broj)

  • energetska_klasa (jedna reč, do 4 karaktera)

Učitati podatke u jednostruko spregnutu listu dodavanjem novih elemenata na kraj liste. Za ime proizvođača uneto argumentom komandne linije ispisati sva imena klimi i cene u izlaznu datoteku. Na standardni izlaz ispisati broj klima u ponudi svake energetske klase: A+++, A++, A+, A, B, C.

U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0 (EXIT_SUCCESS). Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:

  • U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa status kodom 1 (EXIT_FAILURE)

  • Ako nije uspešno otvorena ulazna datoteka, izaći iz programa sa status kodom 2

  • Ako nije uspešno otvorena izlazna datoteka, izaći iz programa sa status kodom 3

  • Ako nije uspešno alocirana memorija za elemente, izaći iz programa sa status kodom 4

  • Ako klimina energetska klasa ne pripada navedenim klasama, izaći iz programa sa status kodom 5

Primer poziva programa:

./a.out klime.txt out.txt BOSCH

Primer ulazne datoteke klime.txt:

cl3000i-35 BOSCH 62999 A++
EasySmart12k HISENSE 45999 A++
InverterEnergyPro+ HISENSE 71999 A+++
Pular12k GREE 56999 A++
MSAG-24HRN1 MIDEA 89999 C
ASW-H18A4 AUX 54999 A
APC12 HISENSE 49999 A
cl8001i-25 BOSCH 189999 A+++

Ispis programa na standardnom izlazu:

Broj klimi po energetskoj klasi:
A+++ 2
A++ 3
A+ 0
A 2
B 0
C 1

Primer izlazne datoteke out.txt:

cl3000i-35 62999
cl8001i-25 189999

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_NAZIV 31
  6#define MAX_PROIZVODJAC 31
  7#define MAX_KLASA 5
  8#define MAX_SIZE 6
  9
 10typedef struct cvor_st {
 11    char naziv[MAX_NAZIV];
 12    char proizvodjac[MAX_PROIZVODJAC];
 13    int cena;
 14    char klasa[MAX_KLASA];
 15    struct cvor_st *sledeci;
 16} CVOR;
 17
 18FILE *safe_fopen(char *ime, char *rezim, int kod_greske);
 19void inicijalizacija(CVOR **glava);
 20void ucitavanje(CVOR **glava, FILE *pf);
 21CVOR *napravi_cvor(char *ime, char *pr, int cena, char *kl);
 22void dodaj_na_kraj(CVOR **glava, CVOR *novi);
 23void ispis_proizvodjaca(FILE *pf, CVOR *glava, char *pr);
 24void ispis_klasa(CVOR *glava);
 25void obrisi_listu(CVOR **glava);
 26
 27int main(int argc, char **argv) {
 28
 29    if (argc != 4) {
 30        printf("Primer poziva programa: %s klime.txt out.txt BOSCH\n", argv[0]);
 31        exit(1);
 32    }
 33
 34    CVOR *glava;
 35    FILE *ulazna, *izlazna;
 36
 37    inicijalizacija(&glava);
 38    ulazna = safe_fopen(argv[1], "r", 2);
 39    ucitavanje(&glava, ulazna);
 40    fclose(ulazna);
 41
 42    izlazna = safe_fopen(argv[2], "w", 3);
 43    ispis_proizvodjaca(izlazna, glava, argv[3]);
 44    fclose(izlazna);
 45
 46    ispis_klasa(glava);
 47    obrisi_listu(&glava);
 48
 49    return 0;
 50}
 51
 52FILE *safe_fopen(char *ime, char *rezim, int kod_greske) {
 53    FILE *pf = fopen(ime, rezim);
 54
 55    if (pf == NULL) {
 56        printf("Nije otvoren %s", ime);
 57        exit(kod_greske);
 58    }
 59
 60    return pf;
 61}
 62
 63void inicijalizacija(CVOR **glava) {
 64    *glava = NULL;
 65}
 66
 67void ucitavanje(CVOR **glava, FILE *pf) {
 68    char ime[MAX_NAZIV], pr[MAX_PROIZVODJAC], kl[MAX_KLASA];
 69    int cena;
 70    
 71    while(fscanf(pf, "%s %s %d %s", ime, pr, &cena, kl) != EOF) {
 72        CVOR *novi = napravi_cvor(ime, pr, cena, kl);
 73        dodaj_na_kraj(glava, novi);
 74    }
 75}
 76
 77CVOR *napravi_cvor(char *ime, char *pr, int cena, char *kl) {
 78    CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
 79
 80    if (novi == NULL) {
 81        printf("Nema dovoljno memorije!\n");
 82        exit(4);
 83    }
 84
 85    strcpy(novi->naziv, ime);
 86    strcpy(novi->proizvodjac, pr);
 87    strcpy(novi->klasa, kl);
 88    novi->cena = cena;
 89    novi->sledeci = NULL;
 90
 91    return novi;
 92}
 93
 94void dodaj_na_kraj(CVOR **glava, CVOR *novi) {
 95    if (*glava == NULL) {
 96        *glava = novi;
 97    } else {
 98        CVOR *trenutni = *glava;
 99        while(trenutni->sledeci != NULL) {
100            trenutni = trenutni->sledeci;
101        }
102        trenutni->sledeci = novi;
103    }
104}
105
106void obrisi_listu(CVOR **glava) {
107    while(*glava != NULL) {
108        CVOR *trenutni = *glava;
109        *glava = trenutni->sledeci;
110        trenutni->sledeci = NULL;
111        free(trenutni);
112    }
113}
114
115void ispis_proizvodjaca(FILE *pf, CVOR *glava, char *pr) {
116    CVOR *trenutni = glava;
117    while(trenutni != NULL) {
118        if (strcmp(trenutni->proizvodjac, pr) == 0) {
119            fprintf(pf, "%s %d\n", trenutni->naziv, trenutni->cena);
120        }
121        trenutni = trenutni->sledeci;
122    }
123}
124
125void ispis_klasa(CVOR *glava) {
126    int klase[MAX_SIZE] = {0};
127    int i;
128    CVOR *trenutni = glava;
129    while(trenutni != NULL) {
130        if (strcmp(trenutni->klasa, "A+++") == 0) {
131            klase[0]++;
132        } else if (strcmp(trenutni->klasa, "A++") == 0) {
133            klase[1]++;
134        } else if (strcmp(trenutni->klasa, "A+") == 0) {
135            klase[2]++;
136        } else if (strcmp(trenutni->klasa, "A") == 0) {
137            klase[3]++;
138        } else if (strcmp(trenutni->klasa, "B") == 0) {
139            klase[4]++;
140        } else if (strcmp(trenutni->klasa, "C") == 0) {
141            klase[5]++;
142        } else {
143            printf("Nepoznata energetska klasa %s, klime %s!\n", trenutni->klasa, trenutni->naziv);
144            exit(5);
145        }
146        trenutni = trenutni->sledeci;
147    }
148    printf("Broj klimi po energetskoj klasi:\nA+++ %d\nA++ %d\nA+ %d\nA %d\nB %d\nC %d\n", klase[0],klase[1],klase[2],klase[3],klase[4],klase[5]);
149}