Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Relevanta dokument
Dataabstraktion. TDDD73 Funktionell och imperativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Abstrakta datatyper. Dagens föreläsning. Abstract data types (ADT)

Dagens föreläsning. TDDC67 Funktionell programmering och Lisp Fö 8 och 9

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Uppgift 4A - Definition av enkla funktioner

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Tentamen i. TDDC67 Funktionell programmering och Lisp

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

Sätt att skriva ut binärträd

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

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

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

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)

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

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

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

TDDC74 Lab 02 Listor, sammansatta strukturer

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

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

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

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

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

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

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

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

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

TDDC74 Programmering, abstraktion och modellering. Tentamen

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Grundläggande Datalogi

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

DD1314 Programmeringsteknik

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

TDDC77 Objektorienterad Programmering

Tentamen i Introduktion till programmering

Grundläggande datalogi - Övning 1

729G06 Föreläsning 1 Objektorienterad programmering

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Idag: Dataabstraktion

Obligatorisk uppgift 5

Tentamen, Algoritmer och datastrukturer

Rekursiva algoritmer sortering sökning mönstermatchning

729G74 IT och programmering, grundkurs. Tema 1, Föreläsning 3 Jody Foo,

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

Programmering II (ID1019)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

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

Föreläsning 1 Datastrukturer (DAT037)

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Tentamen Datastrukturer, DAT037 (DAT036)

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

TDP002 - Imperativ programmering

TDDC74 Programmering, abstraktion och modellering. Tentamen

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

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

Programmering II (ID1019) :00-11:00

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

729G04 Programmering och diskret matematik

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

Översikt 5 delar. 1: Fysisk representation. Binär, oktal och hexadecimal representation

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Föreläsning 9 Innehåll

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

1 Klasser och objektorientering Vad är objektorientering?

Trädstrukturer och grafer

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

Funktionell programmering

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

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

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Pythons standardbibliotek

Föreläsning 2 Programmeringsteknik och C DD1316

Grafik. TDDC66 Datorsystem och programmering Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Föreläsning 14 Innehåll

Programmering A. Johan Eliasson

TDDE44 Programmering, grundkurs

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

DD1361 Programmeringsparadigm. Carina Edlund

Transkript:

Dataabstraktion TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12 Peter Dalenius Institutionen för datavetenskap 2013-11-12

Översikt Vad är abstraktion? Vad är en abstrakt datatyp? Hur kan man designa och implementera abstrakta datatyper? Exempel på abstrakt datatyp: symbolisk derivering Sätt att konstruera sammansatta datatyper Introduktion till almanackan och laborationsomgång 6 2

Abstrakt Teoretisk, konstruerad, overklig, svårfattlig, dunkel, diffus, akademisk Konkret Verklig, påtaglig, faktisk, åskådlig, existerande, tydlig, gripbar 3

4

Olika typer av abstraktion 1. Låt s vara 0 2. För varje tal n i listan x summera_lista låt s vara s + n 3. Returnera s Årtal Månad Dag Nummer personnummer Procedurabstraktion Dataabstraktion 5

Defintion av datatyp (igen) En datatyp är en väldefinierad sorts information som ett datorprogram kan använda. Datatypen talar om vilka dataobjekt som ingår i typen (vilken domän som typen har) samt vilka operationer som är tillåtna. Datatypen svarar alltså på frågorna: Hur ser objekten ut? Vad kan man göra med dem? 6

Datatyper på olika nivåer Allmänna datatyper (stack, kö, tabell, bråk, graf) Min programvara Abstrakta datatyper Tillämpningsnära datatyper (personer, fordon, kurser, schema, klockslag) Programspråk (heltal med oändlig precision, strängar, listor, ) Hårdvara (bit, heltal, flyttal, ) 7

