UITWERKING oefententamen Programmeermethoden NA OPGAVE 1 a. def hoe(A, X): teller = 0 for element in A: if element == X: teller += 1 return teller b. def fac(k): f = 1 for i in range(2, k+1): f *= i return f c. def controle(A): for i, element in enumerate(A): if i > 0 and i % 2 == 0: if hoe(A, element) > i: return False elif i % 2 != 0: if element != fac(i): return False return True d. def busort(A): N = len(A) gewisseld, i = True, 1 while i < N and gewisseld: gewisseld = False for j in range(N - i): if A[j] > A[j+1]: gewisseld = True A[j], A[j+1] = A[j+1], A[j] i += 1 Alternatief: buitenste loop als for-loop en "break" of return gebruiken. e. Minimaal: n-1 vergelijkingen om alle elementen een keer te vergelijken. Voorbeeld: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; ofwel elk rijtje in oplopende volgorde. Maximaal: n-1 + n - 2 + ... + 1 = 1/2(n-1)n vergelijkingen in het geval de lijst precies aflopend is en alle getallen 1 voor 1 naar achteren moeten worden gebubbeld. Voorbeeld: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] f. def langste(A): teller = 1 lengte, laatste = 1, 0 for i in range(1, len(A)): if A[i] != A[i - 1]: teller = 1 else: teller += 1 if teller >= lengte: lengte = teller laatste = i return lengte, laatste OPGAVE 2 a. Zie slides / dictaat. b. Uitvoer: 5.2 8.3 11.4 11.4 13.5 2.1, 3.1, 42 c. Nee, het programma runt niet meer. Omdat er naar "u" wordt geschreven, wordt "u" als lokale variabele gezien. Vervolgens wordt er uit "u" gelezen voordat er een waarde aan is toegekend en dat kan niet. Voor harry maakt het niet uit, omdat er een onconditionele return staat voordat er met "u" wordt gewerkt. d. Als y >= 1: x + y * int(y) anders x. OPGAVE 3 a. M[4,:] b. M[3:,2] c. M[3:,2:] d. M[::2,:] e. np.sum(M, axis=1) OPGAVE 4 a. def aflagen(H, i, j, p, q): for x in range(i, p+1): for y in range(j, q+1): if H[x, y] > 0: H[x, y] -= 1 b. def gemiddeld(H, i, j): som = 0 buren = 0 if i > 0: som += H[i-1,j] buren += 1 if i < m-1: som += H[i+1,j] buren += 1 if j > 0: som += H[i,j-1] buren += 1 if j < n-1: som += H[i,j+1] buren += 1 som /= float(buren) return int(som+0.5) # of: round(som, 0) c. def maximum(H): grootste, aantal, i0, j0 = H[0,0], 0, 0, 0 for i in range(m): for j in range(n): if H[i,j] == grootste: aantal += 1 elif H[i, j] > grootste: grootste = H[i, j] aantal = 1 i0, j0 = i, j return grootste, aantal, i0, j0 d. def egaliseer(H, drempel): stappen = 0 grootste, aantal, i0, j0 = maximum(H) while aantal < drempel: stappen += 1 H[i0,j0] -= 1 grootste, aantal, i0, j0 = maximum(H) return stappen