You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
7.5 KiB

  1. """ coding=utf-8
  2. Analytical Skills - practicum 1: getallen
  3. (c) 2019 Hogeschool Utrecht
  4. Bart van Eijkelenburg (bart.vaneijkelenburg@hu.nl)
  5. Tijmen Muller (tijmen.muller@hu.nl)
  6. """
  7. """
  8. LET OP: JE MAG VOOR DEZE OPDRACHT GEEN (extra) MODULES IMPORTEREN!
  9. Practicum 1: Werk onderstaande functies uit.
  10. floor(real):
  11. Return het grootste gehele getal, dat kleiner dan of gelijk is aan real (reël getal).
  12. ceil(real):
  13. Return het kleinste gehele getal, groter dan of gelijk aan real (reël getal).
  14. div(n):
  15. Return een (natuurlijk) gesorteerde verzameling (lijst) van delers van n.
  16. Het getal a N is een deler van n N, als er een b N is, zodat a · b = n.
  17. is_prime(n):
  18. Return True als n N een priemgetal is, anders False.
  19. primefactors(n):
  20. Return een (natuurlijk) gesorteerde verzameling (lijst) van priemfactoren van n.
  21. Return [n] als n een priemgetal is, of n == 1. Tip: maak gebruik van de functie 'is_prime(n)'
  22. primes_under_30():
  23. Return alle priemgetallen kleiner dan 30.
  24. gcd(a, b):
  25. Return de grootste grootste gemene deler, ggd (ofwel greatest common divisor, gcd) is.
  26. Je hebt twee opties voor deze opgave;
  27. 1. Je programmeert hier het algoritme van Euclides (niet behandeld)
  28. zie: https://nl.wikipedia.org/wiki/Algoritme_van_Euclides
  29. 2. Je bedenkt zelf een oplossing waarbij je gebruik maakt van de eerder
  30. geschreven methode div(n) om de gcd te bepalen.
  31. lcm(a, b):
  32. Return het kleinste gemene veelvoud, kvg (ofwel least common multiple).
  33. add_frac(n1, d1, n2, d2):
  34. Return de sommatie van twee breuken als breuk.
  35. *n1* is de teller van de eerste breuk, *d1* is de noemer van de eerste breuk.
  36. *n2* is de teller van de tweede breuk, *d2* is de noemer van de eerste breuk.
  37. De returnwaarde bestaat uit eerste de teller en dan de noemer van het resultaat.
  38. Bijvoorbeeld: 3/4 + 1/6 = 11/12
  39. dan: add_frac(3, 4, 1, 6) = 11, 12
  40. """
  41. def floor(real):
  42. """ Return het grootste gehele getal, dat kleiner dan of gelijk is aan real (reëel getal). """
  43. return 0
  44. def ceil(real):
  45. """ Return het kleinste gehele getal, groter dan of gelijk aan real (reëel getal). """
  46. return 0
  47. def div(n):
  48. """ Return een (natuurlijk) gesorteerde verzameling (lijst) van delers van n.
  49. Het getal a N is een deler van n N, als er een b N is, zodat a · b = n. """
  50. divisors = []
  51. return sorted(divisors)
  52. def is_prime(n):
  53. """ Return True als n ∈ N een priemgetal is, anders False.
  54. Je kunt gebruik maken van de functie 'div(n)' om te bepalen of n een priem is.
  55. Optioneel: bedenk een efficiënter alternatief. """
  56. return False
  57. def primefactors(n):
  58. """ Return een (natuurlijk) gesorteerde verzameling (lijst) van priemfactoren van n.
  59. Return [n] als n een priemgetal is, of n == 1. Tip: maak gebruik van de functie 'is_prime(n)' """
  60. factors = []
  61. return sorted(factors)
  62. def primes_under_30():
  63. """ Return alle priemgetallen kleiner dan 30. """
  64. primes = []
  65. return primes
  66. def gcd(a, b):
  67. """ Return de grootste grootste gemene deler, ggd (ofwel greatest common divisor, gcd) is. """
  68. return 1
  69. def lcm(a, b):
  70. """ Return het kleinste gemene veelvoud, kvg (ofwel least common multiple). """
  71. return 1
  72. def add_frac(n1, d1, n2, d2):
  73. """ Return de sommatie van twee breuken als breuk.
  74. *n1* is de teller van de eerste breuk, *d1* is de noemer van de eerste breuk.
  75. *n2* is de teller van de tweede breuk, *d2* is de noemer van de eerste breuk.
  76. De returnwaarde bestaat uit eerste de teller en dan de noemer van het resultaat.
  77. Bijvoorbeeld: 3/4 + 1/6 = 11/12
  78. dan: add_frac(3, 4, 1, 6) = 11, 12
  79. """
  80. return 1, 1
  81. """
  82. ========================================================================================================================
  83. Onderstaand staan de tests voor je code -- hieronder mag je niets wijzigen!
  84. Je kunt je code testen door deze file te runnen of met behulp van pytest.
  85. """
  86. def my_assert_args(function, args, expected_output):
  87. argstr = str(args).replace(',)', ')')
  88. assert function(*args) == expected_output, "Fout: {}{} geeft {} in plaats van {}".format(function.__name__, argstr, function(*args), expected_output)
  89. def test_floor():
  90. testcases = [((1.0,), 1),
  91. ((1.05,), 1),
  92. ((1.95,), 1),
  93. ((-1.0,), -1),
  94. ((-1.05,), -2),
  95. ((-1.95,), -2)]
  96. for case in testcases:
  97. my_assert_args(floor, case[0], case[1])
  98. def test_ceil():
  99. testcases = [((1.0,), 1),
  100. ((1.05,), 2),
  101. ((1.95,), 2),
  102. ((-1.0,), -1),
  103. ((-1.05,), -1),
  104. ((-1.95,), -1)]
  105. for case in testcases:
  106. my_assert_args(ceil, case[0], case[1])
  107. def test_div():
  108. testcases = [
  109. ((1,), [1]),
  110. ((2,), [1, 2]),
  111. ((3,), [1, 3]),
  112. ((4,), [1, 2, 4]),
  113. ((8,), [1, 2, 4, 8]),
  114. ((12,), [1, 2, 3, 4, 6, 12]),
  115. ((19,), [1, 19]),
  116. ((25,), [1, 5, 25]),
  117. ((929,), [1, 929]),
  118. ((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])
  119. ]
  120. for case in testcases:
  121. my_assert_args(div, case[0], sorted(case[1]))
  122. def test_primefactors():
  123. testcases = [
  124. ((1,), [1]),
  125. ((2,), [2]),
  126. ((3,), [3]),
  127. ((4,), [2, 2]),
  128. ((8,), [2, 2, 2]),
  129. ((12,), [2, 2, 3]),
  130. ((2352,), [2, 2, 2, 2, 3, 7, 7]),
  131. ((9075,), [3, 5, 5, 11, 11])
  132. ]
  133. for case in testcases:
  134. my_assert_args(primefactors, case[0], sorted(case[1]))
  135. def test_primes_under_30():
  136. expected_output = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
  137. assert sorted(primes_under_30()) == expected_output, "Fout: primes_under_30() geeft {} in plaats van {}".format(primes_under_30(), expected_output)
  138. def test_gcd():
  139. testcases = [
  140. ((60, 70), 10)
  141. ]
  142. for case in testcases:
  143. my_assert_args(gcd, case[0], case[1])
  144. def test_lcm():
  145. testcases = [
  146. ((15, 27), 135)
  147. ]
  148. for case in testcases:
  149. my_assert_args(lcm, case[0], case[1])
  150. def test_add_frac():
  151. testcases = [
  152. ((1, 2, 1, 4), (3, 4)),
  153. ((3, 4, 1, 6), (11, 12)),
  154. ((1, 6, 3, 4), (11, 12))
  155. ]
  156. for case in testcases:
  157. my_assert_args(add_frac, case[0], case[1])
  158. if __name__ == '__main__':
  159. try:
  160. print("\x1b[0;32m")
  161. test_floor()
  162. print("Je functie floor() werkt goed!")
  163. test_ceil()
  164. print("Je functie ceil() werkt goed!")
  165. test_div()
  166. print("Je functie div(n) werkt goed!")
  167. test_primefactors()
  168. print("Je functie primefactors(n) werkt goed!")
  169. test_primes_under_30()
  170. print("Je functie primes_under_30() werkt goed!")
  171. test_gcd()
  172. print("Je functie gcd(a, b) werkt goed!")
  173. test_lcm()
  174. print("Je functie lcm(a, b) werkt goed!")
  175. test_add_frac()
  176. print("Je functie add_frac(n1, d1, n2, d2) werkt goed!")
  177. print("Gefeliciteerd, alles lijkt te werken! Lever je werk nu in op Canvas...")
  178. except AssertionError as ae:
  179. print("\x1b[0;31m" + str(ae))