Advertisement
Guest User

koment

a guest
Dec 15th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.85 KB | None | 0 0
  1. /*Iz zadate ulazne datoteke učitati statički niz struktura, pri čemu se struktura prevoznik_st sastoji od sledećih polja:
  2.  
  3. naziv operatera (jedna reč, do 20 karaktera)
  4. cena karte (pozitivan realan broj)
  5. maksimalna masa besplatnog prtljaga (pozitivan realan broj)
  6. doplata za prekomerni prtljag po kilogramu (pozitivan realan broj)
  7. 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:
  8.  
  9. ukupna cena leta (zaokružena na 2 decimale, koristiti "%7.2f" format specifikator)
  10. naziv operatera (koristiti funkciju strcpy prilikom kopiranja iz strukture prevoznik_st)
  11. Primer poziva:
  12.  
  13. ./letovi 23.5 avioprevoznici.txt cene.txt
  14. sa masa=23.5 i zadatim ulazom u datoteci avioprevoznici.txt:
  15.  
  16. JAT       150.0 2.5 1.5
  17. Wizz       52.3 0.0 7.0
  18. Lufthansa 210.0 7.0 2.5
  19. Delta     180.0 6.5 1.0
  20. i očekivanim izlazom u datoteci cene.txt:
  21.  
  22. 181.50 JAT
  23. 216.80 Wizz
  24. 251.25 Lufthansa
  25. 197.00 Delta */
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29.  
  30. #define MAX_NAZIV 20+1
  31. #define MAX_NIZ 30
  32.  
  33. struct prevoznik_st { // struktura koja predstavlja jednog avio prevoznika, svako polje je jedna rec iz ulazne datoteke
  34.     char operater[MAX_NAZIV];
  35.     double cena_karte;
  36.     double max_masa_besplatnog_prtljaga;
  37.     double cena_po_kg;
  38. };
  39.  
  40. struct cena_st { // transformisana gornja struktura koju cini ime prevoznika i cena koja se racuna po formuli
  41.     double ukupna_cena;
  42.     char operater[MAX_NAZIV];
  43. };
  44.  
  45.  
  46. FILE *safe_fopen(char filename[], char mode[], int error_code); // za bezbedno otvaranje
  47. void ucitaj_prevoznike(FILE *in, struct prevoznik_st prevoznici[], int *n); // ucitava prevoznike iz fajla u niz struktura
  48. double odredi_ukupnu_cenu(struct prevoznik_st prevoznik, double masa); // odredjuje ukupnu cenu za jednog prevoznika na osnovu date formule
  49. void transform(struct prevoznik_st prevoznici[], struct cena_st cene[], int n,
  50. double masa); // transformise prevoznik_st u cena_st tj pravi cena_st na osnovu prevoznik_st
  51. void snimi_cene(FILE *out, struct cena_st cene[], int n); // ispisuje cena_st na izlazni fajl
  52.  
  53.  
  54. int main(int arg_num, char **args) {
  55.     if (arg_num != 4) { // ako nema 4 argumenta nesto nije u redu tj prosledili smo manje ili vise nego sto je trebalo
  56.         printf("USAGE: %s MASA IN_FILENAME OUT_FILENAME\n", args[0]);
  57.         exit(42);
  58.     }
  59.  
  60.     double masa = atof(args[1]); // prvi argument, mora da se konvertuje u float
  61.     char *in_filename = args[2]; // druga dva argumenta tj ime ulaznog fajla iz kojeg se cita i ime izlaznog fajla u koji upisujemo
  62.     char *out_filename = args[3];
  63.  
  64.     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
  65.     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
  66.  
  67.     struct prevoznik_st prevoznici[MAX_NIZ]; // staticki prazni nizovi koji ce prihvatiti strukture
  68.     struct cena_st cene[MAX_NIZ];
  69.     int n; // broj ucitanih iz ulaznog fajla
  70.  
  71.     ucitaj_prevoznike(in, prevoznici, &n); // saljemo n po adresi da bismo ga direktno promenili preko funkcije
  72.     transform(prevoznici, cene, n, masa);// transformacija
  73.     snimi_cene(out, cene, n); // cuvanje na izlazni fajl
  74.  
  75.     fclose(in);
  76.     fclose(out); // zatvaranje fajlova
  77.  
  78.     return 0;
  79. }
  80.  
  81. FILE *safe_fopen(char filename[], char mode[], int error_code) {
  82.     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
  83.     if(fp == NULL) {
  84.         printf("Can't open '%s'!\n", filename);
  85.         exit(error_code);
  86.     }
  87.     return fp;
  88. }
  89.  
  90. void ucitaj_prevoznike(FILE *in, struct prevoznik_st prevoznici[], int *n) {
  91.     *n = 0; // inicijalizujemo duzinu na 1, koristimo operator '*' tj dereferenciranje jer smo prosledili adresu
  92.     while(fscanf(
  93.         in, "%s %lf %lf %lf",
  94.          prevoznici[*n].operater,
  95.         &prevoznici[*n].cena_karte, // ucitavamo jedan ceo red, svaki podatak upisujemo u njegovo polje
  96.         &prevoznici[*n].max_masa_besplatnog_prtljaga, // indeksiramo preko *n jer nam je ono vrednost trenutnog indeksa, povecavamo ga nakon svakog upisa
  97.         &prevoznici[*n].cena_po_kg
  98.     ) != EOF) { // ucitavamo dok povratna vrednost fscanfa ne bude EOF tj dok ne dodjemo do kraja fajla
  99.         (*n)++;
  100.     }
  101. }
  102.  
  103. double odredi_ukupnu_cenu(struct prevoznik_st prevoznik, double masa) {
  104.     double base = prevoznik.cena_karte; // baza ukupne cene
  105.  
  106.     double extra_masa = masa - prevoznik.max_masa_besplatnog_prtljaga;
  107.     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;
  108.         base += extra_masa * prevoznik.cena_po_kg;
  109.     }
  110.  
  111.     return base;
  112. }
  113.  
  114. void transform(struct prevoznik_st prevoznici[], struct cena_st cene[], int n,
  115. double masa) {
  116.     int i;
  117.     for(i=0; i<n; i++) { // prolazimo kroz sve prevoznike i od svakog uzmemo ime i upisemo u ime novog cena_st clana
  118.         strcpy(cene[i].operater, prevoznici[i].operater);
  119.  
  120.         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)
  121.     }                                                                   // te podatke izvlacimo iz svakog prevoznika posebno
  122. }
  123.  
  124. void snimi_cene(FILE *out, struct cena_st cene[], int n) {
  125.     int i;
  126.     for(i=0; i<n; i++) { // ispis cele strukture na izlazni fajl
  127.         fprintf(
  128.             out, "%7.2f %s\n",
  129.             cene[i].ukupna_cena,
  130.             cene[i].operater
  131.         );
  132.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement