Undervisningsopplegg – regnekraft i Scratch

Datamaskiner ble opprinnelig laget for å foreta avanserte, kompliserte og gjerne mange matematiske beregninger. Så hvorfor ikke lage et program som skal foreta en serie ulike matematiske operasjoner av ulik art.

I dette undervisningsopplegget skal vi lage en prosjekt, som inneholder flere ulike matematiske operasjoner på et sett med tall. Vi skal sortere på ulike måter, summere og arbeide med fakultet. Litt for å se hva Scratch kan klare av operasjoner, og ikke minst hvor raskt.

Kompetansemål matematikk etter 8.trinn
– utforske hvordan algoritmer kan skapes, testes og forbedres ved hjelp av programmering
– utforske og beskrive primtalsfaktorisering og bruke det i brøkregning

Kompetansemål matematikk etter 10.trinn
– utforske matematiske egenskaper og sammenhenger ved å bruke programmering

Krav til programmet
Programmet skal spørre etter det høyeste tallet det skal arbeide med, og skal deretter arbeide med tallene fra 1 og opptil dette tallet. Svaret fra brukeren legges i en variabel som sendes til de ulike funksjonene som programmet skal ha. En funksjon til å skille partall og oddetall i hver sin liste, deretter finne primtallene i utvalget. Deretter skal den finne summen av tallene i utvalget og produktet av utvalget.

Til slutt skal vi legge inn en klokke som regner ut hvor lang tid den bruker på oppgavene.

Steg 1 – Pseudokode
Når vi skal løse slike oppgaver med elevene er det en god ide å «skrible» på tavlen sammen med dem for å skape en forståelse av hva som skal gjøres. Pseudokoding gjør det lettere å få en oversikt over hva som skjer med et og et tall og hvordan vi enklest kan løse utfordringene. Samtidig gir det en rask oversikt over hvor vi trenger løkker og vilkår, samt hvilke variabler vi trenger.

Lag en pseudokode for hovedprogrammet og pseudokode for hver av de ulike funksjonene vi trenger i programmet.

Steg 2 – spør etter maks tall
Oppgaven skal bruke tallene fra 1 og oppover til et maks tall, som er det som brukeren skal sette inn. Dette skal skje når det grønne flagget klikkes, og svaret må lagres i en variabel som skal brukes i flere kall til funksjoner.

Test programmet, og se om det spør etter det høyeste tallet, og lagrer svaret i variabelen slutt_tall.

Steg 3 – sorter i partall og oddetall
Den første oppgaven vi skal gjøre, er å lage en funksjon som sorterer tallene i partall og oddetall, og legger dem inn i hver sin liste. Vi kan begynne med å lage to lister, som heter partall og oddetall. Disse må tømmes når det grønne flagget trykkes, så vi legger inn sletteblokker sammen med det grønne flagget.
Vi lager så en ny blokk, en ny funksjon, som skal hete par_oddetall og som skal ha med seg et parameter inn i funksjonen, nemlig slutt_tall.

Blokken til venstre fester vi i hovedprogrammet, mens den til høyre er den nye funksjonen som skal sortere tallene i par og oddetall.

Vi trenger en variabel som vi kaller arbeids_tall, som skal inneholde tallet vi hele tiden arbeider med og finner ut om dette er et par eller oddetall. Dette blir satt til 1 (det første tallet) og blir endret for hver runde i løkken, hvor vi skal lage en kontroll for par eller oddeltall. Løkken skal gå «slutt_tall» ganger.

Så hvordan finner vi ut om det er partall eller oddetall? Et par tall er alltid delelig på 2, og vi kan da bruke den matematiske blokken mod som sjekker om det er rest når en dividerer et tall på et annet. Er det 0 i rest, så vet vi at det er partall og kan legge tallet i partall-listen. Om det er rest, legger vi det i oddetall-listen.

Denne koden legges inn i løkken vi laget i sted, slik at den kjøres for hvert tall vi ønsker å sjekke, før vi endrer arbeidstallet og sjekker neste.

Test om koden din virker, og at den sorterer tallene i partall og oddetallslisten.

Steg 4 – finn summen av tallene
Den neste matematiske oppgaven er å finne summen av alle tallene i listen. Til dette lager vi en ny blokk vi kaller sum og en ny funksjon som foretar beregningen vår.

Blokken til venstre, funksjonskallet, legger vi inn i hovedprogrammet, mens blokken til høyre er den nye funksjonen som skal regne ut summen.

Vi trenger en variabel som heter sum som tar vare på summen når vi regner ut (denne må vises på skjermen) og så gjenbruker vi arbeids_tall variabelen vi brukte i sted. Summen settes til null, og arbeidstallet til 1.

Vi trenger en løkke som kjøres så mange ganger som slutt_tallet og for hver gang legger vi arbeidstallet til summen, før vi endrer arbeidstallet med 1.

På tide å teste at programmet regner ut korrekt sum. Prøv med noen lave tall i begynnelsen slik at du lett kan kontrollere at den regner korrekt.

Steg 5 – fakultet
Fakultet er en matematisk funksjon som arbeidet med naturlige tall, og skrives som n! der n er det naturlige tallet. En kan beregne n! ved å multiplisere tallene opp til n med hverandre, altså 4! er det samme som 1*2*3*4 = 24 mens 5! er 1*2*3*4*5 = 120. Fakultet brukes i blant annet kombinatorikk og sannsynlighetsberegning.

Vi trenger en egen funksjon, på samme måte som sum-funksjonen, og en kan gjerne bruke denne som mal for arbeidet. Vi lager en ny blokk, en funksjon som vi kaller fakultet, og som skal ha et parameter, slutt_tall med.

