Programmering i skolen

Page 1

Forfatterne har gjennom hele boka et didaktisk og faglig perspektiv på teorien og i eksemplene, og de reflekterer over typiske utfordringer lærere og elever kan oppleve.

ISBN 978-82-15-03428-7

PROGRAMMERING I SKOLEN I I I I I

Andreas Drolsum Haraldsrud er universitetslektor ved Center for Computing in Science Education på Universitetet i Oslo. Henrik Andersen Sveinsson er forsker og underviser ved Fysisk institutt på Universitetet i Oslo. Henrik Hillestad Løvold er universitetslektor og underviser ved Institutt for informatikk ved Universitetet i Oslo. Alle tre har bred undervisningserfaring fra realfag og programmering.

PROGRAMMERING I SKOLEN

Boka passer både for nybegynnere som aldri har programmert før, for dem som kan litt fra før, og for dem som kan en del. Alle eksemplene er hentet fra realfagene fra ungdomsskole og videregående skole. Boka spenner vidt i nivå, og du kan plukke ut dine favoritter fra et bredt utvalg av aktiviteter og oppgaver.

Andreas Drolsum Haraldsrud, Henrik Andersen Sveinsson og Henrik Hillestad Løvold

I

Du får en grundig innføring i generelle prinsipper og konkrete ferdigheter i programmering. Boka er bygd opp rundt programmeringsspråket Python, men går også kort gjennom blokkprogrammering i Scratch og MakeCode for micro:bit. Ønsker du ekstra utfordringer, får du det i bokas siste kapitler om objektorientert programmering, maskinlæring og kunstig intelligens.

Haraldsrud, Sveinsson, Løvold

Programmering i skolen er en innføring i programmering på realfagenes premisser. Forfatterne viser at programmering er et verktøy som kan berike de faglige perspektivene og åpne for nye måter å arbeide med fagene på.

MODELL ALGORITMER Scratch

Python


boolsk

heltall flyttall streng (tekst)

output: 1.0 output: 1 output: ’1.0’

print(’hei!’) a = input() a = float(a)

Output og input output: ’hei’ Lagrer input som tekst i a Konverterer a til flyttall

Husk forskjellen på teksten ’1’ og tallet 1.

float(1) int(1.0) str(1.0)

For å omgjøre en variabeltype til en annen:

a = 1 b = 1.0 c = "hei" eller c = ’hei’ d = True eller d = False

Tilordning av verdi til en variabel er gitt ved:

Datatyper

Tegnet «#» angir kommentar. Alt etter # vil bli oversett av programmet. Triple anførselstegn på hver side av koden kommenterer ut kode over flere linjer.

def funksjonsnavn(parameter1, parameter2,...): return verdi Eksempel: def f(x): return x**2

Funksjoner

Hvis vi bruker henholdsvis to argumenter eller ett argument, fungerer range som range(fra, til, steglengde = 1) og range(fra = 0, til, steglengde = 1)

for <tellevariabel> in range(fra, til, steglengde): <gjør dette> Eksempel: a = 2 \\ for i in range(10): print(a**i)

For-løkker

while <betingelse>: <gjør dette> Eksempel: i = 0 while i < 5: print(i) i = i + 1

While-løkker

if <betingelse>: <gjør dette> elif <betingelse>: <gjør noe annet> else: <gjør noe annet> Bytt ut det som står inni <betingelse> med en logisk betingelse (som f.eks. a < 1), og <gjør dette> med en beslutning (f.eks. print(a)).

listenavn.append(element) listenavn.pop(a) len(listenavn) listenavn.count(elementnavn) max(listenavn) min(listenavn) listenavn.sort() listenavn[a] listenavn[a:b] element in listenavn

np.array(listenavn) np.zeros(n) np.linspace(a,b,n) np.arraynavn[a] np.listenavn[a:b] np.dot(A,B) np.cross(A,B)

Opprette Hente element Hente alle nøklene Hente alle verdier

poeng = {"are": 165, "nora": 162} poeng["nora"] poeng.keys() poeng.values()

Dictionaryer lages med krøllparentes, og bruker nøkler i stedet for indekser til å aksessere elementer.

Dictionaryer

Tupler lages med vanlig rund parentes. Tupler er statiske datasamlinger som ikke kan endres. Eksempel: mitt_tuppel = (1, 2, ’a’, ’b’)

Tupler

Fra liste til array Array med n 0-er n jevnt fordelte tall fra a til b Hente element nummer a (fra 0) Hente element a til b Skalarprodukt av array A og B Kryssprodukt av A og B

For å lage arrayer, må et nytt bibliotek importeres: import numpy as np

Arrayer

Legge til element Slette element nr. a Lengden på lista Antall av et visst element Maksimum tallverdi i lista Minimum tallverdi i lista Sorte lista, minst til størst Hente element nummer a Hente element a til b True om element er i liste

Lister lages ved bruk av klammeparentes: [element1, element2].

Tilfeldige tall

Tilfeldige tall trenger biblioteket numpy: import numpy as np

Tilfeldig heltall f.o.m. a til b. Tilfeldig flyttall mellom a og b Lese fra fil

Ordinær lesing fra fil:

fil = open("minfil.txt", "r")

innhold = fil.read()

fil.readline()

Lager array av en fil vha. numpy Åpner og leser (r = read) fila Lagrer hele innholdet i filen som streng Leser/hopper over én linje Lukker fila etter bruk

Automatisk lesing av tabellfil til array:

np.loadtxt("filnavn.txt", float)

Grafikk: Turtle

Plotting np.random.randint(a, b) np.random.uniform(a, b)

Kommentarer

• Les og prøv å tolke feilmeldingen! De to nederste linjene viser ofte plassering av feilen og type feil. • Det kan være feil i linja over den feil-meldingen foreslår. • Skriv ut variabler underveis – da ser du hva du har å gjøre med. • Kommenter ut snutter i programmet for å kjøre utvalgte deler. • Spør noen andre om å lese gjennom programmet ditt. • Bruk dokumentasjon på nettet flittig.

Lister

a + b gir output: 30 a - b gir output: -10 a * b gir output: 200 b / a gir output: 2 b % a gir output: 0 a**b gir output: 1e20 9 // 2 gir output: 4

Beslutninger

Addisjon Subtraksjon Multiplikasjon Divisjon Modulus Eksponent Heltallsdivisjon

Aritmetiske operatorer

+ * / % ** //

Lager et turtle-objekt Gir form til objektet Gir farge til objektet Tegnefart fra 1 til 10 (0 er raskest) Gir posisjonen til objektet Flytter objektet 50 piksler fram Flytter objektet 50 piksler tilbake Vender 45 grader mot venstre Vender 45 grader mot høyre Streken tegnes ikke Flyttes til punktet (20,30) Avslutter når en klikker på ruta

Plotting trenger biblioteket turtle: from turtle import *

Leonardo = Turtle() Leonardo.shape(’arrow’) Leonardo.color(’blue’) Leonardo.speed(1)

Leonardo.pos()

Leonardo.forward(50)

Leonardo.backward(50)

Leonardo.left(45)

Leonardo.right(45)

Leonardo.penup() Leonardo.goto((20,30))

exitonclick() fil.close()

Plotter y mot x. Lager søylediagram med søylehøyde h mot x. Lager sektordiagram med sektorarealer a. Datamaskinen viser plottet Tittel på plottet Beskrivelse av x-aksen Beskrivelse av y-aksen Liste med merkelapper på grafene Definisjonsverdi (x-aksen) Verdimengde (y-aksen) Skru på rutenett x-akse y-akse Separate plott i samme bilde

Plotting trenger biblioteket matplotlib: import matplotlib.pyplot as plt

plt.plot(x,y) plt.bar(x, h)

plt.pie(a)

plt.show()

plt.title(’tittel’) plt.xlabel(’x-aksetittel’)

plt.ylabel(’y-aksetittel’)

plt.legend([’graf1’, ’graf2’])

plt.xlim(fra, til)

plt.ylim(fra, til)

plt.grid() plt.axhline(y=0, color=’black’) plt.axvline(x=0, color=’black’) plt.subplot(rader, kolonner, nr.)

Tips til feilsøking

Kvadratroten av a Briggske logaritmen av a Naturlige logartimen av a ea Sinus av a gitt i radianer Cosinus av a gitt i radianer Tangens av a gitt i radianer Invers sinus av a, gir radianer Invers cosinus av a, gir radianer Invers tangens av a, gir radianer Omgjør a til radianer Omgjør a til grader Absoluttverdien til a

Logisk lik Ikke lik Større enn Større enn eller lik Mindre enn begge kriterier sanne én av kriteriene sanne gir True hvis a ikke er b

Matematiske funksjoner

np.sqrt(a) np.log10(a) np.log(a) np.exp(a) np.sin(a) np.cos(a) np.tan(a) np.arcsin(a)

np.arccos(a)

np.arctan(a)

np.radians(a) np.degrees(a) np.abs(a)

Logiske operatorer

10 == 10 10 != 11 12 > 10 10 >= 10 10 < 11 a < b and a > c a < b or a > c a not b


Programmering i skolen



Programmering i skolen Andreas Drolsum Haraldsrud Henrik Andersen Sveinsson Henrik Hillestad Løvold


c Universitetsforlaget 2020 ISBN 978-82-15-03428-7 Materialet i denne publikasjonen er omfattet av åndsverklovens bestemmelser. Uten særskilt avtale med rettighetshaverne er enhver eksemplarfremstilling og tilgjengeliggjøring bare tillatt i den utstrekning det er hjemlet i lov eller tillatt gjennom avtale med Kopinor, interesseorgan for rettighetshavere til åndsverk. Utnyttelse i strid med lov eller avtale kan medføre erstatningsansvar og inndragning og kan straffes med bøter eller fengsel. Boka er utgitt med støtte fra Kunnskapsdepartementet ved Lærebokutvalget for høyere utdanning. Forfatterne har mottatt støtte fra Det faglitterære fond. Kapittelfoto: 1. Monkey Business Images/Shutterstock.com. 2. sondem / shutterstock.com. 3. Damrongwit Preecha / Shutterstock.com. 4. Dmitriy Rybin / Shutterstock.com. 5. whiteMocca / Shutterstock.com. 6. Olga Medvedeva / Shutterstock.com. 7. PopTika / Shutterstock.com. 8. Photographee.eu / Shutterstock.com. 9. GaudiLab / Shutterstock.com. 10. Trismegist san / Shutterstock.com. 11. frankie’s / Shutterstock.com. 12. KieferPix / Shutterstock.com. 13. Wanf LiQiang / Shutterstock.com. 14. Golubovy / Shutterstock.com. 15. Gina Buliga / Shutterstock.com. 16. Yurchanka Siarhei / Shutterstock.com. Henvendelser om denne utgivelsen kan rettes til: Universitetsforlaget AS Postboks 508 Sentrum 0105 Oslo www.universitetsforlaget.no Omslag: Endre Barstad Sats: Andreas D. Haraldsrud, Henrik A. Sveinsson og Henrik H. Løvold Trykk og innbinding: 07 Media – www.07.no Boka er satt med: Computer Modern Roman Papir: 100 g Arctic Matt


Innhold

I

Grunnleggende programmering

1 Introduksjon 1.1 Valg av programmeringssprĂĽk . . . . . 1.2 Programmering styrker fagene . . . . . 1.3 Programmering endrer fagene . . . . . 1.4 Programmering sikrer fellesskapet . . . 1.4.1 Digital dannelse . . . . . . . . . 1.4.2 Kunstig intelligens i samfunnet 1.5 Hva er et dataprogram? . . . . . . . . 1.5.1 Ă… programmere hverdagslivet . 1.6 Installasjon . . . . . . . . . . . . . . . 1.7 Hva kan du forvente av denne boka? . 1.7.1 Strukturen i boka . . . . . . . . 2 Tall og variabler 2.1 Kom i gang . . . . . . . 2.2 Tall . . . . . . . . . . . 2.2.1 Heltall . . . . . . 2.2.2 Desimaltall . . . 2.2.3 Standardform . . 2.3 Variabler . . . . . . . . . 2.4 Output . . . . . . . . . . 2.5 Tekststrenger . . . . . . 2.6 Boolske variabler . . . . 2.7 Aritmetikk . . . . . . . 2.7.1 Regnerekkefølge . 2.8 Kommentarer . . . . . . 2.9 Lister . . . . . . . . . . 2.10 Input fra kommandolinja

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . . 3

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

13 . 13 . 14 . 14 . 15 . 15 . 16 . 17 . 17 . 18 . 19 . 19

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . . . . .

21 . . 21 . . 22 . . 22 . . 23 . . 23 . . 24 . . 25 . . 25 . . 26 . . 27 . . 28 . . 28 . . 29 . . 31


4

Innhold 2.11 Moduler og pakker . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.12 Feilsøking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.13 Oppgaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3 Kontrollstrukturer og funksjoner 3.1 Vilkår – «if-tester» . . . . . . . . . . . . . . . . . 3.1.1 Flytskjemaer . . . . . . . . . . . . . . . . 3.1.2 Intervaller . . . . . . . . . . . . . . . . . . 3.1.3 Sammmensatt eksempel . . . . . . . . . . 3.2 Iterasjon med løkker . . . . . . . . . . . . . . . . 3.2.1 While-løkker . . . . . . . . . . . . . . . . 3.2.2 For-løkker . . . . . . . . . . . . . . . . . . 3.3 Funksjoner . . . . . . . . . . . . . . . . . . . . . 3.3.1 Kalle på funksjoner . . . . . . . . . . . . . 3.3.2 Definere en funksjon . . . . . . . . . . . . 3.3.3 Syntaks for funksjoner i Python . . . . . . 3.3.4 Flere returvariabler . . . . . . . . . . . . . 3.3.5 Funksjon inni funksjon . . . . . . . . . . . 3.3.6 Utført eksempel: Finn funksjonsuttrykket 3.3.7 Ikke-matematiske funksjoner . . . . . . . 3.3.8 Funksjoner som ikke returnerer . . . . . . 3.3.9 Keyword-argumenter . . . . . . . . . . . . 3.3.10 Funksjoner og definisjonsområde* . . . . . 3.4 Oppgaver . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

41 . 42 . 44 . 45 . 45 . 47 . 47 . 49 . 52 . 52 . 53 . 55 . 58 . 58 . 60 . 62 . 63 . 64 . 65 . 68

4 Datastrukturer 4.1 Array . . . . . . . . . . . . 4.1.1 Vektorisering . . . . 4.1.2 Matrise som array av 4.2 Tuppel . . . . . . . . . . . . 4.3 Dictionary* . . . . . . . . . 4.4 Oppgaver . . . . . . . . . . 5 Blokkprogrammering 5.1 Om Scratch . . . . . 5.2 Blokkprogrammering 5.3 Start-blokken . . . . 5.4 Variabler . . . . . . . 5.5 Vilkår og if-setninger 5.6 Løkker . . . . . . . . 5.7 Funksjoner . . . . . 5.8 Bevegelse . . . . . .

. . . . . . . . . . arrayer* . . . . . . . . . . . . . . .

. . . . . . . . med Scratch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

73 . 73 . 76 . 77 . 79 . 80 . 85

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

87 . 88 . 88 . 89 . 90 . 91 . 92 . 94 . 95


Innhold

5

5.9 Geometri i Scratch . . . . . . . . . . . . . . . . . . . . . . . . 5.10 Matematisk kunst i Scratch . . . . . . . . . . . . . . . . . . . 5.10.1 Fyrverkeri med geometriske former . . . . . . . . . . . 5.11 Overgang fra blokk til tekst . . . . . . . . . . . . . . . . . . . 5.11.1 Syntaks . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11.2 Faglig tilnærming til overgang til tekstprogrammering 5.11.3 Gruppearbeid er nøkkelen . . . . . . . . . . . . . . . . 5.12 Oppgaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

96 97 99 102 102 103 103 104

6 Plotting og grafikk 6.1 Plotting av data . . . . . . . . . . . . . . . . . . . . . 6.1.1 Subplott . . . . . . . . . . . . . . . . . . . . . . 6.1.2 Andre grafiske representasjoner . . . . . . . . . 6.2 Plotting av funksjoner . . . . . . . . . . . . . . . . . . 6.2.1 3D-plott* . . . . . . . . . . . . . . . . . . . . . 6.3 Grafikk . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Skilpadder som objekter . . . . . . . . . . . . . 6.3.2 Eksempel: Virrevandring (brownske bevegelser) 6.4 Oppgaver . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

105 . . . 105 . . . 109 . . . 111 . . . 114 . . . 115 . . . 117 . . . 119 . . . 121 . . . 124

7 Data og statistikk 7.1 Lese inn data . . . . . . . . . . . . . . . . . . . . 7.1.1 Lese inn tabellbaserte filer . . . . . . . . . 7.1.2 Linje for linje . . . . . . . . . . . . . . . . 7.1.3 Linje for linje fra internett . . . . . . . . . 7.1.4 «Hva må jeg huske om å lese filer?» . . . 7.2 Lineær regresjon . . . . . . . . . . . . . . . . . . 7.3 Gjennomsnitt, median, typetall og standardavvik 7.4 Logiske operasjoner på arrayer . . . . . . . . . . 7.5 Prosjekt: Solflekker . . . . . . . . . . . . . . . . . 7.6 Tilfeldige tall . . . . . . . . . . . . . . . . . . . . 7.7 Statistiske simuleringer . . . . . . . . . . . . . . . 7.7.1 Nedarving og sannsynlighet . . . . . . . . 7.7.2 Stigespill . . . . . . . . . . . . . . . . . . 7.7.3 Har noen bursdag på samme dag? . . . . 7.7.4 Virrevandring* . . . . . . . . . . . . . . . 7.8 Samle inn data . . . . . . . . . . . . . . . . . . . 7.9 Oppgaver . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

127 . . 127 . . 128 . . 131 . . 134 . . 136 . . 137 . . 139 . . 142 . . 142 . . 146 . . 147 . . 147 . . 148 . . 150 . . 151 . . 155 . . 156


6

Innhold

II

Programmering i klasserommet

8 Programmering i klasserommet 8.1 Muligheter og utfordringer . . . . . . . . . . . . . . . . . . . 8.1.1 Hvordan motiverer jeg de svake og de sterke elevene? 8.1.2 Hva hvis jeg ikke klarer å holde tritt med elevene? . 8.1.3 Hva gjør jeg når det tekniske ikke virker? . . . . . . 8.1.4 Alle trenger hjelp! Hvordan strekker jeg til? . . . . . 8.2 Vurderinger . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Kortsvar og flervalg . . . . . . . . . . . . . . . . . . . 8.2.2 Feil og omskrivinger . . . . . . . . . . . . . . . . . . 8.2.3 Skisser og forklaringer . . . . . . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

161 . . 161 . . 163 . . 164 . . 164 . . 165 . . 166 . . 166 . . 167 . . 168

9 Metoder 9.1 Å snakke om programkode . . . . . . . . 9.1.1 Programmeringspuslespill . . . . 9.2 Programmeringsmetoder i klasserommet 9.2.1 Parprogrammering . . . . . . . . 9.2.2 Programmeringsdiktat . . . . . . 9.2.3 Programmeringsalias . . . . . . . 9.2.4 Smidig utvikling . . . . . . . . . 9.3 Jupyter Notebook . . . . . . . . . . . . . 9.4 Versjonskontroll* . . . . . . . . . . . . . 9.4.1 Versjonskontroll med Git . . . . 9.4.2 Samarbeid og deling . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

169 . . 169 . . 170 . . 170 . . 171 . . 172 . . 172 . . 173 . . 175 . . 176 . . 177 . . 179

III

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

Numeriske metoder og modellering

10 Algoritmer og modellering 10.1 Algoritmer . . . . . . . . . . . . . . . . . . . . 10.1.1 Beregning av kvadratrøtter . . . . . . 10.1.2 Beregning av π: Arkimedes’ algoritme 10.1.3 Beregning av π: Tilfeldige tall . . . . . 10.2 Algoritmisk tenking . . . . . . . . . . . . . . 10.3 Modellering . . . . . . . . . . . . . . . . . . . 10.4 Numerisk matematikk . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

183 . . . 183 . . . 184 . . . 185 . . . 187 . . . 189 . . . 190 . . . 191

11 Ligninger 11.1 Utforskende ligningsløsing 11.2 Halveringsmetoden . . . . 11.3 Newtons metode . . . . . 11.4 Renter, sparing og lån . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

193 . . 195 . . 196 . . 199 . . 201


Innhold

7

11.4.1 Annuitetslån . . . . . . . . 11.4.2 Varierende rente . . . . . . 11.4.3 Prosjekt: Simulere personlig 11.5 Oppgaver . . . . . . . . . . . . . .

. . . . . . . . . . økonomi . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

211 . . 211 . . 215 . . 217 . . 219 . . 219 . . 221 . . 224 . . 226 . . 228

13 Dynamiske systemer 13.1 Krefter og bevegelse . . . . . . . . . . . . . . . 13.1.1 Rettlinjet bevegelse (Fysikk 1) . . . . . 13.1.2 Didaktiske perspektiver . . . . . . . . . 13.1.3 Eulers metode . . . . . . . . . . . . . . . 13.1.4 Bevegelse i flere dimensjoner (Fysikk 2)* 13.2 Populasjonsdynamikk (Biologi) . . . . . . . . . 13.2.1 Kontinuerlige modeller . . . . . . . . . . 13.2.2 Modeller med ressursbegrensninger . . . 13.2.3 Modeller med to arter . . . . . . . . . . 13.3 Reaksjonsfart (Kjemi 2) . . . . . . . . . . . . . 13.4 Oppgaver . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

229 . . 230 . . 230 . . 234 . . 236 . . 237 . . 239 . . 241 . . 242 . . 243 . . 246 . . 251

. . . . . . . . . .

255 . . . 256 . . . 256 . . . 257 . . . 258 . . . 259 . . . 262 . . . 262 . . . 264 . . . 266 . . . 266

12 Derivasjon og integrasjon 12.1 Derivasjon av funksjoner . . . . . . 12.2 Derivasjon av diskrete data . . . . 12.2.1 Bilder . . . . . . . . . . . . 12.3 Bestemt integrasjon av funksjoner . 12.3.1 Rektangelmetoden . . . . . 12.3.2 Trapesmetoden . . . . . . . 12.4 Integrasjon av diskrete data . . . . 12.5 Numeriske biblioteker . . . . . . . 12.6 Oppgaver . . . . . . . . . . . . . .

IV

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . .

202 204 204 209

Teknologi og avansert programmering

14 Mikrokontrollere 14.1 Programmering av micro:bit . . . . . 14.1.1 Blokk eller tekst? . . . . . . . 14.2 Blokkprogrammering med micro:bit . 14.3 Tekstprogrammering med micro:bit . 14.4 Vilkår og løkker . . . . . . . . . . . . 14.5 Knapper . . . . . . . . . . . . . . . . 14.6 Radio . . . . . . . . . . . . . . . . . 14.7 Analoge og digitale porter . . . . . . 14.8 Mikrokontrollere i klasserommet . . . 14.8.1 Signaloverføring – temperatur

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i en solfanger

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .


8

Innhold 14.8.2 Kalibrering – fuktighetssensor . . . . . . . . . . . . . . . . . 269 14.8.3 Lyd og toneskalaer . . . . . . . . . . . . . . . . . . . . . . . 272 14.9 Oppgaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

15 Objektorientert programmering* 15.1 Klasser . . . . . . . . . . . . . . . . . . . . 15.1.1 Eksempel: En beholder for primtall 15.2 Arv . . . . . . . . . . . . . . . . . . . . . 15.3 Når er klasser nyttig? . . . . . . . . . . . 15.4 Prosjekt: Flokkdynamikk . . . . . . . . . . 15.4.1 Fra enkeltdyr til flokk . . . . . . . 15.4.2 Interaksjoner . . . . . . . . . . . . 15.4.3 Periodiske randbetingelser . . . . . 15.4.4 Subklasser for spesifikke dyr . . . . 15.5 Oppgaver . . . . . . . . . . . . . . . . . . 16 Maskinlæring og kunstig intelligens 16.1 Kunstige nevrale nettverk . . . . . . 16.2 Lineær regresjon med maskinlæring . 16.3 Mer avanserte modeller . . . . . . . . 16.4 En maskinlæringsmodell for blomster 16.5 Overtilpasning* . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

. . . . .

. . . . . . . . . .

279 . . . 280 . . . 282 . . . 284 . . . 286 . . . 287 . . . 288 . . . 289 . . . 292 . . . 292 . . . 295

. . . . .

297 . . . 298 . . . 299 . . . 303 . . . 307 . . . 313


Forord Takk for at du leser boka vår. Med fagfornyelsen 2020 har programmering og algoritmisk tenking blitt en integrert del av flere fag. Vi ønsket derfor å lage en bok som skulle hjelpe lærere til å gjøre gode valg i programmeringsundervisningen. Dette er altså resultatet. Boka er ganske omfattende og dekker mye. Det er altså ikke en spesialisert bok i ett bestemt fag eller på ett bestemt trinn. Vi prøver heller å gi deg de generelle verktøyene du trenger for å bruke programmering på en god måte i realfagene. Noe av stoffet vil du ha direkte nytte av, andre deler er mest for din egen del. Det er også litt opp til deg hva du ønsker å sette deg inn i og hva du trenger. Dette avhenger av det nivået du selv er på (som lærer), elevenes nivå, øvrige læremidler, klassetrinn og fag. Derfor må du ikke føle at du trenger å lære alt. Se på denne boka som en konfekteske med mange lekre biter. Noen spiser alt, mens andre lar bananlikøren være. Programmering er både spennende, kreativt, frustrerende og morsomt. Det prøver vi å trekke frem med utforskende eksempler, faglig relevante oppgaver og undervisningsopplegg som du kan bruke direkte i klasserommet. Noen oppgaver er kanskje mest egnet for deg selv, andre kan du gi direkte til elevene dine. Vi håper at denne boka kan hjelpe deg med å gjøre disse valgene. Vi prøver også å adressere ulike utfordringer og muligheter i didaktiske refleksjoner underveis i boka. Dette er erfaringer som vi har høstet fra undervisning av både elever og lærere. Gjennom undervisning i videregående skole og på Universitetet i Oslo i etterutdanningsprosjektet ProFag har vi vært nær på undervisningen og de lærende. Dessuten er flere av perspektivene og metodene basert på forskning. Takk til Valler videregående skole og Universitetet i Oslo, spesielt CCSE (Center for Computing in Science Education), for mulighetene de har gitt oss. Du kan få mye ut av å samarbeide med andre når du jobber med denne boka. I programmering får både du og elevene dine mye nytte av samarbeid. Skulle du likevel stå fast, finner du løsningsforslag til oppgavene i boka på bokas hjemmesider: https://nettressurser.no/programmeringiskolen. Her finner du også annet relevant fagstoff. Utforsk, eksperimenter og diskuter. La deg bli frustrert, fascinert og ha det gøy. Lek deg med fagene dine og utforsk nye perspektiver. Det viktigste er å være nysgjerrig og tørre og prøve. God reise!

Oslo, mars 2020 Henrik, Henrik og Andreas



Del I Grunnleggende programmering



Kapittel 1

Introduksjon 1. Introduksjon