Datatypens definitionsmängd Ändlig T.ex. sanningsvärden {True, False} Oändlig T.ex. heltal Sammanlagd T.ex. tal (Number i Python) som en union av heltal, flyttal och komplexa tal. Rekursivt definierad T.ex. ett binärt sökträd kan vara ett tomt träd, ett löv eller en nod som innehåller två binära sökträd. 8

Primitiva operationer på datatyper De primitiva operationerna utgör datatypens gränssnitt (eng. interface) gentemot resten av programkoden. Några exempel på typer av primitiver: Konstruktorer (eng. constructors) för att skapa objekt Selektorer (eng. selectors) för att plocka ut delarna Igenkännare (eng. recognizers) för att känna igen objekt av viss datatyp eller objekt med särskilda egenskaper. Iteratorer (eng. iterators) för att bearbeta alla elementen i ett objekt, ofta med hjälp av högre ordningens funktioner Jämförare (eng. comparator) för att kontrollera när objekt är lika Modifikatorer (eng. modifiers) för att ändra elementen i ett objekt 9

Exempel: Symbolisk derivering Deriveringsregler 1 om u x 0 om u ej är en funktion av x Exempel 4 101 34 21 34 2 21 31211 10

Exempel: Symbolisk derivering def derive(expr, var): if expr == var: return 1 elif isinstance(expr, str) or isinstance(expr, int): return 0 elif expr[1] == '+': return [derive(expr[0], var), '+', derive(expr[2], var)] elif expr[1] == '*': return [[expr[0], '*', derive(expr[2], var)], '+', [derive(expr[0], var), '*', expr[2]]] else: raise Exception("Invalid expression!") 11

Exempel: Symbolisk derivering >>> derive('x', 'x') 1 >>> derive(['x', '+', 5], 'x') [1, '+', 0] # 1 >>> derive([4, '*', 'x'], 'x') [[4, '*', 1], '+', [0, '*', 'x']] # 4 Denna lösning är representationsberoende. Programkod som relaterar till hur vi har valt att lagra de matematiska uttrycken är sammanblandad med programkod som behandlar algoritmen för symbolisk derivering. En av de stora poängerna med att införa abstrakta datatyper är vi vill gömma informationen om hur data är representerat (eng. information hiding). 12

Arbetsmetodik 1. Identifiera datatyper Studera tillämpningsområdet och karaktärisera den information som hanteras. För sammansatt information, bestäm hur de ingående delarna relaterar till varandra. 2. Bestäm primitiver Se olika typer på föregående bild. 3. Bestäm representation För varje datatyp, bestäm hur de enskilda objekten ska representeras (i termer av de datatyper som finns i det språk som används) 4. Definiera primitiver Implementera. 13

1. Identifiera datatyper Vilka delar består ett matematisk uttryck av (så långt vi orkar specificera i det här exemplet)? Ett uttryck kan vara en konstant, en variabel eller ett sammansatt uttryck. Ett sammansatt uttryck består i sin tur av två uttryck med en operator emellan. Orden i fetstil ovan är våra abstrakta datatyper. Ofta kan fler detaljer behöva specificeras, men i det här exemplet nöjer vi oss så här. 14

2. Bestäm primitiver Var och en av de fem datatyperna behöver åtminstone en basuppsättning primitiver: konstruktor (som skapar ett objekt från dess delar), selektorer (som plockar ut de olika delarna) och igenkännare. Det är dock inte säkert att alla dessa primitiver är nödvändiga för varje datatyp i just det exempel vi ska implementera. 15

3. Bestäm representation konstant = ett vanligt tal så som det skrivs i Python variabel = en sträng i Python som innehåller bokstäver operator = en sträng i Python som innehåller någon av symbolerna + eller * sammansatt uttryck = en lista bestående av tre element: två uttryck med en operator mellan sig 16

4. Definiera primitiver # Constant def isconstant(obj): """Check if argument is a constant.""" return isinstance(obj, int) or isinstance(obj, float) def make_constant(n): """Make a constant from a number.""" return n # Variable def isvariable(obj): """Check if argument is a variable.""" return isinstance(obj, str) def same_variable(var1, var2): """Check if two variables have the same name.""" return var1 == var2 docstring 17

4. Definiera primitiver def issum(obj): """Check if argument is a binary addition expression.""" return isinstance(obj, list) and len(obj) == 3 and obj[1] == '+' def make_sum(left, right): """Make a binary addition expression.""" return [left, '+', right] def isproduct(obj): """Check if argument is a binary multiplication expression.""" return isinstance(obj, list) and len(obj) == 3 and obj[1] == '*' def make_product(left, right): """Make a binary multiplication expression.""" return [left, '*', right] def arg1(expr): """Return the first subexpression.""" return expr[0] def arg2(expr): """Return the second subexpression.""" return expr[2] 18

Symbolisk derivering (abstraherad version) def derive(expr, var): if isconstant(expr): return make_constant(0) elif isvariable(expr): if same_variable(expr, var): return make_constant(1) else: return make_constant(0) elif issum(expr): return make_sum(derive(arg1(expr), var), derive(arg2(expr), var)) elif isproduct(expr): return make_sum(make_product(arg1(expr), derive(arg2(expr), var)), make_product(derive(arg1(expr), var), arg2(expr))) else: raise Exception("Invalid expression!") 19

Sätt att konstruera sammansatta datatyper Många sammansatta abstrakta datatyper liknar varandra strukturellt och därför kan det vara bra att försöka hitta överordnade begrepp för att beskriva dem. Följande diskretmatematiska begrepp brukar användas för att karaktärisera olika sorters sammansatta datatyper: Tupel Ändlig avbildning Sekvens Mängd 20

Tupel Begrepp Vad är det? Tupel En datatypmed ett fixt antal element där varje element har en given datatyp, dvs. ordningen mellan elementen spelar rolloch elementen i sig har olika betydelser. Hur beskriver videt? <datatyp 1, datatyp 2,, datatyp n > Exempel Motsvarighet i Python datum = <år, månad, dag> tuple 21

Ändlig avbildning Begrepp Vad är det? Ändlig avbildning (eng. finite mapping) Hur beskriver videt? [data 1, data 2,, data n ] En datatypmed ett fixt antal element av samma datatyp där ordningen mellan elementen egentligen inte spelar så stor roll(enbart om indexmängden är ordnad). Exempel veckoschema= [dagschema 1, dagschema 7 ] Motsvarighet i Python list(även om Python-listor är mer generösa) dict(om indexmängden är annat än heltal) indexmängd (ofta heltal) definitionsmängd 22

Sekvens Begrepp Vad är det? Hur beskriver vi det? Exempel Motsvarighet i Python Sekvens En datatypmed ett valfritt antal element av samma datatyp där ordningen mellan elementen spelar roll. {{datatyp}}* om det är okej med tomma sekvenser {{datatyp}}+ om sekvensen måste innehålla något utbildningsprogram = {{kurs}}* list 23

Mängd Begrepp Vad är det? Hur beskriver vi det? Exempel Motsvarighet i Python Mängd En datatypmed ett valfritt antal element av samma datatypdär ordningen mellan elementen inte spelar roll. {datatyp} studieresultat = {kurs} set 24

Laborationsomgång 6: Almanackan I laborationsomgång 6 kommer ni att få arbeta med ett större kodexempel som innehåller ett almanackssystem. Almanackan kan användas för att boka och hålla reda på aktiviteter. Den är uppbyggd av ett stort antal abstrakta datatyper. Almanackan är en klassisk laborationsuppgift som har används i grundkurser i många år. Själva koden i almanackan är mycket enkel och innehåller inga Python-konstruktioner som ni inte redan kan. Även om koden är enkel kan det dock ta ett tag att sätta sig in i tankesättet. 25

