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 i

  • cena (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