Lab3

Nivå E:

Nivå A-D:

For å bestå laben, må alle oppgavene på nivå E være bestått. Laben leveres i CodeGrade; du finner som vanlig knappen dit på mitt.uib.


Nivå E
Vokaler

I filen vowels.py, skriv kode som leser inn en streng og skriver ut hvor mange vokaler det er i strengen. I denne oppgaven anser vi kun bokstavene «a», «e», «i», «o», «u» som vokaler.

Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer:

Oppgi streng: Ouagadougou   
Denne strengen inneholder 8 vokaler.
Oppgi streng: 1.e4 e5 2.f4!   
Denne strengen inneholder 2 vokaler.
Oppgi streng: Såpass   
Denne strengen inneholder 1 vokal.
Oppgi streng: rhythm   
Denne strengen inneholder ingen vokal.
Nivå E
Chatbot

I denne oppgaven skal du lage en veldig primitiv chatbot. Chatboten skal altså bare kunne si tre ting: «Hi! Do you want to talk to me?», «That’s cool!», eller «All right, bye!».

I filen chatbot.py, skriv kode som gjør følgende:

  • Ber brukeren for input med teksten, «Hi! Do you want to talk to me?».
  • Om brukeren skriver inn, «no» skal programmet skrive ut, «All right, bye!» og avslutte å kjøre.
  • Om brukeren skriver in noe annet enn «no», skal programmet skrive ut «That’s cool!», og siden be om input fra brukeren igjen med teksten, «Hi! Do you want to talk to me?»

Eksempelkjøring:

Hi! Do you want to talk to me?
yes   
That's cool!
Hi! Do you want to talk to me?
egentlig ikke  
That's cool!
Hi! Do you want to talk to me?
no  
All right, bye!

Denne oppgaven kan løses på flere måter, men siden vi ikke vet hvor mange ganger løkken skal kjøres på forhånd, må vi i alle tilfeller bruke en while-løkke.

  • Alternativ A: Du kan benytte en while True -løkke, og så benytte break dersom brukeren svarer no.
  • En iterasjon av den innerste løkken er ansvarlig for å skrive ut ett tall, nemlig produktet av iterandene (løkke-variablene) fra de to løkkene.
  • Alternativ B: Du kan opprette en variabel answer = "" før while -løkken starter, og la betingelsen for while-løkken være answer != “no”.

Nivå E
Tog

Denne oppgaven er en litt utfordrende grafikk oppgave. Du skal benytte uib_inf100_graphics.simple. Klikk på følgende oppvarmingsøvelse først før du prøver!

Denne øvelsen trenger du ikke å levere inn, men å gjøre den først kan være en god forberedelse for Tog -oppgaven.

Følgende kode tegner 15 jevnt plaserte rektangeler:

from uib_inf100_graphics.simple import canvas, display

padding = 33
inner_margin = 10
n = 15
width_of_all_rects = (400 - 2 * padding) - (n-1) * inner_margin
width_of_one_rect = width_of_all_rects / n

for i in range(n):
    x_left = padding + i * (width_of_one_rect + inner_margin)
    x_right = x_left + width_of_one_rect
    canvas.create_rectangle(x_left, padding, x_right, 400 - padding)
    
display(canvas)
Eksempelkjøring 1

Endre koden slik at rektangelene i partallsposisjoner er røde og rektangelene i oddetallsposisjoner er blå:

Eksempelkjøring 1

I filen train.py skal du lage en figur som ser (noenlunde) ut som et tog. Toget som tegnes skal ha antall viduer bestemt av brukeren.

Skriv kode som:

  • Ber brukeren skrive inn antall ønsket vinduer, n.
  • Tegner n, jevent plasserte vinduer (rektangeler) av høyde 10 piksler og bredde 5 piksler. Avstanden mellom vinduene skal være 5 piksler.
  • Tegner en større rektagel (vognen) rundt vinduene. Den vertikale avstanden mellom vinduene og toppen og bunnen av dette rektangelet skal være 5 piksler. Videre bør den horisontale avstanden fra det første vinduet til venstre side av rektangelet være 5 piksler og likeledes for avstanden mellom siste vindu og høyre side av rektangelet.

Hvor mange vinduer skal toget ha? 17   

Eksempelkjøring 1

Hvor mange vinduer skal toget ha? 25   

Eksempelkjøring 2
Nivå E
Skyskraper

I filen skyscraper.py skal du lage en figur som ser (noenlunde) ut som en skyskraper. Skyskrapreren som tegnes skal ha antall etasjer og antal vinduer per etasje bestemt av brukeren.

Skrive kode som:

  • Ber brukeren skrive inn antall ønsket etasjer, n.
  • Ber brukeren skrive inn antall ønsket vinduer per etasje, m.
  • Tegner en n ganger m gitter av jevent plasserte vinduer (rektangeler) slika at du får n rad og m kollonner med vinduer. Vinduene skal ha høyde 10 piksler og bredde 5 piksler. Den vertikale og horizontale avstanden mellom vinduene skal være 5 piksler.
  • Tegner en større rektangel (byggets omriss) rundt vinduene. Den vertikale avstanden mellom den øverste raden med vinduer og toppen av dette rektangelet skal være 5 piksler og likeledes for avstanden mellom den nederste raden med vinduer og bunnen av rektangelet. Videre bør den horisontale avstanden fra første vinduskolonnen til venstre siden av rektangelet være 5 piksler og likeledes for avstanden mellom siste vinduskolonnen og høyre siden av rektangelet.

Hvor mange etasjer skal skyskraperen ha? 20   
Hvor mange vinduer skal det være per etasje? 12 
Eksempelkjøring 1

Hvor mange etasjer skal skyskraperen ha? 25   
Hvor mange vinduer skal det være per etasje? 25  

Eksempelkjøring 2
Nivå E
Oppdelt linjestykke

Et endimensional linjestykke langs x-aksen begynner i et punktet xlo og slutter i et punkt xhi. I filen split_line.py skriv et program som deler opp et linjestykke i n like lange biter.

Du skal altså skrive kode som:

  • Ber brukeren oppgi koordinaten xlo.
  • Ber brukeren oppgi koordinaten xhi.
  • Ber brukeren skrive inn tallet n; antall stykker linjestykket skal deles opp i.
  • Skriver ut n linjer, der hver linje består av to tall som representerer et linjestykke.

Eksempelkøringer skal se sånn ut:

x_lo =  1.0  
x_hi =  7.0
n =  3
1.0 3.0
3.0 5.0
5.0 7.0
x_lo =  0.0  
x_hi =  1.0
n =  4
0.0 0.25
0.25 0.5
0.5 0.75
0.75 1.0

  • I denne oppgaven vet du allerede før løkken starter hvor mange iterasjoner løkken skal ha (nemlig n). Derfor bør du velge en for-løkke, og ikke en while-løkke. I denne oppgaven kan faktisk det å velge en while-løkke, i kombinasjon med avrundingsfeil som alltid vil skje når vi jobber med flyttall, gjøre at du får feil svar!
  • Legg merke til at lengden på hvert linjestykke blir $$ b = \frac{x_{hi}-x_{lo}}{n} $$

  • Det første linjestykket begynner i \(x_{lo}+b\cdot 0\) og slutter i \(x_{lo}+b\cdot 1\).
  • Det andre linjestykket begynner i \(x_{lo}+b\cdot 1\) og slutter i \(x_{lo}+b\cdot 2\).
  • … og så videre

Nivå D
Diamant

I filen diamond.py, skriv kode som leser inn et et tall n og skriver ut et diamantmønster med sidelengde n slik som i eksempelkøringene nede.

Eksempelkjøringer:

Sidelengde: 1   
X
Sidelengde: 2   
 X 
XXX
 X
Sidelengde: 3   
  X 
 XXX
XXXXX
 XXX
  X
Sidelengde: 4   
   X 
  XXX
 XXXXX
XXXXXXX
 XXXXX
  XXX
   X
Nivå D
Gangetabellen

I denne oppgaven skal du skrive ut en gangetabell til skjermen.

I filen multiplication_table.py, skriv kode som spør bruker for et positivt heltall tall n og siden skriver ut gangetabellen for alle tall fra og med 1 til og med n. Utskriften skal følge mønsteret vist under.

Eksempelkjøringer:

