/***************************************************************************/ /* ** T U O T E R A K . C ** ** ** Tuoterekisterin rakenteeseen oleellisesti liittyvi„ aliohjelmia. ** ** Aliohjelmat: ** tuotteen_kokonaismaara - summaa tuotteen tuote-erien m„„r„t ** tulosta_tuote - tulostaa tuotteen valittuun tiedostoon ** vastaa_oululaisen_hapankorppu ** - sijoittaa vakiotuotteen (testaus) ** alusta_tuote_era - alustaa tuote-er„n kent„t tyhjiksi ** alusta_tuote - alustaa tuotteen kent„t tyhjiksi ** lisaa_tuote_era - lis„„ uuden tuote-er„n tuotteeseen ** lisaa_tuote - lis„„ uuden tuotteen rakenteeseen ** luo_tuotetaulukko - luo tuoteosoitintaulukon ** kysy_kentta - lukee vastauksen kentt„„n ** kysy_tuote_era - kysyy tuote-er„n kenttien tiedot ** kysy_tuotteen_tiedot - kysyy tuotteen kaikkien kenttien tiedot ** lisaa_tuotemaaraa - lis„„ tuotem„„r„„ lis„„m„ll„ uuden tuote-er„n ** tai p„ivitt„m„ll„ viimeisint„ tuote-er„„ ** vahenna_tuotemaaraa - v„hent„„ tuotem„„r„„ poistamalla tuote-eri„ ** ja/tai p„ivitt„m„ll„ tuote-eri„ ** tuotemaaran_lisays - lis„„ tuotteen m„„r„„ ** tuotemaaran_vahennys - v„hent„„ tuotteen m„„r„„ ** ** ** Ruokatavaraliikkeen tuoterekisterin yleinen tietorakenne on seuraava: ** ** ** Rekisteri_tyyppi ** ** --------------- ** liikkeen_nimi | Ruokatori | ** tiedoston_nimi | RUOKATOR | ** max_tuotteita | 300 | ** tuotteita | 186 | ** nykytuote | 5 | ** **tuotteet | o | Tuote_tyyppi ** -------|------- ------------- ** | | 110001 | tuotenumero ** | | A-piim„ 1l| nimi ** v | 3 | sailyvyysaika ** |-------------| | 10 | taydennysraja ** tuotteet[0] | o-------+--------->| 8 | keskim_myynti ** |-------------| | 3.15 | yksikkohinta ** tuotteet[1] | o-------+------->| | o | tuote_erat ** |-------------| | | | | o | viimeinen_era ** tuotteet[2] | o-------+---->| | ---|--|------ ** |-------------| | | | | Tuote_era_tyyppi ** ... | o-------+--? | | | | ------------ ** |-------------| | | |------->| 12 | maara ** | o-------+--? | | | | 24.2.1992| pvm ** |-------------| | | | | o | seuraava ** | o-------+--? | | | ---|-------- ** |-------------| | | |--------|----------------| ** | | | | | ------------ | ** osoitintaulukko | | |-->| 2 | | ** tuotteisiin | | | 22.2.1992| | | ** | | ------------- | o | | ** | |--->| 110002 | -----|------ | ** |--------------| | Prima sarv| | | ** | | 90 | |--> ...V ** | | 30 | ** | | 12 | ** | | 3.90 | ** | | o | ** | | o-----+---------------| ** | ------------- ---|--------- | ** |--->| 110003 | | ------------ | ** | Mokka Katr| |------->| 60 | | ** | 120 | | 5.2.1992 | | ** | 60 | | o | | ** | 18 | -----|------ | ** | 10.90 | | | ** | o | |-----> ...V ** | | o------+---------------| ** ---|--------- | ** | ------------ | ** |------->| 90 | | ** | 9.2.1992 | | ** | o | | ** -----|------ | ** | | ** |-----> ...V ** ** ** ** Tietorakenne on sekarakenne, jossa on perusrakenteena Rekisteri_tyyppi, ** joka sis„lt„„ tuoterekisterin perustiedot (liikkeen nimi, tiedoston nimi, ** tuotteiden maksimim„„r„ ja tuotteiden todellinen m„„r„) sek„ indeksin ** k„sitelt„v„„n tuotteeseen ja osoittimen taulukkoon tuotteet, jossa on ** osoittimet varsinaisiin tuotetietoihin. ** ** Tietorakenne Tuote_tyyppi sis„lt„„ yksitt„isen tuotteen tiedot (tuote- ** numero, nimi, s„ilyvyysaika (pv), t„ydennysraja, keskim. myynti/pv ja ** yksikk”hinta (mk)) sek„ osoittimen vanhimpaan tuote-er„„n ja viimeksi ** lis„ttyyn tuote-er„„n. ** ** Yksitt„isen tuotteen tuote-er„t seuraavat toisiaan p„iv„m„„r„n mukaan ** j„rjestettyn„ linkitetyksi listaksi - my”hemmin tullut tuote-er„ seuraa ** aiemmin tulleita. Tuote_era_tyyppi sis„lt„„ yksitt„isen tuote-er„n ** tuotem„„r„n ja liikkeeseen saapumisp„iv„m„„r„n sek„ osoittimen seuraa- ** vaan tuote-er„„n. ** ** Tuotteista tarvitaan usein kokonaistuotem„„r„„, joka saadaan laskemalla ** yhteen yksitt„isten tuote-erien tuotem„„r„t. Myydyt tuotteet v„hennet„„n ** aina vanhimmasta tuote-er„st„ alkaen ja kun jokin tuote-er„ loppuu koko- ** naan, se tuhotaan rakenteesta. Inventaarip„ivityksen muutokset tehd„„n ** my”s vanhimpaan tuote-er„„n. Kutakin p„iv„m„„r„„ kohti voi olla vain yksi ** tuote-er„, joten jos samana p„iv„n„ lis„t„„n jonkin tuotteen tuotem„„r„„ ** useammin kuin kerran, yhdistet„„n n„m„ lis„ykset yhdeksi tuote-er„ksi. ** ** ** Tekij„: Iiris Suutarinen 9.4.1992 ** */ #include #include #include #include "mjonot.h" #include "tuote.h" #define OLET_ALKU 22 /* Oletuksen alkusarake */ #define VAKANEN 36 /* V„k„sen alkusarake */ /***************************************************************************/ int /* Tuotteen kokonaism„„r„. */ tuotteen_kokonaismaara( /* */ Tuote_tyyppi *tuote /* s Tuote, jonka kokonaism„„r„ lasketaan. */ ) /* ** Funktiolla summataan tuotteen kaikkien tuote-erien m„„r„t k„ym„ll„ l„pi ** tuote-erist„ muodostettu linkitetty lista. ** --------------------------------------------------------------------------*/ { Tuote_era_tyyppi *era; int summa = 0; era = tuote->tuote_erat; while (era) { summa += era->maara; era = era->seuraava; } return summa; } /***************************************************************************/ void tulosta_tuote( /* */ FILE *f, /* t Tiedosto, johon tulostetaan. */ Tuote_tyyppi *tuote /* s Tulostettava tuote. */ ) /* ** Funktiolla tulostetaan tuote valittuun tiedostoon. ** Mik„li numeerisessa kent„ss„ on tyhj„ arvo, ei sit„ tulosteta! ** ** Tulostus: tiedostoon f ** Kutsuu: int_jonoksi, double_jonoksi, N_S (makro) ---------------------------------------------------------------------------*/ { char st[80]; Tuote_era_tyyppi *era; int varastomaara = tuotteen_kokonaismaara(tuote); fprintf(f," %s %s\n", tuote->tuotenumero, tuote->nimi); fprintf(f," varastom„„r„: %s", int_jonoksi(N_S(st),varastomaara,"%d")); fprintf(f," s„ilyvyysaika: %s pv", int_jonoksi(N_S(st),tuote->sailyvyysaika,"%d")); fprintf(f," t„ydennysraja: %s\n", int_jonoksi(N_S(st),tuote->taydennysraja,"%d")); fprintf(f," keskim.myynti/pv: %s", int_jonoksi(N_S(st),tuote->keskim_myynti,"%d")); fprintf(f," yksikk”hinta: %s mk\n", double_jonoksi(N_S(st),tuote->yksikkohinta,"%4.2lf")); era = tuote->tuote_erat; /* ylim„„r„inen testitulostus tuote-erist„ */ while (era) { fprintf(f," m„„r„: %4d", era->maara); fprintf(f," pvm: %02d.%02d.%02d\n", era->pvm.pv,era->pvm.kk,era->pvm.vv); era = era->seuraava; } } /***************************************************************************/ int /* 0 = uuden tuote-er„n lis„„minen onnistui */ lisaa_tuote_era( /* 1 = tuote-er„n lis„„minen ei onnistu */ Tuote_era_tyyppi *era, /* s Lis„tt„v„ tuote-er„. */ Tuote_tyyppi *tuote /* s,t Tuote, jonka m„„r„„ lis„t„„n. */ ) /* ** Funktiolla lis„t„„n uusi tuote-er„ rekisteriss„ olevaan tuotteeseen. ** Uusi tuote-er„ liitet„„n tuote-er„nketjun viimeiseksi. ** ---------------------------------------------------------------------------*/ { Tuote_era_tyyppi *uusi_era; uusi_era = malloc(sizeof(Tuote_era_tyyppi)); if (uusi_era == NULL) return 1; uusi_era->maara = era->maara; uusi_era->pvm = era->pvm; uusi_era->seuraava = NULL; if (tuote->tuote_erat == NULL) /* lis„t„„n ensimm„inen er„ */ tuote->tuote_erat = uusi_era; if (tuote->viimeinen_era != NULL) /* on jo aikaisempia eri„ - liitet„„n */ tuote->viimeinen_era->seuraava = uusi_era; /* uusi er„ ketjun loppuun */ tuote->viimeinen_era = uusi_era; /* uusi er„ viimeiseksi er„ksi */ return 0; } void vastaa_oululaisen_hapankorppu(Tuote_tyyppi *tuote) { Tuote_era_tyyppi era; strcpy(tuote->tuotenumero, "102010"); strcpy(tuote->nimi, "Oululaisen hapankorppu 350g"); tuote->sailyvyysaika = 90; tuote->taydennysraja = 20; tuote->keskim_myynti = 7; tuote->yksikkohinta = 13.90; tuote->tuote_erat = NULL; tuote->viimeinen_era = NULL; era.maara = 60; era.pvm.pv = 21; era.pvm.kk = 3; era.pvm.vv = 1992; lisaa_tuote_era(&era,tuote); era.maara = 85; era.pvm.pv = 11; era.pvm.kk = 4; era.pvm.vv = 1992; lisaa_tuote_era(&era,tuote); } /***************************************************************************/ void /* */ alusta_tuote_era( /* */ Tuote_era_tyyppi *era /* t Alustettava tuote-er„. */ ) /* ** Aliohjelmalla alustetaan tuotteen tuote-er„n tiedot. ** M„„r„ksi alustetaan tyhj„ arvo, p„iv„m„„r„ksi nykyinen p„iv„m„„r„ ja ** osoitin seuraavaan tuote-er„„n alustetaan NULL:ksi. ** ** Kutsuu: selvita_nyky_pvm ---------------------------------------------------------------------------*/ { era->maara = TYHJA_ARVO; selvita_nyky_pvm(&era->pvm); era->seuraava = NULL; } /***************************************************************************/ void /* */ alusta_tuote( /* */ Rekisteri_tyyppi *rekisteri, /* s Rekisteri, jonka tuote alustetaan. */ Tuote_tyyppi *tuote /* t Alustettava tuote. */ ) /* ** Aliohjelmalla alustetaan tuotteen tiedot rekisterin nykytuotteen mukaan. ** Ne kent„t, jotka halutaan lis„yksess„ tyhjent„„, tyhjennet„„n. ** Mik„li rekisteriss„ ei ole tuotteita, tyhjennet„„n kaikki kent„t. ** ---------------------------------------------------------------------------*/ { if (rekisteri->nykytuote >= rekisteri->tuotteita) { strcpy(tuote->tuotenumero, ""); strcpy(tuote->nimi, ""); tuote->sailyvyysaika = TYHJA_ARVO; tuote->taydennysraja = TYHJA_ARVO; tuote->keskim_myynti = TYHJA_ARVO; tuote->yksikkohinta = TYHJA_ARVO; tuote->tuote_erat = NULL; tuote->viimeinen_era = NULL; } else { *tuote = *rekisteri->tuotteet[rekisteri->nykytuote]; tuote->tuotenumero[0] = 0; tuote->nimi[0] = 0; tuote->tuote_erat = NULL; tuote->viimeinen_era = NULL; } } /***************************************************************************/ int /* 0 = uuden tuotteen lis„„minen onnistui */ lisaa_tuote( /* 1 = tuotteen lis„„minen ei onnistu */ Rekisteri_tyyppi *rekisteri, /* s,t K„sitelt„v„ tuoterekisteri. */ Tuote_tyyppi *tuote /* s Lis„tt„v„ tuote. */ ) /* ** Funktiolla lis„t„„n uusi tuote rekisteriin. EI tarkisteta, esiintyyk” ** tuote jo ennest„„n. Mik„li tilaa ei ole, yritet„„n allokoida uutta ** tilaa 50% maksimim„„r„„n n„hden lis„„. ** ** Algoritmi: Jos uudelle tuotteelle saadaan varattua tilaa, lis„t„„n ** uuden paikan osoite taulukkoon ja kopioidaan tiedot ** uuteen paikkaan. ---------------------------------------------------------------------------*/ { Tuote_tyyppi *uusi_tuote, **uusi_tila; int uusi_koko; if (rekisteri->tuotteita >= rekisteri->max_tuotteita) { uusi_koko = 3*(rekisteri->max_tuotteita)/2; uusi_tila = realloc(rekisteri->tuotteet,uusi_koko*sizeof(Tuote_tyyppi *)); if (!uusi_tila) return 1; rekisteri->tuotteet = uusi_tila; rekisteri->max_tuotteita = uusi_koko; } uusi_tuote = malloc(sizeof(Tuote_tyyppi)); if (uusi_tuote == NULL) return 1; *uusi_tuote = *tuote; rekisteri->tuotteet[rekisteri->tuotteita] = uusi_tuote; rekisteri->nykytuote = rekisteri->tuotteita; rekisteri->tuotteita++; return 0; } static char *EI_VOI_LUODA = " Tuotteille ei saada varattua tilaa muistista!"; /***************************************************************************/ char /* NULL = onnistui */ *luo_tuotetaulukko( /* muut = virheilmoitus merkkijonona */ Rekisteri_tyyppi *rekisteri, /* t K„sitelt„v„ rekisteri. */ int koko /* s Rekisterin maksimituotem„„r„. */ ) /* */ /* ** Funktiolla luodaan rekisteriin tyhj„ osoitintaulukko tuotteisiin. ** Mik„li tuotetaulukkoa ei voida luoda, palautetaan virheilmoitus. ** Mik„li taulukko saadaan luotua, alustetaan se NULL-osoittimilla. ---------------------------------------------------------------------------*/ { int i; rekisteri->tuotteet = malloc(koko*(sizeof(Tuote_tyyppi *))); rekisteri->max_tuotteita = koko; rekisteri->tuotteita = 0; if (!rekisteri->tuotteet) return EI_VOI_LUODA; for (i=0; ituotteet[i] = NULL; return NULL; } /***************************************************************************/ int /* */ kysy_kentta( /* */ char *viesti, /* s Viesti, joka tulee n„yt”lle. */ char *jono, /* t Jono, johon kent„n vastaus luetaan. */ int max_koko /* s Jonon maksimipituus. */ ) /* */ /* ** Funktiolla luetaan vastaus kentt„„n. ** ** Globaalit: POIS (jono, jolla sy”tt” katkaistaan) ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: lue_jono_oletus, kopioi_jono, poista_tyhjat ---------------------------------------------------------------------------*/ { char apu[80]; int paluu; kopioi_jono(N_S(apu),jono); paluu = lue_jono_oletus(viesti,OLET_ALKU,VAKANEN,apu,N_S(apu)); if (paluu < OLETUS) return 1; if (strcmp(apu,POIS) == 0) return 1; kopioi_jono(jono,max_koko,apu); poista_tyhjat(jono); return 0; } /***************************************************************************/ int /* 0 = hommat OK */ kysy_tuote_era( /* 1 = halutaan pois kysymyksest„ */ Tuote_era_tyyppi *era /* s,t T„ytett„v„n tuote-er„n tiedot. */ ) /* */ /* ** Funktiolla kysell„„n tuote-er„n tiedot. Oletusarvoina k„ytet„„n ** tuote-er„n alkuper„isi„ tietoja. ** Mik„li luettaessa pit„„ poistua, lopetetaan kysymykset ** ja tuote-er„n alkuper„iset tiedot s„ilyv„t - palautetaan 1. ** Numeeriset kent„t muutetaan merkkijonoiksi ennen kysymist„. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: jono_intiksi, int_jonoksi ---------------------------------------------------------------------------*/ { #define LUE_KENTTA(jono,viesti) if ( kysy_kentta(viesti,N_S(jono)) ) return 1; Tuote_era_tyyppi apu_era; char st[80]; apu_era = *era; printf("\n"); int_jonoksi(N_S(st),apu_era.maara,"%d"); LUE_KENTTA(st, " Lis„tt„v„ m„„r„"); if (st[0] == 0) return 1; apu_era.maara = jono_intiksi(st,"%d"); *era = apu_era; return 0; #undef LUE_KENTTA } /***************************************************************************/ int /* 0 = hommat OK */ kysy_tuotteen_tiedot( /* 1 = halutaan pois kysymyksest„ */ Tuote_tyyppi *tuote /* s,t T„ytett„v„n tuotteen tiedot. */ ) /* */ /* ** Funktiolla kysell„„n tuotteen tiedot. Oletusarvoina k„ytet„„n ** tuotteen alkuper„isi„ tietoja. ** Mik„li luettaessa pit„„ poistua, lopetetaan kysymykset ** ja tuotteen alkuper„iset tiedot s„ilyv„t - palautetaan 1. ** Numeeriset kent„t muutetaan merkkijonoiksi ennen kysymist„. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: jono_intiksi, int_jonoksi, jono_doubleksi, double_jonoksi ---------------------------------------------------------------------------*/ { #define LUE_KENTTA(jono,viesti) if ( kysy_kentta(viesti,N_S(jono)) ) return 1; Tuote_tyyppi apu_tuote; char st[80]; apu_tuote = *tuote; LUE_KENTTA(apu_tuote.tuotenumero, " Tuotenumero"); if (apu_tuote.tuotenumero[0] == 0) return 1; LUE_KENTTA(apu_tuote.nimi, " Nimi"); int_jonoksi(N_S(st),apu_tuote.sailyvyysaika,"%d"); LUE_KENTTA(st, " S„ilyvyysaika pv"); apu_tuote.sailyvyysaika = jono_intiksi(st,"%d"); int_jonoksi(N_S(st),apu_tuote.taydennysraja,"%d"); LUE_KENTTA(st, " T„ydennysraja"); apu_tuote.taydennysraja = jono_intiksi(st,"%d"); int_jonoksi(N_S(st),apu_tuote.keskim_myynti,"%d"); LUE_KENTTA(st, " Keskim. myynti/pv"); apu_tuote.keskim_myynti = jono_intiksi(st,"%d"); double_jonoksi(N_S(st),apu_tuote.yksikkohinta,"%4.2lf"); LUE_KENTTA(st, " Yksikk”hinta mk"); apu_tuote.yksikkohinta = jono_doubleksi(st,"%lf"); *tuote = apu_tuote; return 0; #undef LUE_KENTTA } /***************************************************************************/ /* 0 = hommat OK */ int /* 0 = lis„„minen onnistui */ lisaa_tuotemaaraa( /* 1 = lis„„minen ei onnistunut */ Tuote_tyyppi *tuote, /* s,t Tuote, jonka m„„r„„ lis„t„„n. */ Tuote_era_tyyppi *era /* s Lis„tt„v„ tuote-er„. */ ) /* */ /* ** Funktiolla lis„t„„n tuotteen m„„r„„. Jos lis„t„„n ensimm„inen tuote-er„ ** tai lis„ys tapahtuu eri p„iv„n„ kuin viimeisin lis„ys on tehty, ** luodaan ja lis„t„„n uusi tuote-er„, muutoin lis„t„„n viimeisimm„n ** tuote-er„n m„„r„„. ---------------------------------------------------------------------------*/ { if ( tuote->viimeinen_era == NULL || sama_pvm(&tuote->viimeinen_era->pvm,&era->pvm) != 0 ) return lisaa_tuote_era(era,tuote); tuote->viimeinen_era->maara += era->maara; return 0; } /***************************************************************************/ /* 0 = hommat OK */ int /* 0 = v„hent„minen onnistui */ vahenna_tuotemaaraa( /* muu arvo = n„in monta kpl j„i v„hent„m„tt*/ Tuote_tyyppi *tuote, /* s,t Tuote, jonka m„„r„„ v„hennet„„n. */ int maara /* s V„hennett„v„ tuotem„„r„. */ ) /* */ /* ** Funktiolla v„hennet„„n tuotteen m„„r„„ aloittamalla v„hent„minen ** vanhimmasta tuote-erist„. Mik„li jokin er„ loppuu kokonaan, se poistetaan ** rakenteesta ja jatketaan tuotem„„r„n v„hent„mist„ seuraavasta er„st„. ** Mik„li haluttu m„„r„ saadaan v„hennetty„, palautetaan funktion arvona 0. ** Jos taas tuote loppuu kesken, palautetaan v„hent„m„tt„ j„„nyt tuotem„„r„. ** ---------------------------------------------------------------------------*/ { Tuote_era_tyyppi *era,*apu; era = tuote->tuote_erat; /* V„hennet„„n tuotem„„r„„, kunnes haluttu m„„r„ on v„hennetty ja niin kauan kuin tuotetta on yleens„ j„ljell„ */ while (maara > 0 && era != NULL) { if (era->maara <= maara) { maara -= era->maara; apu = era; era = era->seuraava; free(apu); /* Poistetaan loppunut tuote-er„ */ tuote->tuote_erat = era; /* Tuote-er„ketjun alku v„hennyksen j„lkeen */ if (era == NULL) /* Jos tuote-er„t loppuivat, p„ivitett„v„ */ tuote->viimeinen_era = NULL; /* my”s osoitinta viimeiseen er„„n */ } else { era->maara -= maara; maara = 0; } } /* while (maara > 0 && era != NULL) */ return maara; } /***************************************************************************/ /* 0 = hommat OK */ void /* */ tuotemaaran_lisays( /* */ Tuote_tyyppi *tuote /* s,t Tuote, jonka m„„r„„ lis„t„„n. */ ) /* */ /* ** Funktiolla lis„t„„n tuotteen m„„r„„. Sy”tteeksi pyydet„„n lis„tt„v„„ ** tuotem„„r„„ ja jos sy”tteen lukeminen onnistuu, yritet„„n lis„t„ tuotteen ** m„„r„„. Jos lis„„minen ei onnistu, tulostetaan virheilmoitus. Lis„yksen ** onnistuessa tulostetaan tuotetiedot lis„ystiedoilla p„ivitettyin„. ** ** Tulostus: N„ytt””n ** Sy”tt”: P„„tteelt„ ** Kutsuu: tulosta_tuote, alusta_tuote_era, kysy_tuote_era, ** lisaa_tuote_maaraa ---------------------------------------------------------------------------*/ { Tuote_era_tyyppi era; printf("\n"); tulosta_tuote(stdout,tuote); alusta_tuote_era(&era); if (kysy_tuote_era(&era) == 0) { if (lisaa_tuotemaaraa(tuote,&era)) printf(" Tuote-er„n lis„„minen ei onnistunut!\n"); else { printf("\n Lis„ys suoritettu:\n"); tulosta_tuote(stdout,tuote); } } } /***************************************************************************/ /* 0 = hommat OK */ void /* */ tuotemaaran_vahennys( /* */ Tuote_tyyppi *tuote /* s,t Tuote, jonka m„„r„„ v„hennet„„n. */ ) /* */ /* ** Funktiolla v„hennet„„n tuotteen m„„r„„. Sy”tteeksi pyydet„„n myyty„ tuote- ** m„„r„„ ja jos sy”tteen lukeminen onnistuu, v„hennet„„n tuotteen m„„r„„. ** Jos myyty„ m„„r„„ ei saada v„hennetty„ kokonaan, tulostetaan virheilmoitus. ** V„hennyksen onnistuessa tulostetaan tuotetiedot v„hennystiedoilla ** p„ivitettyin„. ** ** Tulostus: N„ytt””n ** Sy”tt”: P„„tteelt„ ** Kutsuu: tulosta_tuote, kysy_myyty_tuotemaara, vahenna_tuotemaaraa ---------------------------------------------------------------------------*/ { int maara, vahennys_virhe; printf("\n"); tulosta_tuote(stdout,tuote); if (kysy_myyty_tuotemaara(&maara) == 0) { if ( (vahennys_virhe = vahenna_tuotemaaraa(tuote,maara)) != 0 ) printf("\n %d kappaletta j„i v„hent„m„tt„!\n",vahennys_virhe); else { printf("\n V„hennys suoritettu:\n"); tulosta_tuote(stdout,tuote); } } }