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

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

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

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

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

Tentamen i Introduktion till programmering

Grundläggande datalogi - Övning 1

Introduktion till programmering SMD180. Föreläsning 8: Listor

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

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

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

Strängar. TDDD64 Programmering i Python Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

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

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

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

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

TDDC74 Lab 02 Listor, sammansatta strukturer

729G04 Programmering och diskret matematik. Python 3: Loopar

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Datalogi, grundkurs 1

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Selektion och iteration

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)

Objektorienterad Programmering (TDDC77)

Föreläsning 13. Rekursion

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 6: Introduktion av listor

Introduktion till programmering SMD180. Föreläsning 9: Tupler

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

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

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

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

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

Föreläsning 2 Programmeringsteknik och C DD1316

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

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

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

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

DD1314 Programmeringsteknik

Rekursion och induktion för algoritmkonstruktion

Erfarenheter från labben

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

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

Planering av ett större program, del 2 - for och listor. Linda Mannila

TDIU01 - Programmering i C++, grundkurs

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?

Sätt att skriva ut binärträd

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Grundläggande Datalogi

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

Användarhandledning Version 1.2

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

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

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

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

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

kl Tentaupplägg

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

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

Problemlösning och funktioner Grundkurs i programmering med Python

729G04 Programmering och diskret matematik

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

DD1361 Programmeringsparadigm. Carina Edlund

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Rekursiva algoritmer sortering sökning mönstermatchning

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

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Objektorienterad Programmering (TDDC77)

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Deklarativ programmering

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

tentaplugg.nu av studenter för studenter

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Introduktion till programmering SMD180. Föreläsning 7: Strängar

Magnus Nielsen, IDA, Linköpings universitet

TDDC77 Objektorienterad Programmering

Pythons standardbibliotek

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

729G04 Programmering och diskret matematik. Föreläsning 7

Tentamen ID1004 Objektorienterad programmering October 29, 2013

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

TDIU01 - Programmering i C++, grundkurs

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Beräkningsvetenskap föreläsning 2

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

TDIU01 - Programmering i C++, grundkurs

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

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

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Transkript:

Hur man programmerar TDDC66 Datorsystem och programmering Föreläsning 3 Peter Dalenius Institutionen för datavetenskap 2014-09-05

Översikt Problemlösning: Hur ska man tänka? Datatyper Listor (forsätter i föreläsning 7) Iteration och rekursion över listor Mallar för iteration och rekursion 2

Programutvecklingsprocessen Analys Förstå vilket problem som ska lösas! Specifikation Beskriv vad programmet ska göra! Design Beskriv hur programmet ska lösa problemet! Implementation Översätt designen till ett datorprogram! Testning Prova programmet och rätta eventuella fel! Underhåll Fortsätt utveckla programmet vid behov! 3

Exempel Analys Specifikation Design Pelle tänkte gå en kurs i EcoDriving för att bli bättre på att köra sin bil mer bränslesnålt. Han har tyvärr en gammal bil som inte visar hur mycket bensin den drar, men han vill ändå kunna hålla koll på bränsleförbrukningen. För att göra det hela lite mer spännande vill han ha ett Python-program som hjälper honom. Implementation Testning Underhåll 4

Exempel Analys Specifikation Pelle vill ha ett enkelt program som tar en körd sträcka (i km) och hur mycket han har tankat (i liter). Programmet ska sedan räkna ut bränsleförbrukningen och skriva ut den. Design Implementation Testning Underhåll 5

Exempel Analys Specifikation Design Programmet kommer bestå av tre delar: Inmatning av information från användaren Uträkning av förbrukning enligt formeln förbrukning = bensinmängd/sträcka Utskrift av resultatet Implementation Testning Underhåll 6

Exempel Analys Specifikation Design Implementation def fuel_efficiency(): dist = eval(input("sträcka (km): ")) cons = eval(input("förbrukning (l): ")) eff = cons/(dist/10) print("din bil drar", eff, "liter/mil") Testning Underhåll 7

Exempel Analys Specifikation Design Implementation Testning >>> fuel_efficiency() Sträcka (km): 800 Förbrukning (l): 52 Din bil drar 0.65 liter/mil Underhåll 8

Hur kan vi tillämpa detta? Analys Specifikation Tänk efter innan du börjar koda! Använd papper och penna. Skriv pseudokod. Design Implementation Testning Experimentera gärna! Lös ett annat, lite enklare problem först. Testa mycket, ändra om det inte funkar. Lär känna dig själv! Hur brukar jag tänka? Vad funkar? Underhåll 9

