2. Tall og variabler#

På denne siden finner du løsningsforslag til oppgavene tilhørende kapittel 2 i læreboken Programmering i skolen. Vi gir også løsning på de av underveisoppgavene som har en tydelig løsning. Noen av underveisoppgavene er såpass utforskende eller diskusjonsbareter at det blir rart å lage løsningsforslag.

Underveisoppgaver#

Underveisoppgave 2.1: Flyttall og desimaltall#

  1. Resultatet av beregningen blir

print((0.1 + 0.2) * 3)
0.9000000000000001

som er bittelitt annerledes enn når vi gjør det for hånd. For hånd blir svaret eksakt lik 9.

  1. Det er ikke mulig å representere tallene 0.1 og 0.2 eksakt i 2-tallsystemet med 64 bits. Derfor ender datamaskinen med å lage tallene avrundet til nærmeste verdi i 2-tallsystemet.

  2. For eksempel:

print(0.1*3-0.3)
5.551115123125783e-17

Dette burde blitt eksakt lik 0, men det ble det ikke pga. avrundingsfeil.

Underveisoppgave 2.4: Partall og oddetall#

Et partall \(n\) har egenkapen \(n\%2 = 0\), mens et oddetall har tilsvarende at \(n\%2 = 1\). Dette kan vi bruke til å finne ut om et tall er partall eller oddetall. Eksempel:

print("6%2:", 6%2)
print("3%2:", 3%2)
6%2: 0
3%2: 1

Underveisoppgave 2.5#

liste_a = [2, 5, 3, 7, 6]
liste_b = [7, 3, 45, 78, 19]

# Slett det siste elementet i den ene lista 
liste_a.remove(6)
# alternative metoder:
# liste_a.pop()
# del liste_a[-1]

# Legg til et tall 
liste_b.append(4)

# Slett element nr. 2. 
del liste_b[1]

# Lag en ny variabel der du adderer listene
liste_c = liste_a + liste_b

# Skriv ut de tre listene
print(liste_a)
print(liste_b)
print(liste_c)
[2, 5, 3, 7]
[7, 45, 78, 19, 4]
[2, 5, 3, 7, 7, 45, 78, 19, 4]

Vi ser at +-operasjonen mellom to lister er å legge alle elementene i de to listene etter hverandre i en ny liste.

Underveisoppgave 2.6: Rett opp, så input#

Vi begynner med å prøve å kjøre koden slik den er oppgitt:

høyde = 3480
prosentAndel = høyde/8848
print("Du er på", prosentAndel "prosent av Mount Everest ved",
    høyde, "meter")
  File "<ipython-input-23-8682cf8e4fe7>", line 3
    print("Du er på", prosentAndel "prosent av Mount Everest ved",
                                   ^
SyntaxError: invalid syntax

Da får vi en feilmelding. Det er en syntaksfeil, og her kommer det også opp en pil som viser hvor Python ble forvirra. Vi har glemt et komma etter prosentAndel i print-funksjonen. Når vi retter opp dette fungerer koden fint:

høyde = 3480
prosentAndel = høyde/8848
print("Du er på", prosentAndel, "prosent av Mount Everest ved",
    høyde, "meter")
Du er på 0.3933092224231465 prosent av Mount Everest ved 3480 meter

Så bytter vi ut kodelinja som setter høyden med en kodelinje som tar inn dette tallet fra brukeren:

høyde = int(input("Hvor høyt sitter du?"))
prosentAndel = høyde/8848
print("Du er på", prosentAndel, "prosent av Mount Everest ved",
    høyde, "meter")
Hvor høyt sitter du? 2469
Du er på 0.2790461121157324 prosent av Mount Everest ved 2469 meter

Tall og variabler#

I disse oppgavene kommer vi til å benytte input, som ikke kommer før oppgaver tilhørende 2.13.2. Om du ikke ønsker å benytte input i disse oppgavene er det helt i orden å erstatte dette med en verdi du selv velger, og legge denne verdien direkte i koden.

Oppgave 1#

Den viktigste forskjellen er at vi i programmering pleier å tilordne verdier til variabler, mens vi i matematikken pleier å sette en variabel lik et matematisk uttrykk. I programmering regner datamaskinen ut hva som står til høyre for likhetstegnet, og tilordner det til variabelen. I matematikk pleier vi derimot bare å beskrive relasjonen mellom variabler. Kanskje skal vi så manipulere uttrykket og sette det sammen med mer informasjon for å finne ut av verdien til en av variablene på høyre side av likningen?

Oppgave 2#

a = 3.4 
b = 5.6
summen = a+b

print("Summen er", summen)
Summen er 9.0

Oppgave 3#

Vi ser at a settes til 2. Så settes atil sin egen verdi pluss 1. Da har a verdien 3. Så settes en ny variabel b til to ganger verdien til a, altså 6. Denne verdien skal printes, så da får vi tro at programmet printer 6.

a = 2 
a = a + 1 
b = 2 * a
print(b)
6

Oppgave 4#

\(a=2\) går helt fint.

\(a = a + 1\) blir absurd matematisk, fordi det impliserer at 1 er lik 0.

\(b = 2a\) er uproblematisk. Om \(a=2\), så må det bety at \(b=4\).

Oppgave 5#

Vi kan for eksempel prøve følgende:

a = "Jeg skal aldri jukse"
b = 3
c = a*b
print(c)
Jeg skal aldri jukseJeg skal aldri jukseJeg skal aldri jukse

Vi ser at å gange en streng med et heltall fører til at strengen gjentas det samme heltallet antall ganger.

Oppgave 6#

Vi kjører programmet:

tall1 = 2
tall2 = 4
print(tall1**tall2)
16

** er potensoperatoren, og \(2^4 = 16\), så dette passer fint.

Oppgave 7#

a)

