Zadatak „Poskupljenja goriva (ni)su relativna”¶
Section author: Petar Marić <petarmaric@uns.ac.rs>
Iz zadate ulazne datoteke učitati statički niz struktura, pri čemu se struktura
gorivo_st
sastoji od sledećih polja:
- skraćena oznaka grada (jedna reč, tačno 2 karaktera)
- tip goriva (jedna reč, do 10 karaktera)
- cena goriva (pozitivan realan broj)
Na osnovu fiksnog iznosa povećanja akcize na sva goriva akciza
(pozitivan
realan broj) formirati novi statički niz struktura i upisati ga u zadatu
izlaznu datoteku, pri čemu se struktura analiza_st
sastoji od sledećih
polja:
- nova cena goriva (zaokružena na 2 decimale, koristiti „%6.2f” format specifikator)
- procenat uvećanja cene goriva (zaokružen na 2 decimale, koristiti „%5.2f” format specifikator)
- skraćena oznaka grada (koristiti funkciju
strcpy
prilikom kopiranja iz strukturegorivo_st
) - tip goriva (koristiti funkciju
strcpy
prilikom kopiranja iz strukturegorivo_st
)
Primer poziva:
./ekologija 7.32 pre.txt posle.txt
sa akciza=7.32
i zadatim ulazom u datoteci pre.txt
:
NS gas 71.90
NS benzin 155.20
NS dizel 165.15
NI gas 69.30
NI benzin 155.30
NI dizel 165.20
BG gas 70.20
BG benzin 155.50
BG dizel 165.40
i očekivanim izlazom u datoteci posle.txt
:
79.22 10.18 NS gas
162.52 4.72 NS benzin
172.47 4.43 NS dizel
76.62 10.56 NI gas
162.62 4.71 NI benzin
172.52 4.43 NI dizel
77.52 10.43 BG gas
162.82 4.71 BG benzin
172.72 4.43 BG dizel
Primer rešenja¶
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_GRAD 2+1
#define MAX_GORIVO 10+1
#define MAX_NIZ 30
struct gorivo_st {
char grad[MAX_GRAD];
char tip_goriva[MAX_GORIVO];
double cena;
};
struct analiza_st {
double nova_cena;
double procenat_uvecanja_cene;
char grad[MAX_GRAD];
char tip_goriva[MAX_GORIVO];
};
FILE *safe_fopen(char filename[], char mode[], int error_code);
void ucitaj_goriva(FILE *in, struct gorivo_st goriva[], int *n);
double odredi_novu_cenu(struct gorivo_st gorivo, double akciza);
double odredi_procenat_uvecanja_cene(double stara_cena, double nova_cena);
void transform(struct gorivo_st goriva[], struct analiza_st analize[], int n,
double akciza);
void snimi_analize(FILE *out, struct analiza_st analize[], int n);
int main(int arg_num, char **args) {
if (arg_num != 4) {
printf("USAGE: %s AKCIZA IN_FILENAME OUT_FILENAME\n", args[0]);
exit(42);
}
double akciza = atof(args[1]);
char *in_filename = args[2];
char *out_filename = args[3];
FILE *in = safe_fopen(in_filename, "r", 1);
FILE *out = safe_fopen(out_filename, "w", 2);
struct gorivo_st goriva[MAX_NIZ];
struct analiza_st analize[MAX_NIZ];
int n;
ucitaj_goriva(in, goriva, &n);
transform(goriva, analize, n, akciza);
snimi_analize(out, analize, n);
fclose(in);
fclose(out);
return 0;
}
FILE *safe_fopen(char filename[], char mode[], int error_code) {
FILE *fp = fopen(filename, mode);
if(fp == NULL) {
printf("Can't open '%s'!\n", filename);
exit(error_code);
}
return fp;
}
void ucitaj_goriva(FILE *in, struct gorivo_st goriva[], int *n) {
*n = 0;
while(fscanf(
in, "%s %s %lf",
goriva[*n].grad,
goriva[*n].tip_goriva,
&goriva[*n].cena
) != EOF) {
(*n)++;
}
}
double odredi_novu_cenu(struct gorivo_st gorivo, double akciza) {
return gorivo.cena + akciza;
}
double odredi_procenat_uvecanja_cene(double stara_cena, double nova_cena) {
return (nova_cena / stara_cena - 1) * 100;
}
void transform(struct gorivo_st goriva[], struct analiza_st analize[], int n,
double akciza) {
int i;
for(i=0; i<n; i++) {
strcpy(analize[i].grad, goriva[i].grad);
strcpy(analize[i].tip_goriva, goriva[i].tip_goriva);
analize[i].nova_cena = odredi_novu_cenu(goriva[i], akciza);
analize[i].procenat_uvecanja_cene = odredi_procenat_uvecanja_cene(
goriva[i].cena, analize[i].nova_cena
);
}
}
void snimi_analize(FILE *out, struct analiza_st analize[], int n) {
int i;
for(i=0; i<n; i++) {
fprintf(
out, "%6.2f %5.2f %s %s\n",
analize[i].nova_cena,
analize[i].procenat_uvecanja_cene,
analize[i].grad,
analize[i].tip_goriva
);
}
}