Lab1

Forberedelser
Automatisk retting

Obs! Det er problemer med autograde_lab1.py på Windows-maskiner. Vi ser på saken. Det er fremedeles mulig å få tilbakemelding på om du har løst oppgavene riktig ved å dem levere inn på mitt.uib og se på tilbakemeldingen i CodeGrade.

For å jobbe med lab1 har vi laget et script som automatisk retter din innlevering. Dette skriptet kjører kun på din egen maskin, og vil ikke levere inn lab’en for deg. For å bruke skriptet:

Innlevering

For å få bestått på lab’en må du levere inn oppgaven på mitt.uib.

Oppgaven vil delvis rettes automatisk, men en gruppeleder vil også se over oppgaven din før du får endelig karakter. Rettingen er bestått/ikke bestått.

For å få bestått må du ha løst samtlige oppgaver. Du kan levere så mange ganger du vil, og siste innlevering er tellende.


Oppgave 1

I filen uke_01_oppg_1.py, skriv kode som skriver akkurat følgende output i terminalen:

Hei, det er meg, datamaskinen.
Hyggelig å se deg her.
Lykke til med INF100!

Eksempelkjøring:

Hei, det er meg, datamaskinen.
Hyggelig å se deg her.
Lykke til med INF100!
Oppgave 2

I filen uke_01_oppg_2.py, skriv kode som gjør følgende, i oppgitt rekkefølge:

  1. Ber om brukerens navn ved å bruke print(), og leser inn brukerens navn ved å bruke input().
  2. Ber om brukerens gateadresse ved å bruke print(), og leser inn adressen ved å bruke input().
  3. Ber om brukerens postkode og poststed ved å bruke print(), og leser inn ved å bruke input().
  4. Printer «navn-s adresse er:»
  5. Printer en tom linje
  6. 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
Oppgave 3

I filen uke_01_oppg_3.py, skriv kode som gjør følgende, i oppgitt rekkefølge:

  1. Leser inn brukerens navn.
  2. Leser inn brukerens gateadresse.
  3. Leser inn brukerens postkode og poststed.

Så langt nøyaktig det samme som oppgave 2, altså. Men det neste steget er annerledes:

  1. Finner lengden til hver av de tre strengene som er lest (bruk len()).
  2. Skriver ut lengden på den lengste strengen som ble gitt som input (bruk max())

Eksempelkjøring:

Hva er ditt navn?
Kari Nordmann
Hva er din adresse?
Gateveien 1
Hva er ditt postnummer og poststed?
1234 Stedet
13
Oppgave 4

I denne oppgaven skal vi spørre brukeren om en haiku og siden printe den på en fin måte på skjermen.

I filen uke_01_oppg_4.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):

  1. Spør brukeren om første raden i en haiku. Lagre resultatet i en ny variabel.
  2. Spør brukeren om andre raden i en haiku. Lagre resultatet i en ny variabel.
  3. Spør brukeren om tredje raden i en haiku. Lagre resultatet i en ny variabel. Nå burde du ha tre variabeler.
  4. Finn lengden av hver linje (bruk len())
  5. Finn lengden av den lengste linjen (bruk max())
  6. Skriv ut en tom linje
  7. 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).
  8. 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? )
  9. 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".

Oppgave 5a

I denne oppgaven skal vi bli kjent med funksjoner med returverdi. Som et første eksempel, opprett en funksjon volume_of_box(w, h, d) i filen uke_01_oppg_5.py som returnerer volumet av en eske med bredde w, høyde h og dybde d.

Du kan teste at funksjonen fungerer ved å legge til denne linjen på slutten av filen:

print(volume_of_box(2, 3, 5)) # Skal skrive ut 30

Når du kjører uke_01_oppg_5.py, skal 30 skrives ut i terminalen om du har gjort alt riktig.

  • Volumet av en boks er definert som \(V = w \cdot h \cdot d\)

Oppgave 5b

I denne oppgaven skal du skrive et program som regner ut avstanden mellom to punkter.

Illustrasjon av d=sqrt((x1-x2)^2 + (y1-y2)^2)

Opprett en funksjon distance(x1, y1, x2, y2) i filen uke_01_oppg_5.py som returnerer avstanden mellom punktene \((x_1, y_1)\) og \((x_2, y_2)\).

For å teste koden, kan du legge til denne linjen nederst i filen uke_01_oppg_5.py:

print(distance(0, 0, 1, 1)) # Skal skrive ut ca 1.41421

Når du kjører uke_01_oppg_5.py -filen skal svaret skrives ut i terminalen, ca 1.41421356237 (kvadratroten av 2).

  • For å finne absoluttverdien av et tall kan du benytte abs() -funksjonen som er innebygget i Python.

  • Operatoren for eksponentiering er **, f. eks. vil 3**2 evaluere til 9.

  • Å ta kvadratroten av et tall er det samme som å opphøye tallet i 0.5. For eksempel, 9**0.5 vil evaluere til 3.0.

Oppgave 5c

I denne oppgaven skal du skrive et program som avgjør hvorvidt to sirkler overlapper. En sirkel kan beskrives ved hjelp av et koordinat for sirkelens sentrum \((x, y)\), samt en radius \(r\).

Illustrasjon av sirkel

Opprett en funksjon circles_overlap(x1, y1, r1, x2, y2, r2) i filen uke_01_oppg_5.py. La funksjonen returnere True dersom to sirkler beskrevet med henholdsvis x1, y1, r1 og x2, y2, r2 overlapper, og False hvis ikke.

To sirkler overlapper dersom avstanden mellom sirklenes sentrum er mindre enn eller lik summen av sirklenes radiuser. Kan du gjenbruke funksjonen vi skrev i oppgave 5b?

For å teste funksjonen du har skrevet kan du legge til denne koden nederst i filen uke_01_oppg_5.py:

# Sirkel1 med sentrum (0, 0) og radius 1
# Sirkel2 med sentrum (1, 1) og radius 1
# Overlapper
print(circles_overlap(0, 0, 1, 1, 1, 1)) # Skal skrive ut True

# Sirkel1 med sentrum (0, 0) og radius 2
# Sirkel2 med sentrum (4, 1) og radius 2
# Overlapper ikke
print(circles_overlap(0, 0, 2, 4, 1, 2)) # Skal skrive ut False

# Sirkel1 med sentrum (0, 0) og radius 3
# Sirkel2 med sentrum (5, 0) og radius 2
# De overlapper hverandre i et enkelt punkt
print(circles_overlap(0, 0, 3, 5, 0, 2)) # Skal skrive ut True

Illustrasjon av testene:

Illustrasjon av sirkler/test-caser
Oppgave 6

I denne oppgaven skal vi skrive en kunstig intelligens for å spille Joker fra Norsk Tipping. I dette spillet får man på forhånd vite fem hovedtall; for hvert av hovedtallene må man velge om man skal gå “opp” eller “ned” før et hemmelig vippetall avsløres. Dersom man valgte “opp” og det avslørte vippetallet er høyere eller lik hovedtallet, vinner man en større premie. Det samme skjer dersom man velger “ned” og vippetallet er lavere eller lik hovedtallet. Vi antar at de hemmelige vippetallene er tilfeldig valgt mellom 0 og 9.

Strategien vi skal implementere er å si “opp” dersom hovedtallet er 4 eller lavere, og si “ned” ellers.

I filen uke_01_oppg_6.py, skriv en funksjon joker(x1, x2, x3, x4, x5) som har fem parametre (x1, x2, x3, x4 og x5) som representerer hovedtallene vi får oppgitt når vi begynner å spille Joker. Funksjonen skal skrive ut fem linjer, hvor hver enkelt linje gir oss strategien, enten “opp” eller “ned”, for hvert av de fem hovedtallene. For eksempel skal et kall

joker(3, 4, 5, 6, 1)

skrive ut følgende til terminalen:

opp
opp
ned
ned
opp

Merk: denne funksjonen behøver ikke returnere noen verdi.