FÖRELÄSNING 1 TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 Introduktion till kursen Schemespråkets grunder Enkla exempel Jalal Maleki Institutionen för datavetenskap Linköpings universitet jalal.maleki@liu.se 2 SYFTE ORGANISATION AV UNDERVISNINGEN Kursens syfte är att studenterna ska utveckla förmåga att representera och lösa problem med hjälp av konstruktioner i ett datorspråk. Efter avslutad kurs ska studenterna kunna: redogöra för grundläggande datavetenskapliga begrepp relaterade till programmering och programspråk, särskilt funktionella språk metodiskt lösa programmeringsrelaterade problem i en interaktiv programutvecklingsmiljö representera problem och lösningar till dessa i form av rekursiva och iterativa algoritmer och kunna uppskatta tid- och rymdkomplexiteten för enklare fall konstruera abstraktioner som möjliggör design av program som är lättförståliga, återanvändbara och kan underhållas lättare genomföra ett mindre programmeringsprojekt 3 Föreläsningar Lektioner Laborationer Projekt Datorduggor Datortenta 4
ARBETSSÄTT I KURSEN Laborationsarbete i grupp av två Individuell utveckling Diskutera med andra för att lära dig men gör egen lösning Individuell examination, någon annan grupps lösning kan inte skickas in som labbgruppens lösning Lämna in endast eget arbete för redovisning. Om läraren misstänker annat måste saken rapporteras till universitetets disciplinnämnd - inte kul EXAMINATION DAT1 Datortentamen / duggor (U,3,4,5) 2 hp LAB1 Laborationer (U, G) 3 hp PRA1 Projekt (U,3,4,5) 3 hp Slutbetyget på kursen baseras i första hand på betyget på DAT1. Betyg 3 eller 4 i DAT1 kan höjas - se kurshemsidan 5 6 KURSHEMSIDAN KURSBOKEN SICP http://www.ida.liu.se/~tddc74 - aktuell info om kursen nyheter, personal, laboration/lektion/föreläsningsmaterial, svar på administrativa frågor, gamla duggor och tentor, Tre första kapitlen ingår i denna kurs Finns på nätet: mitpress.mit.edu/sicp/ 7 8
KURSBOKENS INNEHÅLL SICP1 Abstraktioner baserad på procedurer SICP2 Abstraktioner baserat på data SICP3 Abstraktioner baserat på objekt DR.RACKET Systemet vi skall använda för programmering heter DrRacket DrRacket innehåller ett Schemebaserad programspråk Racket www.racket-lang.org eller www.drracket.org DrRacket är en så kallad programmeringsmiljö som tillgängliggör olika verktyg för programmeraren Läs kursboken! 9 10 PROGRAMMERING Formulera beräkningsprocesser som bearbetar data som får datorn att välja mellan alternativa beräkningar som får datorn att snurra som löser ett angivet problem PROGRAMMERING OCH MATLAGNING Program liknar matrecept, t ex recept för pannkakor Programmering liknar kockens arbete i receptproduktion Recept utförs av folk Program utförs av dator eller robot Fel kan uppstå i båda fallen i ett programspråk Representera/modellera/avbilda 11 12
DATASPRÅK primitiva uttryck (primitive expressions) sammansättningsregler (means of combination) - Procedursammansättning - Sammansättning av primitivdata för att få sammansatt data abstraktioner (means of abstraction) - Svartlåda-tänkande (möjlighet att ignorera detaljer) - Dataabstraktion - Högre-ordningens procedurer - Procedurer som data UTTRYCK I SCHEME Primitiva uttryck (konstanter och namn) 1, 3.14, pi, + Sammansatta uttryck (bl a proceduranrop) (* pi 2) Nästlingsmöjlighet: (+ (* 2 3) (- 4 5)) prefixnotation (operator operand operand) (+ 10 21 33) jfr med infixnotation operand operator operand 10+21+33 13 14 KONSTANTER I SCHEME truth-value: #t, #f integer: 28, +1729, -2 rational: 3/4, -22/7 floating: 3.1415, -10e10, 2e-3 complex: 3.1+4i, 2-3i (sanningsvärde) (heltal) (bråk) (flyttal) (komplext tal) NAMN I SCHEME Ett namn är en ändlig följd av tecken som inte skapar en konstant i Scheme Namn får ej innehålla bryttecken som parenteser eller blanktecken Namn används för att benämna ett värde eller en procedur + square seriously? @fstops i-am-a-name-in-scheme http://www.google.com/ -1+ 2+2 15 16
SAMMANSATTA UTTRYCK Applikation av inbyggda procedurer (inbyggd-fn argument-1 argument-2 argument-n) Applikation av användardefinierade procedurer (användar-fn argument-1 argument-2... argument-n) Undantagsformer (if villkor då-uttrycket annars-uttrycket) (and uttryck-1 uttryck-2 uttryck-n) (or uttryck-1 uttryck-2... uttryck-n) Abstractionsmöjligheter (define namn värde) (lambda parametrar kropp) FUNKTION INOM MATEMATIK D = {..., -2, -1, 0, 1, 2,...} R = {..., -2, -1, 0, 1, 2,...} Funktion f(x) = x 2 f={..., < -2, 4 >, < -1, 1 >, < 0, 0 >, < 1, 1 >,...} D= {, -2, -1, 0, 1, } R= {, 4, 1, 0, 1, } D R 17 18 FUNKTION I SCHEME En procedur som utför mappning från mängden D till mängden R Precis beskrivning (algoritm) för hur en beräkning skall gå till (lambda (n) (* n n)) (lambda (r) (* 2 (* pi r))) (lambda (f) (* (/ 5 9) (- f 32))) LAMBDAABSTRAKTION (lambda (n) (* n n)) definierar en anonym funktion som kan beräkna kvadraten av sin parameter Det som skapas av detta uttryck brukar vi också kalla för procedurobjekt för att markera att det är en sak parametrar: (n) kropp: (* n n) 19 20
PROCEDURAPPLIKATION ((lambda (n) (* n n)) 7) Proceduren med parametern n appliceras till argumentet 7 Vi brukar också säga att proceduren anropas Parameter: n Kropp: (* n n) Argument: 7 Returvärde: 49 PARENTESER Parenteser är till för att definiera strukturen för sammansatta uttryck eller beskrivningar Parenteser möjliggör korrekt tolkning av programmen i Scheme ((lambda (n) (* n n)) 7) 21 22 TOLKNING (EVALUERING): READ-EVAL-PRINT Read --- läs ett uttryck Evaluate --- tolka uttrycket Print --- skriv ut resultatet >(+ 2 (* 3 4)) 14 >(define x 3) >(+ 2 x) 5 >(define dubbla (lambda (n) (* n 2))) >(dubbla 9) 18 23 EVALUERING AV FUNKTIONSANROP För att evaluera ett anrop som (fn arg1 arg2 argn) Evaluera fn för att hämta dess definition Evaluera argumenten arg1 arg2 argn för att få värdena Ersätt förekomster av parametrar i procedurens kropp med motsvarande argumentvärden och evaluera sedan kroppen Detta sätt kallas för det applikativevaluering för beräkning. Vårt Schemesystem Racket evakuerar på detta sätt. 24
EVALUERING AV FUNKTIONSANROP - NORMALEVALUERING För att evaluera ett anrop som (fn arg1 arg2 argn) Evaluera fn för att hämta dess definition Ersätt förekomster av parametrar i procedurens kropp med motsvarande (oevaluerade) argument och evaluera sedan kroppen Detta sätt kallas för det normala evaluering. EVALUERING GENOM SUBSTITUTION Både evalueringssätten som presenterades ersätter parametrar i kroppen på en procedur med motsvarande argument varför de ibland kallas substitutionsmodellen på beräkning. 25 PROGRAMEXEMPEL: AVSTÅNDET MELLAN TVÅ PUNKTER (define distance (lambda (x1 y1 x2 y2) ( s q r t ( + ( s q u a r e ( - x 2 x 1 ) ) (square (- y2 y1)))))) SUBSTITUTIONSMODELLEN (APPLIKATIVEVALUERING) (distance 0 0 3 4) (sqrt (+ (square (- 3 0)) (square (- 4 0)))) (sqrt (+ (square 3) (square 4))))) (sqrt (+ (* 3 3) (* 4 4))) (sqrt (+ 9 16)) (sqrt 25) 5 (define square (lambda (n) (* n n))) 27 28
UNDANTAGFORMER I SCHEME IF Konstruktioner som är undantagna från det generella sättet som funktioner tolkas i Scheme. Villkorliga beräkningar if cond Logiska operationer som sätter samman flera villkor and or 29 (if villkor då-uttryck annars-uttryck) (if (< amount 10000) 0.5 1.5)) Om beloppet är mindre än 10000 då skall beräkningen ge resultatet 0.5 annars 1.5 Obs att if skrivs i samma position där man brukar ha ett procedurnamn. Kom ihåg dock att if är ingen procedur/ funktion. 30 COND (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (villkor-n då-uttryck-n)) (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) ((>= amount 50000) 2.5))) ELSE (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) ((>= amount 50000) 2.5))) (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) (else 2.5))) 31 32
EXEMPEL PÅ LOGISKA OPERATORER (and e 1,, e n ) (or e 1,, e n ) (not e 1 ) ABSTRAKTIONSOPERATORER define lambda Gruppering av procedurer (and (> x 2) (< x -2)) (or (> x 2) (< x -2)) (not (< x 3)) 33 34 DEFINE Används för att tilldela namn till konstanter eller procedurobjekt define har tillgång till tabeller där namnen lagras KOMBINATION AV LOGISKA OPERTORATORER (or (and (> x 2) (< x 6)) (and (> x -6) (< x -2))) (not (or (> x 1) (< x -1))) 35 36
LAMBDAUTTRYCK (lambda parametrar kropp) Skapar ett objekt som givet ett antal argument (lika många som de angivna parametrarna) kan beräkna ett värde som motsvarar evaluering av kroppen ABSTRAKTION I SCHEME: ATT NAMNGE SAKER (define ten 10) (define square (lambda (n) (* n n))) (define circle-area (lambda (r) (* pi (square r)))) 37 38 NAMNGIVNING AV FUNKTIONER Följande två sätt att definiera funktionen area är ekvivalenta: (define area (lambda (r) (* pi (square r)))) (define (area r) (* pi (square r))) Så länge man är medveten om denna likhet spelar det ingen roll vilket alternativ man väljer. UNDANTAGSFORMEN IF Medan alla funktionsanrop evalueras enligt en och samma regel som beskrevs nyss, evalueras undantagsformer (special forms) på annat sätt t ex (if villkor då-uttryck annars-uttrycket) Evaluera villkor, om sant evaluera sedan då-uttrycket annars evaluera annars-uttrycket Resultatet blir antingen värdet på då-uttrycket eller annarsuttrycket 39 40
SPECIALFORMEN COND (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (villkor-n då-uttryck-n)) Evaluera villkor-1, om sant, evaluera sedan då-uttryck-1, annars gå till nästa i ordningen Någon av villkoren måste vara sant annars blir det fel Genom att låta villkor-n vara nyckelordet ELSE garanterar vi att då-uttryck-n evalueras i fall de tidigare villkoren varit falska. Så här: (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (ELSE då-uttryck-n)) 41 SPECIALFORMEN (AND ARG-1 ARG-2...) Evaluera argumenten från vänster till höger tills 1) något argument evelueras till ett falskt värde #f,eller 2) argumentlistan tar slut I fall 1 returneras värdet #f, och i fall 2 returneras #t. 42 SPECIALFORMEN (AND ARG-1 ARG-2...) Evaluera argumenten från vänster till höger tills 1) något argument evelueras till ett sant värdet #t,eller 2) argumentlistan tar slut I fall 1 returneras värdet #t, och i fall 2 returneras #f. FÖLJANDE ÄR EKVIVALENTA (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x))) (cond ((> x 0) x) ((= x 0) 0) (else (- x))) (if (> x 0) x (if (= x 0) 0 (- x) 43 44