Laboration 1: En interaktivt system för polynomhantering

Inledning

Laborationen innebär att ni skall skriva ett interaktivt system för hantering av generaliserade polynom. Användaren av systemet skall kunna skriva in polynom på en trevlig form, manipulera polynomen med ett antal olika operationer samt kunna skriva ut resultatet.

Syftet med laborationen är att ni skall skriva ett lite större Modula-2-program samt få lite erfarenhet att använda fält, moduler samt in- och utmatning.

Uppgift

Konstruera ett program för interaktiv hantering av generaliserade polynom som till exempel

3x^9 - 3x + 3x^4 - 4 + 3x^(-2)

Polynomen får ha negativa koefficienter och man skall kunna skriva flera termer med samma gradtal (ni får själva välja lämpliga storlekar på maximala och minimala gradtal, men dessa skall lätt gå att ändra).

En användare skall kunna utföra följande operationer på polynomen:

Ni skall själva bestämma hur användaren skall skriva för att utföra operationerna. Ett exempel på hur man kan välja detta finns nedan.

Programmet skall innehålla en modul som exporterar representation och operationer på polynom. Det är lämpligt att representera ett polynom i form av ett fält av lämplig storlek. Se till att man så lätt som möjligt skall kunna byta representation utan att de program som använder polynommodulen behöver ändras.

Användningsexempel

Om det kompilerade Modula-programmet finns i filen polynom skall man kunna använda programmet på följande sätt:
   % polynom                               -- programmet anropas
   > Print (1x5+2x0-7x1+3x0-3x5)           -- skriv ut ett polynom
   -2x5 - 7x1 + 5x0
   > Diff (3x5-78x1+3x0)  (8x1)            -- skillnaden mellan 2 polynom
   3x5 - 86x1 + 3x0
   > Der (3x5+3x0)                         -- derivatan av ett polynom
   15x4
Jag tror det blir enklast om man sätter paranteser kring polynomen, alltid skriver ut alla gradtal samt inte tillåter blanktecken inuti polynomen. Se vidare sektionen Problem nedan.

Problem

Ett problem i denna laboration är att de Read- och Write-operationer som finns i biblioteksmodulen InOut inte fungerar speciellt bra. Eftersom ReadCard och ReadInt först läser en sträng (dvs de läser i allmänhet alla tecken tills ett blanktecken, en tabulator eller ett nyradtecken) och sedan försöker förvandla denna till ett tal får man svårigheter att använda t ex ReadCard för att läsa koefficienten i 1x5. ReadCard ``äter'' ju upp alla tecken ända till ett blanktecken.

Här är två sätt att lösa detta problem:

Redovisning

Redovisningen görs med kommandot rapportera, som i del 1 av kursen. Inlämningskatalogen ska innehålla programkoden, ett körbart program och en (eller flera) filer med dokumentation. Dokumentationen ska beskriva programdelarna och deras struktur. Den ska även innehålla en syntaxbeskrivning av tillåtna användarkommandon (antingen ett syntaxdiagram eller en BNF-grammatik).

Efterord

Normalt vill man inte exportera representationen av en typ från en modul eftersom det omgivande programmet då kan se representationen samt använda den direkt. Men för att kunna exportera en typ utan att säga exakt vilken typ det är måste den deklareras som en pekare och det har vi ju inte gått igenom än. Mer om detta senare.