from pylab import *

radius = float(input("Tast inn radius: "))
areal = pi*radius**2

print("Arealet av sirkelen er", areal)
Tast inn radius:  34
Arealet av sirkelen er 3631.681107549801

b)

areal = float(input("Tast inn areal: "))
radius = sqrt(areal) / pi

print("Radius i sirkelen er", radius)
Tast inn areal:  45
Radius i sirkelen er 2.1352876302515313

Oppgave 9#

grunntall = float(input("Tast grunntall: "))

kvadrert = grunntall**2
print(grunntall, "kvadrert er", kvadrert)

rot = kvadrert**0.5
print("Roten av", kvadrert, "er", rot)
Tast grunntall:  7
7.0 kvadrert er 49.0
Roten av 49.0 er 7.0

Oppgave 10#

print(1 + 2*3)
print((1 + 2)*3)
print(1+2/2)
7
9
2.0

Oppgave 11#

print(-3 + (1-9)/4 + 3/(12 - 3*2))

# Her gjelder det å holde tunga rett i munnen, og legge inn parenteser der det er hensiktsmessig.
# Er man usikker på om beregningen blir riktig, skader det aldri å legge til ekstra parenteser.
-4.5

Oppgave 12#

kvadrattall1 = 1**2
kvadrattall2 = 2**2
kvadrattall3 = 3**2
kvadrattall4 = 4**2

print(kvadrattall1)
print(kvadrattall2)
print(kvadrattall3)
print(kvadrattall4)

print(kvadrattall1**0.5)
print(kvadrattall2**0.5)
print(kvadrattall3**0.5)
print(kvadrattall4**0.5)

# Denne oppgaven kunne vært løst vha. en løkke, dette kommer vi til i et senere kapittel.
1
4
9
16
1.0
2.0
3.0
4.0

Oppgave 13#

import numpy as np
"""
Regner ukjent side AC med sinussetningen
gitt følgende opplysninger:
BC = 3
Vinkel B = 30 grader
Vinkel C = 80 grader
"""
AB = 3 
vinkelB = 30
vinkelC = 80

AC = AB*np.sin(np.radians(vinkelB))/np.sin(np.radians(vinkelC))
print("Sidelengden AC =", round(AC,2))
Sidelengden AC = 1.52

Oppgave 14#

x1 = (-2 + np.sqrt(4*1*1)) / 2*1
x2 = (-2 - np.sqrt(4*1*1)) / 2*1

print("Likningen har løsninger", x1, "og", x2)

# Merk at vi må regne ut x1 og x2 separat, Python forstår seg ikke på +/-.
Likningen har løsninger 0.0 og -2.0

Oppgave 15#

"""
Regner ut konsentrasjonen av acetat/oksonium
gitt konsentrasjonen til eddiksyre lik 0,10 mol/L
og Ka = 1,8x10^-5.

Legg merke til at programmet kan brukes for en generell syre.
Du trenger bare å spesifisere en ny konsentrasjon og Ka.
"""
import numpy as np

Ka = 1.8E-5
kons_syre = 0.10

# Løser andregradslikningen
a = 1
b = Ka
c = -kons_syre*Ka

x1 = (-b+np.sqrt(b**2 - 4*a*c))/(2*a)
x2 = (-b-np.sqrt(b**2 - 4*a*c))/(2*a)

