# 2023-2024 Deeltoets 1 ## Opgaven De opgaven kun je vinden op: [https://bitbucket.org/HR_ELEKTRO/ems10/wiki/Toetsen/2023-2024_Deeltoets_1.pdf](https://bitbucket.org/HR_ELEKTRO/ems10/wiki/Toetsen/2023-2024_Deeltoets_1.pdf) ## Uitwerkingen ### Toetsvraag 1a ```python def bereken_golflengte(f): lambda = 3e8 / f return lambda ``` De lokale variabele `lambda` is niet echt nodig: ```python def bereken_golflengte(f): return 3e8 / f ``` ### Toetsvraag 1b Een stap-voor-stap oplossing: ```python import math def bereken_FSPL(d, f): golflengte = bereken_golflengte(f) FSPL = (4 * math.pi * d / golflengte) ** 2 return FSPL ``` Een compacte oplossing: ```python import math def bereken_FSPL(d, f): return (4 * math.pi * d / bereken_golflengte(f)) ** 2 ``` ### Toetsvraag 1c Een stap-voor-stap oplossing: ```python d = int(input('Geef de afstand in meter: ')) f = int(input('Geef de signaalfrequentie in Hz: ')) FSPL = bereken_FSPL(d, f); print('De FSPL is:', FSPL) ``` Een compacte oplossing: ```python print('De FSPL is:', bereken_FSPL(int(input('Geef de afstand in meter: ')), int(input('Geef de signaalfrequentie in Hz: ')))) ``` ### Toetsvraag 1d Met een `for`-loop: ```python def FSPL_met_bandbreedte(afst, f1, f2): for freq in range(f1, f2, 1000): FSPL = bereken_FSPL(afst, freq) print("frequentie:", freq, "FSPL:", FSPL) FSPL_met_bandbreedte(3000, 10000, 20000) ``` Met een `while`-loop: ```python def FSPL_met_bandbreedte(afst, f1, f2): freq = f1 while freq < f2: FSPL = bereken_FSPL(afst, freq) print("frequentie:", freq, "FSPL:", FSPL) freq = freq + 1000 FSPL_met_bandbreedte(3000, 10000, 20000) ``` ### Toetsvraag 2 ```python def fix_std_nr(lijst): nieuwe_lijst = [] for nummer in lijst: if nummer[0] == '9' or nummer[0] == '8': nieuwe_lijst.append('0' + nummer) else: nieuwe_lijst.append(nummer) return nieuwe_lijst ``` De voorwaarde van het `if`-statement kan ook korter geformuleerd worden: ```python def fix_std_nr(lijst): nieuwe_lijst = [] for nummer in lijst: if nummer[0] == '9' or '8': nieuwe_lijst.append('0' + nummer) else: nieuwe_lijst.append(nummer) return nieuwe_lijst ``` De voorwaarde van het `if`-statement kan ook anders geformuleerd worden: ```python def fix_std_nr(lijst): nieuwe_lijst = [] for nummer in lijst: if nummer[0] in ['9', '8']: nieuwe_lijst.append('0' + nummer) else: nieuwe_lijst.append(nummer) return nieuwe_lijst ``` Omdat je met in ook in een string kan zoeken naar een karakter, kan de voorwaarde van het `if`-statement nog compacter worden: ```python def fix_std_nr(lijst): nieuwe_lijst = [] for nummer in lijst: if nummer[0] in '98': nieuwe_lijst.append('0' + nummer) else: nieuwe_lijst.append(nummer) return nieuwe_lijst ``` Een alternatieve oplossing die niet geheel correct is omdat de originele lijst wordt aangepast (er wordt gevraagd om een *nieuwe* lijst terug te geven): ```python def fix_std_nr(lijst): for i in range(len(lijst)): if lijst[i][0] in ['9', '8']: lijst[i] = '0' + lijst[i] return lijst ``` Een recursieve oplossing: ```python def fix_std_nr(lijst): if len(lijst) == 0: return [] if lijst[0][0] in ['9', '8']: return ['0' + lijst[0]] + fix_std_nr(lijst[1:]) else: return [lijst[0]] + fix_std_nr(lijst[1:]) ``` Een compacte oplossing: ```python def fix_std_nr(lijst): return ['0' + nummer if nummer[0] in '98' else nummer for nummer in lijst] ``` In het bovenstaande programma wordt gebruik gemaakt van *list comprehension*. Dit is niet behandeld in de les, maar wordt uitgelegd in paragraaf 19.2 van het [boek](https://greenteapress.com/thinkpython2/thinkpython2.pdf#page=206). Testcode: ```python studenten_lijst = ['951203', '863665', '1625532', '811553', '0902333', '0826254', '0913256', '0915464', '941663', '1363614'] nieuwe_studenten_lijst = fix_std_nr(studenten_lijst) print(nieuwe_studenten_lijst) ```