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:
- Addera två polynom.
- Beräkna skillnaden mellan två polynom.
- Multiplicera polynom (skall ge en felutskrift om resultatet
får ett för stort eller för litet gradtal).
- Jämföra om två polynom är lika.
- Derivera ett polynom (skall ge en felutskrift om resultatet
får för litet gradtal).
- Beräkna ett polynoms värde för ett givet värde på variabeln
(skall ge en felutskrift om värdet inte kan beräknas).
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:
- Se till att det alltid finns blanktecken kring alla tal.
- Använd Read-operationerna modulen BetterInput
istället för de i InOut.
BetterInput finns i
/users/mdstud/naptv/ModulaLib/BetterInput.def.
Det är olämpligt att i samma program blanda Read-operationer
från InOut och BetterInOut.
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.