Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Iz zadate ulazne datoteke učitati statički niz struktura, pri čemu se struktura prevoznik_st sastoji od sledećih polja:
- naziv operatera (jedna reč, do 20 karaktera)
- cena karte (pozitivan realan broj)
- maksimalna masa besplatnog prtljaga (pozitivan realan broj)
- doplata za prekomerni prtljag po kilogramu (pozitivan realan broj)
- Na osnovu zadate mase prtljaga masa (pozitivan realan broj) formirati novi statički niz struktura i upisati ga u zadatu izlaznu datoteku, pri čemu se struktura cena_st sastoji od sledećih polja:
- ukupna cena leta (zaokružena na 2 decimale, koristiti "%7.2f" format specifikator)
- naziv operatera (koristiti funkciju strcpy prilikom kopiranja iz strukture prevoznik_st)
- Primer poziva:
- ./letovi 23.5 avioprevoznici.txt cene.txt
- sa masa=23.5 i zadatim ulazom u datoteci avioprevoznici.txt:
- JAT 150.0 2.5 1.5
- Wizz 52.3 0.0 7.0
- Lufthansa 210.0 7.0 2.5
- Delta 180.0 6.5 1.0
- i očekivanim izlazom u datoteci cene.txt:
- 181.50 JAT
- 216.80 Wizz
- 251.25 Lufthansa
- 197.00 Delta */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_NAZIV 20+1
- #define MAX_NIZ 30
- struct prevoznik_st { // struktura koja predstavlja jednog avio prevoznika, svako polje je jedna rec iz ulazne datoteke
- char operater[MAX_NAZIV];
- double cena_karte;
- double max_masa_besplatnog_prtljaga;
- double cena_po_kg;
- };
- struct cena_st { // transformisana gornja struktura koju cini ime prevoznika i cena koja se racuna po formuli
- double ukupna_cena;
- char operater[MAX_NAZIV];
- };
- FILE *safe_fopen(char filename[], char mode[], int error_code); // za bezbedno otvaranje
- void ucitaj_prevoznike(FILE *in, struct prevoznik_st prevoznici[], int *n); // ucitava prevoznike iz fajla u niz struktura
- double odredi_ukupnu_cenu(struct prevoznik_st prevoznik, double masa); // odredjuje ukupnu cenu za jednog prevoznika na osnovu date formule
- void transform(struct prevoznik_st prevoznici[], struct cena_st cene[], int n,
- double masa); // transformise prevoznik_st u cena_st tj pravi cena_st na osnovu prevoznik_st
- void snimi_cene(FILE *out, struct cena_st cene[], int n); // ispisuje cena_st na izlazni fajl
- int main(int arg_num, char **args) {
- if (arg_num != 4) { // ako nema 4 argumenta nesto nije u redu tj prosledili smo manje ili vise nego sto je trebalo
- printf("USAGE: %s MASA IN_FILENAME OUT_FILENAME\n", args[0]);
- exit(42);
- }
- double masa = atof(args[1]); // prvi argument, mora da se konvertuje u float
- char *in_filename = args[2]; // druga dva argumenta tj ime ulaznog fajla iz kojeg se cita i ime izlaznog fajla u koji upisujemo
- char *out_filename = args[3];
- FILE *in = safe_fopen(in_filename, "r", 1); // bezbedno otvaranje, funkcija napravi pokazivace na fajlove i ukoliko nisu null vrati ih mainu a ukoliko jesu zavrsava program
- FILE *out = safe_fopen(out_filename, "w", 2); // prvi argument je ime datoteke, drugi mod za otvaranje, treci je kod greske koja ce biti ispisana ukoliko pokazivac bude null tj ne moze se povezati sa datim fajlom
- struct prevoznik_st prevoznici[MAX_NIZ]; // staticki prazni nizovi koji ce prihvatiti strukture
- struct cena_st cene[MAX_NIZ];
- int n; // broj ucitanih iz ulaznog fajla
- ucitaj_prevoznike(in, prevoznici, &n); // saljemo n po adresi da bismo ga direktno promenili preko funkcije
- transform(prevoznici, cene, n, masa);// transformacija
- snimi_cene(out, cene, n); // cuvanje na izlazni fajl
- fclose(in);
- fclose(out); // zatvaranje fajlova
- return 0;
- }
- FILE *safe_fopen(char filename[], char mode[], int error_code) {
- FILE *fp = fopen(filename, mode); // napravi pokazivac i vidi da li je on uspesno napravljen, ako jeste vraca ga mainu ako nije program se zavrsava
- if(fp == NULL) {
- printf("Can't open '%s'!\n", filename);
- exit(error_code);
- }
- return fp;
- }
- void ucitaj_prevoznike(FILE *in, struct prevoznik_st prevoznici[], int *n) {
- *n = 0; // inicijalizujemo duzinu na 1, koristimo operator '*' tj dereferenciranje jer smo prosledili adresu
- while(fscanf(
- in, "%s %lf %lf %lf",
- prevoznici[*n].operater,
- &prevoznici[*n].cena_karte, // ucitavamo jedan ceo red, svaki podatak upisujemo u njegovo polje
- &prevoznici[*n].max_masa_besplatnog_prtljaga, // indeksiramo preko *n jer nam je ono vrednost trenutnog indeksa, povecavamo ga nakon svakog upisa
- &prevoznici[*n].cena_po_kg
- ) != EOF) { // ucitavamo dok povratna vrednost fscanfa ne bude EOF tj dok ne dodjemo do kraja fajla
- (*n)++;
- }
- }
- double odredi_ukupnu_cenu(struct prevoznik_st prevoznik, double masa) {
- double base = prevoznik.cena_karte; // baza ukupne cene
- double extra_masa = masa - prevoznik.max_masa_besplatnog_prtljaga;
- if (extra_masa > 0) { // ako je ekstra masa veca od 0 dodajemo je, mogli smo samo da kazemo return prevoznik.cena_karte + (masa - prevoznik.max_masa_besplatnog_prtljaga) * prevoznik.cena_po_kg;
- base += extra_masa * prevoznik.cena_po_kg;
- }
- return base;
- }
- void transform(struct prevoznik_st prevoznici[], struct cena_st cene[], int n,
- double masa) {
- int i;
- for(i=0; i<n; i++) { // prolazimo kroz sve prevoznike i od svakog uzmemo ime i upisemo u ime novog cena_st clana
- strcpy(cene[i].operater, prevoznici[i].operater);
- cene[i].ukupna_cena = odredi_ukupnu_cenu(prevoznici[i], masa); // cenu svakog cena_st clana dobijamo po formuli(bazna cena + (masa - max masa besplatnog prtljaga) * cena po kilogramu)
- } // te podatke izvlacimo iz svakog prevoznika posebno
- }
- void snimi_cene(FILE *out, struct cena_st cene[], int n) {
- int i;
- for(i=0; i<n; i++) { // ispis cele strukture na izlazni fajl
- fprintf(
- out, "%7.2f %s\n",
- cene[i].ukupna_cena,
- cene[i].operater
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement