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}