Paste za zube

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

Ulazna datoteka paste.txt sadrži podatke o pastama za zube u sledećem formatu:

  • naziv (jedna reč, do 30 karaktera)

  • cena (u dinarima, realna vrednost)

  • velicina (u ml, celobrojna vrednost)

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

Učitati podatke u statički niz dužine do 20, potom ispisati prosečnu cenu paste za zube. Ispisati sve nazive pasta za zube veće od veličine zadate argumentom komandne linije, potom ispisati naziv najjeftinije od njih. Izlaznu datoteku sredjeni_nazivi.txt popuniti nazivima pasti takvim da su sva slova izmenjena u velika, znak _ zamenjen razmakom, a u slučaju da je pasta dečija na kraju naziva dodato za decu.

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 pasta za zube veličine veće od unete argumentima komandne linije, izaći sa status kodom 2

  • Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom 3

  • Ako program ne može da otvori izlaznu datoteku, izaći sa status kodom 4

Primer poziva programa:

./a.out 100

Primer ulazne datoteke paste.txt:

Naturokosmetik 199.99 50 da
Sensodyne 769.99 150 ne
Paradontax_Ultra_Clean 599.99 150 ne
Curapox_Enzycal 789.99 75 ne
Dontodent_Kids 119.00 100 da
Colgate_Max_Fresh 419.99 125 ne

Ispis programa na standardnom izlazu:

Prosecna pasta za zube kosta: 483.16 dinara.
Paste za zube od bar 100ml: Sensodyne Paradontax_Ultra_Clean Colgate_Max_Fresh
Najjefinija od njih je: Colgate_Max_Fresh!

Izlazna datoteka:

NATUROKOSMETIK za decu
SENSODYNE
PARADONTAX ULTRA CLEAN
CURAPOX ENZYCAL
DONTODENT KIDS za decu
COLGATE MAX FRESH

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_PASTA 20
  6#define MAX_NAZIV 31
  7#define MAX_DECIJA 3
  8#define MAX_SREDJEN_NAZIV 39
  9
 10typedef struct pasta_st 
 11{
 12    char naziv[MAX_NAZIV];
 13    double cena;
 14    int velicina;
 15    char decija[MAX_DECIJA];
 16} PASTA;
 17
 18FILE *safe_fopen(char *, char *, int);
 19void ucitaj_paste(FILE *, PASTA *, int *);
 20double suma_cena(PASTA *, int);
 21double prosek_cena(PASTA *, int);
 22void ispisi_vece(PASTA *, int, int);
 23void sredjeni_nazivi(FILE *, PASTA *, int);
 24
 25int main(int argc, char **argv) 
 26{
 27
 28    PASTA paste[MAX_PASTA];
 29    int n, trazena_velicina;
 30    double prosek;
 31    FILE *ulazna, *izlazna;
 32
 33    if(argc != 2) 
 34    {
 35        printf("Primer poziva: %s 100\n", argv[0]);
 36        exit(1);
 37    }
 38
 39    ulazna = safe_fopen("paste.txt", "r", 3);
 40    ucitaj_paste(ulazna, paste, &n);
 41    fclose(ulazna);
 42    
 43    prosek = prosek_cena(paste, n);
 44    printf("Prosecna pasta za zube kosta: %.2lf dinara.\n", prosek);
 45    
 46    trazena_velicina = atoi(argv[1]);
 47    ispisi_vece(paste, n, trazena_velicina);
 48    
 49    izlazna = safe_fopen("sredjeni_nazivi.txt", "w", 4);
 50    sredjeni_nazivi(izlazna, paste, n);
 51    fclose(izlazna);
 52    
 53    return 0;
 54}
 55
 56FILE *safe_fopen(char *ime, char *rezim, int kod_greske)
 57{
 58    FILE *pf = fopen(ime, rezim);
 59    
 60    if (pf == NULL)
 61    {
 62        printf("Greska pri otvaranju %s!\n", ime);
 63        exit(kod_greske);
 64    }
 65    
 66    return pf;
 67}
 68
 69void ucitaj_paste(FILE *pf, PASTA *p, int *pn) 
 70{
 71
 72    int i = 0;
 73
 74    while(fscanf(pf, "%s %lf %d %s", p[i].naziv, &p[i].cena, &p[i].velicina, p[i].decija) != EOF)
 75    {
 76        i++;
 77    }
 78    
 79    *pn = i;
 80}
 81
 82double suma_cena(PASTA *p, int n) {
 83    int i;
 84    double suma = 0;
 85    
 86    for(i = 0; i < n; i++) 
 87    {
 88        suma += p[i].cena;
 89    }
 90    
 91    return suma;
 92}
 93
 94double prosek_cena(PASTA *p, int n) {
 95    return suma_cena(p, n) / n;
 96}
 97
 98void ispisi_vece(PASTA *p, int n, int velicina) {
 99    int i, nadjena = 0;
100    PASTA *najjeftinija = NULL;
101    
102    printf("Paste za zube od bar %dml: ", velicina);
103    for(i = 0; i < n; i++) 
104    {
105        if(p[i].velicina > velicina) 
106        {
107            printf("%s ", p[i].naziv);
108            nadjena = 1;
109            if (najjeftinija == NULL || najjeftinija->cena > p[i].cena)
110            {
111                najjeftinija = &p[i];
112            }
113        }
114    }
115    printf("\n");
116    if (nadjena)
117    {
118        printf("Najjefinija od njih je: %s!\n", najjeftinija->naziv);
119    }
120    else
121    {
122        printf("Nije nadjena pasta za zube veca od unete velicine!\n");
123        exit(2);
124    }
125}
126
127void sredjeni_nazivi(FILE *pf, PASTA *p, int n) {
128    int i, j;
129    for(i = 0; i < n; i++) 
130    {
131        char naziv[MAX_SREDJEN_NAZIV];
132        strcpy(naziv, p[i].naziv);
133        for(j = 0; j < strlen(naziv); j++) 
134        {
135            if (naziv[j] >= 'a' && naziv[j] <= 'z') 
136            {
137                naziv[j] -= 32;
138            }
139            if (naziv[j] == '_') 
140            {
141                naziv[j] = ' ';
142            }
143        }
144        if (strcmp(p[i].decija, "da") == 0) 
145        {
146            strcat(naziv, " za decu");
147        }
148        fputs(naziv, pf);
149        fputs("\n", pf);
150    }
151}