Datalogi, grundkurs 1 Övningsuppgifter i Pascal. Serafim Dahl, Carina Edlund, Kjell Lindqvist m.fl.

Relevanta dokument
Datalogi, grundkurs 1. Lösningsförslag till tentamen

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Sökning och sortering

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Föreläsning 6: Introduktion av listor

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Några saker till och lite om snabbare sortering

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Pascal... Pascal. Pascal... Pascal...

Poster. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

TDIU01 - Programmering i C++, grundkurs

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Uppgift 1 ( Betyg 3 uppgift )

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Pascal. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Poster... Poster. Poster... Poster...

Uppgift 1 (grundläggande konstruktioner)

Länkade strukturer. (del 2)

Datastrukturer och algoritmer

Några fakta om Standard Pascal. Serafim Dahl, Carina Edlund, m.fl.

Datastrukturer och algoritmer

Föreläsning 11. ADT:er och datastrukturer

Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

Deklarationer/definitioner/specifikationer

2D1310 Programmeringsteknik Tentamen (1p) lördag 29 april 2000 kl 14-17

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Datastrukturer. föreläsning 3. Stacks 1

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Lösningsförslag: Instuderingsfrågor, del D

Övningsuppgifter kapitel 8

Klassdeklaration. Metoddeklaration. Parameteröverföring

Datalogi, grundkurs 1. Lösningsförslag till tentamen

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 3-4 Innehåll

Motivet finns att beställa i följande storlekar

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Tentamen Grundläggande programmering

Instuderingsfrågor, del D

Översikt över Visual Basic

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Tentamen i Algoritmer & Datastrukturer i Java

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Föreläsning 5: Dynamisk programmering

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tommy Färnqvist, IDA, Linköpings universitet

KOMPLETTERANDE HEMTENTAMEN TDDB53

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 2 Datastrukturer (DAT037)

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Objektorienterad programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Exempel på ett litet Ada-program

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Datatyp - mera. Begreppet värde, igen. Ett slags mått på en egenskap, eller något fenomen. Ska ges en bred tolkning!

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Språket Python - Del 1 Grundkurs i programmering med Python

Tentamen i Algoritmer & Datastrukturer i Java

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

Algoritmer, datastrukturer och komplexitet

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Typkonvertering. Java versus C

Uppgifter till praktiska tentan, del A. (7 / 27)

Uppgift 1 (vadå sortering?)

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Tentamen TEN1 HI

Dagens föreläsning Programmering i Lisp Fö 5

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Övning 1 - Abstrakta datatyper

Föreläsning 3. Stack

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Tentamen i. TDDC67 Funktionell programmering och Lisp

Transkript:

Datalogi, grundkurs 1 Övningsuppgifter i Pascal Serafim Dahl, Carina Edlund, Kjell Lindqvist m.fl. Hösten 2010

Datalogi, grundkurs 1, hösten 2009 1 1. Skriv en funktion som återsänder ett heltal som läses från terminalen. 2. Skriv ett program som läser ett tresiffrigt tal, beräknar och skriver ut siffersumman. Exempelvis: Skriv in ett tresiffrigt tal: 123 Siffersumman blir: 6 3. Skriv ett program som läser utgångshastighet v och kastvinkel α samt beräknar och skriver ut kasthöjdhoch kastlängdd. Ledning: d = v2 g sin2α och h = v2 2g sin2 α. 4. Skriv ett program som omvandlar kartesiska koordinater för en punkt i ett koordinatsystem till polära koordinater. Ledning: x = rcosθ samt y = rsinθ där r är punktens avstånd från origo ochθ är vinkeln som visar riktningen från origo till punkten. 5. Body Mass Index, BMI, används för att avgöra om personer är normalviktiga.bmi = vikt/längd 2 där vikten är i kg och längden i m. Normalviktiga har 20 BMI 25. Skriv ett program som frågar efter vikt och längd varefterbmi skrivs ut. 6. Skriv ett program som läser två tal och en operator och beräknar värdet av postfixuttrycket. 7. Som föregående uppgift men ett godtyckligt postfixuttryck. Du har tillgång till en funktion som tittar på nästa tecken utan att läsa detta: FUNCTION peak: Char; 8. Rita syntaxdiagram för att beskriva aritmetiska uttryck. Ett aritmetiskt uttryck är t.ex. följande: 3, x+3, (x*3), (x-3)/4 9. Skriv funktioner som returnerar a. det största av två heltal b. det minsta av två heltal 10. Skriv ett program som för ett givet n beräknar och skriver ut värdet av 1+1/2+ +1/n. 11. Skriv ett program för summation av n st termer som beräknas med hjälp av en funktion som är parameter till summationsfunktionen. 12. Skriv ett program som med hjälp av en funktion med lokala funktioner låter en användare, maximalt tre gånger, ange ett hemligt lösenord omfattande fyra siffror. (Det hemliga lösenordet är låst i programmet)

