TDDC74 Lab 04 Muterbara strukturer, omgivningar

Relevanta dokument
TDDC74 Lab 02 Listor, sammansatta strukturer

TDDC74 - Lektionsmaterial C

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 8 10, 7 april 2016

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

TDDC74 Programmering, abstraktion och modellering DUGGA 3

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TDDC74 Programmering: Abstraktion och modellering Dugga 1, kl 14-16

TDDC74 Programmering: Abstraktion och modellering Datortenta

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

TDDC74 Programmering, abstraktion och modellering DUGGA 2

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

Tentamen i. TDDC67 Funktionell programmering och Lisp

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

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

TDDC74 Programmering: Abstraktion och modellering. Provkod TEN1, Tid: kl 14-18, , Kåra

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

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

TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

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

Idag: Dataabstraktion

Tentamen i. TDDA 69 Data och programstrukturer

Institutionen för datavetenskap, DAT060, Laboration 2 2 För denna enkla simulerings skull kommer handen att representeras som ett par tal μ värdet på

Ändringsbar (mutable compound) data. TDDC74 Programmering: abstraktion och modellering. Sätta - samman listor kopiering. Hitta sista cons-cellen

Datalogi, grundkurs 1

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 3 mars 2016

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

DD1361 Programmeringsparadigm. Carina Edlund

Deklarationer/definitioner/specifikationer

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

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

TDDC74 Programmering, abstraktion och modellering DUGGA 1

MMA132: Laboration 2 Matriser i MATLAB

Föreläsning 9 Exempel

FÖRELÄSNING 1 PERSONAL TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 SYFTE EXAMINATION ORGANISATION

Våra enkla funktioner eller procedurer

Datalogi, grundkurs 1

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Rekursiva algoritmer sortering sökning mönstermatchning

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Modularitet och tillstånd. Stora system kräver en uppdelning. En lösning: modularitet. Basera programmets struktur på den fysiska systemets struktur:

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Imperativ programmering. Föreläsning 2

TDIU01 - Programmering i C++, grundkurs

Funktionell programmering DD1361

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

I dag: Blockstruktur, omgivningar, problemlösning

Tentamen *:58/ID100V Programmering i C Exempel 3

Miniprojekt: MEX och molekyldynamik

Föreläsning 6: Introduktion av listor

Funktionens deklaration

Kopiering av objekt i Java

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Symbolisk data. quote. (define a 1) (define b 2) (jacek johan david) (list a b)

Sökning och sortering

Tentamen i Introduktion till programmering

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

Föreläsning 6: Metoder och fält (arrays)

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Datalogi, grundkurs 1

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

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

Linköpings Tekniska Högskola Instutitionen för Datavetenskap (IDA) Torbjörn Jonsson, Erik Nilsson Lab 2: Underprogram

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Fly me to the moon. Laboration om relationer, TDDC75 Diskreta strukturer. Mikael Asplund. 5 september 2017

Lära dig analysera större och mer komplicerade problem och formulera lösningar innan du implementerar.

Några saker till och lite om snabbare sortering

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Transkript:

TDDC74 Lab 04 Muterbara strukturer, omgivningar 1 Översikt I den här laborationen kommer ni att lära er mer om: Tillstånd, och skillnader mellan ren funktionell programmering och imperativ. Skillnaden mellan att returnera ett värde och att visa ett värde. Procedurer som minns någon form av data. Lexical closures. 2 Värt att veta Laborationen berör kapitel 3 i kurslitteraturen. För mer läsning se även SICP+03 som finns på http://www.ida.liu.se/~tddc74/labbar/extra/ pram-sicp03-2017.pdf När ni är klara med denna labb, fortsätt med laboration 5 så snart ni har möjlighet. 2.1 Filer Börja med att kopiera filerna från ~TDDC74/lab/lab4 till din labb 4-katalog (~/kurs/tddc74/lab4). 1

Uppgift 1 ----------------------------------------------------------------------- Förklara skillnaden mellan att en procedur returnerar ett värde och att en procedur skriver ut ett värde. Förklara även vad som händer, och varför utdata ser ut som det gör, för vart och ett av stegen nedan (efter define-uttrycken) för er labbassistent, antingen på plats eller i kodkommentar: >(define (foo bar) bar) > (define (bar foo) (printf "~a~n" foo)) > (+ (foo 3) 4)???? > (bar 3) > (+ (bar 3) 4)???? > (display (bar 3)) ;; skriv ut returvärdet Uppgift 2 ----------------------------------------------------------------------- Implementera en egen variant av primitiven for-each. Er implementation, for-each-element, ska ta in en procedur och en lista som argument. Den ska sedan köra sedan proceduren på varje element (på topp-nivån). Till skillnad från map samlar for-each inte upp resultaten. Det enda vi är intresserade av är sidoeffekten. > (for-each-element (lambda (element) (printf "Nuvarande element: ~a~n" element)) (1 2 foo bar 3)) Nuvarande element: 1 Nuvarande element: 2 Nuvarande element: foo Nuvarande element: bar Nuvarande element: 3 > (display (for-each-element (lambda (element) 2

(* element 100)) (1))) #<void> Notera att vi inte får tillbaka något från for-each-element. Vi applicerar (kör) funktionen vi skickar med, vi multiplicerar 1*100=100, men vi gör inget med resultatet. Vi kan såklart använda den för att uppdatera värden: > (let ([sum 0]) (for-each-element (lambda (num) (set! sum (+ sum num))) (1 2 3 4 5)) sum) 15 Det vill säga, skapa tillfälligt en bindning sum, uppdatera den ett antal gånger, returnera värdet i slutet. Uppgift 3 ----------------------------------------------------------------------- I denna uppgift ska vi börja utforska lexical closures, där vi knyter samman en procedur med en omgivning (och därmed indirekt med en uppsättning bindningar). På så vis kan man få procedurer som minns data. Skriv en procedur count-calls som returnerar antalet gånger den har blivit anropad. Detta ska göras med en intern räknare. Ni får alltså inte ha en global räknare, något i stil med (define *counter* 0). Proceduren ska också kunna nollställa sin räknare och kontrollera hur många gånger den har blivit anropad utan att den räknas upp. Alltså, om count-calls anropas med symbolen how-many-calls ska räknarens värde returneras. Om anropet görs med symbolen reset ska räknaren nollställas. > (count-calls how-many-calls) 3 > (count-calls how-many-calls) 3

4 > (count-calls reset) > (count-calls how-many-calls) 0 > (count-calls how-many-calls) 1 Notera att antalet argument som count-calls anropas med varierar 1. Titta i SICP+03 eller i annat material på kurshemsidan om ni inte är säkra på hur ni ska börja implementera proceduren. Uppgift 4 ----------------------------------------------------------------------- Det kan ibland vara intressant att veta ungefär hur många gånger en procedur anropas, för att se om den skalar väl. Mer allmänt kan det vara intressant att paketera procedurer på sätt som förändrar hur man anropar dem, kontrollerar att indata är korrekt, eller gör någon annan beräkning. I denna övning ska ni implementera en procedur make-monitored. Den ska som indata ta en procedur fn, och som utdata returnera en procedur som har en intern räknare. Varje gång den nya versionen av funktionen anropas, ska fn anropas, och räknaren räknas upp. Precis som i en tidigare uppgift ska man även kunna anropa den returnerade proceduren med symbolerna how-many-calls och reset. Vid alla andra argument ska fn anropas med övriga argument samt att räknaren ska stegas upp. I denna uppgift är apply mycket lämplig att använda. apply tar in en procedur och en lista och applicerar (kör) sedan proceduren med alla argument i listan. Följande två anrop är alltså desamma: > (apply max (1 2 3 4 5)) 5 > (max 1 2 3 4 5) 5 Så här ska make-monitored fungera: > (define monitored-max (make-monitored max)) > (monitored-max 1 2 3 4 1 5 6) 1 Lästips: https://docs.racket-lang.org/guide/lambda.html 4

6 > (max 10 20 30) 30 > (monitored-max how-many-calls) 1 > (monitored-max reset) > (monitored-max how-many-calls) 0 Vi kan också göra en helt annan monitored -procedur. Notera att den får en helt egen räknare. > (define fac (make-monitored (lambda (num) (if (zero? num) 1 (* num (fac (- num 1))))))) > (fac how-many-calls) 0 > (fac 3) 6 > (fac how-many-calls) 4 > (monitored-max how-many-calls) 0 Uppgift 5 ----------------------------------------------------------------------- En rekursiv procedur med iterativ processlösningsmodell (tänk sum-iter) kan enkelt transformeras till en iterativ procedur genom att utnyttja en enkel loop-procedur utan argument. Istället för att passa med nya versioner av gamla värden (med rekursiva anrop som (fak (+ n 1) (+ acc n))), uppdaterar man dem med (till exempel med set!). Er uppgift är att översätta en enkel rekusiv procedur till detta mönster. Antag att vi har följande rekursiva procedur som går genom en lista: (define (rev lst) (define (rev-iter lst res) 5

(if (null? lst) res (rev-iter (cdr lst) (cons (car lst) res)))) (rev-iter lst ())) Definiera en ny variant genom att skriva er kod på angivna platser: (define (rev lst) (let ([res ()]) (define (loop) (cond [(null? lst) <er kod> ] [else <ngn kod> (loop)])) (loop))) 3 Muterbara data, pekarändringar När vi tidigare har ändrat på data, har vi egentligen tagit gamla namn och ändrat vad de är knutna till. Ta till exempel detta kodstycke: (define *var* (mcons 1 2)) (set! *var* (mcons 1 x)) Först säger vi att det-som-kallas-*var* ska vara (det muterbara) paret (1. 2). Sedan säger vi att det som kallas *var* ska vara paret (1. x). Rent tekniskt ändrar vi aldrig något inuti paret (1. 2). Det vi gör på set!- raden är att skapa ett helt nytt (nästan likadant) par, och säga att namnet *var* ska peka på det. Eftersom det gamla paret inte används längre, städas det bort. I denna uppgift kommer vi att stöta på en muterbar datatyp, en där vi kan ändra i själva innehållet. Uppgift 6 ------------------------------------------------------------------------ Öppna filen pram-la04-mut.rkt som ni kopierade i början av labben 2. Kör 2 Den finns annars i TDDC74/lab/lab4/pram-la04-mut.rkt 6

uttrycken och förklara vad som händer. Vad kommer att skrivas i parenteser som värdet på start? Rita även låd-och-pekar diagram för att illustrera hur cons-cellerna är uppbyggda och vilka pekare som ändras. Gör inte kopior av cons-cellerna utan visa bara vilka pekare som har ändrats. 4 Inlämning Även för denna laboration finns en färdig uppsättning första tester att köra. Kopiera autotest-la04.rkt från TDDC74/lab/lab4 till samma katalog som filen ni skriver i, uppdatera filens require-rad, och skriv följande kod i slutet av er fil i Dr. Racket: (provide (all-defined-out)). Kör sedan autotest-la04.rkt. Får ni ett fel så läs vad felet säger! Det kan även vara intressant att ta en titt på hur autotest-filen ser ut inuti. 7

Appendix A Nya tillåtna primitiver: apply when void begin unless set! display newline Länktips: https://docs.racket-lang.org. 8