Algoritmer och datastrukturer TF3 Sy
samt
Algoritmer och datastrukturer med objektorienterad programmering




Inlämningsuppgift nummer 2
Matte ?

Skriv ett program som kan hantera uttryck uppbyggda av följande delar:

Programmet ska kunna hantera uttryckt på följande sätt:

Inmatningen av uttrycket kan få vara mycket "ful", du behöver inte ordna en inmatning som gör en meningsfylld omformning från det inmatade uttrycket till en internrepresentation.

Det är till och med acceptabelt med ett huvudprogram som inte matar in värden, utan bygger ett antal uttryck från data som finns i programmet. Om denna lösning används ska programmet dock ha många relevanta testexempel.

Anvisningar

Avbilda uttrycken som binära träd. Härled uttryck (bestående av objekt ur olika klasser) från klassen T_n. Det står dig fritt att göra små modifieringar i klassen.

Din lösning ska på ett relevant sätt använda virtuella funktioner.

Ledning

Följande huvudprogram kan fungera som ide hur ett huvudprogram kan se ut. Ditt program ska provas med fler exempel, än vad som görs här. main() { T_n* n = new Plus(new Number(5), new Number(7)); cout << n -> calc(); T_n* m = new Plus(new Var('x'), n); m -> derive('x') -> print(); cout << endl; m -> print(); cout << endl; T_n* k = new Plus(new Mul(new Var('x'), new Sin(new Var('x'))), m); T_n* l = k -> derive('x'); l -> print(); cout << endl; } Använd klassen T_n som basklass.

Skapa nya klasser för operatorer, funktioner, variabler etc!

Inför virtuella funktioner för att derivera, beräkna och skriva ut. Tänk på att namnen på de virtuella funktionerna måste vara deklarerade i basklassen (läs Lippman!).

Skriv rekursiva funktioner, uppgiften blir oerhört mycket knepigare annars.

Smidigast blir förmodligen att använda pekare till noder i ganska stor omfattning.

En lämplig arbetsgång kan vara som följer:

  1. Tänk noggrant igenom klasshierarkier etc

  2. Skapa en ny klass, t ex Number(argument). Förse klassen med en virtuell funktion void print().

  3. Testa

  4. Skapa Operator(argument) eller Plus(argument) beroende på vilken design du väljer, och förse den på samma sätt med en virtuell funktion void print().

  5. Testa

  6. Lägg till ytterligare klasser, en i taget och testa efter varje klass och metod du lagt till. Använd kommentartecknet flitigt i huvudprogrammet för att kommentera bort de delar av programmen som för tillfället inte ingår i din testsekvens, men som kan vara bra att ha kvar, för att kunna testa igen, efter eventuella ändringar.

  7. Lägg till utvärdering, metodiskt i klass efter klass. Testa flitigt.

  8. Lägg till derivering på samma sätt. Ledning: Derivering är, redan från gymnasiet rekursivt definierad. Skriv upp deriveringsreglerna på ett papper och "översätt" dem sedan till C++.


Redovisning

Redovisningen består av
  1. Ifylld försättssida
  2. lämpligt kommenterad programlistning
  3. en kortfattad beskrivning av valda algoritmer och datastrukturer
  4. ett körexempel, möjligtvis avskrivet
  5. uppgift om var den exekverbara filen finns tillgänglig för läsning. Se till att ge läsrättigheter åt gruppen övriga.
Uppgiftslösningen ska i sin helhet spegla en god programmeringssed för C++ och tillämpa klassbegreppet på ett meningsfyllt sätt.

Uppgiften får lösas individuellt eller i grupper om två. Om två personer arbetar tillsammans, ska båda aktivt delta i hela utvecklingsarbetet. En ren arbetsdelning, exempelvis programmering mot dokumentation är inte tillåtet.

För handledning på denna uppgift hänvisas till Datortekniks jourhavandec handledare eller Fredriks handledningstider


Uppgifterna lämnas in enligt anvisningarna i kursplanen, senast den 2 mars.


Fredrik Larsson <fredrikl@DoCS.UU.SE>
Anders Berglund <Anders.Berglund@DoCS.UU.SE>
Last modified: Tue Feb 17 21:38:55 MET 1998