2 Övningsuppgifter Pascal 13. I följande två funktioner kan fel uppträda i vissa fall. Skriv om funktionerna så att felen upptäcks. Resonera om olika metoder för att indikera felen. a. FUNCTION mean(x, y: Real): Real; mean := sqrt(x * y) b. FUNCTION tan(x: Real): Real; tan := sin(x) / cos(x) 14. Skriv om de två funktionerna nedan så att du använder namngivna konstanter och ge samtidigt variabler och funktioner bättre namn. a. formeln för en cirkels area: FUNCTION a(r: Real): Real; a := 3.14159 * sqr(r) b. beräkning av månadsränta på ett sparkonto där räntan blir högre om tillgodohavandet överstiger 50 000 kr: FUNCTION i(x: Real): Real; IF x <= 50000.0 THEN i := 0.055 * x / 12 ELSE i := 0.065 * x / 12 15. I ett programmeringsprojekt för hantering av kalendrar definieras en dags absoluta dagnummer som antalet dagar från 1 januari år noll till den aktuella dagen. På många smådatorer är MaxInt= 32767. Vad kan hända om vi inte tar hänsyn till detta? Hur skall man lösa problemet? Ge gärna flera förslag. 16. Finn lämpliga black-box-tester för följande: a. En funktion som återsänder det största av sina tre flyttalsargument. b. En funktion som återsänder kvadratroten av sitt enda flyttalsargument. c. En funktion som återsänder den minsta gemensamma multipeln för sina två heltalsargument. Dessa måste båda två vara positiva. Den minsta gemensamma multipeln,mgm, för två talxochy är det minsta tal där bådexochy är faktorer. Ex: MGM för 4 och 6 är 12, för 3 och 9 är 9 samt för 5 och 7 är 35.

Datalogi, grundkurs 1, hösten 2009 3 17. Finn en lämplig glass-box-test för: IF a < b THEN IF c > d THEN x := 1 ELSE IF c = d THEN x := 2 ELSE x := 3 ELSE IF a = b THEN x := 4 ELSE IF c = d THEN x := 5 ELSE x := 6; 18. En mängd är definierad som TYPE IntSet = SET OF 0..100; Skriv en procedur i Pascal som skriver ut alla tal i en mängd av denna typ. 19. Antag att vi definierat TYPE nodepointer = ˆnode; där node redan tidigare definierats (på något sätt) och sedan givit deklarationerna VAR p, q, r: nodepointer; x, y, z: node; a. Ange för varje sats nedan vad den har för effekt om den är korrekt och varför den inte fungerar om den inte är korrekt. i. New(p) vi. r := NIL xi. Dispose(r) ii. New(qˆ) vii. z := pˆ xii. x := New(p) iii. New(x) viii. p := ˆx xiii. qˆ := NIL iv. p := r ix. Dispose(y) xiv. pˆ := xˆ v. q := y x. Dispose(pˆ) xv. z := NIL b. Skriv ett Pascal-underprogram som byter innehållet i de variabler som p och q pekar på, så att innehållet i den variabel som p pekar på blivit vad som fanns i variabeln som q pekar på och vice versa. c. Skriv ett Pascal-underprogram som skapar en ny variabel med samma innehåll som den nod som q pekar på och sätter p att peka på den nya noden. 20. Antag att vi har en struktur som kan uppfattas som enligt bilden nedan, med två pekarvariabler p och q samt två noder med ett heltalsfält som heter value och ett pekarfält som heter next. 6 4 NIL p q a. Avgör för varje sats nedan om satsen är sann, falsk eller nonsens och förklara varför: i. pˆ.next = q vii. pˆ = 6 ii. qˆ.next = NIL viii. q = 4 iii. qˆ = 4 ix. qˆ.value = 4 iv. p < q x. pˆ.next = 4 v. pˆ.value < qˆ.value xi. qˆ = NIL vi. pˆ < qˆ xii. pˆ = qˆ

4 Övningsuppgifter Pascal b. Utgå från bilden ovan och rita situationen som uppstår då följande utförs (utgå varje gång från ursprungsbilden ovan, d.v.s. betrakta inte satserna som en sekvens). Vissa satser innebär att fel uppstår, förklara då varför. i. p := pˆ.next vii. p := q ii. qˆ.next := p viii. pˆ.next := p iii. pˆ.value := 5 ix. p : = NIL iv. pˆ.value := qˆ.value x. pˆ.next := NIL v. pˆ.next := qˆ.next xi. pˆ.nextˆ.next := p vi. pˆ := qˆ xii. qˆ.nextˆ.next := q c. Skriv för varje bild nedan en Pascalsats som utför den förändring som indikeras i de fyra bilderna nedan i. 6 4 NIL 6 4 ii. p 6 4 NIL 6 4 p NIL iii. p q p q 6 4 NIL 6 4 NIL iv. p p q 6 4 2 NIL p q 6 4 2 NIL p q 21. Skriv en funktion för att kontrollera a. om ett tecken är en siffra. b. om ett tecken är en bokstav.

Datalogi, grundkurs 1, hösten 2009 5 22. Skriv deklarationer för att representera komplexa tal samt en funktion för att addera två komplexa tal. 23. Studera noga följande definitioner av funktions- och procedurhuvuden med preoch post-villkor och dra slutsatser om den interna strukturen hos listor som kan manipuleras med dem: FUNCTION createlist : listpointer pre: inga. post: en lista har skapats så att den är tom och en pekare till listan returnerats. FUNCTION emptylist(l: listpointer): Boolean pre: listan som L pekar på existerar. post: returnerar True om det inte finns element i listan, annars False. FUNCTION fulllist(l: listpointer): Boolean pre: listan som L pekar på existerar. post: returnerar False om det finns utrymme för fler element i listan, annars True. FUNCTION listsize(l: listpointer): Integer pre: Listan som L pekar på existerar. post: returnerar antalet element i listan L. FUNCTION atfirst(l: listpointer): Boolean pre: Listan som L pekar på existerar. post: returnerar True om den interna positionsindikatorn pekar på L s första element. FUNCTION atlast(l: listpointer): Boolean pre: Listan som L pekar på existerar. post: returnerar True om den interna positionsindikatorn pekar på L s sista element. FUNCTION onlist(l: listpointer): Boolean pre: Listan som L pekar på existerar. post: Returnerar True om den interna positionsindikatorn hos L pekar på ett element i L. PROCEDURE setfirst(l: listpointer) pre: Listan som L pekar på existerar. post: om L är tom pekar den interna positionsindikatorn inte ut något element, men om L inte är tom pekar den interna positionsindikatorn ut dess första element.

6 Övningsuppgifter Pascal PROCEDURE setlast(l: listpointer) pre: Listan som L pekar på existerar. post: om L är tom pekar den interna positionsindikatorn inte ut något element, men om L inte är tom pekar den interna positionsindikatorn ut dess sista element. PROCEDURE setnext(l: listpointer) pre: Listan som L pekar på existerar, är inte tom och dess interna positionsindikator pekar på ett av listans element (onlist(l) = True). post: Listans interna positionsindikator har avancerat ett steg. Om den stod på sista elementet i listan före anropet kommer onlist(l) ge False. PROCEDURE setprev (L: listpointer) pre: Listan som L pekar på existerar, är inte tom och dess interna positionsindikator pekar på ett av listans element (onlist(l) = True). post: Listans interna positionsindikator har backat ett steg. Om den stod på första elementet i listan före anropet kommer onlist(l) ge False. PROCEDURE setposition(target:integer; L:listPointer) pre: Listan som L pekar på existerar och target är ett positivt heltal. post: Om listan innehåller minst target st element kommer listans interna positionsindikator peka på element nr target. PROCEDURE removefromlist(l: listpointer) pre: Listan som L pekar på existerar, är inte tom och dess positionsindikator pekar på ett element i listan. post: Det element som positionsindikatorn pekade på har tagits ut ur listan och positionspekaren pekar på det efterföljande element (har eventuellt hamnat utanför listan). PROCEDURE insertafter(e: elementpointer; L:listPointer) pre: Listan som L pekar på existerar, är inte full och e pekar på ett listelement som inte står i någon lista. Om listan inte är tom pekar positionsindikatorn på ett av listans element. post: e har satts in på platsen efter positionsindiktatorn. Om listan var tom har e blivit dess enda element och positionsindikatorn pekar på e.

Datalogi, grundkurs 1, hösten 2009 7 PROCEDURE insertbefore(e: elementpointer; L:listPointer) pre: Listan som L pekar på existerar, är inte full och e pekar på ett listelement som inte står i någon lista. Om listan inte är tom pekar positionsindikatorn på ett av listans element. post: e har satts in på platsen före positionsindikatorn. Om listan var tom har e blivit dess enda element och positionsindikatorn pekar på e. PROCEDURE replace(e: elementpointer; L: listpointer) pre: Listan som L pekar på existerar och e pekar på ett listelement som inte står i någon lista. Listan är inte tom och positionsindikatorn pekar på ett av listans element. post: e har ersatt elementet på platsen som indikerades av positionsindiktatorn. FUNCTION retrieve(l: listpointer): elementpointer pre: Listan som L pekar på existerar. post: Om positionsindikatorn pekar på ett av listans element har en pekare till elementet på den indikerade positionen returnerats annars returnerades NIL. Många fler operationer kan behövas beroende på användningsområde och å andra sidan kan man klara sig med färre i vissa användningar. På nästa sida ges två exempel på användning: PROCEDURE dotolist(procedure todo(e: elementpointer); L: listpointer); (* pre: Listan som L pekar på existerar. * post: Proceduren todo har applicerats på alla * element i L. *) PROCEDURE apply; VAR e: elementpointer; IF onlist(l) THEN e := retrieve(l); todo(e); setnext(l); apply END setfirst(l); apply

8 Övningsuppgifter Pascal PROCEDURE interchange(e1,e2:integer; L:listPointer); (* pre: Listan som L pekar på existerar, e1 < e * post: om element finns på positionerna e1 och e2 * har de bytt plats. *) VAR el1, el2: elementpointer; setposition(e1, L); IF onlist(l) THEN setposition(e2, L); IF onlist(l) THEN el2 := retrieve(l); removefromlist(l); setposition(e1,l); el1 := retrieve(l); removefromlist(l); setposition(e1,l); insertbefore(el2,l); setposition(e2-1, L); insertafter(el1, L) END END Använd definitionerna ovan för att skriva underprogram för att utföra operationerna nedan. Ange noga pre- och post-villkor för varje underprogram. a. Sätt in ett element först i en lista. b. Sätt in ett element sist i en lista. c. Ta bort det första elementet i en lista. d. Ta bort det sista elementet i en lista. e. Sätt en listas interna positionsindikator på listans mittersta element. f. Skapa en kopia av en lista, så att den nya listans element är kopior av elementen i den gamla listan. g. Kopiera en listas alla element och sätt in dem sist i en annan lista med bibehållen ordning på elementen. h. Kopiera en listas alla element och sätt in dem först i en annan lista med bibehållen ordning på elementen i. Reversera ordningen i en lista. j. Dela en lista i två, så att vartannat element hamnar i den ena listan och vartannat i den andra listan. Den ursprungliga listan skall vara tom efter operationen. k. Implementera alla underprogrammen enligt definitionerna, med följande extra definitioner som grund:

Datalogi, grundkurs 1, hösten 2009 9 TYPE elementpointer = ^element; element = RECORD value: { något värde av någon typ }; next: elementpointer; listpointer = ^list; list = RECORD first: elementpointer; cursor: elementpointer 24. Givet följande definitioner: TYPE elementpointer = ^element; element = RECORD value: (* något värde av någon typ *); next: elementpointer; stackpointer = ^stack; stack = RECORD first: elementpointer; a. Skriv ett underprogram createstack, som skapar en tom stack. b. Skriv ett underprogram emptystack, som kontrollerar om en stack är tom. c. Skriv ett underprogram push, som lägger ett nytt element på toppen av en stack. d. Skriv ett underprogram pop, som tar bort det översta elementet från en stack och återsänder det värde som lagrades i elementet. e. När man tar bort ett element från en länkad stack måste man testa om stacken är tom, men man behöver inte testa om den är full innan man lägger till ett element varför? f. Skriv en funktion fullstack ändå. g. Kan man i alla fall tvingas ha en funktion fullstack (Motivera noga)? h. Skriv ett underprogram som går igenom en stack och räknar hur många element det finns i stacken. i. Man kan undvika att gå igenom hela stacken varje gång man vill veta antalet element genom att ändra i definitionen: stack = RECORD top: elementpointer; size: Integer; Vad måste man ändra - i vilka underprogram - för att det ska fungera? Vilket är bäst? Behöver man veta storleken?

