/**************/ /* laskukon.c */ /****************************************************************************/ /* ** Alkeellinen taskulaskin. ** ** Toimii sellaisenaan en„„ vain TURBO-C tai BORLAND-C k„„nt„j„n alla. ** ** Ohjelman k„„nt„miseksi tarvitaan projekti, jossa on ** LASKUKON.C ** NAPPULA2.C ** HIIRU.C ** ** Vesa Lappalainen ** 1.8.1992 ** ** Teht„vi„: 1) Laita jakolasku toimimaan. ** ** 2) Tee etumerkin vaihton„pp„in ja tarvittavat toiminnot. ** ** 3) Lis„„ muita laskintoimintoja ** ** 4) Laskin toimii parissa kohti v„„rin! Miten korjaat? ** ** 5) Kirjoita ohjelmasta HP-laskinten tyylinen pinolaskin ** jossa n„yt”ss„ n„kyy 4 tulosta ja n„yt”t ** k„ytt„ytyv„t seuraavasti: ** ** n„pp„ily: n„yt”t: X, Y , Z , T ** [clear all] 0 0 0 0 ** 1 1 0 0 0 ** 23 123 0 0 0 ** [Enter] 123 123 0 0 ** 1 1 123 0 0 ** 0 10 123 0 0 ** [+] 133 0 0 0 ** 4 4 133 0 0 ** ** Eli [Enter] py”r„ytt„„ koko pinoa pyk„l„n oikealle ** monistaen X rekisterin Y rekisteriin. ** ja operaatiot laskevat aina X ja Y rekisterin v„lill„ ** pudottaen samalla pinoa se: X = XopY, Y = Z, Z = T ** Operaation j„lkeen ensimm„inen numeron painallus ** kopioi T = Z, Z = Y, Y = X, ja rupeaa t„ytt„m„„n uutta ** numero X:„„n... ** ** ** */ /****************************************************************************/ #include #include "nappula2.h" /****************************************************************************/ /* Globaalit n„pp„imet: */ typedef enum { /* Tunnetut komennot: */ TYHJA, /* Lopun tunniste */ POISTU, NOLLAA, LISAA, NUMERO, BS, OPER } komento_tyyppi; typedef enum { /* Tunnetut operaattorit: */ EI_OPER, PLUS, MIINUS, KERTO, JAKO, LASKE } operaatio_tyyppi; typedef enum { /* K„ytetyt laskurityypit ja niiden tunnisteet */ TYHJA_LASKURI, /* Lopun tunniste */ NAYTTO, VALITULOS } laskuri_tunniste_tyyppi; nappain_tyyppi nappaimet[] = { /* x y lev kork */ { 'X',"eXit" ,{{ 2, 2},{ 0, 0}}, POISTU , 0 }, { 'N',"Nollaa" ,{{ 2, 5},{ 0, 0}}, NOLLAA , 0 }, { 'I',"+1" ,{{10, 5},{ 0, 0}}, LISAA , NAYTTO }, { 8 ,"BS" ,{{14, 5},{ 0, 0}}, BS , NAYTTO }, { '7',"7" ,{{30, 9},{ 0, 0}}, NUMERO , 7 }, { '8',"8" ,{{34, 9},{ 0, 0}}, NUMERO , 8 }, { '9',"9" ,{{38, 9},{ 0, 0}}, NUMERO , 9 }, { '+',"+" ,{{42, 9},{ 0, 0}}, OPER , PLUS }, { '4',"4" ,{{30,13},{ 0, 0}}, NUMERO , 4 }, { '5',"5" ,{{34,13},{ 0, 0}}, NUMERO , 5 }, { '6',"6" ,{{38,13},{ 0, 0}}, NUMERO , 5 }, { '*',"*" ,{{42,13},{ 0, 0}}, OPER , KERTO }, { '1',"1" ,{{30,17},{ 0, 0}}, NUMERO , 1 }, { '2',"2" ,{{34,17},{ 0, 0}}, NUMERO , 2 }, { '3',"3" ,{{38,17},{ 0, 0}}, NUMERO , 3 }, { '-',"-" ,{{42,17},{ 0, 0}}, OPER , MIINUS }, { '0',"0" ,{{30,21},{ 9, 0}}, NUMERO , 0 }, { '/',"/" ,{{42,21},{ 0, 0}}, OPER , JAKO }, { '=',"=" ,{{46,21},{ 0, 0}}, OPER , LASKE }, { 0 ,NULL ,{{ 0, 0},{ 0, 0}}, TYHJA , 0 } }; /****************************************************************************/ /* Globaalit laskurit: */ laskuri_tyyppi laskurit[] = { /* x y lev kork */ { NAYTTO , 0 , "%19ld ",{{30, 2},{20, 1}} }, { VALITULOS , 0 , "%19ld ",{{30, 5},{20, 1}} }, { TYHJA_LASKURI, 0 , NULL ,{{ 0, 0},{ 0, 0}} } }; /****************************************************************************/ void lisaa_numero(laskuri_tyyppi *laskuri, int nro) { laskuri->arvo *= 10; laskuri->arvo += nro; nayta_laskuri(laskuri); } /****************************************************************************/ void bs_numero(laskuri_tyyppi *laskuri) { laskuri->arvo /= 10; nayta_laskuri(laskuri); } static operaatio_tyyppi edel_oper = EI_OPER; /****************************************************************************/ void oper( laskuri_tyyppi *laskuri, laskuri_tyyppi *tulos, operaatio_tyyppi operaatio) { switch (edel_oper) { case EI_OPER: tulos->arvo = laskuri->arvo; break; case PLUS: tulos->arvo += laskuri->arvo; break; case KERTO: tulos->arvo *= laskuri->arvo; break; case MIINUS: tulos->arvo -= laskuri->arvo; break; case LASKE: break; } edel_oper = operaatio; laskuri->arvo = 0; nayta_laskuri(laskuri); nayta_laskuri(tulos); } /****************************************************************************/ void piirra_naytto(nappain_tyyppi *nappaimet,laskuri_tyyppi *laskurit) { int i; tyhjenna_ruutu(); for (i=0; nappaimet[i].valinta_kirjain; i++) piirra_nappula(&nappaimet[i]); for (i=0; laskurit[i].tunnus; i++) piirra_laskuri(&laskurit[i]); } /****************************************************************************/ int laske(nappain_tyyppi *nappaimet,laskuri_tyyppi *laskurit) { komento_tyyppi komento; int lisa_viesti; while (1) { komento = lue_komento(nappaimet,laskurit,&lisa_viesti); switch (komento) { case LISAA : lisaa_laskuria(laskurit,lisa_viesti); break; case NOLLAA : nollaa_laskurit(laskurit); break; case NUMERO : lisaa_numero(&laskurit[NAYTTO-1],lisa_viesti); break; case BS : bs_numero(&laskurit[NAYTTO-1]); break; case OPER : oper(&laskurit[NAYTTO-1], &laskurit[VALITULOS-1],lisa_viesti); break; case PIIRRA : piirra_naytto(nappaimet,laskurit); break; case POISTU : return 0; } } } /****************************************************************************/ int main(void) { alusta_nappulat(); piirra_naytto(nappaimet,laskurit); laske(nappaimet,laskurit); return 0; }