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

Relevanta dokument
729G04 PYTHON 4 JODY FOO. Department of Computer and Information Science (IDA) Linköping University, Sweden

TDP002 - Imperativ programmering

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

729G04 Programmering och diskret matematik. Python 3: Loopar

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

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

Konvexa höljet Laboration 6 GruDat, DD1344

Datalogi för E Övning 3

Grundläggande datalogi - Övning 1

Förkortning och förlängning av rationella uttryck (s. 27 Origo 3c)

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

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

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

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

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?

Uppgifter teknik HT17 (uppdaterad v. 40)

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

Sekvensdatatyper, ASCII och chiffer. Linda Mannila

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

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

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

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

729G04 Programmering och diskret matematik TEN kl 8-12

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

Funktioner. Linda Mannila

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

Extramaterial till Matematik Y

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

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

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

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

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

3137 Bestäm ekvationen för den räta linje som går genom punkterna med koordinaterna a) (5, 3) och (3, 5)

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

Pythons standardbibliotek

v. 43 Python HT17 En introduktion Oscar Bergqvist

Tentamen i Introduktion till programmering

v. 42 Python HT17 En introduktion Oscar Bergqvist

DD1314 Programmeringsteknik

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

Förkortning och förlängning av rationella uttryck (s. 29 Origo 3b)

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

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

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

TDP002 Imperativ programmering

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

Programdesign. minnesutrymme storlek på indata. DA2001 (Föreläsning 15) Datalogi 1 Hösten / 20

Ordlistor, filhantering och ut på webben. Linda Mannila

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

Selektion och iteration

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

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

Namn Stil Dokumentation Objekt-orienterad programmering OBS OBS OBS OBS OBS OBS OBS OBS

Använda Python Laboration 1 GruDat, DD1344

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

Mer grafik. Jan Erik Moström

TDP002 - Imperativ programmering

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

Föreläsning 2 Programmeringsteknik och C DD1316

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

TDP002 - Imperativ programmering

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

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

Föreläsning 5 Mer om funktioner, villkor

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15.

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

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

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

6 cm. 106 Beräkna a) 3 ( 4) b) ( 2) 5 c) 4 ( 2,5) d) ( 8) 1,5. T.ex. print(3 * -4) 13 Beräkna cirkelns a) diameter b) omkrets

Problemlösning och funktioner Grundkurs i programmering med Python

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

729G04 Programmering och diskret matematik

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 7 augusti 2015, kl 08:00-12:00

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

729G06 Programmering och logik. Info om pythondelen & introduktion till objektorienterad programmering.

Sätt att skriva ut binärträd

Programdesign. Dokumentera. Dokumentera

HI1024 Programmering, grundkurs TEN

Övningsuppgifter kapitel 8

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

Kojo med Inga Ingenjör

Variabler och konstanter

Föreläsning 6: Introduktion av listor

Tenta i Grundläggande programmering DD klockan

Lektion Kapitel Uppgift Lösning med programmering

matematik Lektion Kapitel Uppgift Lösningg T.ex. print(9-2 * 2) a) b) c) d)

729G04 Programmering och diskret matematik

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Klasser och objekt, referenser Grundkurs i programmering med Python

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

Lär dig programmera för dig mellan 6 och 100 år...

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

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

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

Imperativ programmering. Föreläsning 2

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

Skolan för Datavetenskap och kommunikation. Programmeringsteknik. Föreläsning 16

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

ENKEL Programmering 3

Transkript:

729G04 Programmering och diskret matematik Föreläsning 4

Turtle Graphics

LOGO LOGO: programmeringsspråk för användning inom undervisning 1967 av Papert och Feurzeig Språket är släkt med LISP, men som "utenhet" hade man bl.a. möjlighet att styra en sköldpadda. Sköldpaddan hade även en "penna" som den kunde höja och sänka.

The robot

Trådlös variant

Modern variant Valiant Technology Ltd.

Turtle Graphics Att rita med hjälp av en sköldpadda som man styr med hjälp av kommandon brukar man kalla för Turtle Graphics. Man ser sköldpaddan uppifrån och kan ge den kommandon Python har en modul som låter oss hålla på med Turtle Graphics.

Kommandon man kan ge till sköldpaddan Gå frammåt Backa Sväng vänster Sväng höger Dra upp pennan Sätt ner pennan

http://el.media.mit.edu/logo-foundation/logo/turtle.html

Pythons turtlemodul

Förflyttning av sköldpaddan fd(avstånd): flytta sköldpaddan frammåt ett visst avstånd bk(avstånd): flytta sköldpaddan bakåt ett visst avstånd lt(grader): sväng vänster ett visst antal grader rt(grader): sväng höger ett visst antal grader

En fyrkant import turtle importera modulen screen = turtle.screen() screen.setup(width=600, height=600) turtle.mode("logo") turtle.showturtle() skapa en rityta sätt storleken på ritytan använd LOGO-standard för riktning visa sköldpaddan turtle.fd(100) turtle.rt(90) turtle.fd(100) turtle.rt(90) turtle.fd(100) turtle.rt(90) turtle.fd(100) gå framåt 100 steg sväng höger 90 grader gå framåt 100 steg sväng höger 90 grader gå framåt 100 steg sväng höger 90 grader gå framåt 100 steg