Elementära abstrakta datatyper timme (ett positivt heltal) minut (ett positivt heltal) dag (ett positivt heltal) månad (en sträng med namnet på en månad) möte (en sträng som beskriver mötets karaktär) I koden kommer dessa begrepp att vara översatta till engelska. 26

Sammansatta abstrakta datatyper klockslag = <timme, minut> tidsperiod = <klockslag, klockslag> mötestid = <tidsperiod, möte> dagalmanacka = {{mötestid}}* månadsalmanacka = [dagalmanacka,...] årsalmanacka = [månadsalmanacka,...] tidsrymd = <timme, minut> datum = <månad, dag> 27

Primitiva funktioner def skapa_timme(h): "Python-heltal -> timme" def är_timme(objekt): "Python-objekt -> sanningsvärde" Olika typer av primitiva funktioner: Konstruktorer Selektorer Igenkännare def skapa_minut(m): "Python-heltal -> minut" def är_minut(objekt): "Python-objekt -> sanningsvärde" def heltal(timme_minut): "timme U minut -> Python-heltal" Primitivernas signaturer beskriver vilka datatyper som förväntas som indata respektive utdata. 28

Grundläggande typmaskineri def packa_ihop(typ, objekt): "almanackstyp x Python-objekt -> almanacksobjekt" return (typ, objekt) def packa_upp(objekt): "almanacksobjekt -> Python-objekt" if isinstance(objekt, tuple): return objekt[1] def typ(objekt): "almanacksobjekt -> almanackstyp" if isinstance(objekt, tuple): return objekt[0] 29

Krav på primitiva funktioner I almanackssystemet har vi ställt upp följande krav på våra primitiva funktioner: De ska alltid kontrollera att argumenten är av rätt typ. Ett värde som en konstruktor skapar ska alltid vara giltigt. De ska alltid kontrollera att restriktioner och beroenden mellan delar är uppfyllda (t.ex. att ett klockslag inte kan ha en timme större än 23, även om en timme kan vara större än så). 30

Implementation av primitiva funktioner def skapa_timme(h): "Python-heltal -> timme" typkontroll(h, lambda h: isinstance(h, int) and 0 <= h) return packa_ihop('timme', h) def är_timme(objekt): "Python-objekt -> sanningsvärde" return typ(objekt) == 'timme' def heltal(timme_minut): "timme U minut -> Python-heltal" typkontroll(timme_minut, lambda x: är_timme(x) or är_minut(x)) return packa_upp(timme_minut) 31

Almanackans Python primtiver Almanackan Tillämpning Abstraktionslager System som använder sig av vår almanacka skapa boka visa ledigt jämför ladda spara Rutiner för att boka och avboka möten samt hantera almanackor skapa_timme är_timme heltal skapa_tidsrymd längd_av_tidsperiod Rutiner för att kapsla in och kontrollera almanacksdata [] + - () * / Pythons interna rutiner och interna representation av t.ex. heltal och listor 32

Uppgifter 6A: Förbättra några funktioner som bryter mot abstraktionen. 6B: Implementera en ny datatyp. 6C: Implementera allt som behövs för att avboka möten. 6D: Implementera allt som behövs för att kontrollera lediga tider, inklusive testrutiner. 6E: Implementera kontroll av gemensamma lediga tider (frivillig uppgift). Mer praktisk introduktion till almanackan kommer på lektion 5. 33

Bildkällor: http://commons.wikimedia.org/wiki/file:geely_assembly_line_in_beilun,_ningbo.jpg http://commons.wikimedia.org/wiki/file:final_assembly_3.jpg http://commons.wikimedia.org/wiki/file:us_army_51725_watervliet_arsenal_apprentices_start_at_the_ground_floor.jpg http://commons.wikimedia.org/wiki/file:wmuk_february_2012_board_meeting.jpg http://commons.wikimedia.org/wiki/file:comit%c3%a9_de_ministros_de_infraestructura,_ciudad_y_territorio.jpg www.liu.se