Prijava kvarova na električnoj mreži¶
Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>
Objekti koji dobijaju električnu energiju iz trafo stanice nalaze se u ulaznoj datoteci trafo-stanica.txt
Objekat je predstavljen na sledeći način:
ulica (jedna reč, maksimalno 20 karaktera)
broj (neoznačeni, ceo broj)
broj domaćinstava (neoznačeni, ceo broj)
tip objekta (jedna reč, maksimalno 10 karaktera)
prijavljen kvar (jedna reč, maksimalno 2 karaktera)
Učitati objekte iz ulazne datoteke, čije je ime zadato kao drugi argument komandne linije i uraditi sledeće:
Pronaći sve objekte koji imaju prijavljen kvar. Izračunati ukupan broj domaćinstava koja su trenutno bez električne energije. Informacije o objektima i ukupan broj domaćinstava ispisati u izlaznu datoteku sa imenom zadatim kao treći argument komandne linije. Prilikom ispisa, za stringove koristiti
%s
, a za neoznačene vrednosti%2u
format specifikator.Uporediti broj objekata trenutno zahvaćenih nestankom električne energije sa vrednošću prvog argumenta komandne linije. Ukoliko broj objekata premašuje zadatu vrednost, u istu izlaznu datoteku iz prethodne tačke napisati: "Moguć kvar trafo stanice!".
Vrednost prvog argumenta komandne linije mora biti prirodan broj, veći od 1. U slučaju sledećih grešaka izaći iz programa sa odgovarajućim kodom greške:
U slučaju nedovoljnog ili suvišnog broja argumenata, izaći iz programa sa kodom greške
1
(EXIT_FAILURE
)U slučaju da je vrednost prvog argumenta izvan navedenog opsega, izaći iz programa sa kodom greške
2
U slučaju neuspešnog otvaranja ulazne datoteke, izaći iz programa sa kodom greške
3
U slučaju neuspešnog otvaranja izlazne datoteke, izaći iz programa sa kodom greške
4
U slučaju uspešnog izvršavanja, izaći iz programa sa kodom 0
(EXIT_SUCCESS
).
Primer ulazne datoteke trafo-stanica.txt
:
Dositejeva 1 1 kuca NE
Dositejeva 2 35 zgrada DA
Dositejeva 3 1 kuca NE
Dositejeva 4 23 zgrada DA
Dositejeva 5 1 kuca DA
Dositejeva 6 1 kuca NE
Temerinska 29 2 kuca DA
Temerinska 26 1 kuca NE
Temerinska 28 3 kuca DA
Temerinska 31 32 zgrada NE
Primer poziva programa:
./prijava_kvarova 5 trafo-stanica.txt bez-energije.txt
Primer izlazne datoteke bez-energije.txt
:
Dositejeva 2 zgrada
Dositejeva 4 zgrada
Dositejeva 5 kuca
Temerinska 29 kuca
Temerinska 28 kuca
Broj domacinstava bez struje: 64
Moguc kvar trafo stanice!
Primer poziva programa:
./prijava_kvarova 7 trafo-stanica.txt bez-energije.txt
Primer izlazne datoteke bez_energije.txt
:
Dositejeva 2 zgrada
Dositejeva 4 zgrada
Dositejeva 5 kuca
Temerinska 29 kuca
Temerinska 28 kuca
Broj domacinstava bez struje: 64
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_OBJEKAT 30
6
7#define MAX_ULICA 21
8#define MAX_TIP_OBJEKTA 11
9#define MAX_PRIJAVLJEN_KVAR 3
10
11#define MIN_KVAROVA 2
12
13typedef struct objekat_st {
14 char ulica[MAX_ULICA];
15 unsigned broj;
16 unsigned broj_domacinstava;
17 char tip_objekta[MAX_TIP_OBJEKTA];
18 char prijavljen_kvar[MAX_PRIJAVLJEN_KVAR];
19} OBJEKAT;
20
21FILE *safe_fopen(char *, char *, int);
22void ucitaj(FILE *, OBJEKAT *, int *);
23int prijavljen_kvar(OBJEKAT);
24void ispisi_bez_struje(FILE *, OBJEKAT *, int);
25unsigned domacinstva_bez_struje(OBJEKAT *, int);
26int kvar_trafo_stanice(OBJEKAT *, int, int);
27
28int main(int argc, char **argv) {
29 OBJEKAT objekti[MAX_OBJEKAT];
30 int n;
31
32 if(argc != 4) {
33 printf("Primer poziva: %s 5 trafo_stanica.txt bez_energije.txt\n",
34 argv[0]);
35 exit(EXIT_FAILURE);
36 }
37
38 int limit_prijavljenih_kvarova = atoi(argv[1]);
39
40 if(limit_prijavljenih_kvarova < MIN_KVAROVA) {
41 printf("Minimalni broj kvarova mora biti %d!\n", MIN_KVAROVA);
42 exit(2);
43 }
44
45 FILE *pin = safe_fopen(argv[2], "r", 3);
46 ucitaj(pin, objekti, &n);
47 fclose(pin);
48
49 FILE *pout = safe_fopen(argv[3], "w", 4);
50 ispisi_bez_struje(pout, objekti, n);
51 fprintf(pout, "\nBroj domacinstava bez struje: %u\n",
52 domacinstva_bez_struje(objekti, n));
53 if(kvar_trafo_stanice(objekti, n, limit_prijavljenih_kvarova)) {
54 fprintf(pout, "\nMoguc kvar trafo stanice!\n");
55 }
56 fclose(pout);
57
58 return EXIT_SUCCESS;
59}
60
61FILE *safe_fopen(char *name, char *mode, int error_code) {
62 FILE *fp = fopen(name, mode);
63
64 if(fp == NULL) {
65 printf("Nije moguce otvoriti datoteku %s!\n", name);
66 exit(error_code);
67 }
68
69 return fp;
70}
71
72void ucitaj(FILE *pin, OBJEKAT *objekti, int *pn) {
73 int i;
74
75 while(fscanf(pin, "%s %u %u %s %s",
76 objekti[i].ulica,
77 &objekti[i].broj,
78 &objekti[i].broj_domacinstava,
79 objekti[i].tip_objekta,
80 objekti[i].prijavljen_kvar
81 ) != EOF) {
82 i++;
83 }
84
85 *pn = i;
86}
87
88int prijavljen_kvar(OBJEKAT objekat) {
89 return strcmp(objekat.prijavljen_kvar, "DA") == 0;
90}
91
92void ispisi_bez_struje(FILE *pout, OBJEKAT *objekti, int n) {
93 int i;
94
95 for(i = 0;i < n;i++) {
96 if(prijavljen_kvar(objekti[i])) {
97 fprintf(pout, "%s %u %s\n", objekti[i].ulica, objekti[i].broj, objekti[i].tip_objekta);
98 }
99 }
100}
101
102unsigned domacinstva_bez_struje(OBJEKAT *objekti, int n) {
103 int i;
104 unsigned ukupno_domacinstava = 0;
105
106 for(i = 0;i < n;i++) {
107 if(prijavljen_kvar(objekti[i])) {
108 ukupno_domacinstava += objekti[i].broj_domacinstava;
109 }
110 }
111
112 return ukupno_domacinstava;
113}
114
115int kvar_trafo_stanice(OBJEKAT *objekti, int n, int limit_prijavljenih_kvarova) {
116 int i, objekti_bez_struje = 0;
117
118 for(i = 0;i < n;i++) {
119 if(prijavljen_kvar(objekti[i])) {
120 objekti_bez_struje++;
121 }
122 }
123
124 return objekti_bez_struje >= limit_prijavljenih_kvarova;
125}