» »

[C#]Računanje iz stringa?

[C#]Računanje iz stringa?

Reliant2 ::

Pozdravljeni!

Če imam string str = "-3*(2/(3+2))+3", kako bi lahko na kar se da enostaven način to izračunal?.. z vsemi matematičnimi pravili, kot so upoštevanje predznakov, oklepajev etc..

Najlepša hvala!

reliant

jeti51 ::

Namig:Izraz pretvori v drevo, potem pa rekurzivno izračunaj vrednosti posameznih poddreves, dokler ne prideš do korena in ti na koncu ostane samo še rezultat, ki je ravno vrednost tvojega izraza. ;)

Alpheus ::

v katerem jeziku pa? če se gre za php lahk hitro rešiš z eval() ukazom.
VI VERI VENIVERSUM VIVUS VICI.

Reliant2 ::

samo potem bi bilo recimo na tem primeru : -3*(2/(3+2))+3



|-3+| |2/| |3+2| |*3|
reimo da je to drevo..
potem izračunam

|-3+| |2/5| |*3|


|-3+| |2/5| |*3|

potem pa nastane problem prednosti pred množenjem in obratno

.. huh.. zdaj se pa že sam sebe mešam..

Reliant2 ::

C#.net

matjazx ::

A loh daš izraz v prefiksno ali postfiksno obliko?

K drgač bo težko.

jeti51 ::

Zakaj pa? Sestaviš ustrezno gramatiko, sintaksni analizator zanjo ti pa zgradi drevo izpeljav. Če je gramatika pravilno sestavljena, je tudi drevo potem pravilno.;)

matjazx ::

Kaj je laži to kr si ti napisu al spravt stvar na kopico in zračunat?

Reliant2 ::

matjazx, kako to misliš na kopico in potem izračunat?

matjazx ::

Ja če maš lahko izraz recimo v postfiksni obliki pol ni problem zračunat

pregleduješ izraz z leve proti desno in..
1 cifro daš na sklad
2 če ne določi za kater operator gre potegni dve stevili s sklada in na njih uporabiš dan operator, rezultat pa shraniš na sklad
3 prazen - maš rezultat

jeti51 ::

No, kako boš pa izraz dal v postfiksno obliko?;)

Ko si enkrat že tako daleč, da je vse pripravljeno, da ga "samo še izpišeš v postfiksno obliko", ga lahko takrat namesto tega že kar direktno začneš računati. Namreč postfiksna oblika ni nič drugega, kot samo na en drug način zapisano drevo, ki predstavlja izraz.

Zgodovina sprememb…

  • spremenil: jeti51 ()

Reliant2 ::

a ima kdo c#.net pa bi mi spisal en primer, lepo bi prosil.. ? Jaz se že več ur matram s tem..

jernejl ::

Reševanje takih izrazov je zelo preprosta zadeva :))

Pred kratkim sem v eni temi tukaj že pisal o tem in podal kratek primer, zato tega tu ne bi ponavljal.
(ideja pa je, da imaš dva sklada: na enega zlagaš operande, na drugega operatorje. Pri tem si moraš določiti prioritete posameznih operatorjev (npr. * ima višjo prioriteto kot +)).

Ker se to obravnava tudi na faksu pri študiju računalništva, je tukaj še en link do prosojnic (powerpoint) predavanj, kjer je opisana ideja in nekaj primerov:

prosojnice


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Postfiksni izraz - računanje

Oddelek: Šola
141584 (1223) lebdim
»

[C]Baza z enačbami

Oddelek: Programiranje
131156 (784) kuall
»

Za programerske teoretike

Oddelek: Programiranje
478534 (5336) Jerry000
»

Binary tree; kater zapis je pravilen?

Oddelek: Programiranje
121233 (1119) |CyGNUS-x
»

Podatkovne strukture kolokviji?

Oddelek: Šola
101779 (1633) whatever

Več podobnih tem