240 likes | 379 Views
Informatica 1rste BAC Biologie. Hoofdstuk 5 Scripting. Inhoud. Inleiding Programeerconstructies functies variabelen (toekenning) statements (print, ...) controlestructuren (if, while, until, for) Oefeningen. "functionzero.zip" gebruik die van vorige week of haal via de web-site
E N D
Informatica1rste BAC Biologie Hoofdstuk 5 Scripting Scripting
Inhoud • Inleiding • Programeerconstructies • functies • variabelen (toekenning) • statements (print, ...) • controlestructuren (if, while, until, for) • Oefeningen Scripting
"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 ? nulpuntberekening convergeert niet meer ! pas a0 en b0 aan zie grafiek Context Kan dit eenvoudiger ? Scripting
Editor voor Programmeercode 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 Immediate: eventjes proberen Scripting
Voorbereiding • 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" 1 2 Scripting
Eerste Functie • "VBASampleCode.txt" • van de web-site • In Editor • (1) Copy/Paste 1rste code Public Function datafunction(x) If x = 0 Then datafunction = 0 Else datafunction = Cos(1 / x) End If End Function • (2) Bewaren • (3) Ga terug naar excel • in cel "=datafunction(0)" 2 3 1 Scripting
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 Scripting
Public Function name ( argumenten) statements End Function gereserveerde woorden public, function, end public wat hier gedefinieerd wordt is "overal" te gebruiken in tegenstelling tot "private" alleen binnen module 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 End Function 't is gedaan ... Functie (vorm) Scripting
name = ... Exit Function name = ... toekenning ("assignment") name wordt gelijk aan ... Exit Function berekening van functie is gedaan, ga naar "End Function" MsgBox ... waarschuwing via dialoog MsgBox "Hello World" MsgBox "datafunction(" & x & ")" Debug.print ... schrijf uit in "Immediate Window" Debug.Print "datafunction(" & x & ")" Statements Scripting
commentaar rem ... ' ... alles na rem of ' wordt genegeerd uitleg naar lezer van programmacode tijdelijk een bepaald statement niet uitvoeren lange regels ... _ lange regels splitsen over meerdere regels ? "spatie" gevolgd door "_" gevolgd door "Enter" Varia Scripting
If expr Then then-block Else else-block End If If expr Then then-block End If expr true false else-block then-block IF-statement (vorm) expr true false then-block Scripting
If expr1 Then block-1 ElseIf expr2 Then block-2 ... ElseIf exprn-1 Then block-n-1 Else block-n End If IF-statement variant (vorm) expr1 true false block-1 expr2 true false block-2 ... ... exprn-1 true block-n-1 false block-n Scripting
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 Else datafunction = Cos(1 / x) End If End Function • Roep datafunction(x) op vanuit cel in rekenblad • Vervang "MsgBox" door "Debug.Print" • Roep datafunction(x) op vanuit "Immediate" window Scripting
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 Else datafunction = sin(1 / x) End If End Function Oproepen vanuit Spreadsheet • Vervang sin(1/x) door • tan(1/x) • cos(1/x) • Bewaar. Grafiek en • nulpunten ? Scripting
Herhaling: Nulpunten (Bissectie methode) • kies a0 en b0 zodat f(a0) < 0 en f(b0) > 0 • stap 0: stel m0 := (a0 + b0) / 2 • f(m0) = 0 ? GEVONDEN • f(m0) < 0 ? a1 := m0 en b1 := b0 • f(m0) > 0 ? a1 := a0 en b1 := m0 • ... • stap n: stel mn := (an + bn) / 2 • f(mn) = 0 ? GEVONDEN • f(mn) < 0 ? an+1 := mn en bn+1 := bn • f(m0) > 0 ? an+1 := an en bn+1 := mn • Benodigheden • variabelen • lus Scripting
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 vb3 3 + 2 2 vb3 3 4 + 1 Scripting
Do While expr block Loop WHILE/UNTIL statement (vorm 1) expr false true block block wordt misschien 0 x uitgevoerd ! expr false true Do Until expr block Loop block Scripting
Do block Loop While expr WHILE/UNTIL statement (vorm 1) block expr true false block wordt minstens 1 x uitgevoerd ! Do block Loop Until expr block expr false true Scripting
For naam = first To last Step step block Next naam FOR-statement (vorm) naam = first true false naam <= last first, last, step: rekenkundige expressies met als resultaat een geheel getal !!! block naam = naam + step Scripting
Bissectiemethode (1rste poging) 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 Else a = m End If m = (a + b) / 2 Loop computeZero = m End Function • Probeer eens • computezero(0.38, 0.18) • computezero(0.18, 0.38) • ... • keyboard: ctrl-break om te onderbreken Scripting
Bissectiemethode (2de poging) 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 End If If datafunction(b0) < 0 Then computeZero = "Second parameter " & b0 & _ " should have positive function value (has " _ & datafunction(b0) & ")" Exit Function End If a = a0 b = b0 m = (a + b) / 2 ... Scripting
Matrix met nulpuntberekeningen • Maak een matrix • rij: 0 tot 0,39 step 0,1 • kolom: 0 tot 0,39 step 0,1 • waarde: computezero(...) Scripting
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 schrijf functie "MExp(x)" exponentieel via benadering door Maclaurin exp(x) = 1 + (x) + (x2 / 2!) + ... + (xn / n!) stop voor n = 10 stop als (xn / 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 Oefeningen Scripting
Conclusie • Inleiding • Programeerconstructies • functies • variabelen (toekenning) • statements (print, ...) • controlestructuren (if, while, until, for) • Oefeningen Scripting