Hvordan løse problemer med programmering?

Like dokumenter
Løse reelle problemer

Løkker og lister. Løse problemer med programmering. INF1001, uke3 Geir Kjetil Sandve

Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve

Løse reelle problemer

Metoder med parametre, løkker og arrayer

Finne ut om en løsning er helt riktig og korrigere ved behov

INF uke 2. Inputt, beslutninger, kontrollflyt og prosedyrer

Finne ut om en løsning er helt riktig og korrigere ved behov

Løse reelle problemer

Oppsummering fra sist

Oppgaver uke 1: Løsningsforslag

Løse reelle problemer

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

INF1000 Eksamen 2014 (modifisert)

Håndtere mange verdier

Eksamensoppgaver 2014

Feilmeldinger, brukerinput og kontrollflyt

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

IN uke 2. Presis forståelse av programmering

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Oppgave 1.1 (1 poeng) Oppgave 1.2 (2 poeng) Oppgave 1.3 (2 poeng) 1.1

TDT4110 IT Grunnkurs Høst 2015

Mattespill Nybegynner Python PDF

Øvingsforelesning i Python (TDT4110)

Repetisjon Novice Videregående Python PDF

Øvingsforelesning 5 Python (TDT4110)

Oppgave 1 Hva tror du følgende program skriver ut til terminalen? Diskuter med gruppen.

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum. if (be): else (not_to_be):

Øvingsforelesning 3 Python (TDT4110)

TDT4110 IT Grunnkurs Høst 2016

Øvingsforelesning 7 i Python (TDT4110)

INF1000 Eksamen 2014 (modifisert)

IN uke 1. Komme i gang med programmering

Øvingsforelesning 5 Python (TDT4110)

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Objektorientert programmering i Python

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

IN uke 2. Presis forståelse av programmering

TDT4110 IT Grunnkurs Høst 2016

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Informasjon Eksamen i IN1000 høsten 2017

Informasjon Prøveeksamen i IN1000 høsten 2018

IN1000 Obligatorisk innlevering 7

IN uke 1. Komme i gang med programmering

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

UNIVERSITETET I OSLO

MAT1030 Diskret Matematikk

Norsk informatikkolympiade runde

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

Repetisjon, del 2. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Øvingsforelesning 1 Python (TDT4110)

Programmering Høst 2017

Verden - Del 2. Steg 0: Oppsummering fra introduksjonsoppgaven. Intro

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

UNIVERSITETET I OSLO

Steg 1: Rest etter divisjon

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

MAT1030 Plenumsregning 1

Innhold uke 9. Objektorientert programmering i Python. Om ukens pensum. Referanser og objekter Tema: Mer komplekse strukturer

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

IN Seminaroppgaver til uke 11

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Hangman. Level. Introduksjon

lage og bruke funksjoner som tar argumenter lage og bruke funksjoner med returverdier forklare forskjellen mellom globale og lokale variabler

Visuell Programmering: Kom i gang med Processing

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

"Hjerneteppe!" er en huskelek hvor du skal huske stadig lengre rekker med bokstaver!

Repetisjon, del 1. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

MAT-INF 1100: Obligatorisk oppgave 1

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Kan micro:biten vår brukes som en terning? Ja, det er faktisk ganske enkelt!

Norsk informatikkolympiade runde

INF Ekstrainnlevering

Del 1 En oversikt over C-programmering

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Kapittel 1 En oversikt over C-språket

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

Innhold. IN1000 Høst Hva skal evalueres? Fra kurssidene. Uke 12: Pensumgjennomgang og eksamenstips

Utførelse av programmer, metoder og synlighet av variabler i JSP

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Transkript:

Start screencast!! (tidlig..) Ha klar glass med linser Lukk programmer, untatt Atom, Keynote, Terminal Hvordan løse problemer med programmering? Problemløsning, løkker, og funksjoner med parametre IN1000, uke4 Geir Kjetil Sandve

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Repetert kjøring med prosedyrer Om vi ønsker å repetere kjøring kan vi: Legge funksjonaliteten i en navngitt kodeblokk (prosedyre) Kalle denne prosedyren flere ganger {tre_velkomster.py} Vi er imidlertid bundet til et fast antall kjøringer (tilsvarende antall kall) For å kjøre et fleksibelt antall ganger trenger vi en løkke

Repetert kjøring (løkke): while Syntaks: while condition: Statement Statement Eksempel: tall=1 while tall<100: print(tall) tall+=5 En slags if med tilbakekobling: Nesten som if, bare at man kjører innholdet mange ganger - helt til condition ikke lenger er True

Et eksempel på repetert kjøring {matte_test.py}

While som en if med tilbakekobling innlest = input("hva er 4+7?") tall = int(innlest) while tall!= 11: innlest = input("prøv igjen!") tall = int(innlest) print("du klarte det!")

While som en if med tilbakekobling innlest = input("hva er 4+7?") tall = int(innlest) if tall!= 11: else: while tall!= 11: innlest = input("prøv igjen!") tall = int(innlest) print("du klarte det!")

Eksempelet vi startet med Repetert spørring frem til brukeren oppgir negativ alder: {velkomst_lokke_feil.py, velkomst_lokke_uperfekt.py}

Merk den presise rekkefølgen ting blir gjort! while condition: statement1 statement2... Man sjekker, kjører hele blokka, og går så tilbake til sjekken igjen Sjekk condition, statement1, statement2, sjekk condition igjen, statement1 statement2..

Merk den presise rekkefølgen ting blir gjort! while condition: statement1 statement2... Det blir altså ikke sjekket noe mellom statement1 og statement2 Det som sjekkes er oppfylt når man starter å kjøre kodeblokka.. men det kan slutte å være oppfylt underveis i blokka

Finjustering av når noe sjekkes og brukes {velkomst_lokke_fungerer.py}: Innlesning av alder lagt sist i løkka, slik at verdi sjekkes like etter innlesning Unngår å skrive alders-basert kommentar etter terminerende input (-1) fra bruker Man må legge en ekstra linje med innlesning før selve løkka begynner

En liten oppgave Skriv kode som regner ut summen av tallene fra 1 til 100 (1+2+3...+100) Prøv selv med blyant og papir! Etterpå diskuter med nabo {sum_vha_while.py}

Noen lærdommer å hente fra oppgaven/løsningen Løkker lar oss splitte opp en problemstilling Oppgaven spør om mange verdier (hundre tall) Poenget med løkken er å kunne behandle ett tall om gangen Første steg i å løse problemet er å sørge for at hvert tall vi trenger oppstår én gang i løkken Vi må også sørge for å få slått sammen hver bit til en fullstendig løsning I dette tilfellet la vi til hver bit i variabelen summen Andre steg er altså å finne ut hvordan slå sammen bitene

Eksempel på bruk av løkke: Enkel animering Prinsippet for animering: Vis et bilde, vis et neste bilde som er litt endret, osv.. Det kan vi få til med en løkke! Tilordne lokasjon til en variabel Tegne rektangel på denne lokasjonen Endre litt på lokasjonen (variabelen) Repetere tegning og endring {heis.py}

Eksempel på bruk av løkke: Monte Carlo-simulering Problemstilling: dersom man triller to terninger, hva er sannsynligheten for å tilsammen få 10 eller mer? Man kan lære seg sannsynlighetsregning Eller man kan la datamaskinen trille terning og bare telle hvor ofte summen blir 10 eller mer {terning.py}

Monte Carlo-simulering Monte Carlo-simulering lar oss løse vanskelige beregnings-problemer med enkel matematikk I stedet for å benytte avanserte matematiske formler, kan man ofte bare la datamaskinen etterligne det man er interessert i (simulere), og så ta et enkelt gjennomsnitt av utfallene Typisk fremgangsmåte i Python: Ha en løkke som simulerer veldig mange ganger Hver gang gjøre noe tilfeldig trekk (bruk random) Inni løkken telle opp det man er interessert i, og så ta et gjennomsnitt etterpå (f.eks. antall ganger noe slo til)

Problemstilling: Jeg har en kopp hvor det ligger 4 løse kontaktlinser, 2 for venstre øye og 2 for høyre øye Av ren latskap grabber jeg to vilkårlige linser fra koppen (av de 4) og håper at jeg har grabbet et for venstre og et for høyre (ellers må jeg lete videre). Hva er sannsynligheten for at jeg fikk én for hvert øye? mindre enn 50% sjanse? over 50% sjanse? nøyaktig 50% sjanse? {linser.py} Et ekte problem (på en travel morgen)

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Løkker og samlinger Løkker og lister arbeider ofte godt sammen! Løkker gjør at kodelinjer kan kjøres flere ganger Lister gjør det mulig å jobbe med mange verdier {huske1-2.py}

Løkker og samlinger Typisk bruk av løkke og liste: En variabel holder en liste av en gitt lengde En annen variabel holder en indeks for listen, starter på 0 En while-løkke øker indeksen med én for hver iterasjon, inntil indeksen er utenfor listen For hver iterasjon i løkken henter eller endrer man listeverdien på den aktuelle indeksen Andre vanlig bruksmåter For hver iterasjon av løkken, sammenligne verdien på den aktuelle indeksen med verdien på indeksen før eller etter Kjøre en løkke et bestemt antall ganger. Begynne med en tom liste og legge til ett nytt element for hver iterasjon

Oppgave (Oppg 3b fra eksamen 2016, lettere omskrevet) Skriv kode som sjekker om alle verdiene i en liste av heltall er ekte større enn 10 og ekte mindre enn 20. Dersom alle verdiene er innenfor dette intervallet skal en variabel innenfor settes til verdien True, ellers skal innenfor settes til False. tallene = [12, 16, 5, 16] #Skriv din kode her assert innenfor==false

En mulig løsning {innenfor.py}

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Iterere gjennom en samling: for Syntaks: for variable in collection: statement1 statement2... Eksempel: for tall in [2,3,4]: print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (collection) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres

Iterere gjennom en samling: for Syntaks: for variable in container: statement1... tall = 2 print(tall*tall) Eksempel: for tall in [2,3,4]: print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (container) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres

Iterere gjennom en samling: for Syntaks: for variable in container: statement1... Eksempel: for tall in [2,3,4]: print(tall*tall) tall = 2 print(tall*tall) tall = 3 print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (container) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres

Iterere gjennom en samling: for Syntaks: for variable in container: statement1... Eksempel: for tall in [2,3,4]: print(tall*tall) tall = 2 print(tall*tall) tall = 3 print(tall*tall) tall = 4 print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (container) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres

Iterere gjennom en samling: for Syntaks: for variable in container: statement1... Eksempel: for tall in [2,3,4]: print(tall*tall) tall = 2 print(tall*tall) tall = 3 print(tall*tall) tall = 4 print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (container) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres [sum_vha_for_v1.py]

Samme oppgave igjen: Kan du nå løse den med for-løkke? Skriv kode som sjekker om alle verdiene i en liste av heltall er ekte større enn 10 og ekte mindre enn 20. Dersom alle verdiene er innenfor dette intervallet skal en variabel innenfor settes til verdien True, ellers skal samme variabel settes til False. tallene = [12, 16, 5, 16] #Skriv din kode her assert innenfor==false

En mulig løsning {innenfor2.py}

Kjapt spesifere lister av tall: range Funksjonen range kan brukes for å kjapt lage lister: print( range(5) ) # [0,1,2,3,4] assert range(2,5) == [2,3,4] assert range(0,5,2) == [0,2,4] assert range(1,5,2) == [1,3] Dette kan brukes som samling i en for-løkke for tall in range(1,5): print(tall*tall) {sum_vha_for_v2.py}

For-løkke og indekser

For-løkke og indekser taxi_kostnader = [145, 220, 91, 340] for kostnad in taxi_kostnader: if kostnad<100: kostnad = 100

For-løkke og indekser For å sette verdier i listen må man bruke indeks(!) taxi_kostnader = [145, 220, 91, 340] for kostnad in taxi_kostnader: if kostnad<100: kostnad = 100 NB! Endrer kun variabelen kostnad - ikke listen print taxi_kostnader [145, 220, 91, 340]

For-løkke og indekser For å sette verdier i listen må man bruke indeks(!) taxi_kostnader = [145, 220, 91, 340] for kostnad in taxi_kostnader: if kostnad<100: kostnad = 100 NB! Endrer kun variabelen kostnad - ikke listen print taxi_kostnader [145, 220, 91, 340] taxi_kostnader = [145, 220, 91, 340] indeks = 0 while indeks < len(taxi_kostnader) : if taxi_kostnader[indeks] <100: taxi_kostnader[indeks] = 100 indeks += 1 print taxi_kostnader Endrer listen [145, 220, 100, 340]

For-løkke og indekser For å sette verdier i listen må man bruke indeks(!) taxi_kostnader = [145, 220, 91, 340] for kostnad in taxi_kostnader: if kostnad<100: kostnad = 100 NB! Endrer kun variabelen kostnad - ikke listen print taxi_kostnader [145, 220, 91, 340] taxi_kostnader = [145, 220, 91, 340] for indeks in range( len(taxi_kostnader) ): if taxi_kostnader[indeks] <100: taxi_kostnader[indeks] = 100 Endrer listen print taxi_kostnader [145, 220, 100, 340]

Siden strenger er en type lister Man kan iterere gjennom strenger: for bokstav in "NORGE": print("gi meg en " + bokstav) Man kan også aksessere strenger på indeks: land = "NORGE" for indeks in range( len(land) ): print( "Gi meg en " + land[indeks] )

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Flere typer subrutiner Subrutine (fra uke 2): en navngitt blokk med kodelinjer, som kan kalles og tilpasses Vi vil i dag introdusere flere aspekter Uke 2: Prosedyre - uten parametre og returverdi I dag: Prosedyre - med parametre I dag: Funksjon - med returverdi Om tre uker: Instans-metode (OO)

Prosedyrer med parametre Prosedyren vi så på i tidligere uke gjorde alltid eksakt det samme når den ble kallet Det er sjelden av nytte! For å være nytig må en slik prosedyre kunne tilpasses Det gjør vi ved å sende inn parametre

Din første prosedyre med parametre print er en prosedyre hvor utfallet tilpasses! print(text): skriver verdien i text til skjermen Variabelen text er en parameter Verdien vi gir inn (hallo IN1000) når vi kaller print er et argument Parameter og argument er to sider av det samme Parameter: variabel i prosedyre som tar i mot verdi Argument: verdi sendt inn når prosedyren kalles

Prosedyre med parametre def mittprosedyrenavn(parameter1, parameter2,...): kodelinje1 kodelinje2... For å kjøre alle kodelinjene i prosedyren ("kalle prosedyren"): mittprosedyrenavn(argument1, argument2,...)

Prosedyre med parametre {prosedyre_med_parameter_v1.pyprosedyre_med_parameter_v3.py}

Parameteren tilordnes verdien av argumentet! def skrivalder(alder): = if alder > 6: print("velkommen til mitt program"); else: print("gaa heller ut og lek i skogen"); innlest = int(input("hvor gammel er du? ")) skrivalder(innlest) innlest

Parameteren tilordnes verdien av argumentet! def skrivalder(alder): if alder > 6: print("velkommen til mitt program"); else: print("gaa heller ut og lek i skogen"); print("hacket av en toaaring: ") skrivalder(2)

Parameteren tilordnes verdien av argumentet! def skrivalder(alder): alder = 2 if alder > 6: print("velkommen til mitt program"); else: print("gaa heller ut og lek i skogen"); print("hacket av en toaaring: ") skrivalder(2)

