Løsningsforslag 5
Oppgave 1
# 1a
def multiply_5_minus_pi(my_number):
return (my_number * 5) - 3.14
# 1b
def shout(text):
return f"{text}!"
# 1c
def name_age(name, gender, age):
return f"{name} er {gender} og er {age} år gammel."
#1d
def kinetic_energy(m,v):
return 0.5 * m * (v ** 2)
Oppgave 2
# 1a
def conc_from_pH(ph):
return 10**(-ph)
# alternativ løsning med math module
from math import pow
def conc_from_pH(pH):
conc = pow(10, -pH)
return conc
from math import log10
def find_acidity(conc):
ph = -log10(conc)
if ph > 7:
return "basic"
if ph == 7:
return "neutral"
# hvis de 2 første if setningene er false.
# trenger vi ikke å sjekke siste betingelse.
return "acidic"
Oppgave 3
def will_work(city, salary):
bergen_lim = 400000
anywhere_lim = 600000
oslo_lim = 950000
if city == "Bergen":
return salary >= bergen_lim
if city == "Oslo":
return salary >= oslo_lim
if city == "Verdensrommet":
return salary >= 0
return salary >= anywhere_lim
Oppgave 4
# 4a
def cross_sum(n):
sum = 0
for c in str(n):
sum += int(c)
return sum
# 4b
def nth_number_with_cross_sum_x(n, x):
counter = 0
i = 0
while True:
if cross_sum(i) == x:
counter += 1
if counter == n:
return i
i += 1
Bonus 1
def is_even_positive_int(x):
if type(x) != int:
return False
if x % 2 == 0:
return True
return False
# eller
def is_even_positive_int(x):
return type(x) == int and x%2 == 0
Bonus 2
def is_legal_triangle(a, b, c):
# Dette er som å gjøre en if/else
# Men vi lagrer resultatet i en variabel.
a_valid = type(a) == int or type(a) == float # Disse evaluerer til True/False.
b_valid = type(b) == int or type(b) == float
c_valid = type(c) == int or type(c) == float
all_valid = (a_valid and b_valid and c_valid)
# Sjekk at alle har riktig type
if all_valid:
check_a = a < (b+c) # sjekk om a er mindre en b + c
check_b = b < (a+c)
check_c = c < (a+b)
# sjekk om hver enkelt side er mindre en summen av de 2 andre sidene.
check_all = (check_a and check_b and check_c)
return check_all
# i alle andre tilfeller
return False
Bonus 3
def joker(x1, x2, x3, x4, x5):
for x in (x1, x2, x3, x4, x5):
print("opp" if x <= 4 else "ned")
# alternativ løsning IKKE pensum
# Hvis funksjonen tar et parameter med "*"
# Vil funksjonen ta uendlige mange verdier.
# Som kan behandles som en liste
def joker(*args):
for x in args:
print("opp" if x <= 4 else "ned")
Bonus 4
# 4a
def point_in_rectangle(x1, y1, x2, y2, x, y):
return (min(x1, x2) <= x <= max(x1, x2)
and min(y1, y2) <= y <= max(y1, y2))
# 4b
def rectangles_overlap(x0, y0, x1, y1, x2, y2, x3, y3):
# må sjekke alle 4 kombi av x2/3 y2/3:
if point_in_rectangle(x0, y0, x1, y1, x2, y2):
return True
if point_in_rectangle(x0, y0, x1, y1, x3, y3):
return True
if point_in_rectangle(x0, y0, x1, y1, x2, y3):
return True
if point_in_rectangle(x0, y0, x1, y1, x3, y2):
return True
return False
# 4c
# avstand mellom 2 punkt
def distance(x1, y1, x2, y2):
dx2 = (x1-x2)**2
dy2 = (y1-y2)**2
return (dx2 + dy2)**0.5
def circle_overlaps_rectangle(x0, y0, x1, y1, x2, y2, r2):
left = min(x0, x1)
right = max(x0, x1)
upper = min(y0, y1)
lower = max(y0, y1)
# senteret er i rektangel
if point_in_rectangle(x0, y0, x1, y1, x2, y2):
return True
# senteret ligger utenfor rektangelen + radius
if not point_in_rectangle((left - r2), (upper + r2), (right + r2), (lower - r2), x2, y2):
return False
if left <= x2 <= right:
return True
if upper <= y2 <= lower:
return True
# hjørnene
if (distance(x0, y0, x2, y2) < r2
or distance(x1, y1, x2, y2) < r2
or distance(x0, y1, x2, y2) < r2
or distance(x1, y0, x2, y2) < r2
):
return True
return False