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:

  1. 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.

  2. 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}