Information som programmet använder x = 35 i en variabel i molnet Hur ser informationen ut? zaza4 <14> cat data.txt Kalle 14 p Lisa 23 p Achmed 19 p Pierre 21 p SQL Server i en fil i en databas 10

Datatyper 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? De flesta programspråk har ett antal inbyggda datatyper (som ofta är ganska lika) samt möjligheter för programmeraren att definiera egna typer. 11

Några datatyper i Python Datatyp Domän Exempel på objekt enkla sammansatta int Heltal 4711 float Flyttal 3.14 str Strängar 'spam' list Listor [1, 2, 75, 6, 7] test av datatyp >>> type(2.78) <class 'float'> >>> type(5) == int True >>> isinstance([1,2,3],list) True 12

Variabler deklararas inte I en del andra programspråk behöver man deklarera variabler, d.v.s. ange vilken datatyp de ska ha. Det behöver vi inte i Python. En variabel har egentligen ingen datatyp, utan är bara en platshållare. Det är innehållet som har en datatyp och en variabel kan ha innehåll av många olika typer under sin livstid. >>> a = 4711 >>> b = ['spam', 'spam'] >>> a = b >>> print(a) ['spam', 'spam'] 13

Datatypen lista Listan är en mycket användbar sammansatt datatyp. I många andra språk kallar man listor för arrayer. Listor kan innehålla obegränsat många element. Man behöver inte i förväg ange hur många som ska få plats, och storleken kan växa och krympa allt efter behov. Elementen i listan kan vara av olika datatyper, t.ex. kan en lista innehålla andra listor. Konstanta listor inleds och avslutas med hakparenteser och elementen separeras med komma. Exempel: a = [1, 'foo', 4.76] En lista som inte innehåller några element kallas tomma listan och betecknas [ ]. 14

Indexering av listor >>> rainbow = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'] >>> rainbow[2] 'yellow' >>> rainbow[2:5] ['yellow', 'green', 'blue'] >>> rainbow[-3] 'blue' >>> rainbow[4:] ['blue', 'indigo', 'violet'] >>> rainbow[:3] ['red', 'orange', 'yellow'] >>> [rainbow[1]] + ['apple', 'banana'] ['orange', 'apple', 'banana'] lista[n] hämtar elementet på plats n, där n även kan vara negativt lista[start:slut] skapar en dellista från start till strax innan slut, där både start och slut är frivilliga red orange yellow green blue indigo violet 0 1 2 3 4 5 6 15

Fler listoperationer >>> for element in [12, 'spam', 3.75]:... print(element)... 12 spam 3.75 >>> a = ['one', 'two', 'three'] >>> a[1] = 2 >>> a ['one', 2, 'three'] >>> len(a) 3 16

Upprepning: Iteration och rekursion Förra föreläsningen genomförde vi upprepningar över tal med iteration (konstruktionen for) och rekursion (funktioner som anropar sig själva). Nu ska vi titta på motsvarande metoder för att upprepa något för varje element i en lista. Hur kan man tänka? Iteration handlar om att hela tiden ha ett delresultat och uppdatera det varje gång man gör upprepningssteget. Rekursion handlar om att försöka omvandla det existerande problemet till ett lite mindre problem och starta om, till dess att problemet är så litet att det är trivialt. Vi ska nu gå igenom en funktion som beräknar längden av en lista på två olika sätt: iterativt och rekursivt. 17

Iterativ beräkning 0123 a b c def length(sequence): result = 0 for element in sequence: result = result + 1 return result I detta exempel beräknar vi längden av listan [ a, b, c ] med iterativ metod. 18

Hur lång är listan [ a, b, c ]? Tack så mycket! Iterativ beräkning a b c Först förbereder vi en räknare. 0123 I 3 Sedan går vi igenom listan ett element i taget. detta exempel beräknar vi längden av listan [ a, b, c ] med iterativ metod. 19

Rekursiv beräkning Testa om listan är tom med if not sequence 1 +? 1 + a b def length(sequence): if not sequence: return 0 else: return 1 + length(sequence[1:])? c 1 + 0? [ ] Resten av listan motsvarar sequence[1:] I detta exempel beräknar vi längden av listan [ a, b, c ] med rekursiv metod. 20

