11 – Parameters

Preview:

DESCRIPTION

11 – Parameters. Question: Arrays. How many array variables are in the following code: Dim x Dim y Dim f(4) x = 12 y = 6 f(2) = 21. 1. Question: Arrays. How many errors are in the following code: Dim x Dim y Dim f(4) f = 3 y(3) = 6 f(1) = 19 f(5) = 21. Session Aims & Objectives. - PowerPoint PPT Presentation

Citation preview

Mark Dixon Page 1

11 – Parameters

Mark Dixon Page 2

Question: Arrays• How many array variables are in the

following code:

Dim xDim yDim f(4) x = 12 y = 6 f(2) = 21

1

Mark Dixon Page 3

Question: Arrays• How many errors are in the following code:

Dim xDim yDim f(4) f = 3 y(3) = 6 f(1) = 19 f(5) = 21

Mark Dixon Page 4

Session Aims & Objectives• Aims

– To introduce passing parameters/arguments to procedures to make them more general purpose

• Objectives, after this week’s sessions, you should be able to:

– use parameters in your programs to make procedures more flexible

– distinguish between formal and actual parameters

– pass parameters by reference and by value– identify and correct parameter errors

Mark Dixon Page 5

Example: Clock (analysis)SPECIFICATION

• User Requirements – to know what the time is

• Software Requirements– Functional:

–display current time in analogue (traditional clock face) format

– Non-functionalshould be easy to read

Mark Dixon Page 6

Example: Clock (user interface)• 14 objects:

– 12 numbers– mid point– second point

(moving)

Mark Dixon Page 7

Example: Clock v0 (HTML)<html>

<head><title></title></head>

<body>

<div id=div1 style="position: absolute;">1</div>

<div id=div2 style="position: absolute;">2</div>

<div id=div3 style="position: absolute;">3</div>

<div id=div4 style="position: absolute;">4</div>

<div id=div5 style="position: absolute;">5</div>

<div id=div6 style="position: absolute;">6</div>

<div id=div7 style="position: absolute;">7</div>

<div id=div8 style="position: absolute;">8</div>

<div id=div9 style="position: absolute;">9</div>

<div id=div10 style="position: absolute;">10</div>

<div id=div11 style="position: absolute;">11</div>

<div id=div12 style="position: absolute;">12</div>

<img id=imgMid style="position: absolute;" src="dot.gif" />

<img id=imgSec style="position: absolute;" src="dot.gif" />

</body>

</html>

Mark Dixon Page 8

Example: Clock v1 (HTML)• Remove 'hard coded' tags

<html>

<head><title></title></head>

<body>

<img id=imgMid style="position: absolute;" src="dot.gif" />

<img id=imgSec style="position: absolute;" src="dot.gif" />

</body>

</html>

Mark Dixon Page 9

Example: Clock v1 (code)Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style='position: absolute;'>" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 … … … div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setInterval "ShowHands", 500 End Sub

• use loop to put in tags

Mark Dixon Page 10

Example: Clock v1 (code)

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

current time and date

Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

Mark Dixon Page 11

Example: Clock v1 (code)Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 … … … div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Mark Dixon Page 12

Example: Clock v1 (code)

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub

• same 2 lines duplicated– not identical

• different object• different angle

Mark Dixon Page 13

Problem: Inflexible Procedure• Procedure does exactly the same each time

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) Position End Sub

Sub Position() imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200End Sub

Mark Dixon Page 14

Parameters/Arguments: What• Sometimes procedures need information

– Making a cup of tea:• milk, and number of sugars

• Makes them more flexible

Make cupof tea

Milk

Sugars

Mark Dixon Page 15

Parameters: How• Procedure Declaration

– formal parameters define name

• Procedure Call– actual parameters list values in order

Option ExplicitDim res

Sub Calc(Num1, Num2) res = Num1 * Num2 End Sub

Sub btnCalc_Click() Calc 5, 2 Calc 11, 15 End Sub

Mark Dixon Page 16

Parameters: How

Mark Dixon Page 17

Error: Wrong number of arguments

Option Explicit

Sub Twice(num) parResult.innerText = num * 2 End Sub Twice 3 Twice 4, 3 Twice

Mark Dixon Page 18

Questions: Parameters• Name the procedures in the following code

and state how many parameters they take:

Sub hello(s, x)Dim i s = "" For i = 1 To x s = s + "Hello" NextEnd Sub

Sub DisplayScore() parScore.innerText = scoreEnd Sub

hello takes 2 parameters

DisplayScore takes 0 parameters

Mark Dixon Page 19

Questions: ParametersGiven the following declaration:

• What will the following put in parRes?

Sub thing(Num1, Num2, Num3)Dim tmpOutput tmpOutput = (Num1 + Num2) * Num3 parRes.innerText = tmpOutputEnd Sub

thing 2, 3, 6thing 6, 3, 2thing 20, 5, 2

301850

Mark Dixon Page 20

Example: Clock v2 (code)Option Explicit

Sub window_OnLoad()

Dim ang

Dim s

Dim i

s = ""

For i = 1 To 12

s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>"

Next

document.body.innerHTML = s & document.body.innerHTML

imgMid.style.pixelleft = document.body.clientwidth / 2

imgMid.style.pixeltop = document.body.clientheight / 2

ang = 6.2 / 12

Position div1, ang

Position div2, ang * 2

Position div3, ang * 3

Position div4, ang * 4

Position div5, ang * 5

Position div6, ang * 6

Position div7, ang * 7

Position div8, ang * 8

Position div9, ang * 9

Position div10, ang * 10

Position div11, ang * 11

Position div12, ang * 12

window.setinterval "ShowHands", 500

End Sub

Sub ShowHands()

Dim ang

Dim s

ang = 6.2 / 60

s = Second(Now())

Position imgSec, ang * s

End Sub

Sub Position(objO, a)

objO.style.pixelleft = imgMid.style.pixelleft + Sin(a) * 200

objO.style.pixeltop = imgMid.style.pixeltop - Cos(a) * 200

End Sub

Sub Position(objO, a) objO.style.pixelleft = imgMid.style.pixelleft + Sin(a) * 200 objO.style.pixeltop = imgMid.style.pixeltop - Cos(a) * 200End Sub

Position imgSec, ang * s

Position div1, angPosition div2, ang * 2Position div3, ang * 3Position div4, ang * 4… … …Position div9, ang * 9Position div10, ang * 10Position div11, ang * 11Position div12, ang * 12

Mark Dixon Page 21

Comparison of Clock Code

<html> <head><title></title></head> <body> <img id=imgMid style="position: absolute;" src=dot.gif /> <img id=imgSec style="position: absolute;" src=dot.gif /> </body></html>

<script language=VBScript>Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 Position div1, ang Position div2, ang * 2 Position div3, ang * 3 Position div4, ang * 4 Position div5, ang * 5 Position div6, ang * 6 Position div7, ang * 7 Position div8, ang * 8 Position div9, ang * 9 Position div10, ang * 10 Position div11, ang * 11 Position div12, ang * 12 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) Position imgSec, ang * s End Sub

Sub Position(objO, a) objO.style.pixelleft = imgMid.style.pixelleft + Sin(a) * 200 objO.style.pixeltop = imgMid.style.pixeltop - Cos(a) * 200 End Sub</script>

<html> <head><title></title></head> <body> <img id=imgMid style="position: absolute;" src=dot.gif /> <img id=imgSec style="position: absolute;" src=dot.gif /> </body></html>

<script language=VBScript>Option Explicit

Sub window_OnLoad() Dim ang Dim s Dim i s = "" For i = 1 To 12 s = s & "<div id=div" & i & " style=""position: absolute;"">" & i & "</div>" Next document.body.innerHTML = s & document.body.innerHTML imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub</script>

<html> <head><title></title></head> <body> <div id=div1 style="position: absolute;">1</div> <div id=div2 style="position: absolute;">2</div> <div id=div3 style="position: absolute;">3</div> <div id=div4 style="position: absolute;">4</div> <div id=div5 style="position: absolute;">5</div> <div id=div6 style="position: absolute;">6</div> <div id=div7 style="position: absolute;">7</div> <div id=div8 style="position: absolute;">8</div> <div id=div9 style="position: absolute;">9</div> <div id=div10 style="position: absolute;">10</div> <div id=div11 style="position: absolute;">11</div> <div id=div12 style="position: absolute;">12</div> <img id=imgMid style="position: absolute;" src=dot.gif /> <img id=imgSec style="position: absolute;" src=dot.gif /> </body></html>

<script language=VBScript>Option Explicit