Programmering og algoritmisk tenking er viktige ferdigheter i dagens samfunn. Derfor har det nå også blitt en integrert del av flere fag i skolen. I denne boka skal vi se på hvordan vi lærer og lærer bort programmering i en realfaglig sammenheng. Vi bruker eksempler fra matematikk, naturfag, fysikk, kjemi og biologi for å illustrere at vi kan lære programmering gjennom å arbeide med fag, men at vi også kan lære fag gjennom å programmere. Boka handler om programmering i en realfaglig sammenheng og er spesielt rettet mot lærere i ungdomsskolen og videregående skole. Lærere i barneskolen som har lyst til å gå litt dypere inn i programmering, kan også ha godt utbytte av boka.

1.1

Valg av programmeringsspråk

Boka tar utgangspunkt i tekstbasert programmering fordi dette gir det beste grunnlaget for å drive med og lære bort programmering. Blokkbasert programmering har senere kommet som et pedagogisk virkemiddel som spesielt kan lette innlæringen av programmering for barn og ungdom, og derfor adresserer vi også dette i et eget kapittel. Vi har valgt programmeringsspråket Python i denne boka. Dette er et valg vi har tatt av både pedagogiske, faglige og didaktiske grunner: 13


14

Kapittel 1. Introduksjon 1. Python er et av de enkleste og mest lettleste tekstbaserte språkene. 2. Den rene syntaksen i Python gjør det enklere å oversette matematikk til Python-kode. 3. Python blir brukt over hele verden, både i akademia og i næringslivet. 4. Python har veldig mange gode biblioteker med ferdigskrevet kode som kan brukes til praktiske formål, spesielt i realfaglige sammenhenger.

For mange elever føles det matnyttig og motiverende at Python ikke er et skolespråk som de ikke får bruk for utenfor skolen. Det er et verktøy som de kan få direkte bruk for senere i livet, i tillegg til at grunnstrukturene i Python er lett overførbare til de fleste andre populære programmeringsspråk. I tillegg til det tekstbaserte språket Python gjennomgår vi hovedtrekk i blokkbaserte språk som Scratch og MakeCode. Dette er to populære og pedagogiske språk som både er morsomme og lærerike å jobbe med.

1.2

Programmering styrker fagene

Et sentralt element i fagfornyelsen i skolen i 2020 er dybdelæring. Konseptet er ikke nytt, men i de nye læreplanene skal det legges bedre til rette for varig forståelse og dybdekunnskap ved at det blant annet introduseres færre ulike temaer i de ulike fagene. Programmering kan være et ledd i dybdelæringen ved at vi kan utforske kjente konsepter på flere måter, i tillegg til at det lar oss utforske temaer vi før ikke har kunnet utforske. Dessuten gir programmering oss metoder og teknikker som kan brukes på tvers av fag, noe som kan bidra til en dypere forståelse av problemløsningsstrategier og bestemte arbeidsmåter.

1.3

Programmering endrer fagene

Realfagene er utviklet gjennom flere hundre år og har lange tradisjoner. Mange av temaene som dekkes i læreplanene i de naturvitenskapelige fagene, har blitt valgt med utgangspunkt i hvor mye matematikk elevene behersker på det gitte årstrinnet. Med programmering er det enklere å arbeide ut fra et modelleringsperspektiv der elevene kan utforske ulike sammenhenger og modeller uten å ta for mye hensyn til matematiske begrensninger. Dette gjør at vi kan flytte fokuset til drøfting, analyse og en dypere forståelse av de ulike modellene. Ved å bruke programmering gjør vi derfor tilgjengelig en rekke nye faglige problemstillinger fordi vi ikke er begrenset av hvilke ligninger som lar seg løse med penn og papir. I matematikk kan vi også ha stor nytte av programmering. Mange analytiske metoder er utviklet for å løse ett spesielt problem. Med programmering kan vi utforske nye fenomener og generalisere løsningsstrategier i større grad enn tidligere. Disse numeriske metodene skal vi se på i del tre av boka.


1.4. Programmering sikrer fellesskapet

15

Store deler av denne boka handler om hvordan vi kan bruke programmering i de eksisterende fagene. Men siden programmering gir nye muligheter, ønsker vi å utforske disse mulighetene. Derfor vil enkelte deler av denne boka inneholde temaer og metoder som ikke er direkte inne i læreplanene. Disse temaene vil derimot kunne berike perspektivene til både lærere og elever.

1.4

Programmering sikrer fellesskapet

Gjennom 2010-tallet har det digitale blitt vevd inn i alle deler av samfunnet. Da smarttelefonen kom, ble vi koblet kontinuerlig til internett, og derfor har 2010-tallet av enkelte blitt kalt «tiåret da dødtiden forsvant». Men vet vi hvordan denne digitale veven fungerer? Vi stoler på at finanssystemet fungerer, fordi vi er relativt fortrolige med den grunnleggende operasjonen, nemlig transaksjon av penger mot en vare, tjeneste eller eiendel. I den digitale verden har vi mange andre typer transaksjoner. Men den grunnleggende enheten er en linje med kode. Når vi åpner en nettside, kjøres det mange linjer med kode, og datamaskinen vår utveksler informasjon med en server som er koblet til internett. Et kjennetegn ved tjenester på internett, i motsetning til tjenester i «den virkelige verden», er at de er tilsynelatende gratis. Vi betaler riktignok for internettilkoblingen vår, men mange tjenester vi bruker på nettet, betaler vi ikke for med penger. Men det koster jo penger å drifte disse tjenestene, så et eller annet sted må det komme inntekter. Dersom vi forstår programmering, kan vi bedre forstå hvordan transaksjoner av informasjon kan føre til inntekter for selskaper som driver tjenester på internett.

1.4.1

Digital dannelse

Barn blir ikke automatisk digitalt kompetente av å få en iPad, på samme måte som voksne ikke blir mekanikere av å kjøre en bil. Det er hva vi gjør med det digitale mediet, som har noe å si. Når vi snakker om digital dannelse, mener vi det å forstå hva som ligger bak det digitale samfunnet, og forholde seg reflektert til dette samfunnet. Kanskje stikker vi nesa litt sjeldnere ned i mobilen når vi vet at ønsker om å gjøre nettopp det ofte skyldes bevisst manipulasjon fra multinasjonale selskaper. Programmering er ikke bare for spesielt interesserte. Det er for alle. Det betyr ikke at alle skal bli programmerere, men vi mener at alle trenger en viss forståelse av de grunnleggende byggesteinene i vårt digitale samfunn. Når samfunnet gjennomdigitaliseres, må vi også vurdere om de digitale verktøyene spiller på lag med verdiene i samfunnet vårt. I Norge er det i stor grad konsensus om fellesskolen, likestilling, at alle skal ha gode muligheter i livet sitt, og at alle skal bli tatt vare på. Digitaliseringen utfordrer slike verdier fordi teknologien i lang tid har blitt utviklet av en smal gruppe dataingeniører. Da Apple lanserte Health-kit i 2014, hadde de glemt at kvinner har en


16

Kapittel 1. Introduksjon