Hur lång är listan [ a,...]? 3 Tack så mycket! Rekursiv beräkning I detta exempel beräknar vi längden av listan [ a, b, c ] med rekursiv metod. 1 + längden av resten Hur lång är listan [ b,...]? 2 1 + längden av resten Hur lång är listan [ c,...]? 1 + längden av resten 1 Hur lång är listan [ ]? 0 21

Mallar för upprepning över en talserie z = startvärde för beräkning (0 om vi kombinerar med +, 1 om vi kombinerar med *) op = operation för att kombinera ihop resultatet, t.ex. + eller * def iter(n): res = z for i in range(n): res = op(i,res) return res def rec(n): if n == 0: return z else: return op(n,rec(n 1)) Mallar för upprepning över en lista op = operation som ska utföras på varje element i listan def iter(seq): res = [] for elem in seq: res = res+[op(elem)] return res def rec(seq): if not seq: return [] else: return [op(seq[0])]+rec(seq[1:]) 22

Utökade mallar för upprepning över en lista med villkor op1, op2 = operationer som ska utföras på varje element i listan cond = villkor som avgör om det är op1 eller op2 som ska användas def iter(seq): res = [] for elem in seq: if cond(elem): res = res+[op1(elem)] else: res = res+[op2(elem)] return res def rec(seq): if not seq: return [] elif cond(seq[0]): return [op1(seq[0])]+rec(seq[1:]) else: return [op2(seq[0])]+rec(seq[1:]) 23

Exempel som använder den utökade mallen Vi vill ha en funktion count som kan räkna hur många gånger ett visst element förekommer i en lista. Exempel: >>> count([1,2,1,3,5],1) 2 def count(seq,goal): result = 0 for element in seq: if element == goal: result = result + 1 return result def count(seq,goal): if not seq: return 0 elif seq[0] == goal: return 1 + count(seq[1:],goal) else: return count(seq[1:],goal) 24

Söndra och härska Dela upp lösningen i flera funktioner, så att varje funktion kan få ett vettigt namn. Använd gärna terminologin från problemet. Gör varje funktion lagom stor så att det är lätt att överblicka och testa varje funktion för sig, men dela inte upp lösningen i allt för många små bitar. Då blir det svårt att få överblick och man riskerar att få onödigt ineffektiva lösningar. Skriv funktioner som är generella och går att återanvända i andra projekt. Du tjänar ofta på att försöka lösa ett lite större problem än du faktiskt har. 25

Exempel: Beräkning av perfekta tal Vi säger att ett tal k delar ett tal n om det finns ett tal a sådant att ak = n. Lite enklare kan man säga att k går jämnt upp i n. Vi säger att ett tal n är perfekt som summan av alla delarna är lika med n. Det finns inte särskilt många perfekta tal. De tre minsta är: 6 (med delarna 1, 2 och 3) 28 (med delarna 1, 2, 4, 7 och 14) 496 (med delarna 1, 2, 4, 8, 16, 31, 62, 124 och 248) Vi vill ha en Python-funktion perfect som tar reda på om ett heltal är perfekt eller inte. Hur kan vi dela upp det problemet i mindre bitar? 26

Ett möjligt sätt att lösa problemet 28 Hitta alla delare till n [1, 2, 4, 7, 14] Testa om k delar n Summera tal i en lista 28 Jämför två tal True 27

Implementation # Check if k divides n def divides(k, n): return n % k == 0 # Return a list of all dividers of n >>> divides(3,24) True >>> divides(3,25) False >>> dividers(10) [1, 2, 5] def dividers(n): result = [] for i in range(1,n//2+1): if divides(i,n): result = result + [i] return result 28

Implementation # Return the sum of a list of numbers def sum(list): if not list: return 0 else: return list[0] + sum(list[1:]) # Checks if n is a perfect number >>> sum([1,2,3,4]) 10 >>> sum(dividers(10)) 8 >>> perfect(10) False >>> perfect(6) True def perfect(n): return n == sum(dividers(n)) 29

Sammanfattning Problemlösning: Hur ska man tänka? steg för steg söndra och härska Datatyper (domän + operationer) int float str list Grundläggande listoperationer, främst indexering s[4] och sånt Iteration och rekursion över listor, inklusive mallar 30

Bildkällor: http://commons.wikimedia.org/wiki/file:%d0%a0%d1%83%d1%81%d1%81%d0%ba%d0 %B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D1%91%D1%88%D0%BA%D0%B0.jpg www.liu.se