Laskin ongelmia

Miten on järkevintä tehdä yksinkertainen laskin joka laskee plus-, miinus-, kerto- ja jakolaskuja?

Olen saanut aikaiseksi sellaisen laskimen joka kyllä toimii mutta sekoaa jos siihen syöttää kirjaimia...

Nykyinen laskin on tehty do-while-rakenteella.

1-4 numeroilla valitaan laskutoimitus ja 0 lopettaa. Laskutoimitukset suoritetaan aliohjelmissa...
51089
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Kaiketikkin nopein/yksinkertiaisin tapa lienee tehdä laskutoimitukset try-catch rakenteen sisällä. Ohjelman ei ainakaan pitäisi seota sitten.

Mutta siihen miten tommonen laskin on "järkevintä" tehdä, niin en ota kantaa :) Nykyistä toteutustapaa en kyllä oikein ymmärrä, mutta jos se toimii niin anna palaa xD

Äänestä

Kaiketikkin nopein/yksinkertiaisin tapa lienee tehdä laskutoimitukset try-catch rakenteen sisällä. Ohjelman ei ainakaan pitäisi seota sitten.

Mutta siihen miten tommonen laskin on "järkevintä" tehdä, niin en ota kantaa :) Nykyistä toteutustapaa en kyllä oikein ymmärrä, mutta jos se toimii niin anna palaa xD

Äänestä

Onko kellään mitään esimerkkiä?

Äänestä
  • Nopeesti miettien näin. Koodi ei suoriltaan toimi et sinne joutuu lisään omaa tauhkaa.
    käyttäjä siis on valinnut minkä laskutoimituksen haluaa:
    while(valid){

    //kysytään lukut
    try{
    double d = Double.parseDouble(luku);
    double p = Double.parseDouble(luku2);
    valid = false;
    }
    catch(ParseException ex){}
    }
    System.out.println("tulos on:" c);

    Äänestä

Joskus väsäsin rpn-laskimen, tosin se laskee vaan miinus ja plus laskuja, mutta lisäämällä siihen saa helposti jako ja kerto laskut ja toi on tehty c-kielellä, mutta tässä ainaki pääohjelmasta esimerkki (aika huonosti rivittyy :)

//Laskin käyttää RPN notaatiota (Reverse Polish //Notation) eli se on ns. //pinolaskin.Pinolaskimella laskettaessa annetaan //ensin laskettavat luvut ja sitten vasta //laskutoimitus.


int main(void)
{
Tintstack stack;
Tboolean succeeded;
int item, pop_item = 0, i, sum = 0;
int luku = 0;
initialize_int_stack(&stack);

printf("RPN-laskin. Ohjelmalle annetaan yksinumeroisia kokonaislukuja");
printf("\nja operaatioita +, - = ja L. Operaatio = tulostaa pinon");
printf("\npaallimaisen alkion. Operaatio L lopettaa ohjelman.\n>");
while((item = getchar()) != 'L') //getchar ottaa vastaan merkin, jos merkki L niin while silmukka päättyy
{
fflush(stdin);
if(item == '+')
{
sum = 0;
succeeded = pop_int(&stack, &pop_item);
if(succeeded == 0) //tarkistetaan onko pinossa operandia
{
printf("Pinossa ei operandia %d\n", succeeded);
}
else
{
sum = pop_item+sum;
succeeded = pop_int(&stack, &pop_item);
if(succeeded == 0) //tarkistetaan onko pinossa operandia
{
printf("Pinossa ei operandia\n");
}
else
{
sum = pop_item+sum;
if(push_int(&stack, sum) == 0) //laitetaan summa pinoon päällimmäiseksi
{
printf("/nStack is full"); //push_int() palauttaa 0 jos pino täynnä ja 1 jos pino ei ole täynnä
}
else
{
//printf("Summa tallennettiin pinoon\n");
}
}
}
}
else if(item == '-')
{
sum = 0;
succeeded = pop_int(&stack, &pop_item);
if(succeeded == 0) //tarkistetaan onko pinossa operandia
{
printf("Pinossa ei operandia %d\n", succeeded);
}
else
{
sum = pop_item-sum; //erotus
succeeded = pop_int(&stack, &pop_item);
if(succeeded == 0) //tarkistetaan onko pinossa operandia
{
printf("Pinossa ei operandia\n");
}
else
{
sum = pop_item-sum; //erotus
if(push_int(&stack, sum) == 0) //Tallennetaan erotus pinoon päällimmäiseksi
{
printf("/nStack is full"); //push_int() palauttaa 0 jos pino täynnä ja 1 jos pino ei ole täynnä
}
else
{
//printf("Erotus tallennettiin pinoon\n");
}
}
}
}
else if(item == '=')
{
succeeded = pop_int(&stack, &pop_item);
if(succeeded == 0) //tarkistetaan onko pinossa operandia
{
printf("Pinossa ei operandia\n");
}
else
{
printf("\t \t tulos %d\n", pop_item);
}
if(push_int(&stack, pop_item) == 0) //laitetaan takasi pinoon päällimmäiseksi
{
printf("/nStack is full"); //push_int() palauttaa 0 jos pino täynnä ja 1 jos pino ei ole täynnä
}
}
else if(isdigit(item)) //onko numero
{
if(push_int(&stack, item - '0') == 0) //laitetaan käyttäjän syöttämä merkki pinoon päällimmäiseksi, täytyy vähentää '0' koska ascii
{
printf("/nStack is full"); //push_int() palauttaa 0 jos pino täynnä ja 1 jos pino ei ole täynnä
}
else
{
//printf("Merkki tallennettiin pinoon\n");
}
}
else
{
printf("Et antanut oikein\n");
}
printf(">");
}
print_int_stack (&stack);
system("PAUSE");   
return 0;
}

Äänestä

Kommentoi aloitusta


Metsäminnni kirjoitti:

Miten on järkevintä tehdä yksinkertainen laskin joka laskee plus-, miinus-, kerto- ja jakolaskuja?

Olen saanut aikaiseksi sellaisen laskimen joka kyllä toimii mutta sekoaa jos siihen syöttää kirjaimia...

Nykyinen laskin on tehty do-while-rakenteella.

1-4 numeroilla valitaan laskutoimitus ja 0 lopettaa. Laskutoimitukset suoritetaan aliohjelmissa...

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu