""" coding=utf-8
|
|
|
|
Analytical Skills
|
|
Practicum 1: getallen
|
|
|
|
(c) 2019 Hogeschool Utrecht
|
|
Bart van Eijkelenburg (bart.vaneijkelenburg@hu.nl)
|
|
Tijmen Muller (tijmen.muller@hu.nl)
|
|
|
|
|
|
Naam: Marcel Haazen
|
|
Klas: DU1B
|
|
Studentnummer:1770145
|
|
|
|
|
|
Opdracht: werk onderstaande functies uit.
|
|
|
|
Je kunt je functies testen met het gegeven raamwerk door het bestand uit te voeren (of met behulp
|
|
van pytest, als je weet hoe dat werkt). Lever je werk in op Canvas als alle tests slagen.
|
|
|
|
Let op! Je mag voor deze opdracht geen extra modules importeren met 'import'.
|
|
"""
|
|
|
|
|
|
def floor(real):
|
|
""" Retourneert het grootste gehele getal (int), dat kleiner dan of gelijk is aan real (float). """
|
|
num = real//1
|
|
return num
|
|
|
|
def ceil(real):
|
|
""" Retourneert het kleinste gehele getal (int), groter dan of gelijk aan real (float). """
|
|
num = -(-real//1)
|
|
return num
|
|
|
|
|
|
def div(n):
|
|
""" Retourneert een (natuurlijk) gesorteerde verzameling (list) van delers van n (int).
|
|
Het getal a ∈ N is een deler van n ∈ N, als er een b ∈ N is, zodat a × b = n. """
|
|
divisors = []
|
|
for i in range(1, int(n / 2) + 1):
|
|
if n % i == 0:
|
|
divisors.append(i)
|
|
divisors.append(n)
|
|
return sorted(divisors)
|
|
|
|
|
|
def is_prime(n):
|
|
""" Return True als n (int) een priemgetal is, anders False.
|
|
Je kunt gebruik maken van de functie 'div(n)' om te bepalen of n een priem is.
|
|
Optioneel: bedenk een efficiënter alternatief. """
|
|
if n <= 1:
|
|
return False
|
|
|
|
for x in range(2, n):
|
|
# if number is divisble by x, return False
|
|
if not n % x:
|
|
return False
|
|
return True
|
|
|
|
|
|
|
|
def primefactors(n):
|
|
""" Return een (natuurlijk) gesorteerde verzameling (list) van priemfactoren van n (int)
|
|
Return [n] als n een priemgetal is, of wanneer n == 1.
|
|
Tip: maak gebruik van de functie 'is_prime(n)' """
|
|
sqrt = n**(1/2.0)
|
|
factors = []
|
|
if n == 1:
|
|
factors.append(1)
|
|
while n % 2 == 0:
|
|
factors.append(2),
|
|
n = n / 2
|
|
for i in range(3,int(sqrt)+1,2):
|
|
|
|
# while i divides n , print i ad divide n
|
|
while n % i== 0:
|
|
factors.append(i),
|
|
n = n / i
|
|
if n > 2:
|
|
factors.append(n)
|
|
|
|
|
|
return sorted(factors)
|
|
|
|
|
|
def primes(num):
|
|
""" Return alle priemgetallen kleiner dan num (int). """
|
|
primes = []
|
|
for n in range(1, num + 1):
|
|
is_prime = True
|
|
for i in range(2, n):
|
|
if n % i == 0:
|
|
is_prime = False
|
|
break
|
|
if is_prime and n > 1 and n != num: #EDIT HERE
|
|
primes.append(n)
|
|
return primes
|
|
|
|
|
|
def gcd(a, b):
|
|
""" Return de grootste grootste gemene deler , ggd (ofwel greatest common divisor, gcd) (int) van
|
|
natuurlijke getallen a en b (beide int).
|
|
|
|
Je hebt twee opties voor deze opgave;
|
|
1. Je programmeert hier het algoritme van Euclides
|
|
zie: https://nl.wikipedia.org/wiki/Algoritme_van_Euclides
|
|
2. Je bedenkt zelf een oplossing waarbij je gebruik maakt van de eerder
|
|
geschreven methode div(n) om de gcd te bepalen.
|
|
"""
|
|
while(b):
|
|
a, b = b, a % b
|
|
|
|
return a
|
|
|
|
|
|
def lcm(a, b):
|
|
""" Return het kleinste gemene veelvoud, kvg (ofwel least common multiple, lcm) (int)
|
|
van natuurlijke getallen a en b (beide int). """
|
|
lcm = (a*b)//gcd(a,b)
|
|
return lcm
|
|
|
|
|
|
|
|
def add_frac(n1, d1, n2, d2):
|
|
""" Retourneer de sommatie van twee breuken als breuk.
|
|
|
|
Argumenten:
|
|
n1 -- de teller van de eerste breuk
|
|
d1 -- de noemer van de eerste breuk
|
|
n2 -- de teller van de tweede breuk
|
|
d2 -- de noemer van de tweede breuk
|
|
|
|
Retourneert de som *als breuk*, met eerst de teller en dan de noemer van het resultaat (tuple).
|
|
|
|
Bijvoorbeeld: 3/4 + 1/6 = 11/12
|
|
dan: add_frac(3, 4, 1, 6) = (11, 12)
|
|
"""
|
|
d3 = gcd(d1,d2)
|
|
d3 = (d1 * d2) / d3
|
|
n3 = ((n1) * (d3/d1) + (n2) * (d3/d2))
|
|
|
|
|
|
|
|
return n3, d3
|
|
|
|
|
|
"""==============================================[ HU TESTRAAMWERK ]====================================================
|
|
Onderstaand staan de tests voor je code -- hieronder mag je niets wijzigen!
|
|
Je kunt je code testen door deze file te runnen of met behulp van pytest.
|
|
"""
|
|
|
|
|
|
def my_assert_args(function, args, expected_output):
|
|
argstr = str(args).replace(',)', ')')
|
|
assert function(*args) == expected_output, \
|
|
f"Fout: {function.__name__}{argstr} geeft { function(*args)} in plaats van {expected_output}"
|
|
|
|
|
|
def test_floor():
|
|
testcases = [((1.0,), 1),
|
|
((1.05,), 1),
|
|
((1.95,), 1),
|
|
((-1.0,), -1),
|
|
((-1.05,), -2),
|
|
((-1.95,), -2)]
|
|
|
|
for case in testcases:
|
|
my_assert_args(floor, case[0], case[1])
|
|
|
|
|
|
def test_ceil():
|
|
testcases = [((1.0,), 1),
|
|
((1.05,), 2),
|
|
((1.95,), 2),
|
|
((-1.0,), -1),
|
|
((-1.05,), -1),
|
|
((-1.95,), -1)]
|
|
|
|
for case in testcases:
|
|
my_assert_args(ceil, case[0], case[1])
|
|
|
|
|
|
def test_div():
|
|
testcases = [
|
|
((1,), [1]),
|
|
((2,), [1, 2]),
|
|
((3,), [1, 3]),
|
|
((4,), [1, 2, 4]),
|
|
((8,), [1, 2, 4, 8]),
|
|
((12,), [1, 2, 3, 4, 6, 12]),
|
|
((19,), [1, 19]),
|
|
((25,), [1, 5, 25]),
|
|
((929,), [1, 929]),
|
|
((936,), [1, 2, 3, 4, 6, 8, 9, 12, 13, 18, 24, 26, 36, 39, 52, 72, 78, 104, 117, 156, 234, 312, 468, 936])
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(div, case[0], sorted(case[1]))
|
|
|
|
|
|
def test_is_prime():
|
|
testcases = [
|
|
((1,), False),
|
|
((2,), True),
|
|
((3,), True),
|
|
((4,), False),
|
|
((5,), True),
|
|
((6,), False),
|
|
((29,), True)
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(is_prime, case[0], case[1])
|
|
|
|
|
|
def test_primefactors():
|
|
testcases = [
|
|
((1,), [1]),
|
|
((2,), [2]),
|
|
((3,), [3]),
|
|
((4,), [2, 2]),
|
|
((8,), [2, 2, 2]),
|
|
((12,), [2, 2, 3]),
|
|
((2352,), [2, 2, 2, 2, 3, 7, 7]),
|
|
((9075,), [3, 5, 5, 11, 11])
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(primefactors, case[0], sorted(case[1]))
|
|
|
|
|
|
def test_primes():
|
|
testcases = [
|
|
((1,), []),
|
|
((2,), []),
|
|
((3,), [2]),
|
|
((4,), [2, 3]),
|
|
((5,), [2, 3]),
|
|
((6,), [2, 3, 5]),
|
|
((30,), [2, 3, 5, 7, 11, 13, 17, 19, 23, 29])
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(primes, case[0], sorted(case[1]))
|
|
|
|
|
|
def test_gcd():
|
|
testcases = [
|
|
((60, 70), 10)
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(gcd, case[0], case[1])
|
|
|
|
|
|
def test_lcm():
|
|
testcases = [
|
|
((15, 27), 135)
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(lcm, case[0], case[1])
|
|
|
|
|
|
def test_add_frac():
|
|
testcases = [
|
|
((1, 2, 1, 4), (3, 4)),
|
|
((3, 4, 1, 6), (11, 12)),
|
|
((1, 6, 3, 4), (11, 12))
|
|
]
|
|
|
|
for case in testcases:
|
|
my_assert_args(add_frac, case[0], case[1])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
print("\x1b[0;32m")
|
|
|
|
test_floor()
|
|
print("Je functie floor() werkt goed!")
|
|
|
|
test_ceil()
|
|
print("Je functie ceil() werkt goed!")
|
|
|
|
test_div()
|
|
print("Je functie div(n) werkt goed!")
|
|
|
|
test_is_prime()
|
|
print("Je functie is_prime(n) werkt goed!")
|
|
|
|
test_primefactors()
|
|
print("Je functie primefactors(n) werkt goed!")
|
|
|
|
test_primes()
|
|
print("Je functie primes() werkt goed!")
|
|
|
|
test_gcd()
|
|
print("Je functie gcd(a, b) werkt goed!")
|
|
|
|
test_lcm()
|
|
print("Je functie lcm(a, b) werkt goed!")
|
|
|
|
test_add_frac()
|
|
print("Je functie add_frac(n1, d1, n2, d2) werkt goed!")
|
|
|
|
print("Gefeliciteerd, alles lijkt te werken! Lever je werk nu in op Canvas...")
|
|
|
|
except AssertionError as ae:
|
|
print("\x1b[0;31m")
|
|
print(ae)
|