370 likes | 461 Views
08 – Variables. Questions: Conditional Execution. What is the result of (txtFah.value is 50): (txtFah.value >= 40)
E N D
Questions: Conditional Execution • What is the result of (txtFah.value is 50):(txtFah.value >= 40) • What will txtTax be after the following code has executed (txtSalary.value is 4589): If txtSalary.value < 5035 Then txtTax.value = 0 Else txtTax.value = txtSalary.Value * 0.20 End If true 0
Session Aims & Objectives • Aims • Introduce you to (invisible) data storage concepts, i.e. variables • Objectives,by end of this week’s sessions, you should be able to: • declare a variable • assign a value to a variable, • using combination of literal values, operators, functions, and identifiers • Determine whether a variable is in or out of scope at a given point in a piece of code • Select a variable’s scope in your own program
Example: Moon Orbit v1 <html> <head><title>Moon orbit</title></head> <body style="background-color: Black;"> <input id="txtAngle" type="text" value="0" /> <img id="imgEarth" style="position: absolute; left: 200; top: 200;" src="Earth.gif" /> <img id="imgMoon" style="position: absolute;" src="Moon.gif" /> </body> </html> <script language="vbscript"> Sub window_onLoad() imgMoon.style.posLeft = imgEarth.style.posLeft imgMoon.style.posTop = imgEarth.style.posTop + 150 window.setInterval "MoonRotate()", 50 End Sub Sub MoonRotate() txtAngle.value = txtAngle.value + 0.025 imgMoon.style.posLeft = imgEarth.style.posLeft + (Sin(txtAngle.value) * 150) imgMoon.style.posTop = imgEarth.style.posTop + (Cos(txtAngle.value) * 150) End Sub </script>
Problem: Intermediate Results <html> <head><title>Moon orbit</title></head> <body style="background-color: Black;"> <input id="txtAngle" type="text" value="0" /> <img id="imgEarth" style="position: absolute; left: 200; top: 200;" src="Earth.gif" /> <img id="imgMoon" style="position: absolute;" src="Moon.gif" /> </body> </html> <script language="vbscript"> Sub window_onLoad() imgMoon.style.posLeft = imgEarth.style.posLeft imgMoon.style.posTop = imgEarth.style.posTop + 150 window.setInterval "MoonRotate()", 50 End Sub Sub MoonRotate() txtAngle.value = txtAngle.value + 0.025 imgMoon.style.posLeft = imgEarth.style.posLeft + (Sin(txtAngle.value) * 150) imgMoon.style.posTop = imgEarth.style.posTop + (Cos(txtAngle.value) * 150) End Sub </script> • Intermediate result (angle)stored in object property(txtAngle.value) • visible • takes lot of memory • verbose
Variables (why?) • Variables useful for: • reducing memory use • speed up execution • storing information you don't want user to see • storing intermediate results of calculations temporarily: • makes code easier to understand, & • prevents need to re-calculate • making code easier to read (short variable name instead of long object.property names)
Variables (what) • Variables have • Identifier (name) – you choose this, used to refer to (reference) variable • Value – you set/change this x 23 Name/Identifier Value Memory
Variable declaration (how) represents the name of the variable • Variables must be declared, using the following syntax (grammar):Dimidentifiere.g. Dim weight Dim x Dim s Dim year
Variable assignment (how) • Variables are assigned values,using the following syntax:identifier=expressione.g. x = 5 weight = 109.45 name = "Bob" s = "Hello "Note: the data flows backwards (from right to left) read the = as 'becomes equal to'
Variables: Dry running • list the values of variables as each line is run: - - - - 8 - 8 8 3 8 3 5
Questions: Dry running • Produce a dry run table for the following code: - - - - - 3 5 3 9 3
Example: Moon Orbit v1.2 Declarationof Variable initial value change value Use ofVariable <html> <head><title>Moon orbit</title></head> <body style="background-color: Black;"> <img id="imgEarth" style="position: absolute; left: 200; top: 200;" src="Earth.gif" /> <img id="imgMoon" style="position: absolute;" src="Moon.gif" /> </body> </html> <script language="vbscript"> Option Explicit Dim ang Sub window_onLoad() imgMoon.style.posLeft = imgEarth.style.posLeft imgMoon.style.posTop = imgEarth.style.posTop + 150 window.setInterval "MoonRotate()", 50 ang = 0 End Sub Sub MoonRotate() ang = ang + 0.025 imgMoon.style.posLeft = imgEarth.style.posLeft + (Sin(ang) * 150) imgMoon.style.posTop = imgEarth.style.posTop + (Cos(ang) * 150) End Sub </script> • shorter code • invisible to user • memory efficient • faster execution
Option Explicit: Variable undefined • Must be first line of script • Useful to force explicit variable declaration: • Undeclared variables produce error message: <script language="vbscript"> Option Explicit Dim length length = 6 age = 5 </script>
Variables: Name redefined <script language="vbscript"> Option Explicit Dim x Dim y Dim x x = 23 y = 10 23 = x </script> • can't use same name again
Variables: Expected statement <script language="vbscript"> Option Explicit Dim x Dim y x = 23 y = 10 23 = x </script> • destination can't be literal
Example: Moon Orbit v1.3 • How can we change the speed and direction of the moon?
Questions: Variable declaration • Write a line of code that: • Declares a variable called x • Declares a variable called y • Declares a variable called surname Dim x Dim y Dim surname
Questions: Variable assignment • Write a line of code that: • Assigns the value of 23 to the variable y • Puts 14.6 into a variable called x • Assigns the value of ‘John’ to the variable surname y = 23 x = 14.6 surname = "John"
Questions: Variable assignment 2 • Write a line of code that: • Increases the value of x by 2.89 • Divides Km by 1.6 and puts the result in Miles x = x + 2.89 Miles = Km / 1.6
Example: GuessNum – Analysis • SPECIFICATION • User Requirements • need to keep children occupied/entertained, while learning about maths • Software Requirements • Functional: • computer picks a number between 0 and 10 • user enters a number • compare numbers and display appropriate message • Non-functionalshould be easy and fun to use
Example: GuessNum - Code GenerateRandomNumber between 0 and 9 <script language="vbscript"> Option Explicit Dim GuessNum Sub window_onLoad() Randomize GuessNum = Int(Rnd() * 10) lblResult.innerText = GuessNum End Sub Sub btnGuess_onClick() If CInt(txtGuessNum.value) = GuessNum Then lblResult.innerText = "Correct" Else lblResult.innerText = "Wrong, please try again" End If End Sub </script> Temporary line(helps us test)
Variables: Errors Option Explicit Dim z Sub window_onClick() Dim s Dim x Dim x y = 5 z = 5 End Sub OK, explicit variable declaration OK OK OK OK Duplicate definition error. Variable not defined error. OK, as z is page level
Variable Scope (what) • Scope – accessibility/visibility • Local (declared within procedure) • Page (general declarations)
Variable Scope (How) • Page variables • general declarations (top) • Local variables: • in procedures Option Explicit Dim mv Sub btnCalc_onClick() Dim lv1 ... End Sub Sub btnAdd_onClick() Dim lv2 ... End Sub
Variable Scope (why) • In short – Robustness of code/software • Protection from accidental outside interference • One of many responses to code that is • Difficult to maintain, and • Unreliable • House of cards phenomenon • Prevent: • Uncontrolled and ad hoc interactions between code • Always define things at lowest level needed
Variable Scope Errors Variable not defined error • Spot the error in the following: Option Explicit Sub btnCalc_onClick() Dim x x = 0 lblTotal.innerText = "£" + x End Sub Sub btnQuit_onClick() x = 0 lblTotal.innerText = "£" + x End Sub
Example: Ball Char (v2.5) <html> <head><title>Ball Char</title></head> <body style="background-color: Lime;"> <img id="imgBall" src="BallChar.gif" style="position: absolute;" /> </body> </html> <script language="vbscript"> Sub window_onLoad() window.setInterval "MoveBallRight()", 50 End Sub Sub MoveBallRight() If (imgBall.style.posLeft + 5 + imgBall.width) < (document.body.clientWidth) Then imgBall.style.posLeft = imgBall.style.posLeft + 5 Else window.setInterval "MoveBallLeft()", 50 End If End Sub Sub MoveBallLeft() If (imgBall.style.posLeft - 5) > 0 Then imgBall.style.posLeft = imgBall.style.posLeft - 5 Else window.setInterval "MoveBallRight()", 50 End If End Sub </script> previous solution: multiple timers erratic behaviour
Example: Ball Char (v3) local variable page variable <html> <head><title></title></head> <body style="margin-left: 0"> <img id="imgBall" src="BALLCHAR.gif" style="position: absolute" /> </body> </html> <script language="vbscript"> Dim hInc Sub window_onLoad() window.setInterval "BallMove()", 50 hInc = 5 End Sub Sub BallMove() Dim nxt nxt = imgBall.style.posLeft + hInc If nxt >= 0 And nxt + imgBall.width <= document.body.clientWidth Then imgBall.style.posLeft = nxt Else hInc = -hInc End If End Sub </script> Using variables: • shorter code • invisible to user • less memory • faster execution
Question: Variable Scope • Will this compile? Option Explicit Dim v Dim x … Sub window_onLoad() Dim z x = 23 y = "there" z = 12 end Sub btnTest_onClick() Dim y y = "hello" x = 67 z = 53 End Sub Is x in scope? Is y in scope? Is z in scope? Yes No Yes Yes Is y in scope? Is x in scope? Is z in scope? Yes No
Variable Names • Variables in same scope cannot have same name:
Tutorial Exercises: Moon Orbit • LEARNING OBJECTIVE:use variables to simplify and make code more dynamic • Task 1: Get Moon Orbit examples working (v1 to v1.2).The code is provided on the slides. • Task 2: Modify your page to allow the user to stop speed up and change the moon's direction (v1.3).Use the existing code as inspiration. • Task 3: Modify your page so that it makes a water noise when the mouse moves over the Earth, and the ohh noise over the moon.Use code from previous lectures as inspiration. • Task 4: Modify your page so that the diameter and mass of the Moon are displayed when the mouse moves over it. Do the same for the Earth. Go on-line to find the diameter and mass information.
Tutorial Exercises: Guess Num • LEARNING OBJECTIVE:use variables to simplify and make code more dynamic • Task 1: Get GuessNum example working. You will need to create the html for the text box, button, and labels. • Task 2: Modify GuessNum to tell the user whether their incorrect guess was higher of lower than the correct number. • Task 3: Modify GuessNum to only allow 5 attempts before picking a new number.
Tutorial Exercises: Ball Char • LEARNING OBJECTIVE:use variables to simplify and make code more dynamic • Task 1: Get the Ball Char (v3) example working. • Task 2: Add sound to the Ball Char (v3) example. • Task 3: Get the Ball Char moving diagonally, bouncing off all four sides of the window. • Task 4: Modify your page so that it allows the user to control how fast the ball character moves.