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%2uformat 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
2U slučaju neuspešnog otvaranja ulazne datoteke, izaći iz programa sa kodom greške
3U 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}