Vina

Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>

Dat je niz od maksimalno 30 vina. Učitati n vina ako su vina opisana sledećim podacima:

  • naziv (jedna reč, do 30 karaktera)

  • osnovna_cena (u dinarima, celobrojna vrednost)

  • kolicina (u litrima, realna vrednost)

  • godiste (celobrojna vrednost)

  • tip (jedna reč, do 10 karaktera)

Izmeniti naziv tako da se umesto _ koristi prazan prostor, prvo slovo uveća, ostala umanje. Ispisati nazive svih vina tipa unetog pomoću argumenta komandne linije. Proceniti cenu vina formulom:

\[cena = \frac{( osnovna_cena + (2024 - godište) * 100 ) * količina}{tip}\]

Gde je tip koeficijent određen vrednošću polja tip i ima vrednosti:

  • crveno - 0.66

  • roze - 1

  • belo - 1.33

Ispisati cene vina.

U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0 (EXIT_SUCCESS). Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:

  • U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa sa status kodom 1 (EXIT_FAILURE)

  • Ako nije pronađeno vino tipa unetog argumentom komandne linije, izaći sa status kodom 2

  • Ako tip nekog od vina nije belo, crveno ili roze, izaći sa status kodom 3

Primer poziva programa:

./a.out belo < vina.txt

Primer ulazne datoteke vina.txt:

7
VRANAC 1000 1 2020 crveno
FRESCOBALDI_CICINIS 1500 1 2020 belo
PINOT_NOIR 1200 1.5 2017 crveno
ALEXANDRIA 300 0.75 2021 roze
ZDREBCEVA_KRV 300 1 2024 crveno
REGINA 500 0.7 2022 roze
STARI_GRAD 200 1 2021 belo

Ispis programa na standardnom izlazu:

Vina datog tipa:
Frescobaldi Cicinis
Stari Grad

Vranac 2121.21
Frescobaldi Cicinis 1428.57
Pinot Noir 4318.18
Alexandria 450.00
Zdrebceva Krv 454.55
Regina 490.00
Stari Grad 375.94

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_VINA 20
  6#define MAX_NAZIV 31
  7#define MAX_TIP 11
  8
  9typedef struct vino_st {
 10    char naziv[MAX_NAZIV];
 11    int osnovna_cena;
 12    double kolicina;
 13    int godiste;
 14    char tip[MAX_TIP];
 15} VINO;
 16
 17void ucitaj_vina(VINO *, int *);
 18void izmena_naziva(VINO *, int);
 19void ispis_po_tipu(VINO *v, int n, char *tip);
 20void nadji_cene(VINO *v, int n);
 21
 22int main(int argc, char **argv) {
 23
 24    VINO vina[MAX_VINA];
 25    int n;
 26
 27    if(argc != 2) {
 28        printf("Primer poziva: %s belo\n", argv[0]);
 29        exit(1);
 30    }
 31    
 32    ucitaj_vina(vina, &n);
 33    izmena_naziva(vina, n);
 34    ispis_po_tipu(vina, n, argv[1]);
 35    nadji_cene(vina, n);
 36
 37    return 0;
 38}
 39
 40void ucitaj_vina(VINO *v, int *pn) {
 41
 42    int i;
 43
 44    do {
 45        scanf("%d", pn);
 46    } while (*pn <= 0 || *pn > MAX_VINA);
 47
 48    for (i = 0; i < *pn; i++) {
 49        scanf("%s %d %lf %d %s", v[i].naziv, &v[i].osnovna_cena, &v[i].kolicina, &v[i].godiste, v[i].tip);
 50    }
 51}
 52
 53void izmena_naziva(VINO *v, int n) {
 54    int i, j;
 55    
 56    for(i = 0; i < n; i++) {   
 57        int prvo_slovo = 1;
 58        for(j = 0; j < strlen(v[i].naziv); j++) {
 59            if ((v[i].naziv[j] >= 'A') && (v[i].naziv[j] <= 'Z') && (prvo_slovo == 0)) {
 60                v[i].naziv[j] += 32;
 61            } else if ((v[i].naziv[j] >= 'a') && (v[i].naziv[j]) <= 'z' && (prvo_slovo == 1)) {
 62                v[i].naziv[j] -= 32;
 63            }
 64        
 65            prvo_slovo = 0;
 66            if (v[i].naziv[j] == '_') {
 67                v[i].naziv[j] = ' ';
 68                prvo_slovo = 1;
 69            }
 70        }
 71    }
 72}
 73
 74void ispis_po_tipu(VINO *v, int n, char *tip) {
 75    int i, nadjeno = 0;
 76    printf("Vina datog tipa:\n");
 77    for(i = 0; i < n; i++) {
 78        if (strcmp(v[i].tip, tip) == 0) {
 79            printf("%s\n", v[i].naziv);
 80            nadjeno = 1;
 81        }
 82    }
 83    printf("\n");
 84    if (!nadjeno) {
 85        printf("Nije nadjeno vino datog tipa.\n");
 86        exit(2);
 87    }
 88}
 89
 90void nadji_cene(VINO *v, int n) {
 91   int i;
 92   for(i = 0; i < n; i++) {
 93      double tip = 0;
 94      if (strcmp(v[i].tip, "belo") == 0) {
 95          tip = 1.33;
 96      } else if (strcmp(v[i].tip, "roze") == 0) {
 97          tip = 1;
 98      } else if (strcmp(v[i].tip, "crveno") == 0) {
 99          tip = 0.66;
100      } else {
101          printf("Tip vina %s je neispravan: %s\n", v[i].naziv, v[i].tip);
102          exit(3);
103      }
104          
105      double cena = (v[i].osnovna_cena + (2024 - v[i].godiste) * 100) * v[i].kolicina / tip;
106      printf("%s %.2lf\n", v[i].naziv, cena);
107   }
108   
109}