Sub window_OnLoad() Dim ang imgMid.style.pixelleft = document.body.clientwidth / 2 imgMid.style.pixeltop = document.body.clientheight / 2 ang = 6.2 / 12 div1.style.pixelleft = imgMid.style.pixelleft + Sin(ang) * 200 div1.style.pixeltop = imgMid.style.pixeltop - Cos(ang) * 200 div2.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 2) * 200 div2.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 2) * 200 div3.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 3) * 200 div3.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 3) * 200 div4.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 4) * 200 div4.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 4) * 200 div5.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 5) * 200 div5.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 5) * 200 div6.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 6) * 200 div6.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 6) * 200 div7.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 7) * 200 div7.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 7) * 200 div8.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 8) * 200 div8.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 8) * 200 div9.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 9) * 200 div9.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 9) * 200 div10.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 10) * 200 div10.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 10) * 200 div11.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 11) * 200 div11.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 11) * 200 div12.style.pixelleft = imgMid.style.pixelleft + Sin(ang * 12) * 200 div12.style.pixeltop = imgMid.style.pixeltop - Cos(ang * 12) * 200 window.setinterval "ShowHands", 500 End Sub

Sub ShowHands() Dim ang Dim s ang = 6.2 / 60 s = Second(Now()) imgSec.style.pixelleft = imgMid.style.pixelleft + Sin(ang * s) * 200 imgSec.style.pixeltop = imgMid.style.pixeltop - Cos(ang * s) * 200 End Sub</script>

v0 (64 lines) v1 (59 lines) v2 (51 lines)

(2474 bytes) (2064 bytes) (941 bytes)

Mark Dixon Page 22

Example: Clock v3• Use for loop instead of repeated calls

Position div1, angPosition div2, ang * 2Position div3, ang * 3Position div4, ang * 4Position div5, ang * 5Position div6, ang * 6Position div7, ang * 7Position div8, ang * 8Position div9, ang * 9Position div10, ang * 10Position div11, ang * 11Position div12, ang * 12

For i = 1 To 12 Position document.getElementById("div" & i), ang * iNext

Mark Dixon Page 23

Example: Clock v4

Mark Dixon Page 24

Memory Addresses• Memory addresses - keep track of where

variables are stored in memory• Every byte (position) in memory has a memory

address:

• e.g. variable identified by name xstored at location 63542(address of the first byte of data for variable x)

23xIdentifier

Value

Computer Memory

63542

0

Mark Dixon Page 25

Example: Change the Value

Mark Dixon Page 26

Parameter Passing Methods • 2 ways to pass parameters to procedures:

– Passing by Value: literal value is passed from the call to the definitionSub Change1(ByVal x) …End Sub

– Passing by Reference: variable’s memory address (a reference to the variables position in memory) is passed from the call to the definitionSub Change2(ByRef y) …End Sub

Mark Dixon Page 27

Why pass by reference?• Previously, used parameters to pass data

into a procedure (input)

• Pass by reference, allows:– the procedure to change the value of the

passed variable– data to be input and output via parameters

ChangeByVal x

SetByRef x

Mark Dixon Page 28

What can be passed• Pass by value – both literals and variables

can be passed (variables are substituted by their value)

Change1 y Change1 21

• Pass by reference – only variables can be passed (in fact the variable’s memory address is passed)

Change2 y literals cannot be passed – they have no memory address

Change2 21 ERROR

Mark Dixon Page 29

Two results?• Total and Average algorithms share a lot of

code

• Useful to combine them

• TotAve procedure:

double (average)integer (total)TotAve

Mark Dixon Page 30

Example: Total and Average Sub TotAve(ByRef T, ByRef A)

Dim i

T = 0

For i = 1 to 5

T = T + Nums(i)

Next

A = T / 5

End Sub

tot = 0

ave = 0

TotAve tot, ave ' What is the value of ave and tot?

TotAvevar Tvar A

Mark Dixon Page 31

Questions: Parameter Passing• Consider the following code: Dim a Sub Add(ByRef item, ByVal extra) item = item + extra End Sub a = 5

• What is the value of a, after each of these: Add a, 3 Add a, a Add 4, 4

8

16

Error – cannot pass 4 by reference

Mark Dixon Page 32

Tutorial Exercise: Clock• LEARNING OBJECTIVE:

– use parameters provided by event procedures

• Task 1: Get the Clock (v2) example (from the lecture) working.

• Task 2: Modify your code – display lots of dots for the second hand (as per v3).

• Task 3: Modify your code – add an hour and minute hand

Recommended