Cena parkinga po zonama

Autor zadatka: Olja Anđelovski <andjelovski.olja@uns.ac.rs>

Iz zadate ulazne datoteke učitati statički niz struktura, pri čemu se struktura parking sastoji od sledećih polja:

  • naziv grada (jedna reč, do 30 karaktera)

  • naziv zone (jedna reč, do 6 karaktera)

  • registracija vozila (jedna reč, do 8 karaktera)

  • broj provedenih sati (pozitivan broj)

ZONA

CENA PO SATU

crvena

60 din

žuta

55 din

zelena

40 din

plava

0 din

Napisati funkciju za računanje ukupne cene parkinga posebno za vozila koja se nalaze u crvenoj, zelenoj i žutoj zoni. Izračunate vrednosti ispisati na terminal. Kroz argumente komandne linije proslediti naziv ulazne datoteke.

Primer poziva:

./parking vozila.txt

sa zadatim ulazom u datoteci vozila.txt:

Beograd zuta BG401-AA 1
Beograd zuta BG123-EC 2 
Kragujevac crvena KG001-OP 3 
Beograd zelena BG217-EE 4
Krusevac plava KS100-KV 10
Beograd plava BG666-VR 4
Beograd crvena BG711-QW 2

i očekivanim ispisom na terminal:


Ukupna cena parkinga za vozila u crvenoj zoni je 300 dinara.
Ukupna cena parkinga za vozila u zutoj zoni je 165 dinara.
Ukupna cena parkinga za vozila u zelenoj zoni je 160 dinara.

Primer rešenja

 1#include <stdio.h>
 2#include <string.h>
 3#include <stdlib.h>
 4
 5#define MAX_GRAD 31
 6#define MAX_ZONA 7
 7#define MAX_REGISTRACIJA 9
 8#define MAX_MESTA 20
 9
10struct parking {
11    char grad[MAX_GRAD];
12    char zona[MAX_ZONA]; 
13    char registracijaVozila[MAX_REGISTRACIJA];
14    unsigned brojProvedenihSati;
15};
16
17FILE *safe_fopen(char filename[], char mode[], int error_code);
18void ucitavanjeVozila(FILE *in, struct parking p[], int *n);
19void cenePoZoni(struct parking c[], int n);
20
21int main(int arg_num, char **args){
22    if (arg_num != 2) {
23        printf("Program treba pozvati na sledeci nacin: "
24               "%s nazivUlazneDatoteke.txt\n", args[0]);
25        exit(1);
26    }
27
28    char *in_filename = args[1];
29    FILE *in  = safe_fopen(in_filename, "r", 1);
30
31    struct parking p[MAX_MESTA];
32
33    int n;
34
35    ucitavanjeVozila(in, p, &n);
36    cenePoZoni(p, n);
37
38    fclose(in);
39    return 0;
40}
41
42FILE *safe_fopen(char filename[], char mode[], int error_code){
43    FILE *fp = fopen(filename, mode);
44
45    if(fp == NULL) {
46        printf("Nije moguce otvoriti datoteku '%s'!", filename);
47        exit(error_code);
48    }
49
50    return fp;
51}
52
53void ucitavanjeVozila(FILE *in, struct parking p[], int *n){
54    *n = 0;
55    while(fscanf(in, "%s %s %s %u", 
56              p[*n].grad,
57              p[*n].zona,
58              p[*n].registracijaVozila,
59              &p[*n].brojProvedenihSati
60         )
61    != EOF) {
62        (*n)++;
63    }
64}
65
66void cenePoZoni(struct parking c[], int n){
67    unsigned crvena=0, zuta=0, zelena=0;
68    int i;
69
70    for(i=0; i<n; i++) {
71        if (strcmp(c[i].zona,"crvena")==0) {
72            crvena+=c[i].brojProvedenihSati*60;
73        } else if (strcmp(c[i].zona,"zuta")==0) {
74            zuta+=c[i].brojProvedenihSati*55;
75        } else if (strcmp(c[i].zona,"zelena")==0) {
76            zelena+=c[i].brojProvedenihSati*40;
77        }
78    }
79
80    printf("\nUkupna cena parkinga za vozila u crvenoj zoni je %u dinara.",
81        crvena);
82    printf("\nUkupna cena parkinga za vozila u zutoj zoni je %u dinara.",
83        zuta);
84    printf("\nUkupna cena parkinga za vozila u zelenoj zoni je %u dinara.\n",
85        zelena);
86
87}
88
89