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}