/**************/ /* laskuko3.c */ /****************************************************************************/ /* ** Alkeellinen taskulaskin. ** ** ** Ohjelman kääntämiseksi tarvitaan projekti, jossa on ** LASKUKO3.C ** NAPPULA3.C (OIKEA VERSIO, DOS tai WINDOWS) ** HIIRU.C (DOS) ** LASKURI.DEF (WINDOWS) ** ** 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) 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 "nappula3.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 , 6 }, { '*',"*" ,{{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 LASKE: if ( laskuri->arvo == 0 )break; 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; } 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 : edel_oper = EI_OPER; 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 SYS_EXIT: case POISTU : return 0; } } } /****************************************************************************/ int laskin_main(void) { alusta_nappulat(nappaimet); piirra_naytto(nappaimet,laskurit); laske(nappaimet,laskurit); return 0; }