10 Övningsuppgifter Pascal 25. Givet följande definitioner: TYPE elementpointer = ^element; element = RECORD value: (* något värde av någon typ *); next: elementpointer; queuepointer = ^queue; queue = RECORD first, last: elementpointer; a. Skriv createqueue, som skapar en tom kö. b. SkrivemptyQueue, som kontrollerar om en kö är tom. c. Skriv enqueue, som lägger ett nytt element sist i en kö. d. Skriv retrieve, som återsänder värdet i det första elementet i en kö. e. Skriv dequeue, som tar bort det första elementet från en kön. f. Skriv queuecardinal, som går igenom en kö och räknar hur många element det finns i kön. g. Skriv clearqueue, som rensar en kö så att den blir tom. 26. Givet följande definitioner: TYPE elementpointer = ^element; element = RECORD prev, next: elementpointer listpointer = ^list; list = RECORD first, last: elementpointer; Komplettera till en abstrakt datayp så att man kan skapa en tom lista, kontrollera om en lista är tom, sätta in element först och sist i en lista, före och efter ett element till vilket man har en referens (om det står i någon lista), samt slutligen tömma listan. 27. Skriv deklarationer för att representera enkla lisputtryck. Uttrycken innehåller bara heltal, operatorerna +, - och * samt ( och ). 28. Skriv funktioner för att läsa in lisputtryck och för att evaluera dessa. 29. Mätvärden av reell typ finns lagrade på en textfil och man vill beräkna medelvärdet. Svårigheten är att veta när sista värdet har lästs eftersom det finns ett returslag efter sista talet. Hur löser vi detta problem? 30. Skriv ett program som läser heltal från tangentbordet och lagrar dem i en FILE OF Integer. Använd filslutsmarkering som slut på inmatningen. 31. Skriv ett program som från en FILE OF Integer läser heltal och skriver alla talen på skärmen.

Datalogi, grundkurs 1, hösten 2009 11 32. I en textfil finns tal instoppade i texten. Skriv ett program som läser filen och beräknar summan av alla tal. 33. I en faktura finns i texten par omfattande antal och pris. Skriv ett program som beräknar totalsumman. 34. Skriv en Pascalprocedur som tar en filparameter, och avancerar filens positionspekare så att den pekar på nästa tecken som kan börja ett korrekt tal, om det finns något sådant tecken, eller på filslutet annars. 35. Skriv ett Pascalprogram som läser en textfil som innehåller ett Pascalprogram och räknar antalet tilldelningssatser i programmet. 36. Skriv ett pascalprogram som läser en textfil och som räknar antalet förekomster av varje tecken i programmet. 37. Givet följande definitioner: CONST maxindex = 100; TYPE element = RECORD value: { något värde av någon typ } { eventuella andra fält } storage = ARRAY [1..maxIndex] of element; queuepointer = ^queue; queue = RECORD entry: storage; first, last: 0..maxIndex; a. Implementera den abstrakta datatypen kö, med funktionalitet som enligt uppgift 25, och använd den enkla men föga effektiva idén att första elementet alltid är i första positionen i den kontinuerliga listan. b. Använd i stället som implementationsidé att listan entry betraktas som en cirkulär lista, d v s att element 1 följer på det sista elementet. Man får olika implementationsproblem i de två olika fallen. Jämför! 38. Ett palindrom är en teckensträng som läses likadant även om man vänder på den, d v s att första och sista bokstäverna är lika, andra och näst sista är lika o s v. I ett äkta palindrom kommer även ordmellanrum på samma ställen om man vänder på meningen, medan man i ett oäkta palidrom tillåter likhet först då mellanslagen rensats bort. Ex på äkta palindrom: alla, adolf i paris rapar sirap i floda. Ex på oäkta palindrom: Ni talar bra latin. a. Skriv en funktion som kontrollerar om en teckensträng lagrat i en vektor är ett äkta palindrom. b. Skriv en funktion som kontrollerar om en teckensträng lagrat i en vektor är ett oäkta palindrom.