En fyrkant framåt

En fyrkant vänster

En fyrkant framåt

En fyrkant vänster

En fyrkant framåt

En fyrkant vänster

En fyrkant framåt

En fyrkant

Demo av pennan, förflyttning, position och riktning

Olika sätt att importera moduler import turtle from turtle import * screen = turtle.screen() turtle.showturtle() screen = Screen() showturtle() turtle.fd(100) turtle.rt(90) turtle.fd(100) turtle.rt(90) turtle.fd(100) turtle.rt(90) turtle.fd(100) fd(100) rt(90) fd(100) rt(90) fd(100) rt(90) fd(100)

Kan vi stoppa in detta i en loop?

Kan vi få sköldpaddan att röra sig slumpmässigt?

Sköldpaddan ritar på ritytan med en penna Sköldpaddan har en penna som kan höjas och sänkas. Den är nere från början. pd(): sätt ner pennan pu(): dra upp pennan

Koordinatsystem och riktning

(-, +) (+, +) (0, 0) (-, -) (+, -)

Sköldpaddan och koordinater pos() returnerar en tupel (x, y) där x och y är flyttal setpos(x, y) flyttar sköldpaddan till positionen (x, y) där x och y är flyttal. OBS! setpos() "teleporterar" inte sköldpaddan, dvs att om pennan är nere kommer det att bli ett streck.

Ja, tupler finns i Python också... Lista: [1, 2, 3] Tupel: (1, 2, 3) Den stora skillnaden mellan listoroch tupler i Python är att man inte kan ändra på en tupel. Datatyper som man inte kan ändra värdet på kallas "immutable" Datatyper man kan ändra värde på kallas "mutable"

Tupel-exempel

Går inte att ändra på en tupel >>> a = [1, 2, 3] >>> b = (1, 2, 3) >>> a[0] = 4 >>> b[0] = 4 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>>

Riktning

Riktning i världen mode("standard") 90 mode("logo") 0 0 90

Sköldpaddan vet vilken riktning den tittar åt mode("logo") 0 är norrut 90 grader är österut gradantalet ökar medurs heading() returnerar ett flyttal somberättar gradantalet hos den riktning man står åt seth(d) där d är ett flyttal, ställer in sköldpaddans riktning

Cirkelrörelse

Exempel på anrop till circle() circle(40) circle(-40) circle(40, 90) circle(40, 180, 4)

Cirkelrörelse circle() kan ta etttill tre argument circle(40) flyttar sköldpaddan moturs i en cirkel med radien 40 circle(-40) ger en rörelse i medurs riktning circle(40, 90) avbryter rörelsen efter 90 grader circle(40, 90, 2) säger att sköldpaddan kommer dela upp rörelsen i två raksträckor.

Refaktorisering att skriva om kod för att göra den bättre utan att ändra på dess beteende

Exempel och refaktorisering Några exempel på vad man kan göra med turtle-modulen samt genomgång av refaktorisering genom generalisering och inkapsling Inkapsling: Att kapsla in en sekvens av uttryck och satser i en funktion Generalisering: Att göra en funktion mer generell genom att specificera beteenden med hjälp av parametrar/argument

Refaktorisering (refactoring) Förbättring av kod dock med bibehållen funktionalitet. Förbättringen kan avse underhåll lättlästhet Inte att förväxla med optimering som har med förbättring av prestanda att göra. Båda kan dock inträffa samtigt. Optimering kommer på nästa föreläsning.

Exempel på refaktorisering def get_number_of_children(name): if name == "Ada": return 1 elif name == "Bean": return 3 elif name == "Cecil": return 1 elif name == "Dan": return 2 elif name == "Eliza": return 2 elif name == "Frodo": return 0 elif name == "Garfield": return 0 def get_number_of_children(name): if name in ["Frodo", "Garfield"]: return 0 elif name in ["Ada", "Cecil"]: return 1 elif name in ["Dan", "Eliza"]: return 2 elif name in ["Bean"]: return 3

När ska man refaktorisera? När koden luktar illa - exempel på dålig lukt: redundant kod, t.ex. kod som upprepas eller kod som inte gör något långa funktioner väldigt mångaparametrar skickastill en funktion en funktion som gör för lite variabelnamn eller funktionsnamn som har missvisande namn komplexa vilkor i koden

Olika sätt att refaktorisera Hitta loopar Kapsla in (bryt ut till funktioner) Generalisera (gör koden mer generell, ofta funktioner)

Bryta ut en funktion / inkapsling print "Hi Ben!" print "I am happy!" # Inkapsling: Att kapsla in en sekvens av # uttryck och satser i en funktion. def greet_ben(): print "Hi Ben!" print "I am happy!"

