Datastructuren aanvulling op opdracht 2 2014 Over expressies en expressiebomen Deadline De deadline is verplaatst naar maandag 27 oktober 11:00 ('s ochtends). Extra uitleg Dit document beschrijft een aantal zaken, die in de opdracht niet voor iedereen duidelijk zijn. En daarbij tips om het beschreven probleem aan te pakken. Deze aanpak is niet verplicht, maar zijn bedoeld als idee voor diegenen die er zelf niet uitkomen. Wiskundige formules v.s. expressies bestaande uit operatoren en operanden Bij wiskundige formules zijn niet alle operatoren expliciet in de formule aanwezig, maar blijken ze uit de volgorde van de operanden of uit het gebruik van superscript. Zo betekent 2a hetzelfde als 2 * a en x3 het zelfde als x tot de macht 3 en zo betekent (fg)' de afgeleide van (f * g ). Bij het opstellen van expressies voor een expressieboom is het handig om de operatoren expliciet te maken. Dus (2a + 6)2 wordt b.v. ((2 * a) + 6) ^ 2 als we ^ als symbool gebruiken voor machtsverheffen. Poolse notatie Om een expressie in poolse notatie te kunnen parsen zodat je er een expressieboom van kan maken, is het handig om operatoren en operanden telkens te scheiden door spaties. (2a + 6)2 wordt dan ^ + * 2 a 6 2. Unaire operatoren Wanneer je unaire operatoren wil gebruiken, is het goed om je te realiseren dat de inorderwandeling van de boom de infix notatie oplevert. Dat is de notatie zoals wij het meest gewend zijn. Een gewone inorder-wandeling plaatst geen haakjes die de rekenvolgorde afdwingen. Hiervoor kan je je expressieboom een eigen inorder-wandeling geven (overriding). Sommige unaire operatoren schrijven wij nl vóór de operand zoals –x, ln a en sin(x). Andere unaire operatoren schrijven we echter achter de operand zoals 10! (10 faculteit). In de poolse notatie schrijf je altijd eerst de operator en dan de operand. Dus – x, ln a, sin x en ! 10. In je expressiebomen gebruik je één van de twee kinderen voor de operand. Doe dit zo dat je inorder wandeling de juiste notatie oplevert. Bij unaire operaties, die wij normaal voor de operand zetten komt de operand dan in het linker kind en bij unaire operatoren die wij achter de operand plaatsen komt de operand in het rechter kind. 10log(sin(x) + ln(7!)) wordt in poolse notatie log 10 + sin x ln ! 7 Diferentiëren De differentiatie regels zoals gegeven in de opdracht (rule 1 t/m 4) staan beschreven als wiskundige formules. Wanneer je deze wil toepasen is het handig om deze eerst uit te schrijven als expressie en er een expressie boom voor te tekenen. Dan blijkt dat je i.p.v. met (axn)'=naxn-1 kan werken met (xn)'=nxn-1 omdat vermenigvuldigen met a al door toepassing van de eerste regel kan worden opgelost. Ter geruststelling Het is niet de bedoeling, dat je programma alle wiskundige formules perfect kan differentiëren. Wel alle polynomen en logaritmen en enkele goniometrische functies (sin, cos). De uitdaging zoals beschreven in de opdracht geldt voor studenten die een goed willen halen. Vereenvoudigen (simplify) hoeft niet tot in de perfectie. Maak het niet te ingewikkeld. Maar doe wel alles wat je direct kan zien aan een operand en zijn twee kinderen. Denk bijvoorbeeld aan: Operanden zijn beide bladeren: 3+6=9 4 * 10 = 40 x–x=0 x/x=1 Operand = 0 of 1 0 * <subtree> = 0 1 * <subtree> = <subtree> <subtree> ^ 0 = 1 <subtree> ^ 1 = <subtree> Recursief toepassen van deze regels vereenvoudigt je boom. Evaluate vult alleen waarden in voor x. Hierdoor verenvoudigt je expressieboom sterk en blijft er een expressie over zonder x en als er geen andere symbolen/variabelen in de expressie zaten komt er een waarde uit. Evaluate vervangt dus in je expresieboom alle x-en door de opgegeven waarde en roept daarna simplify aan.
© Copyright 2024 ExpyDoc