Taksi¶
Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>
Iz zadate ulazne datoteke učitati podatke u jednostruko spregnutu
listu, pri čemu se struktura taksi_st
sastoji od sledećih polja:
naziv_taksija (jedna reč, maksimalno 20 karaktera),
vrsta_vozila (jedna reč, maksimalno 8 karaktera – dozvoljene vrednosti su
limuzina
ikaravan
),cena_po_km (realan broj) i
zauzetost (jedna reč, maksimalno 8 karaktera).
Struktura taksi_st
dodatno sadrži i polje potrebno za formiranje jednostruko spregnute liste.
Na osnovu zadatog parametra novac
i vrstaVozila
iz formirane liste upisati podatke
u zadatu izlaznu datoteku, u sledećem rasporedu polja strukture taksi_st
:
vrsta_vozila,
naziv_taksija,
cena_po_km i
zauzetost.
Ako je zauzetost
označena sa “+” neophodno je promeniti vrednost na slobodan
,
a ako je označena sa “-“ parametar zauzetost
postaviti na vrednost zauzet
.
U istu izlaznu datoteku potrebno je ispisati još i sledeće informacije:
1. koji taksi će preći potencijalno najveću kilometražu na osnovu prosleđenog argumenta komandne linije novac
,
2. koliko će ukupno zaraditi kompanija od zauzetih taksija (na osnovu prosleđenog argumenta komandne linije novac
koji je na raspolaganju za vožnju) ukoliko od svakog pređenog kilometra uzima 10%,
3. koliko ima taksija koji su slobodni i odgovaraju prosleđenom argumentu komandne linije vrstaVozila
.
Primer poziva programa:
./zad taxi.txt 2500 limuzina izvestaj.txt
sa zadatim parametrom novac = 2500
, zadatim ulazom u datoteci taxi.txt
i sa zadatim
parametrom vrstaVozila = limuzina
:
Halo karavan 15.5 -
Maxi karavan 10.4 +
Mega limuzina 13.3 +
Crveni karavan 9.7 +
Pink limuzina 3.9 -
Grand limuzina 21.7 +
Beli karavan 12.1 +
Lux limuzina 30.0 +
Cool limuzina 10.4 -
i očekivanim izlazom u datoteci izvestaj.txt
:
karavan Halo 15.5 zauzet
karavan Maxi 10.4 slobodan
limuzina Mega 13.3 slobodan
karavan Crveni 9.7 slobodan
limuzina Pink 3.9 zauzet
limuzina Grand 21.7 slobodan
karavan Beli 12.1 slobodan
limuzina Lux 30.0 slobodan
limuzina Cool 10.4 zauzet
Za 2500.0 din mozemo se najduze voziti 641.0 km Pink taksijem.
Kompanija ce ukupno ostvariti profit od 750.0 dinara.
Broj taksija koji su slobodni i tip vozila je limuzina: 3.
Primer rešenja¶
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#define MAX_NAZIV 20+1
6#define MAX_VRSTA 8+1
7#define MAX_ZAUZETOST 8+1
8
9typedef struct taxi_st {
10 char naziv[MAX_NAZIV];
11 char vrstaVozila[MAX_VRSTA];
12 float cena_po_km;
13 char zauzetost[MAX_ZAUZETOST];
14
15 struct taxi_st* sledeci;
16}TAXI;
17
18void inicijalizacija(TAXI **glava) {
19 *glava = NULL;
20}
21
22void dodajUListu(TAXI **glava, TAXI *novi) {
23 if(*glava == NULL) {
24 *glava = novi;
25 return;
26 }
27
28 dodajUListu(&((*glava)->sledeci), novi);
29}
30
31TAXI *kreirajNoviElement(char naziv[], char vrsta[],
32 float cena_po_km, char zauzetost[]) {
33 TAXI *novi = (TAXI *)malloc(sizeof(TAXI));
34 if (novi == NULL) {
35 printf("\tNema dovoljno memorije!\n");
36 exit(4);
37 }
38
39 strcpy(novi->naziv, naziv);
40 strcpy(novi->vrstaVozila, vrsta);
41 novi->cena_po_km = cena_po_km;
42
43 if(strcmp(zauzetost,"+") == 0) {
44 strcpy(novi->zauzetost,"slobodan");
45 } else {
46 strcpy(novi->zauzetost,"zauzet");
47 }
48
49 novi->sledeci = NULL;
50
51 return novi;
52}
53
54void ucitaj(FILE *in, TAXI **glava) {
55 char naziv[MAX_NAZIV];
56 char vrsta[MAX_VRSTA];
57 float cena_po_km;
58 char zauzetost[MAX_ZAUZETOST];
59
60 while(fscanf(in, "%s %s %f %s",naziv,vrsta,&cena_po_km,zauzetost) != EOF) {
61 TAXI *novi = kreirajNoviElement(naziv, vrsta, cena_po_km, zauzetost);
62 dodajUListu(glava, novi);
63 }
64}
65
66void sacuvajElement(FILE *izlazna, TAXI *element) {
67 fprintf(izlazna, "%s %s %.1f %s\n",
68 element->vrstaVozila,
69 element->naziv,
70 element->cena_po_km,
71 element->zauzetost);
72}
73
74void sacuvajListu(FILE *izlazna, TAXI *glava) {
75 if(glava != NULL) {
76 sacuvajElement(izlazna, glava);
77 sacuvajListu(izlazna, glava->sledeci);
78 }
79}
80
81void unistiListu(TAXI **glava) {
82 if(*glava != NULL) {
83 unistiListu(&((*glava)->sledeci));
84 free(*glava);
85 *glava = NULL;
86 }
87}
88
89FILE *safe_open(char *imeDatoteke, char *rezim, int kodGreske) {
90 FILE *fp = fopen(imeDatoteke, rezim);
91
92 if (fp == NULL) {
93 printf("\tNije moguce otvoriti datoteku %s!\n", imeDatoteke);
94 exit(kodGreske);
95 }
96
97 return fp;
98}
99
100void algoritam(FILE *izlazna, TAXI *glava, char *vrstaVozila, float novac) {
101 if (glava == NULL) {
102 return;
103 }
104
105 TAXI *najduzi_taxi = NULL;
106 float predjena_km = 0;
107 int brojac = 0;
108 float zaradaKompanije = 0;
109
110 while(glava != NULL) {
111 predjena_km = novac/glava->cena_po_km;
112 if(najduzi_taxi == NULL) {
113 najduzi_taxi = glava;
114 } else if(novac/najduzi_taxi->cena_po_km < predjena_km) {
115 najduzi_taxi = glava;
116 }
117
118 if(strcmp(glava->zauzetost,"zauzet") == 0) {
119 zaradaKompanije += predjena_km*0.1*glava->cena_po_km;
120 }
121
122 if(strcmp(glava->zauzetost,"slobodan") == 0
123 && strcmp(glava->vrstaVozila, vrstaVozila) == 0) {
124 brojac++;
125 }
126
127 glava = glava->sledeci;
128 }
129
130 fprintf(izlazna,"\nZa %.1f din mozemo se najduze voziti",novac);
131 fprintf(izlazna," %.1f km",novac/najduzi_taxi->cena_po_km);
132 fprintf(izlazna," %s taksijem.", najduzi_taxi->naziv);
133
134 fprintf(izlazna,"\nKompanija ce ukupno ostvariti profit");
135 fprintf(izlazna," od %.1f dinara.",zaradaKompanije);
136
137 fprintf(izlazna,"\nBroj taksija koji su slobodni i tip vozila je");
138 fprintf(izlazna," %s: %d.",vrstaVozila, brojac);
139}
140
141int main(int brArg, char **args) {
142 if(brArg != 5) {
143 printf("\tNiste dobro pozvali program!\n");
144 exit(3);
145 }
146
147 float novac = atof(args[2]);
148 char *vrstaVozila = args[3];
149
150 FILE *ulazna = safe_open(args[1], "r", 1);
151 FILE *izlazna = safe_open(args[4], "w", 2);
152
153 TAXI *glava;
154
155 inicijalizacija(&glava);
156 ucitaj(ulazna, &glava);
157 sacuvajListu(izlazna, glava);
158 algoritam(izlazna,glava,vrstaVozila,novac);
159 unistiListu(&glava);
160
161 fclose(ulazna);
162 fclose(izlazna);
163
164 return 0;
165}