Parser matematických výrazů v céčku

C++ Parser matematických výrazů v céčku

Toto je můj parser matematických výrazů napsaný v jazyce C. Zvládá klasické +-*/(), mocniny, odmocniny, funkce, konstantu π a také uložení proměnných pro pozdější použití. To všechno s přesností na 30 desetinných míst s rozsahem 10^(-4932) až 104932.

  1. Použitelné symboly jsou standardní "+-*/^()" +

    "\" = druhá odmocnina - použití : 2\256=16

  2. Můžete používat tyto funkce : sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, log, abs, fact (factorial)
    • use : sin(90)
    • sin, cos, tan ... - vstup je v radiánech (= stupně*pi/180)

    Můžete používat konstantu : pi

  3. Ve vstupu pro proměnné můžete zadávat proměnné ve formátu : "a=2.2;b=2,3;c=a­+b;re=5+a-c/b"
  4. V normálním vstupu můžete zadávat matematické výrazy ve formátu : "5+8*3-2a+fact(3)+5b(2-1)(4+2)" a přiřadit je proměnné :
    • "sa=2\16+a"

    V normálním vstupu můžete psát příkazy pomocí znaku ":" , můžete použít : vars

    • použití : ":vars"
  5. Tento program odstraňuje mezery a nahrazuje {}[] za () a : za / , takže
    • "abs[ a+b :r e }" je to samé jako
    • "abs(a+b/re)"
  6. Přesnost je 30 desetinných míst, nejsou podporována čísla větší než 104932 nebo menší než 10^(-4932)

Galerie

Program byl vytvořen v roce 2014.

 

Stáhnout

Staženo 135x (239.88 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

  Aktivity (1)

Program pro vás napsal tomisoka
Avatar

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
C a C++

 

 

Komentáře

Avatar
Libor Šimo (libcosenior):

Zdá sa mi, že som nepochopil názov článku.
Píšeš o parseri výrazov a v skutočnosti parsuješ či je dobre zadaný reťazec - číslo.

Odpovědět 7.11.2014 13:43
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
tomichi
Redaktor
Avatar
tomichi:

no pokud bys to chtěl vylepšit tak pravý parser si tvoří svůj syntaktický strom ast pokud se jedná o parser výrazů tak tvoří binární strom. :) jinak k'od je celkem dost nečitelný jako je vidět že jazyku c rozumíš. Jinak celkem je to overhead řešení :)

Odpovědět  -1 15.12.2015 22:09
Dělte se o svou zkušenost, je to cesta jak dosáhnout nesmrtelnosti. Dalajláma
Avatar
Odpovídá na tomichi
Jakub Šárník:

Parser nemusí tvořit jen AST a nevím, proč by měl parser výrazů tvořit zrovna jen binární strom :-D

 
Odpovědět  +1 15.12.2015 22:41
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jakub Šárník
Martin Dráb:

Ano. Já jsem snad vždycky, když jsem potřeboval parsovat výrazy, uchýlil k postfixu. Přišlo mi to jednodušší, než sázení stromů.

Odpovědět  +1 16.12.2015 0:41
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Jakub Šárník:

Já jsem si teď jen pro procvičování dělal parser (jsem tady taky měl dotaz :-D) a použil jsem AST. Mě se zase zdá jednodušší ten a hlavně univerzálnější. Jen třeba moc nevím, jak bych to dělal, kdyby měl mít uživatel třeba možnost definovat vlastní operátory (s prioritou), aniž by se to nějak extrémé zkomplikovalo...

Editováno 17.12.2015 18:53
 
Odpovědět 17.12.2015 18:52
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Martin Dráb
David Novák:

Souhlas. Na matematické výrazy je asi postfix nejlepší řešení :)

Odpovědět 22.12.2015 15:15
Chyba je mezi klávesnicí a židlí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.