Funksjonskallet fakultet legger vi inn i hovedprogrammet, mens den nye funksjonen skal foreta utregningen.

Vi trenger en ny variabel, fakultet som skal inneholde verdien av n!. NB! Viktig av denne variabelen vises på skjermen. Denne setter vi til 1, ikke 0, da «å gange med null er tull«. Vi gjenbruker også variabelen arbeids_tall, da vi skal lage en struktur som er ganske lik de andre funksjonene.

Akkurat som i summeringsfunksjonen må vi lage en løkke som kjøre slutt_tall ganger, og der vi endrer arbeidstallet med 1 for hver runde, slik at vi beveger oss gjennom hele tallrekken. Denne ganger summerer vi ikke, men multipliserer.

La oss teste av programmet fungerer som forventet. Bruk noen lave tall i begynnelsen, f.eks 4 og 5, og se at programmet regner riktig.

Steg 6 – finn primtallene
Dette er det vanskelige steget i programmet. Vi skal lage en funksjon som finner primtallene blant tallene våre, og liste dem ut i en egen liste, som kalles primtall. Så vi begynner med å lage en liste som vi kaller primtall, og legger inn en blokk som sletter alt i listen, samtidig som de sletter oddetall og partall-listene.

Vi trenger en egen funksjon til å finne primtallene, og lager en ny blokk primtall som skal ha med verdien slutt_tall til funksjonen.

Funksjonskallet til venstre legger vi inn i hovedprogrammet, mens funksjonen til høyre skal inneholde koden som finner primtallene. Denne koden er en variant av koden som er brukt i dette undervisningsopplegget Undervisningsopplegg – Finn primtallene – Espens klasserom (wordpress.com)

Vi begynner med å sette variabelen arbeids_tall til 2 som er det laveste primtallet. Selve koden skal legges i en løkke som skal kjøres til arbeidstallet blir større enn slutt_tall som kommer inn til funksjonen. arbeids_tall variabelen endres for hver runde i løkken.

Definisjonen på et primtall er at tallet kun er delbart med 1 og seg selv, altså vil 3 være et primtall, siden det kun er delbart på 1 og 3, mens 4 ikke er et primtall, da det kan deles på 1, 2 og 4. Altså må vært eneste tall i tallrekken testes om det er delbart på tall høyere enn 2 og mindre enn seg selv. Vi trenger derfor to nye variabler, en som holder kontroll på hvilket tall vi dividerer på kalt div_tall og en variabel som markerer om det er primtall eller ei. Denne variabelen er_primtall blir satt til 1, da vi antar at alle tall er primtall inntil det motsatte er bevist, da setter vi den til 0.

Vi må så lage en ny løkke som skal kjøres så lenge vi har muligheten til å teste om tallet er delbart. Vi legger også inn en ekstra kontroll på variabelen er_primtall, for om den er 0 vet at tallet ikke er et primtall og det er ikke nødvendig å teste lenger ved å dividere på andre tall.

Vi er nå klar til selve testen. Vi tar variabelen arbeids_tall og deler på div_tall og ser om det finnes noe igjen som rest. Er det ingen rest er det delbart, og tallet vi tester er ikke et primtall. Da setter vi kontrollvariabelen er_primtall til 1 og det vil ikke bli kjørt flere tester på dette tallet. Hvis ikke endrer vi variabelen div_tall og tester videre.

Når den så er ferdigkjørt, og er_primtall fortsatt er 1, vil tallet vi har arbeidet med og testet være et primtall, og dette må legges inn inn i tabellen som inneholder primtallene.

Vi setter så dette sammen til en funksjon og tester. Test hele programmet på noen tall hvor du er sikker på at du vet hva som er primtallene, slik at du ser at det fungerer og primtallene kommer i rett liste.

Steg 7 – klokke
Så hvor lang tid ville du brukt på å regne ut dette? Og hvor lang tid bruker datamaskinen? Ingen av disse regneoperasjonene er spesielt vanskelige, selv om det kan ta ganske lang tid å regne ut summen av tallene og ikke minst fakultet om vi gjør det i hodet eller med penn og papir. I tillegg kan det ta litt tid å finne primtallene når vi begynner å bevege oss utover de vi kjenner godt.

Hvor lang tid tror du det tar med tallene 5, 10, 50, 100? Vanskelig å si. Vil du prøve å gjette?

La oss legge til en klokke som tar tiden på hvor lang tid dette programmet bruker på å gjennomføre alle disse regneoperasjonene. Vi skal bruke en blokk som nullstiller klokken, og det må gjøres i det øyeblikket brukeren har lagt inn det høyeste tallet vi skal arbeide med, og vise resultatet i det øyeblikket den er ferdig med siste funksjonskall. Da legger den blokken sekundklokke (engelsk timer) inn i variabelen kjøretid som vises på skjermen. Husk å sette variabelen til 0 i begynnelsen av programmet.

Test med et lavt tall, for eksempel 5, 10 og 20. Hva skjer? Får du et svar? Test med 1000 og se hva som skjer.

Et ferdig prosjekt finner du på https://scratch.mit.edu/projects/529049026

Utfordringer
Ferdig? Da kan det kanskje være nødvendig med litt ekstra kode:

  • Legg inn kontroller på at det er heltall og naturlige tall
  • Finnes det andre regneoperasjoner som kan være interessant å teste ut hastigheten på?

Kommentarer er stengt.

Blogg på WordPress.com.

opp ↑

%d bloggere liker dette: