/* tuoterek.c */ /* Ohjelma lukee tiedostoa TUOTTEET.DAT, joka on muotoa: Volvo | 12300 | 1 Audi | 55700 | 2 Saab | 1500 | 4 Volvo | 123400 | 1 Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden yhteishinnat ja kappalem„„r„t sek„ koko varaston yhteishinnan ja kappalem„„r„n. */ #include #include #include "mjonot.h" void hopo(void) {double d; scanf("%lf",&d); } /* jotta float scanf -toimisi*/ typedef struct{ char nimike[20]; double hinta; int kpl; } Tuote_tyyppi; #define MAX_TUOTTEITA 20 typedef struct{ Tuote_tyyppi yhteensa; int tuotteita; Tuote_tyyppi tuotteet[MAX_TUOTTEITA]; } Tuotteet_tyyppi; int etsi_tuote(Tuotteet_tyyppi *varasto, char *tuote) { int i; char ituote[80], isana[80]; kopioi_jono(N_S(ituote),tuote); jono_isoksi(ituote); for (i=0; ituotteita; i++) { kopioi_jono(N_S(isana),varasto->tuotteet[i].nimike); if ( wildmat(jono_isoksi(isana),ituote) == 0 ) return i; } return -1; } int lisaa_tuote(Tuotteet_tyyppi *varasto, char *tuote) { int i = varasto->tuotteita; if ( i >= MAX_TUOTTEITA ) return -1; kopioi_jono(N_S(varasto->tuotteet[i].nimike),tuote); varasto->tuotteet[i].hinta = 0.0; varasto->tuotteet[i].kpl = 0; varasto->tuotteita = i+1; return i; } int ynnaa_tuote(Tuotteet_tyyppi *varasto, Tuote_tyyppi *tuote) { int i; i = etsi_tuote(varasto,tuote->nimike); if ( i < 0 ) i = lisaa_tuote(varasto,tuote->nimike); if ( i < 0 ) return 1; varasto->tuotteet[i].hinta += tuote->hinta * tuote->kpl; varasto->tuotteet[i].kpl += tuote->kpl; varasto->yhteensa.hinta += tuote->hinta * tuote->kpl; varasto->yhteensa.kpl += tuote->kpl; return 0; } int rivi_tuotteeksi(char *rivi, Tuote_tyyppi *tuote) { char *p,apu[80]; int j; kopioi_jono(N_S(apu),rivi); p = palanen(apu,"|",&j); poista_tyhjat(p); kopioi_jono(N_S(tuote->nimike),p); p = palanen(NULL,"|",&j); if ( sscanf(p,"%lf",&tuote->hinta) != 1 ) return 1; p = palanen(NULL,"|",&j); if ( sscanf(p,"%d",&tuote->kpl) != 1 ) return 1; return 0; } int lue_tuotteet(Tuotteet_tyyppi *varasto) { FILE *f; char rivi[80]; Tuote_tyyppi tuote; f = fopen("TUOTTEET.DAT","rt"); if (!f) return 1; while ( !feof(f) ) { if ( f_lue_jono(f,N_S(rivi)) <= OLETUS ) continue; if ( rivi_tuotteeksi(rivi,&tuote) || ynnaa_tuote(varasto,&tuote) ) printf("Rivill„ \"%s\" jotain pieless„!\n",rivi); } fclose(f); return 0; } void tulosta_tuote(Tuote_tyyppi *tuote) { printf("%-20s %7.0lf %4d\n",tuote->nimike,tuote->hinta,tuote->kpl); } void tulosta_tuotteet(Tuotteet_tyyppi *varasto) { int i; printf("\n\n\n"); printf("-------------------------------------------\n"); for (i=0; ituotteita; i++) tulosta_tuote(&varasto->tuotteet[i]); printf("-------------------------------------------\n"); tulosta_tuote(&varasto->yhteensa); printf("-------------------------------------------\n"); printf("\n\n\n"); } int main(void) { Tuotteet_tyyppi varasto; kopioi_jono(N_S(varasto.yhteensa.nimike),"Yhteens„"); varasto.yhteensa.hinta = 0.0; varasto.yhteensa.kpl = 0; varasto.tuotteita = 0; if (lue_tuotteet(&varasto)) { printf("Tuotteita ei saada luetuksi!\n"); return 1; } tulosta_tuotteet(&varasto); return 0; }