print("Konsentrasjonen av base er:", round(x1,4), "mol/L.")

"""
Vi kan også bruke opplysningene til å regne ut pH-en
"""

pH = -np.log10(x1)
print("pH-en er:",round(pH,2))
Konsentrasjonen av base er: 0.0013 mol/L.
pH-en er: 2.88

Input#

Oppgave 16#

navn = input("Tast ditt navn: ")
print("Hei,", navn)
Tast ditt navn:  Henrik
Hei, Henrik

Oppgave 17#

aar = int(input("Antall år: "))
sekunder = aar*365*24*60*60
# 365 dager per år, 24 timer per dag, 60 minutter per time, 60 sekunder per minutt.

print("I løpet av", aar, "år, er det", sekunder, "sekunder.")
Antall år:  45
I løpet av 45 år, er det 1419120000 sekunder.

Oppgave 18#

a = int(input("Tast inn a: "))
b = int(input("Tast inn b: "))

kvotient = a//b
rest = a % b

print(a, "/", b, "=", kvotient, "+", rest, "i rest")
Tast inn a:  4
Tast inn b:  8
4 / 8 = 0 + 4 i rest

Oppgave 19#

from pylab import *

radius = float(input("Tast radius: "))
areal = pi * radius**2

print("Areal av sirkel er", areal)
Tast radius:  4.7
Areal av sirkel er 69.39778171779854

Oppgave 20#

grunnlinje = float(input("Tast grunnlinje: "))
hoyde = float(input("Tast høyde: "))

areal = grunnlinje*hoyde / 2 + grunnlinje*hoyde / 2

print("Arealet er", areal)
Tast grunnlinje:  5.8
Tast høyde:  4
Arealet er 23.2

Oppgave 21#

from pylab import *

radius = float(input("Tast radius: "))

overflate = 4 * pi * radius**2
volum = 1/3 * overflate * radius

print("Overflate =", overflate)
print("Volum =", volum)
Tast radius:  6.2
Overflate = 483.0512864159667
Volum = 998.3059919263311

Oppgave 22#

grunntall = float(input("Tast grunntall: "))
eksponent = float(input("Tast eksponent: "))

print("Grunntall opphøyet i eksponent:", grunntall**eksponent)
Tast grunntall:  3
Tast eksponent:  4
Grunntall opphøyet i eksponent: 81.0

Lister#

Oppgave 23#

partall = [2, 4, 6, 8, 10, 12, 14, 16]
oddetall = [1, 3, 5, 7, 9, 11, 13, 15]

# (a)
print(partall + oddetall) # de legges sammen til én lang liste

# (b)
print(partall*oddetall)
[2, 4, 6, 8, 10, 12, 14, 16, 1, 3, 5, 7, 9, 11, 13, 15]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-39-793f6270df37> in <module>
      6 
      7 # (b)
----> 8 print(partall*oddetall)

TypeError: can't multiply sequence by non-int of type 'list'
print(partall/oddetall)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-631d93d7ea1c> in <module>
----> 1 print(partall/oddetall)

TypeError: unsupported operand type(s) for /: 'list' and 'list'

Vi ser at både multiplikasjon og divisjon av liste med liste gir TypeError. Det skyldes at disse operasjonene ikke er tillatt mellom to variabler av typen list.

Oppgave 24#

serier = ["Home and away", "7th heaven", "Pacific blue", "MacGyver", "Hotell Caesar"]
boeker = ["Ringenes herre", "Fluenes herre", "Tatt av vinden", "Tatt av kvinnen", "Froeken Detektiv"]

# (a)
alle = serier + boeker

# (b)
del alle[0]
del alle[2]

# (c)
print("Ringenes herre finnes på indeks", alle.index("Ringenes herre"))

# (d)
nyliste = alle[3:7]

# (e)
nyliste = nyliste.reverse()
Ringenes herre finnes på indeks 3

Oppgave 25#

Denne oppgaven løser du på egenhånd ved å slå opp i dokumentasjonen.

Oppgave 26#

# Eksempel der fartsformelen er brukt med input
v0 = float(input("Hva er startfarten i m/s? "))
a = float(input("Hva er akselerasjonen i m/s^2? "))
t = float(input("Hva er tida i s? "))

v = v0 + a*t

print("Sluttfarten er:", v, "m/s.")
Hva er startfarten i m/s?  4.6
Hva er akselerasjonen i m/s^2?  2
Hva er tida i s?  9
Sluttfarten er: 22.6 m/s.