/**************/ /* laskinr.c */ /****************************************************************************/ /* ** Windows: Win 3.1 & Win32 ** ** Alkeellinen taskulaskin. ** ** Ohjelman kääntämiseksi tarvitaan projekti, jossa on ** laskinr.c ** laskurir.def ** laskukor.rc ** ** Vesa Lappalainen ** 18.9.1992, 18.8.1994 (32-bit yteensopivuus) ** ** 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 /* Tarvitaan 32-bit yhteensopivuudeksi */ #include "laskinr.h" #define LASKUREITA 2 #define EKA_LASKURI TULOS typedef enum { /* Tunnetut operaattorit: */ EI_OPER, PLUS, MIINUS, KERTO, JAKO, LASKE } operaatio_tyyppi; static HWND GhWnd; static long laskurit[LASKUREITA] = {0,0}; #define TULOSL 0 #define VALITULOSL 1 /***************************************************************************/ int ShowStaticL(HWND hWnd, int id, long value) /* Aliohjelmalla tulostetaan Static ikkunaan numero */ { char s[20]; wsprintf(s,"%ld ",value); SetDlgItemText(hWnd,id,s); return 0; } /****************************************************************************/ void nayta_laskuri(int laskuri) { ShowStaticL(GhWnd,laskuri+EKA_LASKURI,laskurit[laskuri]); } /****************************************************************************/ void lisaa_numero(int laskuri, int nro) { laskurit[laskuri] *= 10; laskurit[laskuri] += nro; nayta_laskuri(laskuri); } /****************************************************************************/ void lisaa_laskuria(int laskuri) { laskurit[laskuri]++; nayta_laskuri(laskuri); } /****************************************************************************/ void bs_numero(int laskuri) { laskurit[laskuri] /= 10; nayta_laskuri(laskuri); } static operaatio_tyyppi edel_oper = EI_OPER; /****************************************************************************/ void oper( int valitulos, int tulos, operaatio_tyyppi operaatio) { switch (edel_oper) { case LASKE: if ( laskurit[valitulos] == 0 ) break; case EI_OPER: laskurit[tulos] = laskurit[valitulos]; break; case PLUS: laskurit[tulos] += laskurit[valitulos]; break; case KERTO: laskurit[tulos] *= laskurit[valitulos]; break; case MIINUS: laskurit[tulos] -= laskurit[valitulos]; break; } edel_oper = operaatio; laskurit[valitulos] = 0; nayta_laskuri(valitulos); nayta_laskuri(tulos); } /****************************************************************************/ void nollaa_laskurit(void) { int i; for (i=0; i