menstruasjonssyklus. Da Microsoft prøvde å slippe løs samtaleroboten Tay på Twitter i 2016, måtte de ta den ned etter under et døgn fordi den raskt ble til en rasistisk kvinnehater. Det var ingen som eksplisitt hadde programmert inn denne oppførselen, det var bare sånn den ble. Vi har blitt vant til at et uregulert økonomisk system fører til stor økonomisk ulikhet, selv om ingen politikere har laget lover som eksplisitt innfører denne ulikheten. Vi har derfor også en levende debatt om hvor sterke virkemidler vi skal bruke for å motvirke den ulikheten som kapitalismen selv produserer. Vi kommer i de neste tiårene til å bli stilt overfor tilsvarende problemstillinger, der digitalisering fører til systemer som «bare blir sånn» dersom vi ikke passer på. Vi trenger at hele samfunnet settes i stand til å delta i debatten om slike problemstillinger. Ved å sørge for at alle har tilgang på det grunnleggende innen all digital teknologi, nemlig en linje med kode, bidrar vi til å opprettholde det store fellesskapet som samfunnet vårt er.

1.4.2

Kunstig intelligens i samfunnet

Kunstig intelligens kan høres både komplisert og skremmende ut – og det er det jo også. Men grunnlaget for enhver kunstig intelligens er programkode. Denne koden kan være omfattende, og den kan også være slik laget at datamaskinen kan lære av erfaringer. Ofte er strukturen i dataprogrammer med kunstig intelligens laget for å etterligne hvordan hjernen fungerer, med «nevroner» som er koblet sammen. Disse «nevronene» tar imot og viderebringer signaler. Et signal inn kan for eksempel være et bilde. Dette signalet blir sendt gjennom et nettverk av kunstige nevroner, og signalet ut kan bli et tall som representerer hva som er avbildet på dette bildet, for eksempel en katt. Vi kan også la input til denne kunstige hjernen være informasjon om et menneske, og output være sannsynligheten for at vedkommende er skyldig i en straffesak. Da kan en dommer få hjelp av en datamaskin til å avsi en dom. Men hva er en rettferdig kunstig intelligens? Er det greit at et menneske får økt sannsynlighet for å bli uskyldig dømt bare fordi vedkommende kan grupperes sammen med andre som er mer kriminelle enn gjennomsnittet? Kommer den selvkjørende bilen til å stoppe bare for barn og eldre, men ikke rullestolbrukere og syklister? Det høres kanskje rart ut, men denne oppførselen kan oppstå helt uten at noe menneske engang har tenkt på at dette er viktig å ta hensyn til når vi designer selvkjørende biler. Og hva med fordommene som utviklerne av den selvkjørende bilen har? Har det for eksempel noe å si at holdningene til bilister sammenlignet med fotgjengere varierer dramatisk mellom kulturer? Slike etiske spørsmål trenger vi mennesker for å besvare. Vi kan ikke etterlate maskinene til seg selv, og vi trenger mennesker som forstår hvordan maskinene fungerer og handler.


1.5. Hva er et dataprogram?

1.5

17

Hva er et dataprogram?

