Lab1
Kursnotater for tema som er nye i denne laben:
- En lab er en samling med én eller flere oppgaver.
- Hver lab kan gi opp til 25 poeng.
- Dersom du består alle oppgavene i hovedfeltet, får du 20 poeng. Alt eller ingenting.
- De resterende 5 poengene kan du få ved å gjøre oppgaver fra ekstrafeltet.
- Alle oppgaver rettes automatisk. Hvis du ikke består de automatiske testene, får du ikke poeng.
- De automatiske testene for grafikk-oppgaver sjekker bare at programmet ditt faktisk kjører, og så laster den opp bildet du lager i galleriet – den sjekker ikke om du faktisk har løst riktig oppgave. Vi gjør derfor en rask manuell sjekk på de grafiske oppgavene.
- Vi vil trekke poeng manuelt dersom vi oppdager at oppgaven åpenbart ikke er løst, eller man forsøker å trikse seg gjennom de automatiske testene.
- Hver lab kan leveres så mange ganger du vil; det er siste innlevering som teller. Du kan umiddelbart se resultatene på de automatiske testene etter innlevering.
Hver lab utgjør 2.5% av den endelige karakteren din i emnet. Du må få til sammen 100 poeng eller mer på labene for å kunne ta eksamen.
Det er veldig viktig at du siterer alle kilder og eventuelle samarbeid. Se mitt.uib for mer informasjon om vår policy på plagiat og samarbeid.
Det er lurt å levere inn mange ganger underveis. Du får umiddelbart en automatisk tilbakemelding på oppgavene, og du kan prøve igjen hvis noe ikke virker.
Innlevering av lab’er foregår via verktøyet Codegrade som du kommer til via mitt.uib.
- Gå til «Oppgåver» i menyen til venstre
- Klikk deg videre til CodeGrade ved å klikke på «Last lab i eit nytt vindauge»
- Last opp filene du har laget for lab’en og trykk på «Submit.»
Fremdeles problemer? Se (merk at videoen er litt gammel, så det kan være noen små forskjeller i hvordan det ser ut nå.)
Ser du ikke knappen du skal trykke på i mitt.uib?
- Dobbeltsjekk at du er innlogget på mitt.uib.
- Prøv å laste siden i nettleseren på nytt.
- Prøv en «force refresh» (F5 eller Ctrl+F5 eller Ctrl+Shift+F5 eller Ctrl+Shift+R eller Command+R eller Command+Shift+R avhengig av nettleser og operativsystem).
- Prøv å tøm cache i nettleseren din (se refreshyourcache.com for hvordan du gjør dette) og prøv på nytt.
- Prøv en annen nettleser.
Hei
I filen hei.py, skriv kode som produserer akkurat følgende output i terminalen:
Hei, det er meg, datamaskinen.
Hyggelig å se deg her.
Lykke til med INF100!
Addisjonskalkulator
Forberedeleser: les kursnotatene for å komme i gang, særlig avsnittet om å lese input fra terminalen.
I filen addition.py, be brukeren om 2 tall, og skriv ut summen av tallene. Eksempelkjøring:
Oppgi et tall:
2
Oppgi et tall til:
3
Summen av tallene er 5
Figurer
Før du gjør denne oppgaven, må du installere grafikk-biblioteket vi benytter i emnet. Se instruksjoner i kursnotater om grafikk.
I filen figures.py, skriv et program som tegner dette bildet:
Kodesnutten under er et godt utgangspunkt, så begynn med å kopiere den inn i filen din. Desverre ser det ut som feil figur har kommet øverst (kjør koden og se hva den viser – det er ikke helt det samme som hva vi ønsker oss). Endre koden slik at figurene blir tegnet i riktig rekkefølge: kvadratet skal være nederst, så følger sirkelen, deretter kaken, og helt øverst finner vi trekanten.
from uib_inf100_graphics.simple import canvas, display
canvas.create_oval(100, 100, 250, 250, fill="yellow")
canvas.create_polygon(200, 200, 200, 380, 350, 350, fill="blue")
canvas.create_rectangle(50, 50, 200, 200, fill="green")
canvas.create_arc(150, 150, 300, 300, fill="red", start=90, extent=300)
display(canvas)
Strekmenn
Før du gjør denne oppgaven, må du installere grafikk-biblioteket vi benytter i emnet. Se instruksjoner i kursnotater om grafikk.
I filen stickmen.py, skriv et program som tegner to strekmenn ved siden av hverandre. Når programmet ditt kjøres, skal det se omtrent slik ut:
For å hjelpe deg i gang, kan du ta utgangspunkt i denne koden, som tegner én av strekmennene. Sjekk at du kan kjøre koden og se at den tegner en strekmann.
from uib_inf100_graphics.simple import canvas, display
canvas.create_oval(60, 80, 140, 160) # Head
canvas.create_line(100, 160, 100, 280) # Body
canvas.create_line(50, 180, 150, 180) # Arms
canvas.create_line(100, 280, 50, 330) # Left leg
canvas.create_line(100, 280, 150, 330) # Right leg
display(canvas)
For å lage den andre strekmannen, må du skrive fem nye linjer i filen. I forhold til den koden du allerede ser, trenger du kun å endre på x-verdiene i de nye linjene dine.
Adresse
I filen adresse.py, skriv kode som gjør følgende, i oppgitt rekkefølge:
- Ber om brukerens navn ved å bruke
print()
, og leser inn brukerens navn ved å brukeinput()
. - Ber om brukerens gateadresse ved å bruke
print()
, og leser inn adressen ved å brukeinput()
. - Ber om brukerens postkode og poststed ved å bruke
print()
, og leser inn ved å brukeinput()
. - Printer «navn-s adresse er:»
- Printer en tom linje
- Printer navn og adresse slik man skriver det på et brev
Tips: lagre det du får som input fra brukeren i variabler.
Eksempelkjøring (uthevet tekst er skrevet av brukeren etter programmet har startet):
Hva er ditt navn?
Kari Nordmann
Hva er din adresse?
Gateveien 1
Hva er ditt postnummer og poststed?
1234 Stedet
Kari Nordmanns adresse er:
Kari Nordmann
Gateveien 1
1234 Stedet
Twistdeling
Du og vennene dine har vert med i en quiz og har vunnet en pose med twist. På posen står det hvor mange biter det er i posen. Du vil finne ut hvor mange biter som er til overs når alle på laget har fått like mange biter.
I filen twist.py, skriv kode som ber brukeren om å oppgi hvor mange biter det er i posen, og hvor mange dere er på laget. Programmet skal så skrive ut hvor mange biter hver av dere får, og hvor mange biter som blir til overs. Pass på å skrive ut svaret slik som eksempelet viser.
Eksempelkjøring:
Hvor mange er dere på laget?
4
Hvor mange twist er det i posen dere vant?
21
Det blir 5 twist til hver, og det blir 1 twist til overs.
Les om heltallsdivisjon og modulo i notatene om operatorer.
Lånekalkulator kodesporing
Oppgaven baserer seg på at du har installert Python -utvidelsen til Visual Studio Code. Vi skal benytte oss av debugger-funksjonen som finnes i Visual Studio Code for å spore kode.
Begynn med å kopiere koden under til en fil som heter mortgage.py.
|
|
Oppvarming
Kjør programmet og se hvor mye du må betale hver måned hvis du skal kjøpe en bolig til 2 millioner kroner, med 300 000 i egenkapital, 6.44% rente og 25 års nedbetalingstid. Sjekk f. eks. om det stemmer overens med lånekalkulatoren til Nordea.
Sett et breakpoint på linje 4 og kjør programmet i debug-modus. Klikk deg gjennom programmet linje for linje med «step over» -knappen, og observer hvordan variablene endrer seg underveis.
Økonomene sier du må ta hensyn til at renten stiger med fire prosentpoeng. Hva blir i så fall den månedlige kostnaden?
Selve oppgaveteksten
Endre input-seksjonen av programmet slik at
- huset koster 1.5 millioner,
- egenkapitalen er 280 000,
- renten er 7.5%, og
- nedbetalingstiden er 30 år.
Hvilken verdi får variabelen discount_factor
?
Ta et skjermbilde som du navngir discount_factor.png eller discount_factor.jpg. Bildet skal vise:
- et skjermbilde av Visual Studio Code, der
- debug-modus er aktivt, og
- variabelen
discount_factor
med tilhørende verdi er synlig i variabel-vinduet.
Å ta et skjermbilde er en viktig life skill :)
Mac
Cmd
+Shift
+4
, trekk deretter en rute rundt det du vil ta bilde av. Skjermbilet lagres på skrivebordet ditt og kommer i .png -format. Så er det bare å endre navnet på filen og levere inn.
Windows 11
- Søk etter applikasjonen «Snipping Tool», klikk på «New» og velg området du vil ta bilde av. Når du har valgt et område, velg «Save As» for å lagre (filtype png). Så er det bare å levere inn.
Det finnes mange alternative metoder, så spør gjerne internett om hjelp om du ikke får til akkurat denne.
Nå som du skal lære programmering er det også på tide at du blir en voksen datamaskinbruker og slår på visning av filendelser.
Mac:
- Åpne Finder, velg «Settings» i menyen. Under «Advanced», velg «Show all filename extensions».
Windows:
Åpne Filutforskeren, gå til «View» -menyen, og under «Show» marker «File name extensions».
Hale på grisen
Før du gjør denne oppgaven, må du installere grafikk-biblioteket vi benytter i emnet. Se instruksjoner i kursnotater om grafikk.
Det følgende programmet tegner en gris; men uheldigvis er halen plassert feil sted. Opprett en fil pigs_tail.py hvor du kopierer inn koden under, men endrer den slik at halen blir tegnet på riktig sted (omtrent som vist på bildet under).
from uib_inf100_graphics.simple import canvas, display
# Legs
canvas.create_rectangle(110, 230, 150, 300, fill="pink")
canvas.create_rectangle(300, 230, 340, 300, fill="pink")
canvas.create_rectangle(80, 260, 120, 330, fill="pink")
canvas.create_rectangle(280, 260, 320, 330, fill="pink")
# Ears
canvas.create_polygon(260, 70, 260, 30, 290, 60, fill="pink", outline="black")
canvas.create_polygon(310, 55, 330, 30, 340, 70, fill="pink", outline="black")
# Body
canvas.create_oval(50, 100, 350, 300, fill="pink")
# Head
canvas.create_oval(250, 50, 350, 150, fill="pink")
# Eyes
canvas.create_oval(280, 70, 295, 85, fill="black")
canvas.create_oval(320, 70, 335, 85, fill="black")
# Nose
canvas.create_oval(290, 100, 330, 130, fill="lightpink")
canvas.create_oval(295, 110, 305, 120, fill="black")
canvas.create_oval(315, 110, 325, 120, fill="black")
# Tail
canvas.create_line(200, 50, 150, 20, 100, 50)
display(canvas)
Eksempelløsning:
Du står fritt til å tegne en enda finere hale dersom du ønsker. Når du leverer denne oppgaven på CodeGrade, vil et skjermbilde av programmet ditt automatisk lastes opp til galleriet hvor du også kan se dine medstudenter sine besvarelser.
Halen tegnes på den linjen som begynner med
canvas.create_line
. Denne funksjonen trekker en linje mellom to eller flere punkter (her: tre punkter).Tallene mellom parenteser angir koordinatene hvor linjen skal trekkes. Tallene kommer parvis x1, y1, x2, y2, x3, y3 og så videre. For eksempel betyr de to første tallene i utlevert kode (
200, 50
) at linjen som trekkes starter i punktet (x1=200, y1=50).Husk: vinduet har størrelse 400x400.
Begynn med å endre kun det første punktet; flytt det slik at halen begynner ved grisen sin rumpestump.
Flytt deretter de andre to punktene, slik at du får en fin hale.
Ansikt
Før du gjør denne oppgaven, må du installere grafikk-biblioteket vi benytter i emnet. Se instruksjoner i kursnotater om grafikk.
I filen face.py, skriv kode som tegner et ansikt. Du kan velge helt selv hvordan ansiktet ser ut. Du må benytte uib_inf100_graphics.simple
når du tegner. Noen eksempler:
Når du leverer denne oppgaven på CodeGrade, vil et skjermbilde av programmet ditt automatisk lastes opp til galleriet hvor du også kan se dine medstudenter sine besvarelser.
Lengste linje
I filen longest_line.py, skriv kode som gjør følgende, i oppgitt rekkefølge:
- Leser inn brukerens navn.
- Leser inn brukerens gateadresse.
- Leser inn brukerens postkode og poststed.
Videre:
- Finner lengden til hver av de tre strengene som er lest (bruk
len()
). - Skriver ut lengden på den lengste strengen som ble gitt som input (bruk
max()
)
Hva er ditt navn?
Kari Nordmann
Hva er din adresse?
Gateveien 1
Hva er ditt postnummer og poststed?
1234 Stedet
13
I eksempelet over ble det skrevet ut 13
fordi «Kari Nordmann» inneholder 13 tegn. Det er den lengste strengen som ble gitt som input.
Hva er ditt navn?
Ola Hansen
Hva er din adresse?
Gateveien 1
Hva er ditt postnummer og poststed?
1234 Foo
11
I eksempelet over ble det skrevet ut 11
fordi «Gateveien 1» inneholder 11 tegn. Det er den lengste strengen som ble gitt som input.
Avstand mellom to punkter
I filen distance.py, skriv kode som ber brukeren om to punkter i et koordinatsystem, og som regner ut avstanden mellom de to punktene. Programmet skal så skrive ut avstanden mellom punktene til terminalen.
Du kan anta at brukeren alltid vil oppgi koordinat-verdiene som heltall (det er altså helt greit hvis programmet ditt krajser hvis brukeren oppgir noe annet).
- Spør brukeren om x-koordinaten til første punkt. Lagre resultatet i en ny variabel.
- Spør brukeren om y-koordinaten til første punkt. Lagre resultatet i en ny variabel.
- Spør brukeren om x-koordinaten til andre punkt. Lagre resultatet i en ny variabel.
- Spør brukeren om y-koordinaten til andre punkt. Lagre resultatet i en ny variabel.
- Regn ut avstanden mellom de to punktene, og lagre resultatet i en ny variabel.
- Skriv ut avstanden mellom punktene til terminalen.
En kjøring av programmet kan se slik ut (brukerens input er markert med fet skrift):
x1 = 1
y1 = 2
x2 = 3
y2 = 4
Avstanden mellom (1, 2) og (3, 4) er 2.8284271247461903
For å regne ut avstanden mellom to punkter, kan du bruke formelen
Husk å omgjøre strengen du får fra brukeren til et flyttall før du gjør noen matematiske utregninger.
Nærmeste busstopp
Byen Veiby består av én uendelig lang gate som heter «Byveien». Alle husene i byen har et husnummer, og det første huset er i nummer 0. Infrastrukturavdelingen i Veiby kommune har bestemt at det skal finnes et busstopp ved hvert husnummer som er delelig med 7. Det er altså busstopp ved husnummer 0, 7, 14, 21, 28 og så videre.
I filen busstop.py, skriv et program som ber brukeren om et husnummer, og som skriver ut nummeret til nærmeste busstopp.
Eksempelkjøring 1:
Husnummer:
16
Nærmeste busstopp er ved nummer 14
Eksempelkjøring 2:
Husnummer:
22
Nærmeste busstopp er ved nummer 21
Eksempelkjøring 2:
Husnummer:
139
Nærmeste busstopp er ved nummer 140
Det er ikke nødvendig å bruke if-setninger eller løkker for å løse denne oppgaven. Det er fullt mulig å løse den ved vanlig aritmetikk (se kursnotatene om operatorer).
Legg merke til at busstopp-nummer
x
befinner seg ved husnummer7 * x
. Så hvis vi bare klarer å finne ut hva busttopp-nummeretx
er, så er det lett å regne seg frem til husnummeret vi skal skrive ut.
Haiku
I denne oppgaven skal vi spørre brukeren om en haiku og siden printe den på en fin måte til terminalen.
I filen haiku.py, skriv kode som gjør følgende, i oppgitt rekkefølge (merk at noen av de beskrevne punktene her krever mer enn en enkelt linje med Python-kode):
- Spør brukeren om første raden i en haiku. Lagre resultatet i en ny variabel.
- Spør brukeren om andre raden i en haiku. Lagre resultatet i en ny variabel.
- Spør brukeren om tredje raden i en haiku. Lagre resultatet i en ny variabel. Nå burde du ha tre variabeler.
- Finn lengden av hver linje (bruk
len()
) - Finn lengden av den lengste linjen (bruk
max()
) - Skriv ut en tom linje
- Skriv ut toppen av haiku-rammen. Lengden av den er basert på lengden av den lengste linjen, som vi fant i trinn 5, men pluss fire til. Vi trenger fire til fordi rammen skal gå på utsiden på begge sider (se eksempelkjøring nedenfor).
- Skriv ut hver av de tre linjene. Hver linje skal begynne med
@
+ et passende antall mellomrom. Deretterer følger selve teksten, og til slutt et nytt mellomrom og en ny alfakrøll. (Hvor mange mellomrom er passende for hver linje? ) - Skriv ut bunnen av rammen.
Eksempelkjøring:
Første raden:
What a pleasure to
Andre raden:
right justify a haiku
Tredje raden:
as an exercise
@@@@@@@@@@@@@@@@@@@@@@@@@
@ What a pleasure to @
@ right justify a haiku @
@ as an exercise @
@@@@@@@@@@@@@@@@@@@@@@@@@
Husk at strenger kan gjentas flere ganger ved help av
*
. For eksempel vil"bar" * 2
evaluere til"barbar"
.
Fargemix
Koden i denne filen skal skrives i filen fargemix.py.
I denne oppgaven skal du ikke benytte deg av streng-operasjoner som beskjæring (slicing) eller indeksering, den eneste bruken av strenger er for å ta i mot input fra brukeren. Du skal heller ikke benytte deg av lister, løkker eller if-setninger. Du kan derimot bruke de matematiske operatorene
+
,-
,*
,/
,//
(heltallsdivisjon) og%
(modulo) og den innbygde funksjonen for avrundinground()
.
En farge kan representeres som en RGB -verdi (les mer i avsnittet om farger i notatene om grafikk). En RGB-verdi består av tre heltall mellom 0 og 255, som representerer mengden av rød, grønn og blå farge i fargen. For eksempel er fargen rød representert som (255, 0, 0), fargen grønn er representert som (0, 255, 0), og fargen blå er representert som (0, 0, 255). Vi kan representere andre farger ved å blande disse tre fargene sammen i ulike blandingsforhold, for eksempel (255, 128, 0) gir en oransje farge.
I denne oppgaven bruker vi en litt utradisjonell representasjon for RGB: vi representerer hver farge som ett heltall med (opptil) ni siffer. De tre første sifrene representerer mengden rød farge, de tre neste sifrene representerer mengden grønn farge, og de tre siste sifrene representerer mengden blå farge. For eksempel er fargen rød representert som tallet 255000000, fargen grønn er representert som tallet 000255000 (eller bare 255000), og fargen oransje er representert som tallet 255128000.
Oppgaven vi skal utføre er å blande sammen to farger. Programmet skal lese følgende tre linjer som input fra brukeren:
- en farge colA i formatet beskrevet over
- en farge colB i formatet beskrevet over
- et flyttall rationB mellom 0.0 og 1.0 som beskriver hvor stor andel av colB som skal være i den nye fargen. For eksempel, hvis colA er rød og colB er grønn, og rationB er 0.75, skal den nye fargen være en blanding av 25% rød og 75% grønn.
Programmet skal så regne ut den nye fargen som oppstår når de to fargene blandes sammen, og skrive ut den nye fargen til terminalen på en egen linje. For eksempel:
Grunnfarge:
255000000
Målfarge:
255255000
Andel målfarge:
0.25
255064000
Grunnfarge:
255000000
Målfarge:
255255000
Andel målfarge:
0.75
255191000
Grunnfarge:
200198000
Målfarge:
100190100
Andel målfarge:
0.25
175196025
- Les inn input fra brukeren og konvert til heltall og flyttall ved hjelp av
int()
ogfloat()
. - Bruk heltallsdivisjon og modulo for å separere ut verdiene for R, G og B for hver av de to fargene. PS: for å finne de siste tre sifrene i et tall kan du bruke
% 1000
. - Regn ut de nye verdiene for R, G og B ved å blande sammen de to verdiene (for eksempel, hvis rationB er 0.25, skal den nye verdien for R være 0.75 * colA_R + 0.25 * colB_R).
Husk å runde av til nærmeste heltall. Til slutt:
- Regn ut den nye verdien ved å multipliserer R-verdien med 1000000 og så summere inn G multiplisert med 1000 og til slutt B.