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:
- 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å 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:
- En modul för polynom. Modulen ska exportera
- en typ för polynom,
- procedurer och funktioner för de operationer på polynom
som behövs (addition, multiplikation, osv),
- procedurer för inläsning och utskrift av polynom på terminalen.
Det är lämpligt att representera ett polynom i form av ett
fält av lämplig storlek.
- En programmodul som sköter dialogen med användaren och använder
polynommodulen för att utföra de operationer som användaren begär.
- Eventuellt någon mer modul med hjälpfunktioner och dylikt.
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:
- 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
/usr/lic/Mocka/reuse/BetterInput.md.
OBS!
Det blir konsigt om man i samma program blandar 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).
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.