Oppgi et positivt heltall: 3   
1: 1 2 3
2: 2 4 6
3: 3 6 9
Oppgi et positivt heltall: 5   
1: 1  2  3  4  5
2: 2  4  6  8 10
3: 3  6  9 12 15
4: 4  8 12 16 20
5: 5 10 15 20 25

  • La programmet ha to nøstede løkker, som begge går igjennom verdiene fra 1 til «n».
  • En iterasjon av den ytterste løkken er ansvarlig for å skrive ut én linje. Den ytterste løkken inneholder tre elementer: først, utskrift av hvilket tall denne linjen gjelder for, etterfulgt av kolon; deretter den innerste løkken; og til slutt utskrift av et linjeskift.
  • En iterasjon av den innerste løkken er ansvarlig for å skrive ut ett tall, nemlig produktet av iterandene (løkke-variablene) fra de to løkkene.
  • Husk at ‘print(…, end=" “)’ vil skrive ut til skjermen og avslutte med et mellomrom istedet for et linjeskift.

Nivå C
Befolkningsvekst

I denne oppgaven skal du skrive et program som beregner befolkningsvekst. Programmet skal lese inn tre tall. Først den opprinnelige størelsen av en populasjon som et heltall, så den årlige veksten som flyttall, også antall år som skal beregnes som et heltall. For hvert år skal programmet skrive ut estimatet av de nye befolkningstørrelsen. Til slutt skal programmet skrive ut totalveksten av startbefolkningen i prosent med to desimalers nøyaktighet (det er ikke nødvendig å skrive ut avsluttende nullere (trailing zeros), man kan med andre ord bruke round() funksjonen).

Kort oppsummert, i filen population_growth.py skriv et program som:

  • Ber brukeren om nåværende befolkning, en spesifikk vekstrate og antall år som skal beregnes (se eksempelkøringene for nøyaktig ordlyd).
  • Skriver ut én linje per år som beregnes, med antatt befolkning gitt oppgitt vekstrate.
  • Skriver ut en linje på slutten som oppgir den totale veksten etter oppgitt antall år i prosent.

Eksempelkøringer:

Befolkning: 1000  
Årlig vekstrate (i prosent): 2.48
Antall år: 5
Befolkningen etter 1 år er 1025
Befolkningen etter 2 år er 1050
Befolkningen etter 3 år er 1076
Befolkningen etter 4 år er 1103
Befolkningen etter 5 år er 1130
Total vekst etter 5 år er (i prosent) 13.03
Befolkning: 797510515  
Årlig vekstrate (i prosent): 0.83
Antall år: 3
Befolkningen etter 1 år er 804129852
Befolkningen etter 2 år er 810804130
Befolkningen etter 3 år er 817533804
Total vekst etter 3 år er (i prosent) 2.51
Nivå B
Tverrsum

I filen cross_sum.py.py skriv et program som tar inn et tall n og et tall x skriver ut det n’te tallet med tverrsummen x.

Det første tallet med tverrsum 7 er bare tallet 7, mens det andre tallet med tverrsum 7 er 16. Derfor skal programmet ditt skrive ut 7 på input n = 1 og x = 7, mens programmet skal ut 16 på input n = 2 og x = 7.

Du skal altså skrive kode som:

  • Ber brukeren oppgi tallet n.
  • Ber brukeren oppgi tallet x.
  • Skriver ut det n’te tallet med tverrsummen x.

Eksempelkøringer:

n =  3  
x =  7
Det 3. tallet med tverrsum 7 er 25.
n =  1  
x =  10
Det 1. tallet med tverrsum 10 er 19.
n =  2  
x =  10
Det 2. tallet med tverrsum 10 er 28.
n =  10  
x =  2
Det 10. tallet med tverrsum 2 er 2000.

  • I denne oppgaven vet du ikke før løkken starter hvor mange iterasjoner løkken skal ha. Derfor bør du velge en while-løkke, og ikke en for-løkke.

Nivå B
Sparing

Du er uteksaminert fra UiB og har nå en flott jobb! Du flytter til London og bestemmer deg for at du vil begynne å spare for å kjøpe hus. Siden boligprisene er svært høye i London, innser du at du må spare i flere år før du har råd til å skaffe deg egenkapital. Vi skal finne ut hvor lang tid det vil ta deg å spare nok egenkapital gitt følgende forutsetninger:

  • Egenkapital er 0,25 (25%) av total kostnad.
  • Beløpet du har spart så langt er null.
  • Anta at sparingene dine tjener en årlig rente \(r = 0.04\) (4%).

I filen saving.py skriv et program som ber brukeren om å angi følgende variabler:

  1. Årslønn.
  2. Prosentandel av lønnen som skal spares.
  3. Total kostnaden for drømmeboligen.

Programmet skal så beregne hvor mange måneder det vil ta deg å spare opp nok egenkapital. Her kan du anta at det etter hver måned blir utbetalt \(r/12\) i renter av det som står på konto.

Eksempelkøringer:

Hva er årslønn?:  500000  
Hvor mange prosent spares?:  20
Hvor mye koster boligen?:  3000000
Det tar 79 måneder å spare nok egenkapital.
Hva er årslønn?:  900000  
Hvor mange prosent spares?:  10
Hvor mye koster boligen?:  5000000
Det tar 133 måneder å spare nok egenkapital.
Nivå A-D
Animasjon

Denne koden tegner en ball som blir sluppet fra en gitt høyde, 300 piksler over bunnen av skjermen.

from uib_inf100_graphics.simple import canvas, display

y_pos_px = 100
y_vel_px_s = 0
radius = 20
gravity_px_s2 = 100
time_delta_s = 0.1     # Som standard viser display et bilde i 0.1 sekunder

while True:
    # La tiden gå
    y_vel_px_s += gravity_px_s2 * time_delta_s
    y_pos_px += y_vel_px_s * time_delta_s 

    # Tegne
    canvas.create_oval(200 - radius, y_pos_px - radius,
                       200 + radius, y_pos_px + radius, fill="red")
    display(canvas)

Akkurat nå forsvinner ballen ut av skjermen når den treffer bunnen. Din jobb er å endre legge til noen linjer i koden slik at ballen spretter opp igjen når den treffer bunnen av skjermen.

Illustrasjon av ferdig program

  • Linjene du skal legge til passer bra å ha mellom ballen har blitt flyttet og ballen har blitt tegnet på nytt.
  • Hvis ballen har falt ut av skjermen, da kan du endre fortegnet på farten til ballen.
  • Hvilken betingelse skal du sjekke for å finne ut om ballen er utenfor skjermen?

I filen animation.py, skriv et program som lager en valgfri animasjon ved hjelp av rammmeverket uib_inf100_graphics.simple.

Merk: de 60 første bildene i animasjonen lastes opp i galleriet.