Lab1
- En lab er en samling med én eller flere oppgaver.
- De fleste lab’er vil vare i én uke; ny lab kommer på fredag kl 14:00, og skal leveres innen neste fredag kl 23:59.
- Hver lab kan leveres så mange ganger du vil; det er siste innlevering som teller. Noen av oppgavene vil ha automatiske tester som gir deg en enkel tilbakemelding umiddelbart etter innlevering.
- For å bestå en lab, må alle de automatiske testene under obligatoriske oppgaver bli bestått. I tillegg må en sensor godkjenne eventuelle grafikk-oppgaver som er obligatoriske.
- For å ta eksamen i emnet, må du bestå alle lab’ene i kurset. Ved uforskyldte forhold som sykdom, heimevernsøvelse, dødsfall i familien eller lignende kan du sende en søknad om utsettelse eller fritak til vår administrator, så finner vi en løsning.
Oppgavene er delt inn i ulike nivåer stigende fra E til A. For å bestå en lab, må alle de obligatoriske oppgavene være bestått.
Det er lurt å levere inn mange ganger underveis. Du får umiddelbart en automatisk tilbakemelding på mange av 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 «Oppå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.
Oppvarmingsoppgaver
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
Forberedeleser: les kursnotatene om grafikk og installer uib-inf100-graphics.
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
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.
Obligatoriske oppgaver
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.
Hale på grisen
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.
-
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
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 den automatisk lastes opp i galleriet, der du også kan se hva dine medstudenter har laget.
Frivillige oppgaver
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.
Så langt nøyaktig det samme som oppgaven om adresse, altså. Men det neste steget er annerledes:
- 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"
.