Letovanje autobusom

Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>

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

  • prevoznik (jedna reč, maksimalno 30 karaktera),

  • stanje (jedna reč, maksimalno 10 karaktera),

  • cena_karte (realan broj) i

  • broj_mesta (prirodan broj).

Na osnovu parametara traženi_prevoznik i prijavljeno_putnika koji se prihvataju preko standardnog ulaza, proveriti da li autobusi traženog prevoznika mogu da prevezu sve prijavljene putnike do letovališta. Voditi računa o tome da na put mogu krenuti isključivo ispravni autobusi.

Napisati funkciju koja ispisuje informaciju o maksimalnoj mogućoj zaradi svih autobusa zaokruženu na dve decimale. Za izračunavanje koristiti formulu: max_zarada = cena_karte * broj_mesta.

U izlaznu datoteku obracun.txt ispisati sve informacije o učitanim ispravnim autobusima (vrednost polja cena_karte zaokružiti na dve decimale), podatak o tome da li autobusi traženog prevoznika mogu da prevezu sve prijavljene putnike do letovališta, kao i informaciju o maksimalnoj mogućoj zaradi svih autobusa.

Primer poziva programa:

./zad Lasta autobusi.txt 138 obracun.txt

sa zadatim ulazom u datoteci autobusi.txt:

Lasta ispravan 980.99 80
Benko ispravan 950.89 70
Kimmel neispravan 1100.00 65
Raketa neispravan 905.99 78
Benko neispravan 985.80 53
Raketa ispravan 1030.40 55
Kimmel ispravan 1070.35 61
Lasta ispravan 960.55 64
Lasta neispravan 1010.50 72
Benko ispravan 975.70 63
Raketa ispravan 900.89 80
Kimmel ispravan 1045.99 55

Očekivani izlaz u izlaznoj datoteci obracun.txt je sledeći:

Raspolozivi ispravni autobusi:

Lasta ispravan 980.99 80
Benko ispravan 950.89 70
Raketa ispravan 1030.40 55
Kimmel ispravan 1070.35 61
Lasta ispravan 960.55 64
Benko ispravan 975.70 63
Raketa ispravan 900.89 80
Kimmel ispravan 1045.99 55

Prevoznik Lasta na letovanje moze da preveze sve prijavljene putnike.
Maksimalna moguca zarada svih autoprevoznika iznosi 786720.42 dinara.

U slučaju da traženi prevoznik ne može da preveze sve prijavljene putnike očekivani izlaz je sledeći:

Raspolozivi ispravni autobusi:

Lasta ispravan 980.99 80
Benko ispravan 950.89 70
Raketa ispravan 1030.40 55
Kimmel ispravan 1070.35 61
Lasta ispravan 960.55 64
Benko ispravan 975.70 63
Raketa ispravan 900.89 80
Kimmel ispravan 1045.99 55

Prevoznik Lasta ne moze da preveze sve prijavljene putnike na letovanje!
Maksimalna moguca zarada svih autoprevoznika iznosi 786720.42 dinara.

Primer rešenja

  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4
  5#define MAX_PREVOZNIK 30+1
  6#define MAX_STANJE 10+1
  7#define MAX_NIZ 10
  8
  9typedef struct autobus_st
 10{
 11    char prevoznik[MAX_PREVOZNIK];
 12    char stanje[MAX_STANJE];
 13    double cena_karte;
 14    unsigned broj_mesta;
 15}Autobus;
 16
 17FILE *otvori(char *name,char *mode)
 18{
 19    FILE *f = fopen(name,mode);
 20
 21    if(f == NULL)
 22    {
 23        printf("Problem prilikom otvaranja %s datoteke.",name);
 24        exit(-2);
 25    }
 26
 27    return f;
 28}
 29
 30void ucitavanje(FILE *in, Autobus *a, int *n)
 31{
 32    *n=0;
 33    while(fscanf(in,"%s %s %lf %u",
 34                    a[*n].prevoznik,
 35                    a[*n].stanje,
 36                    &a[*n].cena_karte,
 37                    &a[*n].broj_mesta) != EOF)
 38    {
 39        (*n)++;
 40    }
 41}
 42
 43void letovanje(FILE *out,Autobus *a, int n, int prijav_put,char *tr_prev)
 44{
 45    int i, suma=0;
 46    for(i=0;i<n;i++)
 47    {
 48        if(strcmp(a[i].prevoznik,tr_prev) == 0 
 49            && strcmp(a[i].stanje,"ispravan") == 0)
 50        {
 51            suma+=a[i].broj_mesta;
 52        }
 53    }
 54
 55    if(suma >= prijav_put)
 56    {
 57        fprintf(out,"\nPrevoznik %s na letovanje moze da preveze",tr_prev);
 58        fprintf(out," sve prijavljene putnike.");
 59    }
 60    else
 61    {
 62        fprintf(out,"\nPrevoznik %s ne moze da preveze",tr_prev);
 63        fprintf(out,"sve prijavljene putnike na letovanje!");
 64    }
 65}
 66
 67void zarada(FILE *out,Autobus *a, int n)
 68{
 69    double suma=0.0;
 70    int i;
 71
 72    for(i=0;i<n;i++)
 73    {
 74        suma+=a[i].cena_karte*a[i].broj_mesta;
 75    }
 76    fprintf(out,"\nMaksimalna moguca zarada svih autoprevoznika");
 77    fprintf(out," iznosi %.2lf dinara.",suma);
 78}
 79
 80void ispis(FILE *out, Autobus *a,int n)
 81{
 82    fprintf(out,"Raspolozivi ispravni autobusi:\n\n");
 83    int i;
 84    for(i=0;i<n;i++)
 85    {
 86        if(strcmp(a[i].stanje,"ispravan") == 0)
 87        {
 88            fprintf(out,"%s %s %.2lf %u\n",
 89                        a[i].prevoznik,
 90                        a[i].stanje,
 91                        a[i].cena_karte,
 92                        a[i].broj_mesta);
 93        }
 94    }
 95}
 96
 97//primer poziva ./a.out Lasta autobusi.txt 138 obracun.txt
 98int main(int brojArgum, char **argumenti)
 99{
100    Autobus a[MAX_NIZ];
101    FILE *in,*out;
102    char *trazeni_prevoznik = argumenti[1];
103    int n, broj,prijavljeno_putnika=atoi(argumenti[3]);
104
105    if(brojArgum != 5)
106    {
107        printf("Pogresan broj unetih argumenata!");
108        exit(-1);
109    }
110
111    in = otvori(argumenti[2],"r");
112    out = otvori(argumenti[4],"w");
113
114    ucitavanje(in,a,&n);
115    ispis(out,a,n);
116    letovanje(out,a,n,prijavljeno_putnika,trazeni_prevoznik);
117    zarada(out,a,n);
118
119    fclose(in);
120    fclose(out);
121
122    return 0;
123}