Zadatak „Hipermarket”

Section author: Petar Marić <petarmaric@uns.ac.rs>

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

  • cena (pozitivan realan broj)
  • broj prodatih artikala (prirodan broj)
  • trgovačka marža u procentima (pozitivan realan broj)
  • naziv (jedna reč, do 20 karaktera)

Formirati novi statički niz struktura i upisati ga u zadatu izlaznu datoteku, pri čemu se struktura zarada_st sastoji od sledećih polja:

  • ostvarena zarada (zaokružena na 2 decimale, koristiti "%7.2f" format specifikator)
  • naziv (koristiti funkciju strcpy prilikom kopiranja iz strukture artikal_st)

Primer poziva:

./hipermarket artikli.txt zarada.txt

sa zadatim ulazom u datoteci artikli.txt:

  40.00  20  5.0 Politika
  50.00 800 10.5 Hleb
2219.99   2 30.0 Parmezan
 118.36  76 12.3 Mleko

i očekivanim izlazom u datoteci zarada.txt:

  40.00 Politika
4200.00 Hleb
1331.99 Parmezan
1106.43 Mleko

Primer rešenja

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAZIV 20+1
#define MAX_NIZ 30

struct artikal_st {
    double cena;
    unsigned broj_prodatih;
    double trgovacka_marza;
    char naziv[MAX_NAZIV];
};

struct zarada_st {
    double zarada;
    char naziv[MAX_NAZIV];
};


FILE *safe_fopen(char filename[], char mode[], int error_code);
void ucitaj_artikle(FILE *in, struct artikal_st artikli[], int *n);
double odredi_zaradu(struct artikal_st artikal);
void transform(struct artikal_st artikli[], struct zarada_st zarade[], int n);
void snimi_zarade(FILE *out, struct zarada_st zarade[], int n);


int main(int arg_num, char **args) {
    if (arg_num != 3) {
        printf("USAGE: %s IN_FILENAME OUT_FILENAME\n", args[0]);
        exit(42);
    }

    char *in_filename = args[1];
    char *out_filename = args[2];

    FILE *in  = safe_fopen(in_filename,  "r", 1);
    FILE *out = safe_fopen(out_filename, "w", 2);

    struct artikal_st artikli[MAX_NIZ];
    struct zarada_st zarade[MAX_NIZ];
    int n;

    ucitaj_artikle(in, artikli, &n);
    transform(artikli, zarade, n);
    snimi_zarade(out, zarade, n);

    fclose(in);
    fclose(out);

    return 0;
}

FILE *safe_fopen(char filename[], char mode[], int error_code) {
    FILE *fp = fopen(filename, mode);
    if(fp == NULL) {
        printf("Can't open '%s'!\n", filename);
        exit(error_code);
    }
    return fp;
}

void ucitaj_artikle(FILE *in, struct artikal_st artikli[], int *n) {
    *n = 0;
    while(fscanf(
        in, "%lf %u %lf %s",
        &artikli[*n].cena,
        &artikli[*n].broj_prodatih,
        &artikli[*n].trgovacka_marza,
         artikli[*n].naziv
    ) != EOF) {
        (*n)++;
    }
}

double odredi_zaradu(struct artikal_st artikal) {
    return artikal.cena * artikal.broj_prodatih * artikal.trgovacka_marza / 100;
}

void transform(struct artikal_st artikli[], struct zarada_st zarade[], int n) {
    int i;
    for(i=0; i<n; i++) {
        strcpy(zarade[i].naziv, artikli[i].naziv);

        zarade[i].zarada = odredi_zaradu(artikli[i]);
    }
}

void snimi_zarade(FILE *out, struct zarada_st zarade[], int n) {
    int i;
    for(i=0; i<n; i++) {
        fprintf(
            out, "%7.2f %s\n",
            zarade[i].zarada,
            zarade[i].naziv
        );
    }
}