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 i karavan),

  • 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}