ProgX: Oppgaver i "Basic Python"
Mykje av dette er det du finn under "Grunnleggjande
programmering", men noken krever bruk av lister (sjå Introduksjon
til lister og listemetodar)
eller strenger (sjå strengmetodar).
Andre krever randomfunksjonar.
1 Bruk av matematiske og andre operatorar i konsollet:
- Finn kvadratet av 77 og kvadratrota av 85
- Finn avstanden frå origo til punktet (0.5, 0.7)
- Utfør heiltalsdivisjonen 127 delt på 33
- Finn resten av divisjonen 127/33 Svar: 28
- Kan du finna denne resten på ein annan måte? Hint: du kan bruka
divisjon og heiltalsdivisjon
- Korleis kan du finna ut om 27 er delelig med 3?
- Korleis kan du finna ut om eit tilfeldig heiltal er eit kvadrattal?
- Kva skjer hvis du skriv "hei på " + "deg"?
- Kva skjer hvis du skriv "to" + 2 ?
2
"Kalkulatorar"
Her treng du ikkje bruka løkker, men gjerne if-setningar
- Pytagoras: Lag eit program som finn hypotenusen i ein trekant
med kjente kateter.
Variant: Lag eit program som finn ei side i ein rettvinkla
trekant når dei to andre er kjente. Programmet skal lesa inn dei to
sidene og spørja om disse er to kateter eller hypotenus og ein av
katetane.
- avstand: Lag eit program som les inn to punkt (x1,y1) og
(x2,y2), og skriv ut avstanden mellom dei.
- enheter: Lag eit eller fleire program som reknar om mellom
enheter, feks m/s til km/h, meter til engelsk mile osv. Sjå Omrekningskalkulator.
- abc-formelen:
Lag eit program som løyser ein andregradslikning vha abc-formelen (eksempel på det),
og skriv ut riktig svar for to, ein, eller ingen løysing.
- ulikheter:
Lag et program som les inn ein x-verdi og sjekkar om den er ei
løysing på ulikheten - x2 +
7x - 6 > 0
- Herons formel:
Skriv et program som les inn alle sidene (a, b og c) i ein
vilkårlig trekant, og reknar ut arealet vha Herons formel.
Ein variant av Herons formel er Brahmaguptas
formel. Den gjeld for ein såkalt syklisk
firkant, som er det same som ein firkant innskriven i ein sirkel.
- Bevegelseslikningane: Skriv et program basert på
bevegelseslikningane i fysikk, som les inn v0, a, og t, og
som reknar ut sluttfarten v, og strekningen s
3 Tilfeldige tal, terningkast ol.
Sjå Python:
Randomfunksjonar.
- Lag eit tilfeldig heiltal mellom 1 og 100
- Lag eit tilfeldig partal mellom 1 og 100
- Lag eit tilfeldig desimaltal mellom 0 og 1
- Lag eit tilfeldig desimaltal mellom -1 og 1
- Lag eit tilfeldig punkt (x,y) slik at både x og y ligg mellom
-1 og 1. Finn deretter avstanden frå origo. (Dette er ein
utvidelse av 1.2)
3.6 Terningkast med ein terning
Lag eit program som kastar ein terning N gonger, dvs generer N tilfeldige
tal mell om 1 og 6
Finn gjennomsnittet.
3.7 Terningkast med to terningar
Lag et program som simulerer kast av to terninger. Vi "kastar" mange
gonger og skriv ut summen S av kast1 og kast2. Stopp programmet hvis
summen er større eller lik 10. Sjå løysingsforslag
Variant: Lag ei liste med frekvensane (kalla "f" her) der du tar
vare på summen, dvs slik at f[0] inneheld antal gonger summen blir to,
f[1] antal gonger tre osv heilt opp til f[10] som er antall gonger summen
blir 12, som er det meste. Så for kvart kast må du altså legga 1 til på
rett plass i lista.
Til slutt skal programmet skriva ut alle frekvensane.
- Finn gjerne også den relative frekvensane, som er frekvens
/ N, der N er totalt antal kast. Varier N. Prøv også å finna ut
sannsynlighetane for å få sum = 2, 3 osv. Ligg dine relative frekvensane
nær sannsynlighetane?
- Ekstra: kan du utvida til 3 (eller fleire) terningar?
4 if-setningar:
- Finn ut om det tilfeldige punktet du genererte over har kortare
avstand frå origo enn 1. (sjå 1.2 og 3.5)
- Finn ut om det tilfeldige talet frå oppgave 1) over er eit partal
eller oddetal og om det er eit kvadrattall eller ikkje.
- Hvis dette talet er eit oddetal, sjekk om n2 også er eit
oddetal. Ka finn du?
5 Løkker:
- Lag ei løkke med N = 100 iterasjonar der du genererer eit tilfeldig
punkt som over, og finn ut om talet k har kortare avstand enn 1 frå
origo. La variabelen k telja opp kor mange gonger det skjer, og regn ut
p = 4*k / N. Skriv ut p. Auk N til 1000, 10000 osv. Kva tal nærmar p
seg? Korfor det? Sjå løysingsforslag
- Skriv ut alle multippel av 3 som er mindre enn 100. Bruk ei
while-løkke.
- Skriv ut del lille gangetabellen. Hint: skriv ut multippel av 1, av 2
osv opp til 10. (prøv å pynta på utskriften)
6 Fleire løkkeoppgaver:
6.1 Primtal
- Lag eit program som finn ut om eit gitt tal N er delelig med heiltal
mellom 1 og N. Hvis ikkje skriv du ut at N er eit primtal!
- Prøv å effektivisera algoritmen over. Kor mange tal treng vi egentlig
å sjekka?
- Lag eit program som skriv ut alle primtal mindre enn 100 vha.
tankegangen over
- Lag eit program som bruker den såkalte Eratosthenes'
sil - algoritmen.
Les meir om Primtal.
1) Lag et program som finn n! (n - fakultet) (5! er 1*2*3*4*5 = 120 osv)
2) Ved hjelp av denne funksjonen skal du skriva ut dei første 10 tala:
1! = 1
2! = 2
3! = 6...
10! = 3628800
6.3
Fibonacci-følgen
Lag
eit program som skriv ut Fibonacci-følgen. sjå: https://no.wikipedia.org/wiki/Fibonaccitall
Her kan du gjerne bruka lister, (Sjå introduksjon
til lister) men oppgava kan løysast på mange måtar. Her er ei løysingsforslag.
Det bruker ein teknikk for tallbytting som du kan sjå
her.
6.4
Figurtall
Skriv
ut alle trekanttal og alle pyramidetal under 100 Sjå https://no.wikipedia.org/wiki/Trekanttall og https://no.wikipedia.org/wiki/Pyramidetall
Prøv tilsvarande for tetraedertall: https://no.wikipedia.org/wiki/Tetraedertall
Sjå
også: http://oyro.no/figurtal.html
6.5
Pascals trekant
Skriv ut dei ti (feks.) første radene i Pascals
trekant. Her er dei første fem. Her er det også greit å bruka lister.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Skriv ut dei første n radene i Floyds trekant. Her er dei første fem:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
6.7 Lazy caterer's sequence
Siffera til venstre i kvar rad, dvs. 1, 2, 4, 7, 11, .... dannar det som
kallast Lazy
caterer's sequence. Lag eit program som skriv ut disse.
6.8 Mønster
Lag program som skriv ut følgande mønster (med varierande antal linjer).
Programmet skriv ut ulike mønster med X-ar
NB! Mønster 1,2 og 3 er innanfor det som kan komma på ein prøve, det
fjerde er på grensa, men det siste er for vanskelig til å ha på ein
prøve. Sjå løysingsforslag.
Mønster
1:
X
XX
XXX
XXXX
XXXXX
XXXXXX
Mønster 2:
XXXXXX
XXXXX
XXXX
XXX
XX
X
Mønster 3:
X
XX
X X
X X
X X
X X
Mønster
4:
X X X
X X X
X X X
X X X
X X X
X X X
Mønster 5: Diamantmønster:
X
X X
X X
X X
X X
X X
X
6.9 Collatz antagelse
Eit av dei uløyste problema i matematikken er den såkalte Collatz
Conjecture. (formodning eller antagelse). Problemet er som følger
Vi startar med eit heiltal, og bruker ein av følgande reglar på talet og
erstattar det med det nye:
- Hvis det er partal, divider med 2
- Hvis ikkje, multipliser med 3 og legg til 1.
Antagelsen er at vi alltid ender opp med 1 til slutt. Men dette
er ikkje bevist.
Oppgava for oss er då å laga eit program som bruker reglane og sjekker om
dette stemmer for eit gitt tall.
7 Vektorar som lister:
Denne oppgava passar kanskje best for dei som tar R1. NB: Det fins
bibliotek der vi kan gjera dette med arrays, som er enklare, men vi skal
gjera det med vanlige lister.
- Lag et program som definer vektorane a = [1,3,2] og b = [2,2,3],
og som finn ein ny vektor som er summen av disse: c = a + b.
Finn også differansen.
- Lag eit program som finn skalarproduktet av
to vektorar [1,3,2] * [2,2,3] = 1*2 + 3*2 + 2*3 = 2 + 6 + 6 = 14.
- Finn lengden av ein vektor når
start- og sluttpunkt er gitt. Dette er det same som å finna avstanden
mellom to punkt.
- Finn vinkelen mellom to vektorar som
er gitt på koordinatform.
8 Tekststrenger
Oppgave 8.1
Definer strengen s1 = "abcdefg", og lag ein ny streng som er lik den
omvendte "gfedcba" vha ei løkke.
Oppgave 8.2
- Sjekk om ein tekststreng er eit isogram,
dvs. som ikkje har repeterande bokstavar.
- Tisvarande for pangram
(setning eller uttrykk som inneheld minst ein av kvar bokstav i
alfabetet.
- Finn ut om ein streng er eit anagram
av den andre. Feks. Kama Sutra = Austmarka (blanke er lovlig)
- Eit palindrom
er eit ord eller ein setning som er lik seg sjøl hvis du skriv den
baklengs, som feks "Agnes i senga". Lag eit program som sjekker om ein
gitt tekststreng er eit palindrom (uten å bruka funksjonen "reversed()")
- Skriv ut diktet There
was an old lady who swallowed a fly ved det kortaste mulige
program!
9 Nøtter (?):
9.1 Randomwalk i 2D (som et apropos til Brownske bevegelsar i
termofysikken)
- Tenk deg at du startar i origo og tar eit tilfeldig steg i y- eller
x-retning til eit nytt punkt. Skriv ut det nye punktet. Mulighetene er
altså (-1, -1), (-1, 1), (1, -1) og (1, 1).
Ta så nye tilfeldige steg. Ta feks. 10 steg på denne tilfeldige turen.
- No kan du sløyfa utskrift for kvart steg. Ta 100 steg, og skriv ut
koordinatane for sluttpunktet.
- Finn avstanden frå origo.
- Legg ei ekstra løkke, slik at du gjer fleire turar. (10?) Då kan du
feks. finna gjennomsnittsavstand og maks- og min-avstand.
Du kan evt. gjera det enklare ved å gå langs ei linje. Då startar du i x
= 0, og så tar du eit tilfeldig steg i pluss- eller minusretning.
9.2 Pytagoreiske talltrippel:
Eit pytagoreisk talltrippel er tre heiltall som passar i Pytagoras sin
likning, som feks 3,4 og 5.
- Finn alle Pytagoreiske talltrippel (a, b og c) der alle tal er
mindre enn 100
- Finn alle (hvis det fins) Pytagoreiske talltrippel der a + b + c
= 1000
9.3
Kaprekars konstant.
Lag eit program som finn Kaprekars
konstant (også kalla Kaprekars tall)
9.4 Primtal
Her treng du kanskje heiltalsdivisjon og/eller rest (modulo) av ein
heiltalsdivisjon. Sjå
operatorar.
- Skriv eit program som finn ut om eit gitt tal er eit primtal. Løysingsforslag.
- Skriv eit program som finn ut alle primtalsfaktorane av eit gitt tal.
- Ein av dei kjente algoritmane for å generera primtal er den såkalte Eratosthenes'
sil (eller sold). Les om den og bruk den til å generera alle
primtall opp til 100
9.5 Sortering.
Ei av dei vanligaste algoritmane å starta med i programmering, er å laga ein
sorteringsalgoritme. Det fins mykje teori, og mange forskjellige
algoritmar for
dette, og det fins ferdiglaga funksjonar i Python. Men du skal laga
din egen algoritme. For å klara det treng du å kunna lister. (Sjå Introduksjon
til lister og listemetodar.)
Det kan også vera greit å sjekka programmet bytt.py
som bytter to tal.
Sorter ei liste med heiltal. Du bruka såkalt boblesortering.
Hvis du feks startar med a = [6,2,7,9,1,1,3,2,5,10,15,8], så skal du ha ut
[1,1,2,2,3,5,6,7,9,10,15] Løysingsforslag.
10 Funksjonar:
- Lag funksjonane f(x) = x2 + 5x og df(x) = 2*x +
5 (Ser du samanhengen?)
- Lag eit program som skriv ut alle f(x) og alle df(x) for x-verdiar
mellom -7 og 2.
Intro til bunnpunkt og nullpunkt for ein funksjon
Vi tar utgangspunkt i funksjonen f(x) over.
- Start i ein tilfeldig x-verdi mellom -7 og 2. Rekn ut y-verdien vha
f(x). Skriv ut x- og y-verdi.
- Vi skal no prøva å finna bunnpunktet til f(x) på to måtar.
Først lagar vi ei løkke der vi sjekkar for x-verdiar som ligg eit lite
steg dx = 0.1 til venstre og til høgre. Så bruker vi det for å ta eit
steg i riktig retning. Gjenta til du ikkje finn lavare f(x), eller etter
eit visst antal iterasjonar. Du bestemmer sjøl kor langt steg programmet
skal ta. Det kan gjerne vera smart å variera steglengda (og dx?) Skriv
ut det punktet du endar på. Kor nært kom du?
- I staden for å sjekka 0.1 til høgre og venstre, så skal vi no bruka
df(x) (som altså er den deriverte, dvs den gir deg stigningstalet) for å
bestemma om vi skal gå til høgre eller venstre.
- Kan du prøva å laga ein metode for å finna nullpunkta til f(x)?