""" 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:
|
|
Klas:
|
|
Studentnummer:
|
|
"""
|
|
|
|
"""
|
|
LET OP: JE MAG VOOR DEZE OPDRACHT GEEN (extra) MODULES IMPORTEREN!
|
|
|
|
Practicum 1: Werk onderstaande functies uit.
|
|
|
|
floor(real):
|
|
Return het grootste gehele getal, dat kleiner dan of gelijk is aan real (reël getal).
|
|
|
|
ceil(real):
|
|
Return het kleinste gehele getal, groter dan of gelijk aan real (reël getal).
|
|
|
|
div(n):
|
|
Return een (natuurlijk) gesorteerde verzameling (lijst) van delers van n.
|
|
Het getal a ∈ N is een deler van n ∈ N, als er een b ∈ N is, zodat a · b = n.
|
|
|
|
is_prime(n):
|
|
Return True als n ∈ N een priemgetal is, anders False.
|
|
|
|
primefactors(n):
|
|
Return een (natuurlijk) gesorteerde verzameling (lijst) van priemfactoren van n.
|
|
Return [n] als n een priemgetal is, of n == 1. Tip: maak gebruik van de functie 'is_prime(n)'
|
|
|
|
primes_under_30():
|
|
Return alle priemgetallen kleiner dan 30.
|
|
|
|
gcd(a, b):
|
|
Return de grootste grootste gemene deler, ggd (ofwel greatest common divisor, gcd) is.
|
|
Je hebt twee opties voor deze opgave;
|
|
1. Je programmeert hier het algoritme van Euclides (niet behandeld)
|
|
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.
|
|
|
|
lcm(a, b):
|
|
Return het kleinste gemene veelvoud, kvg (ofwel least common multiple).
|
|
|
|
add_frac(n1, d1, n2, d2):
|
|
Return de sommatie van twee breuken als breuk.
|
|
*n1* is de teller van de eerste breuk, *d1* is de noemer van de eerste breuk.
|
|
*n2* is de teller van de tweede breuk, *d2* is de noemer van de eerste breuk.
|
|
De returnwaarde bestaat uit eerste de teller en dan de noemer van het resultaat.
|
|
Bijvoorbeeld: 3/4 + 1/6 = 11/12
|
|
dan: add_frac(3, 4, 1, 6) = 11, 12
|
|
"""
|
|
|
|
|
|
def floor(real):
|
|
""" Return het grootste gehele getal, dat kleiner dan of gelijk is aan real (reëel getal). """
|
|
|
|
return 0
|
|
|
|
|
|
def ceil(real):
|
|
""" Return het kleinste gehele getal, groter dan of gelijk aan real (reëel getal). """
|
|
|
|
return 0
|
|
|
|
|
|
def div(n):
|
|
""" Return een (natuurlijk) gesorteerde verzameling (lijst) van delers van n.
|
|
Het getal a ∈ N is een deler van n ∈ N, als er een b ∈ N is, zodat a · b = n. """
|
|
|
|
divisors = []
|
|
return sorted(divisors)
|
|
|
|
|
|
def is_prime(n):
|
|
""" Return True als n ∈ N 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. """
|
|
|
|
return False
|
|
|
|
|
|
def primefactors(n):
|
|
""" Return een (natuurlijk) gesorteerde verzameling (lijst) van priemfactoren van n.
|
|
Return [n] als n een priemgetal is, of n == 1. Tip: maak gebruik van de functie 'is_prime(n)' """
|
|
|
|
factors = []
|
|
return sorted(factors)
|
|
|
|
|
|
def primes_under_30():
|
|
""" Return alle priemgetallen kleiner dan 30. """
|
|
|
|
primes = []
|
|
return primes
|
|
|
|
|
|
def gcd(a, b):
|
|
""" Return de grootste grootste gemene deler, ggd (ofwel greatest common divisor, gcd) is. """
|
|
|
|
return 1
|
|
|
|
|
|
def lcm(a, b):
|
|
""" Return het kleinste gemene veelvoud, kvg (ofwel least common multiple). """
|
|
|
|
return 1
|
|
|
|
|
|
def add_frac(n1, d1, n2, d2):
|
|
""" Return de sommatie van twee breuken als breuk.
|
|
*n1* is de teller van de eerste breuk, *d1* is de noemer van de eerste breuk.
|
|
*n2* is de teller van de tweede breuk, *d2* is de noemer van de eerste breuk.
|
|
De returnwaarde bestaat uit eerste de teller en dan de noemer van het resultaat.
|
|
Bijvoorbeeld: 3/4 + 1/6 = 11/12
|
|
dan: add_frac(3, 4, 1, 6) = 11, 12
|
|
"""
|
|
|
|
return 1, 1
|
|
|
|
|
|
"""
|
|
========================================================================================================================
|
|
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, "Fout: {}{} geeft {} in plaats van {}".format(function.__name__, argstr, function(*args), 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_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_under_30():
|
|
expected_output = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
|
assert sorted(primes_under_30()) == expected_output, "Fout: primes_under_30() geeft {} in plaats van {}".format(primes_under_30(), expected_output)
|
|
|
|
|
|
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_primefactors()
|
|
print("Je functie primefactors(n) werkt goed!")
|
|
|
|
test_primes_under_30()
|
|
print("Je functie primes_under_30() 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" + str(ae))
|