Oppgave: Hva skrives ut på skjermen? def pros1(a): print(a*2) def pros2(b): print(b) pros1(b+2) pros1(5) pros2(4)

Løsning: Hva skrives ut på skjermen? def pros1(a): print(a*2) def pros2(b): print(b) pros1(b+2) pros1(5) pros2(4) På skjermen:

Løsning: Hva skrives ut på skjermen? def pros1(a): a=5 print(a*2) #10 def pros2(b): print(b) pros1(b+2) pros1(5) pros2(4) På skjermen: 10

Løsning: Hva skrives ut på skjermen? def pros1(a): print(a*2) def pros2(b): b=4 print(b) pros1(b+2) #6 pros1(5) pros2(4) På skjermen: 10 4

Løsning: Hva skrives ut på skjermen? def pros1(a): a=6 print(a*2) #12 def pros2(b): b=4 print(b) pros1(b+2) #6 pros1(5) pros2(4) På skjermen: 10 4 12

Prosedyrer outsourcer detaljer og håndterer redundans Man har ofte behov for (omtrent) samme funksjonalitet ulike steder i en kode Man ønsker da ikke å duplisere koden Minsker oversiktlighet av kode Endringer og rettinger må utføres mange steder Man samler i stedet funksjonaliteten i en prosedyren og kaller metoden der den trengs Dersom det er noe variasjon i hva man trenger, representerer man det som varierer med en parameter

Outline Løkker Kombinere løkker og samlinger For-løkker Prosedyrer med parametre Funksjoner (returverdier)

Subrutiner med returverdi: Funksjoner def mittfunksjonsnavn(parameter1,...): kodelinje1 kodelinje2 return beregnet_verdi For å kjøre alle kodelinjene i funksjonen ("kalle prosedyren"): verdien_jeg_trenger = mittfunksjonsnavn(argument1,..)

Subrutiner med returverdi: Funksjoner En funksjon lar deg outsource en beregning til en separat kodeblokk Funksjonen tar inn en eller flere verdier, gjør en bestemt beregning, og sender tilbake resultatet Det som skiller en funksjon fra en prosedyre er altså at en funksjon returnerer noe: def min_funksjon(parametre,..):... return en_beregnet_verdi

Subrutiner med returverdi: Funksjoner Eksempler på funksjoner: def gang_med_to(tall): return tall*2 def lag_velkomst(fag, person): return "Velkommen til " + fag + " kjaere " + person Bruk av funksjoner dusin=13 todusin = gang_med_to(dusin) print(todusin) #Skriver ut 26 velkomst = lag_velkomst("in1000", "Geir") print(velkomst) #Velkommen til in1000 kjaere Geir

Prøv selv (Lett modifisert fra eksamen 2014) Skriv en funksjon def pris(gratis, alder): Dersom parameteren gratis har verdien True, skal funksjonen alltid returnere 0. Dersom parameteren gratis har verdien False og verdien av alder er mindre enn 18, skal funksjonen returnere 100, ellers 200. Altså skal f.eks. kallet pris (true, 10) returnere 0, kallet pris(false,10) returnere 100 og kallet pris(false, 50) returnere 200.

En mulig løsning def pris(gratis, alder): if gratis: svar = 0 elif alder < 18: svar = 100 else: svar = 200 return svar

En annen mulig løsning (returnere inni if) def pris(gratis, alder): if gratis: return 0 elif alder < 18: return 100 else: return 200

En tredje mulig løsning (bare rene if - ingen else..) def pris(gratis, alder): if gratis: svar = 0 if (!gratis and alder < 18): svar = 100 if (!gratis and alder >= 18): svar = 200 return svar

Oppsummering Løkker gjør at kodelinjer kan kjøres flere ganger F.eks. gjøre lignende type utregning på ulike verdier Løkker og lister jobber godt sammen Kan generere og oppsummere store mengder verdier Prosedyrer og funksjoner gjør livet behagelig! Tillater å tenke overordnet først, og deretter ordne detaljene Dere har nå verktøykassen for å løse skikkelige problemstillinger!