Pice

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

Dat je niz od maksimalno 20 pica. Učitati n pica ako su opisane sledećim podacima:

  • naziv (jedna reč, do 30 karaktera)

  • cena (u dinarima, realna vrednost)

  • precnik (u cm, celobrojna vrednost)

  • vegetarijanska (jedna reč, do 2 karaktera, "da" ili "ne")

  • pun_naziv (više reči, određeno opisom u zadatku)

Ispisati prosečnu cenu pice. Ispisati sve nazive pica veće od površine zadate argumentom komandne linije. Površina pice nalazi se formulom:

\[P = (\frac{R}{2})^2 \pi\]

Pi proceniti na 2 decimale. Formirati string od naziva, veličine pice i reči vegetarijanska ako je pica vegetarijanska. Veličine pice mogu biti:

  • mala - ako je prečnik manji od 25

  • srednja - ako je prečnik između 25 i 40

  • velika - ako je prečnik veći od 40

Formirano ime upisati u polje pun_naziv i ispisati ga. Ispisati koliko ima vegetarijanskih pica.

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đena pice površine veće od unete argumentom komandne linije, izaći sa status kodom 2

Primer poziva programa:

./a.out 500.00 < pice.txt

Primer ulazne datoteke pice.txt:

6
Kapricoza 739.99 32 ne
Madjarica 800.00 32 ne
Margarita 350.00 24 da
Mediteran 1529.99 50 ne
Tuna 1350.00 52 ne
Vegetarijana 379.99 24 da

Ispis programa na standardnom izlazu:

Prosecna pica kosta: 858.33 dinara.
Pice koje su vece od unete povrsine: Kapricoza Madjarica Mediteran Tuna 

Kapricoza srednja
Madjarica srednja
Margarita mala vegetarijanska
Mediteran velika
Tuna velika
Vegetarijana mala vegetarijanska

Ima 2 vegetarijanskih pica u ponudi.

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_PICA 20
  6#define MAX_NAZIV 31
  7#define MAX_VEGE 3
  8#define MAX_SREDJEN_NAZIV 54
  9
 10
 11typedef struct pica_st {
 12    char naziv[MAX_NAZIV];
 13    double cena;
 14    int precnik;
 15    char vege[MAX_VEGE];
 16    char pun_naziv[MAX_SREDJEN_NAZIV];
 17} PICA;
 18
 19void ucitaj_pice(PICA *, int *);
 20double suma_cena(PICA *, int);
 21double prosek_cena(PICA *, int);
 22void ispisi_vece(PICA *, int, double);
 23int sredjeni_nazivi(PICA *, int);
 24
 25int main(int argc, char **argv) {
 26
 27    PICA pice[MAX_PICA];
 28    int n, i;
 29
 30    if(argc != 2) {
 31        printf("Primer poziva: %s 500.00\n", argv[0]);
 32        exit(1);
 33    }
 34
 35    ucitaj_pice(pice, &n);
 36    double prosek = prosek_cena(pice, n);
 37    printf("Prosecna pica kosta: %.2lf dinara.\n", prosek);
 38    
 39    double trazena_povrsina = atof(argv[1]);
 40    ispisi_vece(pice, n, trazena_povrsina);
 41    
 42    int br_veg = sredjeni_nazivi(pice, n);
 43    printf("\n");
 44    for(i = 0; i < n; i++) {
 45        printf("%s\n", pice[i].pun_naziv);
 46    }
 47    printf("\nIma %d vegetarijanskih pica u ponudi.\n", br_veg);
 48    
 49    return 0;
 50}
 51
 52void ucitaj_pice(PICA *p, int *pn) {
 53
 54    int i;
 55
 56    do {
 57        scanf("%d", pn);
 58    } while (*pn <= 0 || *pn > MAX_PICA);
 59
 60    for (i = 0; i < *pn; i++) {
 61        scanf("%s %lf %d %s", p[i].naziv, &p[i].cena, &p[i].precnik, p[i].vege);
 62    }
 63}
 64
 65double suma_cena(PICA *p, int n) {
 66    int i;
 67    double suma = 0;
 68    
 69    for(i = 0; i < n; i++) {
 70        suma += p[i].cena;
 71    }
 72    
 73    return suma;
 74}
 75
 76double prosek_cena(PICA *p, int n) {
 77    return suma_cena(p, n) / n;
 78}
 79
 80void ispisi_vece(PICA *p, int n, double povrsina) {
 81    int i;
 82    int nadjena = 0;
 83    printf("Pice koje su vece od unete povrsine: ");
 84    for(i = 0; i < n; i++) {
 85        float temp = p[i].precnik * p[i].precnik * 3.14 / 4;
 86        if(temp > povrsina) {
 87            printf("%s ", p[i].naziv);
 88            nadjena = 1;
 89        }
 90    }
 91    printf("\n");
 92    
 93    if (nadjena == 0) {
 94        printf("Nije pronadjena pica veca od unete povrsine!\n");
 95        exit(2);
 96    }
 97}
 98
 99int sredjeni_nazivi(PICA *p, int n) {
100    int i, j, br_veg = 0;
101    for(i = 0; i < n; i++) {
102        char naziv[MAX_SREDJEN_NAZIV];
103        strcpy(naziv, p[i].naziv);
104        if (p[i].precnik < 25) {
105            strcat(naziv, " mala");
106        } else if (p[i].precnik <= 40) {
107            strcat(naziv, " srednja");
108        } else {
109            strcat(naziv, " velika");
110        }
111        
112        if (strcmp(p[i].vege, "da") == 0) {
113            strcat(naziv, " vegetarijanska");
114            br_veg++;
115        }
116        strcpy(p[i].pun_naziv, naziv);
117    }
118    
119    return br_veg;
120}