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
2Ako nije uspešno otvorena izlazna datoteka, izaći iz programa sa status kodom
3Ako nije uspešno alocirana memorija za elemente, izaći iz programa sa status kodom
4Ako 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}