5.1 5.2 1rste BAC Biologie Hoofdstuk 5 Inhoud Inleiding Programeerconstructies functies variabelen (toekenning) statements (print, ) controlestructuren (if, while, until, for) Oefeningen 5.3 5.4 "functionzero.zip" gebruik die van vorige week of haal via de web-site vervang in alle rekenbladen de functie "sinus" door "cosinus" find-replace: "sin(" "cos(" hoeveel cellen moet je aanpassen? hoeveel operaties heb je nodig? Context nulpuntberekening convergeert niet meer! pas a0 en b0 aan zie grafiek Kan dit eenvoudiger? Project: Alle plaatsen waar VisualBasic code kan zitten Programeercode wordt best bewaard in Modules Inspecteren / veranderen van Properties (o.a. naam) Programeercode wordt geschreven in de editor Editor voor Programmeercode Immediate: eventjes proberen 1
5.5 5.6 Open VisualBasic Editor In Excel >>Tools>>Macro >>Visual Basic Editor Maak Module (1) rechtsklik op "VBA Project (functionzero)" >>Insert>>Module Hernoem Module1 nieuw naam "GlobaleFuncties" (2) venster "Properties" Voorbereiding 1 2 "VBASampleCode.txt" van de web-site 2 In Editor 3 (1) Copy/Paste 1rste code Public Function datafunction(x) If x = 0 Then datafunction = 0 datafunction = Cos(1 / x) (2) Bewaren (3) Ga terug naar excel in cel "=datafunction(0)" Eerste Functie 1 5.7 5.8 Even uitproberen Ga terug naar Visual Basic Editor in venster "Immediate" "MsgBox datafunction(0.1)" + keyboard: Enter "Debug.print datafunction (0.2)" + keyboard: Enter Merk op: Amerikaanse conventie voor komma getallen Public Function name ( argumenten ) statements gereserveerde woorden public, function, end public wat hier gedefinieerd wordt is "overal" te gebruiken in tegenstelling tot "private" alleen binnen module Functie (vorm) Function we maken een functie <name> zelf in te vullen naam <argumenten> tussen haakjes, gescheiden door kommas <statements> programmacode elk statement begint op een nieuwe lijn 't is gedaan 2
5.9 5.10 name = Exit Function name = toekenning ("assignment") name wordt gelijk aan Exit Function berekening van functie is gedaan, ga naar "End Function" Statements MsgBox waarschuwing via dialoog MsgBox "Hello World" MsgBox "datafunction(" & x & ")" Debug.print schrijf uit in "Immediate Window" Debug.Print "datafunction(" & x & ")" commentaar rem ' alles na rem of ' wordt genegeerd uitleg naar lezer van programmacode tijdelijk een bepaald statement niet uitvoeren Varia lange regels _ lange regels splitsen over meerdere regels? "spatie" gevolgd door "_" gevolgd door "Enter " 5.11 5.12 IF-statement (vorm) IF-statement variant (vorm) If Then then- else- If Then then- then- else- then- If 1 Then -1 If 2 Then -2 If n-1 Then -n-1 -n -1-2 -n-1 1 2 n-1 -n 3
5.13 5.14 Voorbeeld (1) Vervang code voor datafunction(x) door Copy/Paste vanuit "VBASampleCode.txt" (web-site) Public Function datafunction(x) ' a function used as input for a spreadsheet ' producing graphs and calculating zero points MsgBox "oproep van datafunction(" _ & x & ")" If x = 0 Then datafunction = 0 datafunction = Cos(1 / x) Roep datafunction(x) op vanuit cel in rekenblad Vervang "MsgBox" door "Debug.Print" Roep datafunction(x) op vanuit "Immediate" window Oproepen vanuit Spreadsheet Vervang in "functionzero" alle IF( =0;0;(COS(1/ ))) door datafunction() bekijk grafiek en nulpunten Vervang code door voorbeeld3 Copy/Paste vanuit "VBASampleCode.txt" Application.volatile elke verandering aan rekenblad: alle oproepen datafunction herberekenen zie "Immediate window" Public Function datafunction(x) ' a function used as input ' producing graphs and Application.Volatile Debug.print _ "oproep van datafunction(" _ & x & ")" If x = 0 Then datafunction = 0 datafunction = sin(1 / x) Vervang sin(1/x) door tan(1/x) cos(1/x) Bewaar. Grafiek en nulpunten? 5.15 5.16 Herhaling: Nulpunten (Bissectie methode) kies a 0 en b 0 zodat f(a 0 ) < 0 en f(b 0 ) > 0 stap 0: stel m 0 := (a 0 + b 0 ) / 2 f(m 0 ) = 0? GEVONDEN f(m 0 ) < 0? a 1 := m 0 en b 1 := b 0 f(m 0 ) > 0? a 1 := a 0 en b 1 := m 0 stap n: stel m n := (a n + b n ) / 2 f(m n ) = 0? GEVONDEN f(m n ) < 0? a n+1 := m n en b n+1 := b n f(m 0 ) > 0? a n+1 := a n en b n+1 := m n Benodigheden variabelen lus Variabelen, Toekenning ("assignment") variabele = waarde vb1=0 vb2=0 vb3=0 'vb1, vb2, vb3 bevatten 0 vb1 = 1 'vb1 bevat 1 vb2 = 2 'vb2 bevat 2 vb3 = vb1 + vb2 'vb3 bevat 3 vb1 = vb2 ' vb1 bevat 2 vb3 = vb3 + 1 ' vb3 bevat 4 vb1 vb2 vb3 0 0 0 vb1 vb2 vb3 1 0 0 vb1 vb2 vb3 1 2 0 vb1 vb2 1 2 2 2 + 1 + vb3 3 vb3 3 4 4
5.17 5.18 WHILE/UNTIL statement (vorm 1) WHILE/UNTIL statement (vorm 1) Do While Loop Do Loop While Do Until Loop wordt misschien 0 x uitgevoerd! Do Loop Until wordt minstens 1 x uitgevoerd! 5.19 5.20 FOR-statement (vorm) Bissectiemethode (1rste poging) For naam = first To last Step step Next naam first, last, step: rekenkundige essies met als resultaat een geheel getal!!! naam = naam + step naam = first naam <= last Public Function computezero(a0, b0) 'calculates a zero point of a function using the bissection method a = a0 b = b0 m = (a + b) / 2 Do While Abs(datafunction(m)) > 0.000000001 ' Debug.Print " a = " & a & " - b = " & " - m = " & m If datafunction(m) > 0 Then b = m a = m m = (a + b) / 2 Loop computezero = m Probeer eens computezero(0.38, 0.18) computezero(0.18, 0.38) keyboard: ctrl-break om te onderbreken 5
5.21 5.22 Bissectiemethode (2de poging) Matrix met nulpuntberekeningen Public Function computezero(a0, b0) 'calculates a zero point of a function using the bissection method If datafunction(a0) > 0 Then computezero = "First parameter " & a0 & _ " should have negative function value (has " _ & datafunction(a0) & ")" Exit Function If datafunction(b0) < 0 Then computezero = "Second parameter " & b0 & _ " should have positive function value (has " _ & datafunction(b0) & ")" Exit Function a = a0 b = b0 m = (a + b) / 2 Maak een matrix rij: 0 tot 0,39 step 0,1 kolom: 0 tot 0,39 step 0,1 waarde: computezero() 5.23 5.24 schrijf functie "fsin(x)" grafiek en nulpunten via functionzero x = 0 dan fsin(x) = 1 x 0 dan fsin(x) = Sin(x) / x schrijf functie "fac(n)" faculteit(n) of n! n is positief natuurlijk getal n = 0 dan fac(n) = 1 n > 0 dan fac(n) = n * fac (n-1) schrijf met FOR en WHILE Oefeningen schrijf functie "MExp(x)" exponentieel via benadering door Maclaurin exp(x) = 1 + (x) + (x 2 / 2!) + + (x n / n!) stop voor n = 10 stop als (x n / n!) < 10-10 schrijf functie "sumrange(a, b)" a en b natuurlijke getallen a < b: a + (a+1) + + b a > b: b + (b+1) + + a Conclusie Inleiding Programeerconstructies functies variabelen (toekenning) statements (print, ) controlestructuren (if, while, until, for) Oefeningen 6