Et program er et sett med instruksjoner. Et vaskeprogram er et sett med instruksjoner som utføres av en vaskemaskin når en vaskemaskin kjører programmet. Et dataprogram er et sett med instruksjoner som utføres når en datamaskin kjører programmet. En av de enkleste instruksjonene vi kan gi datamaskinen, er å skrive ut «Hei, verden!». I Python skriver vi da: print("Hei, verden!) print er en funksjon som ber datamaskinen skrive noe på skjermen. Når vi kjører programmet ovenfor, får vi følgende utskrift: Hei, verden!

Instruksjonen ovenfor gjør ikke egentlig noe nyttig. Et nyttigere sett med instruksjoner kan for eksempel være: 1. Sjekk temperaturen i Oslo og Bergen. 2. Om temperaturen i Oslo er lavere enn i Bergen, skriv «Det er kaldere i Oslo enn i Bergen». Ellers, skriv «Det er kaldere i Bergen enn i Oslo». I Python-kode kunne dette blitt noe slikt som from yr.libyr import Yr weather_oslo = Yr(location_name=’Norge/Oslo/Oslo/Oslo’) temperatur_oslo = float(weather_oslo.now()["temperature"]["@value"]) weather_bergen = Yr(location_name=’Norge/Hordaland/Bergen/Bergen’) temperatur_bergen = float(weather_bergen.now()["temperature"]["@value"]) if temperatur_oslo < temperatur_bergen: print("Det er kaldere i Oslo enn i Bergen") else: print("Det er kaldere i Bergen enn i Oslo")

Vi skal ikke se på detaljene i dette programmet nå. Det som skjer, er at vi laster ned værdata fra Yr, og sammenligner dataene vi får for Oslo og Bergen.

1.5.1

Å programmere hverdagslivet

Datamaskiner er veldig nøye med at vi gir den presise instruksjoner. Dersom vi i eksemplet ovenfor hadde glemt kolon til høyre i linja som starter med «if», ville hele programmet krasjet. Dessuten hentet vi været i Bergen med


18

Kapittel 1. Introduksjon

location_name=’Norge/Hordaland/Bergen/Bergen’. Hvem vet hvor lenge det

vil fungere nå som Hordaland har blitt Vestland? Det kommer an på hvordan Yr velger å håndtere regionreformen. Underveisoppgave 1.1: Å handle i butikken

Skriv et sett med instruksjoner som du kan bruke til å komme deg gjennom dagligvarebutikken. Legg gjerne til ting slik som «Dersom jeg mangler melk i kjøleskapet, ta med melk». Datamaskinen er å regne som barn som blir bedt om å gå ut i gangen for å ta på seg skoene, for så å gå i vranglås fordi skoene ikke står der. En «Ellers: sjekk vaskerommet» kunne kanskje løst mye. Noen synes dette er veldig greit å forholde seg til. Datamaskinen gjør det vi ber den om, verken mer eller mindre. Andre blir frustrert over at det å bytte ut et semikolon med et komma er forskjellen mellom et pent plott som kan legges inn i en rapport, og en stygg feilmelding som kan se ut som noe slikt: Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: ’numpy.ndarray’ object has no attribute ’x’

Datamaskinen kan svare på en måte som føles uforholdsmessig vrang og aggressiv, bare på grunn av små detaljer. Men husk: Det er bare fordi den ikke forstår hva som foregår. Nøyaktighet og feilsøking er to viktige ferdigheter som vi øver på når vi programmerer. Det kan selvfølgelig være utfordrende og frustrerende når det står på som verst, og all kode blir feil på grunn av bagateller, men som all annen læring gjør det litt vondt å bli skikkelig god i noe. Ferdigheter som nøyaktighet, presisjon, feilsøking, logikk, dekomponering og kreativitet er heldigvis overførbare på andre disipliner enn programmering. Det er derfor en verdifull investering!

1.6

Installasjon

I denne boka bruker vi som nevnt Python som programmeringsspråk. Derfor trenger du å ha en Python-interpreter installert på datamaskinen. Dette er kort fortalt et program, en slags tolk, som oversetter Python-kode til noe datamaskinen forstår. I en standard Python-installasjon følger det med en del funksjonalitet, men siden det er realfagene vi skal konsentrere oss om, trenger vi litt mer matematikk- og visualiseringsfunksjonalitet. Derfor trenger vi matplotlib- og numpy-pakken i tillegg til en standard Python-installasjon. Vår erfaring er


1.7. Hva kan du forvente av denne boka?

19

at den enkleste måten å få det til på i et klasserom er å installere Anaconda fra anaconda.com. Anaconda pakker sammen Python med en del pakker for matematikk og visualisering, og installeres slik vi er vant til å installere programmer – ved å laste ned og åpne en fil. Ellers finnes det mange online-tjenester, slik som repl.it og trinket.io. Repl gir i tillegg en del muligheter for interaksjon mellom lærere og elever.

1.7

Hva kan du forvente av denne boka?

Vi skal være vennlige og gjøre det vi kan for å gi en behagelig og spennende introduksjon til programmering. Der det er hensiktsmessig, er eksemplene både relevante og nyttige for fagene i skolen. Det er derimot ikke alltid det gir praktisk mening å forklare hvorfor hvert eneste konsept vi innfører, er nyttig med en gang. Dette kjenner vi fra ethvert klasserom. Selv om vi ofte både vet og kunne forklart hvorfor hvert enkelt tema i matematikkfaget er nyttig og viktig, så er det ikke praktisk å alltid gjøre det. I tillegg prøver vi å være ærlige om hvordan verden og teknologien faktisk er. Det vil si at vi ikke kommer til å late som at alt alltid går på skinner. En del eksempler er med vilje laget mer plundrete enn de må være for å illustrere at verden av og til er litt rotete. Det er ikke alltid numeriske metoder virker, og om du tror du har funnet et datasett som inneholder temperaturmålinger fra Blindern de siste 200 årene, så må du regne med at det mangler enkelte avlesinger i tabellen. Vi tar opp denne typen problemstillinger fordi det er ekte problemstillinger som vi tvinges til å forholde oss til når vi programmerer.

1.7.1

Strukturen i boka

Boka er delt inn i fire deler. Den første delen dreier seg om grunnleggende programmering. Her lærer du grunnstrukturene i Python og de tilsvarende strukturene i blokkspråket Scratch. Det mest sentrale er variabler, vilkår, løkker, funksjoner og visualisering. I tillegg behandler vi datahåndtering og statistisk modellering her. I del to av boka ser vi på sentrale trekk ved programmering i klasserommet. Her gjennomgår vi anerkjent didaktikk, men tilpasset en faglig kontekst og et norsk klasserom. Vi adresserer vanlige utfordringer og muligheter med programmering i klasserommet, og vi gjennomgår metoder og virkemidler som du kan bruke i undervisningshverdagen. Del tre av boka adresserer numerisk matematikk og anvendelser av dette. Gjennom gjennomarbeidede eksempler, klasseromsopplegg og oppgaver veileder vi deg gjennom mange av de nye mulighetene du kan få med programmering. Denne delen er spesielt nyttig for lærere i videregående opplæring, men mange andre kan ha stor glede og nytte av den. Den siste delen av boka, del fire, inneholder en del om programmering


20

Kapittel 1. Introduksjon

og teknologi. Spesielt ser vi på bruk av mikrokontrollere, særlig micro:bit. Vi adresserer også maskinlæring og objektorientert programmering, noe som kan være greit å kunne litt om dersom en ønsker å kunne utfordre spesielt flinke elever. Boka har et bredt utvalg av gjennomarbeidede eksempler. Disse kan benyttes både til egen læring og i klasserommet. I tillegg anbefaler vi at du gjør underveisoppgavene mens du leser – ingen lærer programmering av å bare lese om det! Du må prøve, øve, eksperimentere, diskutere, gråte av håpløshet og hoppe av glede hvis du virkelig skal få fullt utbytte av programmering. Numeriske metoder og definisjoner er samlet i egne bokser med fargekoder slik at de er lett å finne frem til. I tillegg er det en del oppgaver i slutten av hvert kapittel som kan løses av både lærere og elever. Mange av disse oppgavene er merket med bestemte fag og om de er mest egnet på ungdomsskolen eller videregående. Boka er ment å inneholde noe for alle. Det betyr at du vil finne stoff som er for enkelt for noen, og noe som er altfor vanskelig for andre. Det er ikke slik at vi ser for oss at alle lærere og elever skal lære seg alt i boka, men det er samtidig viktig å tilby de flinke litt ekstra. Noen kapitler er merket med *. Dette betyr at de kan ses på som ekstramateriale for lærere og elever som ønsker litt ekstra. Vi ønsker deg god fornøyelse med boka!


boolsk

heltall flyttall streng (tekst)

output: 1.0 output: 1 output: ’1.0’

print(’hei!’) a = input() a = float(a)

Output og input output: ’hei’ Lagrer input som tekst i a Konverterer a til flyttall

Husk forskjellen på teksten ’1’ og tallet 1.

float(1) int(1.0) str(1.0)

For å omgjøre en variabeltype til en annen:

a = 1 b = 1.0 c = "hei" eller c = ’hei’ d = True eller d = False

Tilordning av verdi til en variabel er gitt ved:

Datatyper

Tegnet «#» angir kommentar. Alt etter # vil bli oversett av programmet. Triple anførselstegn på hver side av koden kommenterer ut kode over flere linjer.

def funksjonsnavn(parameter1, parameter2,...): return verdi Eksempel: def f(x): return x**2

Funksjoner

Hvis vi bruker henholdsvis to argumenter eller ett argument, fungerer range som range(fra, til, steglengde = 1) og range(fra = 0, til, steglengde = 1)

for <tellevariabel> in range(fra, til, steglengde): <gjør dette> Eksempel: a = 2 \\ for i in range(10): print(a**i)

For-løkker

while <betingelse>: <gjør dette> Eksempel: i = 0 while i < 5: print(i) i = i + 1

While-løkker

if <betingelse>: <gjør dette> elif <betingelse>: <gjør noe annet> else: <gjør noe annet> Bytt ut det som står inni <betingelse> med en logisk betingelse (som f.eks. a < 1), og <gjør dette> med en beslutning (f.eks. print(a)).

listenavn.append(element) listenavn.pop(a) len(listenavn) listenavn.count(elementnavn) max(listenavn) min(listenavn) listenavn.sort() listenavn[a] listenavn[a:b] element in listenavn

np.array(listenavn) np.zeros(n) np.linspace(a,b,n) np.arraynavn[a] np.listenavn[a:b] np.dot(A,B) np.cross(A,B)

Opprette Hente element Hente alle nøklene Hente alle verdier

poeng = {"are": 165, "nora": 162} poeng["nora"] poeng.keys() poeng.values()

Dictionaryer lages med krøllparentes, og bruker nøkler i stedet for indekser til å aksessere elementer.

Dictionaryer

Tupler lages med vanlig rund parentes. Tupler er statiske datasamlinger som ikke kan endres. Eksempel: mitt_tuppel = (1, 2, ’a’, ’b’)

Tupler

Fra liste til array Array med n 0-er n jevnt fordelte tall fra a til b Hente element nummer a (fra 0) Hente element a til b Skalarprodukt av array A og B Kryssprodukt av A og B

For å lage arrayer, må et nytt bibliotek importeres: import numpy as np

Arrayer

Legge til element Slette element nr. a Lengden på lista Antall av et visst element Maksimum tallverdi i lista Minimum tallverdi i lista Sorte lista, minst til størst Hente element nummer a Hente element a til b True om element er i liste

Lister lages ved bruk av klammeparentes: [element1, element2].

Tilfeldige tall

Tilfeldige tall trenger biblioteket numpy: import numpy as np

Tilfeldig heltall f.o.m. a til b. Tilfeldig flyttall mellom a og b Lese fra fil

Ordinær lesing fra fil:

fil = open("minfil.txt", "r")

innhold = fil.read()

fil.readline()

Lager array av en fil vha. numpy Åpner og leser (r = read) fila Lagrer hele innholdet i filen som streng Leser/hopper over én linje Lukker fila etter bruk

Automatisk lesing av tabellfil til array:

np.loadtxt("filnavn.txt", float)

Grafikk: Turtle

Plotting np.random.randint(a, b) np.random.uniform(a, b)

Kommentarer

• Les og prøv å tolke feilmeldingen! De to nederste linjene viser ofte plassering av feilen og type feil. • Det kan være feil i linja over den feil-meldingen foreslår. • Skriv ut variabler underveis – da ser du hva du har å gjøre med. • Kommenter ut snutter i programmet for å kjøre utvalgte deler. • Spør noen andre om å lese gjennom programmet ditt. • Bruk dokumentasjon på nettet flittig.

Lister

a + b gir output: 30 a - b gir output: -10 a * b gir output: 200 b / a gir output: 2 b % a gir output: 0 a**b gir output: 1e20 9 // 2 gir output: 4

Beslutninger

Addisjon Subtraksjon Multiplikasjon Divisjon Modulus Eksponent Heltallsdivisjon

Aritmetiske operatorer

+ * / % ** //

Lager et turtle-objekt Gir form til objektet Gir farge til objektet Tegnefart fra 1 til 10 (0 er raskest) Gir posisjonen til objektet Flytter objektet 50 piksler fram Flytter objektet 50 piksler tilbake Vender 45 grader mot venstre Vender 45 grader mot høyre Streken tegnes ikke Flyttes til punktet (20,30) Avslutter når en klikker på ruta

Plotting trenger biblioteket turtle: from turtle import *

Leonardo = Turtle() Leonardo.shape(’arrow’) Leonardo.color(’blue’) Leonardo.speed(1)

Leonardo.pos()

Leonardo.forward(50)

Leonardo.backward(50)

Leonardo.left(45)

Leonardo.right(45)

Leonardo.penup() Leonardo.goto((20,30))

exitonclick() fil.close()

Plotter y mot x. Lager søylediagram med søylehøyde h mot x. Lager sektordiagram med sektorarealer a. Datamaskinen viser plottet Tittel på plottet Beskrivelse av x-aksen Beskrivelse av y-aksen Liste med merkelapper på grafene Definisjonsverdi (x-aksen) Verdimengde (y-aksen) Skru på rutenett x-akse y-akse Separate plott i samme bilde

Plotting trenger biblioteket matplotlib: import matplotlib.pyplot as plt

plt.plot(x,y) plt.bar(x, h)

plt.pie(a)

plt.show()

plt.title(’tittel’) plt.xlabel(’x-aksetittel’)

plt.ylabel(’y-aksetittel’)

plt.legend([’graf1’, ’graf2’])

plt.xlim(fra, til)

plt.ylim(fra, til)

plt.grid() plt.axhline(y=0, color=’black’) plt.axvline(x=0, color=’black’) plt.subplot(rader, kolonner, nr.)

Tips til feilsøking

Kvadratroten av a Briggske logaritmen av a Naturlige logartimen av a ea Sinus av a gitt i radianer Cosinus av a gitt i radianer Tangens av a gitt i radianer Invers sinus av a, gir radianer Invers cosinus av a, gir radianer Invers tangens av a, gir radianer Omgjør a til radianer Omgjør a til grader Absoluttverdien til a

Logisk lik Ikke lik Større enn Større enn eller lik Mindre enn begge kriterier sanne én av kriteriene sanne gir True hvis a ikke er b

Matematiske funksjoner

np.sqrt(a) np.log10(a) np.log(a) np.exp(a) np.sin(a) np.cos(a) np.tan(a) np.arcsin(a)

np.arccos(a)

np.arctan(a)

np.radians(a) np.degrees(a) np.abs(a)

Logiske operatorer

10 == 10 10 != 11 12 > 10 10 >= 10 10 < 11 a < b and a > c a < b or a > c a not b


Forfatterne har gjennom hele boka et didaktisk og faglig perspektiv på teorien og i eksemplene, og de reflekterer over typiske utfordringer lærere og elever kan oppleve.

ISBN 978-82-15-03428-7

PROGRAMMERING I SKOLEN I I I I I

Andreas Drolsum Haraldsrud er universitetslektor ved Center for Computing in Science Education på Universitetet i Oslo. Henrik Andersen Sveinsson er forsker og underviser ved Fysisk institutt på Universitetet i Oslo. Henrik Hillestad Løvold er universitetslektor og underviser ved Institutt for informatikk ved Universitetet i Oslo. Alle tre har bred undervisningserfaring fra realfag og programmering.

PROGRAMMERING I SKOLEN

Boka passer både for nybegynnere som aldri har programmert før, for dem som kan litt fra før, og for dem som kan en del. Alle eksemplene er hentet fra realfagene fra ungdomsskole og videregående skole. Boka spenner vidt i nivå, og du kan plukke ut dine favoritter fra et bredt utvalg av aktiviteter og oppgaver.

Andreas Drolsum Haraldsrud, Henrik Andersen Sveinsson og Henrik Hillestad Løvold

I

Du får en grundig innføring i generelle prinsipper og konkrete ferdigheter i programmering. Boka er bygd opp rundt programmeringsspråket Python, men går også kort gjennom blokkprogrammering i Scratch og MakeCode for micro:bit. Ønsker du ekstra utfordringer, får du det i bokas siste kapitler om objektorientert programmering, maskinlæring og kunstig intelligens.

Haraldsrud, Sveinsson, Løvold

Programmering i skolen er en innføring i programmering på realfagenes premisser. Forfatterne viser at programmering er et verktøy som kan berike de faglige perspektivene og åpne for nye måter å arbeide med fagene på.

MODELL ALGORITMER Scratch

Python


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.