laskutoimitus merkkijonosta

Haluan tehdä yksinkertaisen laskukoneen, joka osaa purkaa laskutoimituksen merkkijonosta. Mutta miten sulkulausekkeet voisi purkaa helposti auki. esim (((1 1)/2)*(1*2)/1) ja oletetaan että näitä sulkupareja voisi olla n-määrä. Mites tällänen probleema kannttaisi tehdä?
2212
Äänestä

Muut lukivat myös

Vastaukset 2

Vanhimmat

Tässä kolme vaihtoehtoa. Valitse sen mukaan minkä ongelman haluat oikein ratkaista:

1. Jos haluat vain laskea lausekkeen arvon, yksinkertaisinta on antaa lauseke jollekin valmiille funktiolle, joka hoitaa asian. Python esimerkki:

lauseke = "(((1 1)/2)*(1*2)/1)"
vastaus = eval(lauseke)

2. Jos haluat toteuttaa itse mm. operaattorit (esim. -*/) ja laskujärjestyksen, yksinkertaisinta on määritellä laskimen operaatiot ja sen hyväksymä "kieli" jonkin valmiin jäsentäjätyökalun avulla. Näin säästyt lausekkeen jäsennykseltä. Python esimerkki: http://www.dabeaz.com/ply/example.html

3. Jos haluat urheilla oikein kunnolla ja tehdä kaiken jäsentäjästä alkaen, voit aloittaa esimerkiksi täältä: http://en.wikipedia.org/wiki/LR_parser

Äänestä

Yllä mainittu vaihtoehto 3 on se mikä kannattaa jossain vaiheessa ohjelmoinnin opettelua käydä läpi. Jäsentäjät ovat kuitenkin sen verran perus tietojenkäsittelyteoriaa, että jokaisen itseäänkunnioittavan ohjemoijan pitäisi olla kerran tehnyt sellaisen. Usein tällainen tehdäänkin ohjelmointiopinnoissa. Kannattaa lainata kirjastosta klassikkokirja "Aho, Sethi, and Ullman: Compilers, Principles, Techniques and Tools" ja lukea sieltä miten homma toimii. Käytännössä joku operator precedence -parseri tai recursive descent ovat helpompia aluksi kuin LR.

Äänestä

Kommentoi aloitusta


15+2 kirjoitti:

Haluan tehdä yksinkertaisen laskukoneen, joka osaa purkaa laskutoimituksen merkkijonosta. Mutta miten sulkulausekkeet voisi purkaa helposti auki. esim (((1 1)/2)*(1*2)/1) ja oletetaan että näitä sulkupareja voisi olla n-määrä. Mites tällänen probleema kannttaisi tehdä?

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