12 Övningsuppgifter Pascal 39. Implementera den abstrakta datatypen lista baserad på definitionerna nedan. Funktionalitet som enligt definitionerna i uppgift 23: CONST maxindex = 100; TYPE element = RECORD value: { något värde av någon typ } { eventuella andra fält } storage = ARRAY [1..maxIndex] of element; listpointer = ^list; list = RECORD entry: storage; cursor: 0..maxIndex; 40. I en kontinuerlig lista ligger tal, med maximalt 50 siffror, lagrade med en siffra i varje komponent. Skriv deklarationer för att representera talen samt en funktion som adderar två sådana tal. 41. Som ovan men med n siffror i varje komponent. 42. Med maximinormen för en matris av positiva tal menas den största radsumman. Skriv en funktion som beräknar maximinormen för en matris. 43. Skriv en funktion för att transponera en matris. (Hur måste matrisen se ut för att vi skall kunna transponera den?) 44. Gå noga igenom sorteringsmetoderna nedan. OBS! att plats 0 (noll) i listorna används till mellanlagring vid byte av element. PROCEDURE selectionsort(var v:vector; first, last: index); VAR i, j, minpos: index; FOR i := first TO last - 1 DO minpos := i; FOR j := i TO last DO IF v[minpos] > v[j] THEN minpos := j; v[0] := v[i]; v[i] := v[minpos]; v[minpos] := v[0]

Datalogi, grundkurs 1, hösten 2009 13 PROCEDURE insertionsort(var v:vector; first, last: Index); VAR next, pos: index; FOR next := first + 1 TO last DO v[0] := v[next]; pos := next; WHILE v[pos - 1] > v[0] DO v[pos] := v[pos - 1]; pos := Pred(pos) v[pos] := v[0] END PROCEDURE exchangesort(var v:vector; first, last: Index); VAR i, j: index; FOR i := last DOWNTO first + 1 DO FOR j := first TO i - 1 DO IF v[j] > v[succ(j)] THEN v[0] := v[j]; v[j] := v[succ(j)]; v[succ(j)] := v[0] END END Kontrollera för hand hur följande skulle sorteras enligt alla tre algoritmerna: a. talen 26, 33, 35, 29, 19, 12, 22 i stigande ordning b. talen 12, 19, 33, 26, 29, 35, 22 i stigande ordning (samma tal men annan ordning) c. namnen Tim, Dot, Eva, Roy, Tom, Kim, Guy, Amy, Jon, Ann, Jim, Kaj, Ron och Jan i alfabetisk ordning (antag att > klarar jämförelsen). 45. Skriv om den abstrakta datatypen list enligt uppgift 39 så att rekursion inte används. 46. Eliminera rekursion där det går i följande: a. FUNCTION f(n: Integer): Integer; IF n <= 0 THEN f := 0 ELSE IF Odd(n) THEN f := 1 + f(n - 1) ELSE f := f(n DIV 5)

14 Övningsuppgifter Pascal b. FUNCTION f(n: Integer): Integer; IF n <= 1 THEN f := n IF Odd(n) THEN f := f((n + 1) DIV 2) + f((n - 1) DIV 2) ELSE f := n + f(n DIV 2) c. FUNCTION gcd(a, b: Integer): Integer; IF b = 0 THEN gcd := a ELSE gcd := gcd(b, a MOD b) d. FUNCTION b(key: keytype; VAR v: vector; a, b: Index): elementpointer; VAR m: Index; m := (a + b) MOD 2; IF v[m] = key THEN b := v[m] ELSE IF v[m] < key THEN b := b(key, v, m + 1, b) ELSE b := b(key, v, a, m - 1) e. FUNCTION p(s: string; a, b: Index): Boolean; IF a > b THEN p := True ELSE p := s[a] = s[b] AND p(s, a + 1, b - 1)) 47. Skriv en listhanterare samt postdeklarationer för att hantera punkter i både planet och rymden. 48. Skriv om uppgifterna 27 och 28 med varianta poster.