Avionska karta¶
Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>
U ulaznom fajlu letovi.txt
redom su navedeni podaci o letovima.
Let je predstavljen sledećim podacima:
ID leta (jedna reč, maksimalno 10 karaktera)
oznaka aerodroma mesta polaska (jedna reč, maksimalno 3 karaktera)
oznaka aerodroma mesta dolaska (jedna reč, maksimalno 3 karaktera)
dužina leta u km (prirodna vrednost)
broj_presedanja (prirodna vrednost)
Učitati letove iz ulazne datoteke u statički niz.
Cena leta računa se na sledeći način:
Svako presedanje smanjuje cenu leta za 5€
Dužina leta manja od 5000km --> 1km = 0,5€
Dužina leta između 5000km i 10000km (>= 5000km, < 10000km) --> 1km = 0.75€
Dužina leta veća ili jednaka 10000km --> 1km = 1€
U izlaznu datoteku ispisati ID, oznaku aerodroma mesta polaska i cenu svih letova ka x aerodromu (x je zadat kao argument komandne linije). Ukoliko ne postoji nijedan let ka zadatom aerodromu u izlaznu datoteku ispisati: "Nema letova ka zadatom aerodromu!".
Naziv izlazne datoteke formirati tako da bude letovi_ka_<x>.txt
.
Primer ulazne datoteke:
11-B LAX JFK 3974 1
118-AW NSW VIE 15975 3
87-SH LAX JFK 3974 0
03-PQ SAW JFK 11036 2
JU-45 NRT VIE 9128 2
LN-78-T AUH SAW 2987 1
QAT-87 AUH VIE 4238 2
QAT-257 AUH VIE 4238 1
Primer poziva programa:
./let letovi.txt VIE
Primer izlazne datoteke letovi_ka_VIE.txt
:
118-AW NSW 15960.00
JU-45 NRT 6836.00
QAT-87 AUH 2109.00
QAT-257 AUH 2114.00
Primer poziva programa:
./let letovi.txt LAX
Primer izlazne datoteke letovi_ka_LAX.txt
:
Nema letova ka zadatom aerodromu!
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_SIZE 30
6#define MAX_NAME 11
7#define MAX_FLIGHT 4
8#define OUT_NAME_MAX 51
9
10typedef struct let_st {
11 char ID[MAX_NAME];
12 char aerodrom_polazak[MAX_FLIGHT];
13 char aerodrom_dolazak[MAX_FLIGHT];
14 int duzina;
15 int broj_presedanja;
16} LET;
17
18FILE *safe_fopen(char *, char *);
19void ucitaj_letove(FILE *, LET[], int *);
20void ispisi_letove(FILE *, LET [], char *, int);
21float izracunaj_cenu(LET);
22
23int main(int argc, char **args) {
24 LET letovi[MAX_SIZE];
25 int n;
26 char out_name[OUT_NAME_MAX];
27
28 if(argc != 3) {
29 printf("Primer poziva programa: ./let letovi.txt VIE\n");
30 exit(EXIT_FAILURE);
31 }
32
33 FILE *in = safe_fopen(args[1], "r");
34
35 strcpy(out_name, "letovi_ka_");
36 strcat(out_name, args[2]);
37 strcat(out_name, ".txt");
38 FILE *out = safe_fopen(out_name, "w");
39
40 ucitaj_letove(in, letovi, &n);
41 fclose(in);
42
43 ispisi_letove(out, letovi, args[2], n);
44 fclose(out);
45
46 return EXIT_SUCCESS;
47}
48
49FILE *safe_fopen(char *filename, char *mode) {
50 FILE *f = fopen(filename, mode);
51
52 if(f == NULL) {
53 printf("Greska prilikom otvaranja datoteke %s!\n", filename);
54 exit(EXIT_FAILURE);
55 }
56
57 return f;
58}
59
60void ucitaj_letove(FILE *in, LET letovi[], int *pn) {
61 int i = 0;
62 while(fscanf(in, "%s %s %s %d %d",
63 letovi[i].ID,
64 letovi[i].aerodrom_polazak,
65 letovi[i].aerodrom_dolazak,
66 &letovi[i].duzina,
67 &letovi[i].broj_presedanja
68 ) != EOF) {
69 i++;
70 }
71 *pn = i;
72}
73
74
75void ispisi_letove(FILE *out, LET letovi[], char *x, int n) {
76 int i;
77 int br = 0;
78
79 for(i = 0;i < n;i++) {
80
81 if(strcmp(letovi[i].aerodrom_dolazak, x) == 0) {
82 br++;
83 fprintf(out, "%s %s %0.2f\n",
84 letovi[i].ID,
85 letovi[i].aerodrom_polazak,
86 izracunaj_cenu(letovi[i])
87 );
88 }
89 }
90
91 if(br == 0) {
92 fprintf(out, "Nema letova ka zadatom aerodromu! \n");
93 }
94}
95
96float izracunaj_cenu(LET let) {
97 float cena = 0;
98
99 if(let.duzina < 5000) {
100 cena += let.duzina * 0.5;
101 } else if(let.duzina >= 5000 && let.duzina < 10000) {
102 cena += let.duzina * 0.75;
103 } else if(let.duzina > 10000){
104 cena += let.duzina;
105 }
106
107 cena += -5 * let.broj_presedanja;
108 return cena;
109}