Rad carinske službe¶
Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>
Iz zadate ulazne datoteke posiljke.txt
učitati statički niz
struktura, pri čemu se struktura posiljka_st
sastoji od sledećih
polja:
sifra
(jedna reč, maksimalno 5 karaktera),zemlja
(jedna reč, maksimalno 10 karaktera),vrednost
(jedna reč, maksimalno 4 karaktera) – izražena u evrima,tezina
(realan broj) – izražena u gramima icena
(realan broj).
Na osnovu parametra odabrana_zemlja
koji se prihvata preko standardnog
ulaza, izračunati cenu pošiljke nakon carine na sledeći način:
ako je vrednost pošiljke veća od 100 evra, težina veća od 1000 grama i zemlja odgovara vrednosti unetog parametra odabrana_zemlja tada visina cene odgovara visini vrednosti pošiljke uvećane za 18%
u suprotnom, visina cene odgovara visini vrednosti pošiljke.
Preko standardnog ulaza korisnik treba da unese i parametar
vrsta_ispisa čije su moguće vrednosti -1 ili 1 (obavezno realizovati
proveru validnosti unete vrednosti parametra). Vrednost parametra -1
označava da je ispis informacija o svim pošiljkama nakon carine potrebno
realizovati preko standardnog izlaza, dok se u slučaju vrednosti 1
podaci o pošiljkama ispisuju u izlaznu datoteku carinjenje.txt
.
Prilikom ispisa podatke o svim pošiljkama neophodno je sortirati u
opadajućem redosledu zemlje (pomoć: koristiti funkcije za rad sa
stringovima).
Primer poziva programa:
./zad posiljke.txt carinjenje.txt
sa zadatim ulazom u datoteci posiljke.txt
:
12bs3 150e Kina 1750
x1vbn 743e Srbija 2300
vcrt7 28e Francuska 1280
K210g 166e Slovenija 961
bQ22a 494e Nemacka 1797
sfh55 78e Holandija 889
t7vby 325e Holandija 3058
5874w 583e Francuska 2831
e89m0 92e Kina 231
8yumn 628e Slovenija 149
Očekivani izlaz u izlaznoj datoteci carinjenje.txt
ukoliko je
vrednost parametra odabrana_zemlja unetog preko standardnog ulaza
„Slovenija“ je sledeći:
Cene posiljki nakon carinjenja:
x1vbn 743.00 Srbija 743e 2300.0
K210g 166.00 Slovenija 166e 961.0
8yumn 628.00 Slovenija 628e 149.0
bQ22a 494.00 Nemacka 494e 1797.0
e89m0 92.00 Kina 92e 231.0
12bs3 150.00 Kina 150e 1750.0
sfh55 78.00 Holandija 78e 889.0
t7vby 325.00 Holandija 325e 3058.0
vcrt7 28.00 Francuska 28e 1280.0
5874w 583.00 Francuska 583e 2831.0
Očekivani izlaz u izlaznoj datoteci carinjenje.txt
ukoliko je vrednost
parametra odabrana_zemlja unetog preko standardnog ulaza
„Holandija“ je sledeći:
Cene posiljki nakon carinjenja:
x1vbn 743.00 Srbija 743e 2300.0
K210g 166.00 Slovenija 166e 961.0
8yumn 628.00 Slovenija 628e 149.0
bQ22a 494.00 Nemacka 494e 1797.0
e89m0 92.00 Kina 92e 231.0
12bs3 150.00 Kina 150e 1750.0
sfh55 78.00 Holandija 78e 889.0
t7vby 383.50 Holandija 325e 3058.0
vcrt7 28.00 Francuska 28e 1280.0
5874w 583.00 Francuska 583e 2831.0
U slučaju da je vrednost parametra vrsta_ispisa unetog preko
standardnog ulaza „1“, ispis će se vršiti u izlaznoj datoteci
carinjenje.txt
(ako parametar ima vrednost -1 ispis ostaje
nepromenjen, ali se realizuje na standardnom izlazu).
Prilikom unosa parametara koji se zadaju preko standardnog ulaza, format treba da bude sledeći:
Uneti naziv zemlje: Holandija
Uneti broj (-1 - ispis na standardni izlaz / 1 - ispis u datoteku): 1
Primer rešenja¶
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#define MAX_NIZ 30
6#define MAX_ZEMLJA 10+1
7#define MAX_SIFRA 5+1
8#define MAX_VREDNOST 4+1
9
10typedef struct posiljka_st
11{
12 char sifra[MAX_SIFRA];
13 char zemlja[MAX_ZEMLJA];
14 char vrednost[MAX_VREDNOST];
15 double tezina;
16 double cena;
17} Posiljka;
18
19FILE *otvori(char *name,char *mode) {
20 FILE *f = fopen(name,mode);
21
22 if(f == NULL)
23 {
24 printf("Problem prilikom otvaranja %s datoteke.",name);
25 exit(-2);
26 }
27
28 return f;
29}
30
31void ucitavanje(FILE *in, Posiljka *p, int *n)
32{
33 *n=0;
34 while(fscanf(in,"%s %s %s %lf",p[*n].sifra,p[*n].vrednost,
35 p[*n].zemlja,&p[*n].tezina) != EOF)
36 (*n)++;
37}
38
39void srediPodatke(Posiljka *p, int n, char *zemlja)
40{
41 int i,j;
42 for(i=0;i<n;i++)
43 {
44 char temp_vrednost[MAX_VREDNOST] = " ";
45 for(j=0;j<strlen(p[i].vrednost)-1;j++)
46 temp_vrednost[j] = p[i].vrednost[j];
47
48 if(atof(temp_vrednost) > 100 && p[i].tezina > 1000
49 && strcmp(p[i].zemlja,zemlja)==0)
50 p[i].cena = atof(temp_vrednost)*1.18;
51 else
52 p[i].cena = atof(temp_vrednost);
53 }
54}
55
56void sortiraj(Posiljka *p, int n)
57{
58 int i,j;
59 for(i=0;i<n-1;i++)
60 for(j=i+1;j<n;j++)
61 if(strcmp(p[i].zemlja,p[j].zemlja) < 0)
62 {
63 Posiljka temp = p[i];
64 p[i] = p[j];
65 p[j] = temp;
66 }
67}
68
69void ispis(FILE *out, Posiljka *p, int n)
70{
71 sortiraj(p,n);
72 fprintf(out,"Cene posiljki nakon carinjenja:\n\n");
73 int i;
74 for(i=0;i<n;i++)
75 fprintf(out,"%s %.2lf %s %s %.1lf\n",p[i].sifra,p[i].cena,
76 p[i].zemlja,p[i].vrednost,p[i].tezina);
77}
78
79//primer poziva ./a.out posiljke.txt carinjenje.txt
80int main(int brojArgum, char **argumenti)
81{
82 Posiljka p[MAX_NIZ];
83 FILE *in,*out;
84 char zemlja[MAX_ZEMLJA];
85 int n, broj;
86
87 if(brojArgum != 3)
88 {
89 printf("Pogresan broj unetih argumenata!");
90 exit(-1);
91 }
92
93 in = otvori(argumenti[1],"r");
94 out = otvori(argumenti[2],"w");
95
96 printf("Uneti naziv zemlje: ");
97 scanf("%s",zemlja);
98
99 ucitavanje(in,p,&n);
100 srediPodatke(p,n,zemlja);
101
102 do
103 {
104 printf("Uneti broj (-1 - ispis na standardni izlaz");
105 printf(" / 1 - ispis u datoteku): ");
106 scanf("%d",&broj);
107 }while(broj!=-1 && broj!=1);
108
109 if(broj==-1)
110 ispis(stdout,p,n);
111 else
112 ispis(out,p,n);
113
114 fclose(in);
115 fclose(out);
116
117 return 0;
118}
119