• No results found

TDP002 - Problemlösning

N/A
N/A
Protected

Academic year: 2022

Share "TDP002 - Problemlösning"

Copied!
44
0
0

Loading.... (view fulltext now)

Full text

(1)

TDP002 - Problemlösning

Pontus Haglund

Department of Computer and informa on science

(2)

Stegvis förfining

2 Kontrollera komplexitet 3 regler

4 Rekursion

(3)

Stegvis förfining

2 Kontrollera komplexitet 3 regler

4 Rekursion

(4)

A konstruera e program

• Vad är uppgi en?

• Förstå problemet 1. Beskriv problemet

2. Gör en lösning (pseudokod) 3. Implementera (programkod) 4. Testa/utvärdera/verifiera) 5. Börja om vid 1

• Skeppa produkten

(5)

Vad är uppgi en?

• Möten

• Specifika oner

• labbuppgi

(6)

Förstå problemet

• Hur har jag förstå problemet

• Rubberduck

• Kund

• Partner

(7)

Systemutveckling

(8)

Systemutveckling

(9)

Systemutveckling

(10)

Systemutveckling

(11)

Systemutveckling

(12)

Systemutveckling

(13)

Kommunicera behov/uppgi

• Vi bryr oss inte om kunder i denna kurs

• Jag är kunden

• Hur du uppfa ar uppgi en spelar roll

Har din partner uppfa at samma sak?

Är det vad jag menar?

(14)

Va enfallsmodellen (waterfall)

(15)

Agil utveckling (agile)

(16)

Stegvis förfining

• Metod för a skapa e program från e problem

en krea v process

• Formulera på informell nivå (vanlig svenska)

• Förfina olika steg ll en mekanisk nivå

Gå mot kållkodslikt språk

• Kallas även top-down-design

(17)

verktyg för förfining

• Pseudokod

• Flödesdiagram

(18)

Exempel: skriv ut x-kvadrat i tabell

• Uppgi :

Skapa en tabell med uträkning av x-kvadrat för varje x mellan 1 och 20.

Körexempel

x: x^2:

========

1 1 2 4 3 9 4 16 . .

========

(19)

Pseudokod

• Pseudokod:

1. Skriv ut tabellrubrik för 2 kolumner 2. För varje tal x mellan 1 och 20:

1. skriv ut värdet på x i kolumn 2. skriv ut värdet på x**2 i kolumn 3. Skriv ut tabellfot

Körexempel

x: x^2:

========

1 1 2 4 3 9 4 16 . .

========

(20)

Flödesschema

(21)

Implementa on

print('x: x^2:\n========')

for xin range(1, 20):

print(x, x*x, sep='\t') print('========')

x: x^2:

========

1 1 2 4 3 9 4 16 . .

========

(22)

Tillbaka ll början

1. Beskriv problemet

2. Gör en lösning (pseudokod) 3. Implementera (programkod) 4. Testa/utvärdera/verifiera) 5. Börja om vid 1

(23)

Stegvis förfining

2 Kontrollera komplexitet 3 regler

4 Rekursion

(24)

Programmeringens hantverk

Controlling complexity is the essence of computer programming

-Brian Kernighan

(25)

Abstrak on

(26)

Dekomposi on

• Uppdelning i delar

• Varje delning blir enklare

• Sträva mot a varje dela har ETT tydligt och enkelt sy e

• Summan av delarna ger heltheten

(27)

Variabler

Utan

print(int(input('Mata in tal: '))**2)

Med

user_input =int(input('Mata in tal: ')) squared = user_input ** 2

print(squared)

(28)

Dekomposi on

• Variabler lagrar delresultat

• Varje sats löser EN avgränsad uppgi

• Funk oner separerar ut delar av programmet under nya namn

(29)

Satsnivå

Uppgi :

• Vi vill göra en uträkning för varje tal 0..9, samt en annan uträkning för varje jämnt tal.

Komplex lösning

results_1 = []

result_2 = []

for xin range(10):

results_1.append(x * 3 / 5.0) if(x % 2 == 0):

results_2.append(x * 4 / 3.0)

(30)

Satsnivå

results_1 = []

for xin range(10):

result = x * 3 / 5.0 results_1.append(result)

results_2 = []

for xin range(0,10, 2):

result = x * 4 / 3.0 results_2.append(result)

• mindre delar

• tydligare delar

• mindre effek vt?

• ...

(31)

Procedurell dekomposi on

def calculate_results_1():

results_1 = []

forx in range(10):

result = x * 3 / 5.0 results_1.append(result) returnresults_1

def calculate_results_2():

results_2 = []

forx in range(0,10, 2):

result = x * 4 / 3.0 results_2.append(result) returnresults_2

results_1 = calculate_results_1() results_2 = calculate_results_2() present_results(results_1) present_results(results_2)

• Ortogonalitet: en funk on e sy e

• Håll isär presenta on och innehåll

(ha inte i/o och beräkningar

llsammans)

(32)

Funk oner

Utan

"""

Skriv ut primtal

"""

for iin range(1000):

is_prime = True forj in range(i):

ifi%j == 0:

is_prime = False break

ifis_prime:

print(i)

Med

def prime(i):

is_prime = True forj in range(i):

ifi%j == 0:

is_prime = False break

returnis_prime

#Huvudprogram for iin range(1000):

ifprime(i):

print(i)

(33)

Stegvis förfining

2 Kontrollera komplexitet 3 regler

4 Rekursion

(34)

KISS

Keep It Simple, Stupid!

• En komplex uppgi är en kombina on av flera enkla deluppgi er

Genom a dela upp programmets totala uppgi i delar håller vi varje deluppgi avgränsat och enkelt. Vi löser större uppgi er genom a kombinera lösningar på flera enklare uppgi er.

• Skriv aldrig komplex källkod för a lösa e komplext problem (eller e enkelt problem)

(35)

Exempel

Lösa sokoban på några minuter...

(36)

DRY

Don’t Repeat Yourself

• Varje bit av informa on ska finnas representerad endast en gång i e program.

Exempelvis: namn på användare, färger i gränssni et, storlek på fonter, algor mer för uträkningar...

• Duplicering gör det jä esvårt a underhålla och felsöka program.

(37)

Stegvis förfining

2 Kontrollera komplexitet 3 regler

4 Rekursion

(38)

Rekursion

E annat sä a göra repe on

(39)

Räkna

Räkna från i upp ll 10 Itera v

def count_print(i):

forj in range(i+1):

print(i)

Rekursiv

def count_print(i):

print(i) ifi < 10:

count_print(i+1)

(40)

Factorial

Itera v

def factorial(n):

summan = 1

fori in range(1, n+1):

summan *= i returnsumman

Rekursiv

def factorial(n):

ifn == 0:

return 1 else:

return n * factorial(n-1)

(41)

Summera listor

Itera v

def sum_list(l):

summa = 0 fore inl:

summa += e returnsumma

Rekursiv

def sum_list(l):

if notl:

return 0 else:

return l[0] + sum_list(l[1:])

(42)

Summera listor i listor...

Itera v - är de a lika bra?

def sum_arb_list(l):

tot = 0 forx inl:

if isinstance(x,list):

fory inx:

tot += y else:

tot += x returntot

Rekursiv

def sum_arb_list(l):

tot = 0 forx inl:

if not isinstance(x,list):

tot += x else:

tot += sum_arb_list(x) returntot

(43)

Towers of hanoi

A = [4, 3, 2, 1]

B = []

C = []

def move(n, source, target, auxiliary):

ifn > 0:

# move n - 1 disks from source to aux, so they are out of the way move(n - 1, source, auxiliary, target)

# move the nth disk from source to target target.append(source.pop())

# Display our progress

print(A, B, C, '##############', sep ='\n')

# move the n - 1 disks that we left on auxiliary onto target move(n - 1, auxiliary, target, source)

# initiate call from source A to target C with auxiliary B move(len(A), A, C, B)

(44)

References

Related documents

Karaktären visar med olika nivåer av gester, från vag till tydlig instruktion, vilket objekt som testdeltagaren behöver klicka på för att klara av uppgiften.. På förstå

5.1.4 Sammanställning av fjärrvärmeförbrukningen för området Graniten Av den totala fjärrvärmeförbrukningen används en del till tappvarmvatten, en del till uppvärmning

En typisk pandemi, där smittan sprids från människa till människa, varar ofta i 6-8 veckor och en andra våg kommer vanligtvis inom ett år.I teorin kan både virus och bakterier

Lärarna beskriver att deras mål med undervisningen genom problemlösning är att få eleverna att utmana sig själva genom att använda olika strategier för att lösa det givna

Lärarens engagemang spelar givetvis även en viktig roll för hur elevernas engagemang utvecklas. När det gäller matematikundervisning genom problemlösning krävs det en extra

Det första av de två rättsfallen visar lagstiftningens genom- slagskraft när domstolarna tolkar lagen enligt dess ändamål, såsom när Arbetsdomstolen definierade

Trafikverket har under hösten 2017 hållit ett tidigt samråd med särskilt berörda, allmänheten, myndigheter med flera inför Länsstyrelsen beslut om projektet kan antas

Att följa checklistan och därmed svenska byggregler slaviskt behöver inte i alla lägen vara den bästa idén. Det är viktigt att se till vilken typ av projekt man jobbar