sorry, po neblahe zkusenosti z PRG C/C++ zap test kdy jsem si to ukladal na J, jsem to ted ukladal na C do tempu a pak rychle vypadl, takze se to tam vali mozna jeste, SW1 druha rada od tabule, pocitac nejvic ke dverim )
jinak proste binarni strom na vyrazy a rozparsovani ja udelal rekurzivne jak to naznacuje töpfer - osekat zavorky okolo a pak podle priority najit bud prvni + ktery neni v zavorce, nebo -, *, /, ~ (postupne), hodit to do vrcholu stromu, text okolo poslat na zpracovani o parto niz a z toho postavit strom... obcas jsem hazel nejaky vyjimky a cvicicimu se to libilo...
exAdmin. Magistr přes umělou inteligenci. Právník přes daně.
tak ja byl posledni co daval a skore je ze 3 nedali, 2 vzdali a jeden to tam zmotal, ze mu rekl ze potrebuje vic praxe.
Jinak nastesti se nehralo na pure C++, takze mu nevadilo kdyz sem dle potreby parsil radek tak ze sem si ho prevedl do char * a pak rozarsoval,
Jinak nemel sem vse (uspesne sem zapomnel na zavorky a pak kdyz mi to vse behalo sem si na ne vzpomnel, ale nestihl dodelat. ale kdyz to videl ze to neco pocita, tak to vzal.
Jinak delal sem jako tutchek, postavil sem strom nad vyrazem
P.S. dokonce prezil i jeden mensi ulet v navrhu predka, kdy sem tam dal neco co melo byt az v potomkovi.
No, dalo se to zvladnout - i kdyz ty 3 hodinky mi byly tak akorát. K výsledku - chtěl nějakou pěkně navrženou reprezentaci toho výrazu. Nejlepší by asi bylo nedělat obyčejný binární strom, ale vytvořit různé typy vrcholů stromu - jeden typ pro operátory a pak různé druhy listů - pro čísla a pro proměné. Takže nejlépe mít nějaký abstraktní vrchol stromu - předek s virtuální funkcí vyhodnocení, která pro číslový vrchol vrátí číslo, pro vrchol s proměnou hodnotu proměné a pro vrchol s operátorem vrátí výsledek operace provedené na vyhodnocené podstromy. Taky jsem poprvé v životě viděl operátor ~ - binární negace integeru.
Jo a třída by měla mít nějakej fajnovej destruktor, kterej správně odalokuje strom.
Co mě docela zdrželo bylo odalokovávání napůl rozestavěného stromu při syntakticky špatném výrazu - protože jsem si tuhle nutnost uvědomil až když jsem to měl hotový a musel jsem to tam docpávat dodatečně.
Jinak to řešení se stromem s více druhy vrcholů jsem já nedělal - měl jsem jen jeden univerzální druh vrcholu, který reprezentoval všechny případy - a stačilo to (prej ne moc čistý, ale uznáme..). Taky se zas až tak nic moc nestalo, když to neumělo všechno (kolegovi to třeba vůbec neumělo závorky, a taky to dostal). Hlavní byla ta třída.
Algoritmus na vyhodnocení už asi všichni znají - takže jen pro jistotu - buď budete vždy ve výrazu hledat operátor nejmenší priority a ten provedete a tím se postupně bude výraz zjednodušovat, nebo se může použít nepřímá rekurze (jedna funkce vyhodnocuje sčítání a odčítání, druhá násobení a dělení, třetí negaci a čtvrtá podvýraz (buď něco v závorkách, nebo proměnná/číslo). Každá procedura pak volá proceduru pro nižší prioritu a podvýraz v případě závorek zase volá funkci pro sčítání a odčítání. Tenhle algoritmus pracuje lineárně vzhledem k délce výrazu (čte ho jen jednou a nevrací se)
Uff, to jsem se ale rozepsal...
Třeba to někomu pomůže.
Jo, asi tak. Ja mel binarni strom s dvema typy uzlu (a v pripade toho druheho typu i listu), zdedenych od abstraktniho interfacu, i kdyz ze zacatku jsem to mel vicemene jen v jedne te tride a docistoval jsem to az pred koncem, protoze jsem se bal, ze se to cvicicimu nebude libit ale nakonec mi pripadalo, ze by si toho ani nevsimnul.