Iznajmljivanje sefova

Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>

Iz zadate ulazne datoteke sefovi.txt učitati statički niz struktura, pri čemu se struktura sef_st sastoji od sledećih polja:

  • sifra (jedna reč, maksimalno 5 karaktera),

  • zauzetost (jedna reč, maksimalno 8 karaktera),

  • cena_zakupa (prirodan broj) i

  • tezina_robe (realan broj) – izražena u gramima.

Na osnovu parametra max_tezina koji se prihvata preko standardnog ulaza (izražena u gramima), izračunati cenu zakupa sefa nakon obračunavanja dodatnog poreza (procesu izračunavanja dodatnog poreza podležu isključivo zauzeti sefovi; cena zakupa slobodnih sefova ostaje nepromenjena) na sledeći način:

  • ako je težina robe smeštene u zauzetom sefu veća od vrednosti unetog parametra max_tezina, cena zakupa odgovarajućeg zauzetog sefa uvećava se za 15%

  • u suprotnom, cena zakupa odgovarajućeg zauzetog sefa ostaje nepromenjena.

Potrebno je napisati funkciju koja vraća informaciju o ukupnom broju trenutno slobodnih sefova.

Ispis informacija o svim sefovima nakon obračuna dodatnog poreza i o ukupnom broju trenutno slobodnih sefova potrebno je realizovati u izlaznu datoteku oporezovani.txt. Prilikom ispisivanja realne brojeve zaokružiti na jednu decimalu.

Primer poziva programa:

./zad sefovi.txt 300.0 oporezovani.txt

sa zadatim ulazom u datoteci sefovi.txt:

12bs3 slobodan 150 475.0
x1vbn slobodan 743 230.1
vcrt7 slobodan 28 328.5
K210g zauzet 166 961.6
bQ22a slobodan 494 179.7
sfh55 slobodan 78 889.4
t7vby zauzet 325 305.8
5874w slobodan 583 283.1
e89m0 zauzet 92 231.7
8yumn slobodan 628 149.9

Očekivani izlaz u izlaznoj datoteci oporezovani.txt je sledeći:

Cene sefova nakon oporezivanja:

12bs3 slobodan 150 475.0
x1vbn slobodan 743 230.1
vcrt7 slobodan 28 328.5
K210g zauzet 190 961.6
bQ22a slobodan 494 179.7
sfh55 slobodan 78 889.4
t7vby zauzet 373 305.8
5874w slobodan 583 283.1
e89m0 zauzet 92 231.7
8yumn slobodan 628 149.9

Broj slobodnih sefova: 7

Primer rešenja

  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4
  5#define MAX_NIZ 30
  6#define MAX_ZAUZETOST 8+1
  7#define MAX_SIFRA 5+1
  8
  9typedef struct sef_st
 10{
 11    char sifra[MAX_SIFRA];
 12    char zauzetost[MAX_ZAUZETOST];
 13    unsigned int cena_zakupa;
 14    double tezina_robe;
 15}Sef;
 16
 17FILE *otvori(char *name,char *mode)
 18{
 19    FILE *f = fopen(name,mode);
 20
 21    if(f == NULL)
 22    {
 23        printf("Problem prilikom otvaranja %s datoteke.",name);
 24        exit(-2);
 25    }
 26
 27    return f;
 28}
 29
 30void ucitavanje(FILE *in, Sef *s, int *n)
 31{
 32    *n=0;
 33    while(fscanf(in,"%s %s %u %lf",
 34                    s[*n].sifra,
 35                    s[*n].zauzetost,
 36                    &s[*n].cena_zakupa,
 37                    &s[*n].tezina_robe) != EOF)
 38    {
 39        (*n)++;
 40    }
 41}
 42
 43void srediPodatke(Sef *s, int n, double max_tez)
 44{
 45    int i;
 46    for(i=0;i<n;i++)
 47    {
 48        if(s[i].tezina_robe > max_tez && strcmp(s[i].zauzetost,"zauzet") == 0)
 49        {
 50            s[i].cena_zakupa*=1.15;
 51        }
 52    }
 53}
 54
 55int slobodni(Sef *s,int n)
 56{
 57    int i,count=0;
 58    for(i=0;i<n;i++)
 59    {
 60        if(strcmp(s[i].zauzetost,"slobodan") == 0)
 61        {
 62            count++;
 63        }
 64    }
 65
 66    return count;
 67}
 68
 69void ispisi(FILE *out, Sef *s, int n)
 70{
 71    int i;
 72    fprintf(out,"Cene sefova nakon oporezivanja:\n\n");
 73    for(i=0;i<n;i++)
 74    {    
 75        fprintf(out,"%s %s %u %.1lf\n",
 76                        s[i].sifra,
 77                        s[i].zauzetost,
 78                        s[i].cena_zakupa,
 79                        s[i].tezina_robe);
 80    }
 81    fprintf(out,"\nBroj slobodnih sefova: %d\n",slobodni(s,n));
 82}
 83
 84//primer poziva ./a.out sefovi.txt 300 oporezovani.txt
 85int main(int brojArgum, char **argumenti)
 86{
 87    Sef s[MAX_NIZ];
 88    FILE *in,*out;
 89    double max_tezina = atof(argumenti[2]);
 90    int n, broj;
 91
 92    if(brojArgum != 4)
 93    {
 94        printf("Pogresan broj unetih argumenata!");
 95        exit(-1);
 96    }
 97
 98    in = otvori(argumenti[1],"r");
 99    out = otvori(argumenti[3],"w");
100
101    ucitavanje(in,s,&n);
102    srediPodatke(s,n,max_tezina);
103
104    ispisi(out,s,n);
105
106    fclose(in);
107    fclose(out);
108    return 0;
109}