Varför är detta bra? Återanvändning! def greet_ben(): print "Hi Ben!" print "I am happy!" greet_ben() greet_ben()

Generalisering av funktion Att gå från en funktion som utför en specifik uppgift, till en funktion som är mer flexibel med avseende på beteende genom att införa parametrar

Generalisering def greet_ben(): print "Hi Ben!" print "I am happy!" # Vi gör funktionen mer generell så # att den kan hälsa på vilket namn som helst def greet(name): print("hi " + name + "!") print("i am happy!")

Sick sack Vi vill producera ovanstående mönster. Kom ihåg: programmering är en iterativ aktivitet! Vi gör ett steg i taget.

Vi provar att refaktorisera https://www.ida.liu.se/codela/as/729g04d/sicksack

Sick sack from turtle import * screen = Screen() mode("logo") fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90)

Sick sack vi ser en loop from turtle import * screen = Screen() mode("logo") fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) for i in range(3): fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90)

Sick sack inkapsling for i in range(3): fd(100) rt(90) fd(10) rt(90) fd(100) lt(90) fd(10) lt(90) # Vi hittar delar av koden vi kan göra om # till funktioner def make_right_l(): fd(100) rt(90) fd(10) rt(90) def make_left_l(): fd(100) lt(90) fd(10) lt(90) for i in range(3): make_right_l() make_left_l()

Sick sack inkapsling och generalisering def make_right_l(): fd(100) rt(90) fd(10) rt(90) def make_left_l(): fd(100) lt(90) fd(10) lt(90) for i in range(3): make_right_l() make_left_l() # Vi kapslar in loopen och generaliserar # den på samma gång def make_right_l(): fd(100) rt(90) fd(10) rt(90) def make_left_l(): fd(100) lt(90) fd(10) lt(90) def zig_zag(n): for i in range(n): make_right_l() make_left_l() zig_zag(3)

Sick sack inkapsling och generalisering # Vi kapslar in loopen och generaliserar # den på samma gång def make_right_l(): fd(100) rt(90) fd(10) rt(90) def make_left_l(): fd(100) lt(90) fd(10) lt(90) def zig_zag(n): for i in range(n): make_right_l() make_left_l() zig_zag(3) # Vi skapar en funktion som ritar ut tv segment med en b j def two_segments(angle, segment1, segment2): fd(segment1) rt(angle) fd(segment2) rt(angle) def make_right_l(): two_segments(90, 100, 10) def make_left_l(): two_segments(-90, 100, 10) def zig_zag(n): for i in range(n): make_right_l() make_left_l() zig_zag(3)

Uppgift: Stjärnan Vi vill rita en sån här figur Hur? Dela upp problemet, hitta mönster, gör samma sak flera gånger?

Rita en stjärna def draw_line_and_return(): """Rita ett streck p 50 enheter och startpositionen.""" fd(50) bk(50) terv nd till def draw_star(): """Rita ut en stj rna med fem armar""" for line in range(5): draw_line_and_return() rt(360.0/5) draw_star()

Debugga med spårutskrifter

Att hitta vad som går fel skriv ut värden på variabler på lämpligt ställe i koden print("x: ", x)

Med spårutskrifter def draw_line_and_return(length): """Rita ett streck och # Spr rutskrift print("drawing line, length:", length) fd(length) bk(length) terv nd till startpositionen.""" def draw_star(points, length): """Rita ut en stj rna med fem armar""" for line in range(points): # Skriv ut vilket streck vi ligger p print("line:", line) draw_line_and_return(length) rt(360.0/points)

Visualisering av nästlad loop

Stjärna med stjärnor

Stjärna med stjärnor

Labb 4 Tillämpning av funktioner, loopar och sköldpaddor Labb 4-8 görs i par Anmäl er till nya pargrupper https://www.ida.liu.se/webreg/729g04-2014/parlabb

Angry Turtles

Angry Turtles Fåglar har stulit sköldpaddornas ägg och sköldpaddorna hämnas genom att skjuta iväg sig själva på en måltavla. Användaren ger styrka och vinkel Spelet ritar ut hur sköldpaddan flyger iväg och kollar om sköldpaddan träffar målet.

Exempel

Angry Turtles - innan spelet kan börja Innan vi spelet kan börja måste vi göra följande Ställa in ritytan Bestämma var måltavlan ska vara Rita ut måltavlan Placera sköldpaddan i startposition

Angry Turtles - själva spelet Spelaren börjar med t.ex. 1000 poäng Spelloop Fråga användaren parametrar: styrka och ev vinkel - använd input() Förflytta sköldpaddan lite i taget (loop) förflyttningen baseras på angiven styrka (och ev vinkel) avbryt loopen (break) när sköldpaddan nuddat marken (eller är under marken), dvs kolla om y <= 0. Kolla avståndet till måltavlan Om sköldpaddan är tillräckligt nära måltavlan - berätta det, visa poäng och fråga om spelaren vill spela igen. Om sköldpaddan var för långt ifrån måltavlan - berätta det och dra ifrån poäng