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}