Analýza matematické funkce
Ahoj,
potřeboval bych od Vás poradit.
Řeším program, který bude vykreslovat matematickou funkci o jedné proměnné.
Nevím si rady s tím, jak analyzovat vstupní výraz co se týče závorek.
Např. vstupní fuknce bude f(x) = (sin(1+x)/(2+3))
Jak bych měl programově poznat, že je to něco jako
((a)/(b)), kdy a = sin(1+x), b = (2+3).
Jak by jste postupovali? Díky za diskuzi.
urobis si v pamati nejaky strom vyrazu, googli strom vyrazu. Alebo vzdy jak najdes lavu zatvorku tak najdes aj konciacu zatvorku a rekurziou zavolas vyhodnocovaciu fciu pre podvyraz. Ale pozor na prednost u znamienok (to sice nema nic so zatvorkami, ale musis to tam tiez implementovat, v rieseni (pod)vyrazu)
Ano, stromem to mám v plánu taky řešit, ale jak mám najít koncovou závorku. Např: (pokud je číslama označím)
(a+b*(c+d))
1____2__3_4
Jak poznám, že závorka číslo 1 patří k číslu 4 a né k číslu 3? (u složitějších funkcí to pak bude mít hlavní význam)
if(znak=='(') level++;
else if(znak==')') level--;
ak je level==0 tak mas co si chcel
Aha, tak jednoduché. Děkuji za pomoc
To je zakladny princip. Ja by som zacal za zatvrkou s levelom 0, a potom ked najdem pravu zatvorku a sucasne level je 0 tak viem ze to je koniec podstringu, a patricne zatvorku odignorujem a poslem ten medzistring do rekurzie, apod.
Nevím jak je to v praxi časté, ale nedávno nás učili, že existuje postfixová notace výrazu a ta je úplně bez závorek. Možná by to pak bylo i jednodušší vyhodnotit.
http://cs.wikipedia.org/wiki/Postfixov%C3%A1_notac e
Díky za info, zrovna o tom čtu, pokud si chcete také počíst, nějaké informace by měli být tady: ODKAZ, ale ještě jsem to celý neprojel.
Po tom, čo si napíšeš tokenizér, si pozri algoritmus shunting-yard, pomocou ktorého sa dá vytvoriť aj tá reverzná poľská notácia. V podstate ide o to, že si vytvoríš 2 zásobníky. Jeden je pre operandy a druhý pre operátory. Operátor podľa priority operátorov buď rovno vyhodnotíš nad zásobníkom operandov (v tvojom prípade vytvoríš uzol abstraktného syntaktického stromu), alebo len odložíš na zásobník operátorov. Plus špeciálne ošetríš prioritu zátvoriek a máš to.
neviem zhlavy ani ja vyrazy som nikdy neparsoval, ale myslim ze tieto veci su rozobrate v kdejakych prednaskach apod ked si bude googlit to "strom vyrazu" tak to asi aj najde vsetko okolo toho.