Programmering för Naturvetare, vt-95
Institutionen för Datavetenskap
Thomas Hallgren

Laboration 5: Ett interaktivt program för polynomhantering

Inledning

Laborationen innebär att ni skall skriva ett interaktivt program för hantering av generaliserade polynom. Användaren av programmet 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 genom att skriva ett lite större Modula-2-program får lite erfarenhet att använda fält, moduler, 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å användardialog finns nedan.

Programstruktur

Programmet som behövs för att lösa denna uppgift blir såpass sort att det är meningsfullt att dela upp det i moduler. Låt därför ditt program bestå av följande moduler: Med denna moduluppdelning samlas den programkod som har direkt med polynom att göra i en modul, polynommodulen. En fördel med detta är att polynommodulen blir en självständig enhet som skulle kunna återanvändas i något annat program där man behöver göra beräkningar med polynom.

En ytterligare fördel med moduluppdelningen är att man kan begränsa vilka delar av programmet som behöver justeras om man t ex vill ändra representationen av polynom. När du skriver programmet, se till att man kan byta representation utan att de program som använder polynommodulen behöver ändras.

Användningsexempel

Om det kompilerade Modula-2-programmet finns i filen polynom skall man kunna använda programmet på följande sätt:
   % polynom                               -- programmet anropas
   Välkommen till det interaktiva polynomprogrammet!
   > 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).

För att bli godkänd krävs, förutom att programmet fungerar, att det följer programstrukturen ovan och i övrigt är bra strukturerat och lättläst. Dokumentationen är också viktig.

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.