540 likes | 779 Views
CSCI 3131.01 Chapter 8 Arrays Instructor: Bindra Shrestha University of Houston – Clear Lake. Acknowledgement Dr. Xinhua Chen And Starting Out with Visual Basic 2010 by Tony Gaddis and Kip Irvine. Chapter 8 Arrays, Timers, and More Topics
E N D
CSCI 3131.01 Chapter 8 Arrays Instructor: Bindra Shrestha University of Houston – Clear Lake
Acknowledgement Dr. Xinhua Chen And Starting Out with Visual Basic 2010 by Tony Gaddis and Kip Irvine
Chapter 8 Arrays, Timers, and More • Topics • Declare and initialize a one-dimensional array • Search a one-dimensional array • Compute the sum and average of a one-dimensional array • Sort a one-dimensional array • Copy between arrays • Using For Each … Next with array • Create and manipulate parallel one-dimensional arrays • Create and initialize a two-dimensional array • Enabled property • Timer • Random number generation
Introduction • Arrays are like groups of variables that allow you to store sets of similar data • A single dimension array is useful for storing and working with a single set of data, like a column or a row of data. • A multidimensional array can be used to store and work with multiple sets of data. A two-dimensional array deals with data in a table. • Array programming techniques covered • Summing and averaging all the elements in an array • Summing all the columns in a two-dimensional array • Searching an array for a specific value • Using parallel arrays
Array Characteristics • An array stores multiple values of same type • Like a group of variables with a single name • For example, the days of the week might be: • a set of 7 string variables • with a maximum length of 9 characters • All variables within an array are called elementsand must be of the same data type • You access the elements in an array through a subscript
Subscript Characteristics • A subscript, also called an index, is a number that identifies a specific element within an array • Subscript numbering works like a list box index: • Subscript numbering begins at 0 • 1st element in an array is always subscript 0 • Last element is total number of elements – 1 • An array with 7 elements refers to the 1st element as subscript 0 and the last element as subscript 6
Declaring a One-Dimensional Array Dim ArrayName(UpperSubscript) As DataType • ArrayName is the variable name of the array • UpperSubscript is the value of the array's highest subscript • Must be a positive whole number • DataType may be any Visual Basic data type • VB knows an array is declared when name is followed by parentheses with number of elements
Array Declaration Example Dim intHours(5) As Integer intHours(0) intHours(1) intHours(2) intHours(3) intHours(4) intHours(5) • Note that 6 elements are available when an array with an upper subscript of 5 is declared • Each element is an integer type
Default Initialization • All elements of an Integer array are initialized to zero • Same initialization as an integer variable • Each array element is initialized exactly the same as a simple variable of that data type • A Single is initialized to zero (0.0) • A String is initialized to Nothing
Implicit Array Sizing & Initialization • An array can be initialized when declared • Example: • This array is implicitly sized • Upper subscript value is left blank • Number of elements implied from initialization • Upper subscript of 5 implied by this example • This results in a 6 element array • Elements are assigned the values shown Dim intNumbers() As Integer = {2, 4, 5, 7, 9, 12}
Named Constant as Upper Subscript • A named constant may be used as an array's highest subscript instead of a number • This is a common use for named constants • Highest subscript is often used multiple times • If highest subscript changes, use of a named constant allows it to be changed in one place Const UPPER_SUB As Integer = 100 Dim array(UPPER_SUB) As Integer
Working With Array Elements • Simply include the subscript to use an array element like an ordinary variable • intNumbers(2) refers to 3rd element of array intNumbers(0) = 100 intNumbers(1) = 200 intNumbers(2) = 300 intNumbers(3) = 400 intNumbers(4) = 500 intNumbers(5) = 600 decPay = intHours(3) * decRate intNumbers(0) += 1 MessageBox.Show(decPay(5).ToString())
Arrays and Loops • Loops are frequently used to process arrays • Use a loop to prompt for 10 values • Use a loop to reset values in the strNames array to an empty string Dim intNbrs(9) as Integers Dim intCount As Integer For intCount = 0 To 9 intNbrs(intCount) = CInt(InputBox("Enter number")) Next intCount Dim strNames(999) as String Dim intCount As Integer For intCount = 0 To 999 strNames(intCount) = "" Next intCount
Array Bounds Checking • Visual Basic checks each subscript value of each array reference used at run time • A subscript is invalid if it is • Negative • Greater than the UpperSubscript declared • An invalid subscript causes VB to throw a run-time exception • Bounds checking is not done at design time
For Each Loop Array Processing • A For…Each loop is similar to a For…Next • Iterates for each element in the array • strName is assigned the value of the next array element at each iteration • Tutorial 8-1 demonstrates array processing Dim strEmployees() As String = {"Jim", "Sally", _ "Henry", "Jean", "Renee"} Dim strName As String For Each strName In strEmployees MessageBox.Show(strName) Next strName
UseForEachTo Sum an Array Private intArray() as Integer = {10, 20, 90, -20) Dim intSum as Integer = 0 For Each intVal as Integer in intArray intSum = intSum + intVal Next • Start of iteration 1 intVal = 10 intSum = 0 • End of iteration 1 intVal = 10 intSum = 10 • Start of iteration 2 intVal = 20 intSum = 10 • End of iteration 2 intVal = 20 intSum = 30 • Start of iteration 3 intVal = 90 intSum = 30 • End of iteration 3 intVal = 90 intSum = 120 • End of iteration 4 intVal = -20 intSum = 120 • Start of iteration 4 intVal = -20 intSum = 100
UseForEachTo Find Largest Value Dim intArray() as Integer = {10, 20, 90, -20) Dim intLargest as Integer = intArray(0) For Each intVal as Integer in intArray If intVal > intLargest Then intLargest = intVal Next • Start of iteration 1 intVal = 10 intLargest = 10 • End of iteration 1 intVal = 10 intLargest = 10 • Start of iteration 2 intVal = 20 intLargest = 10 • End of iteration 2 intVal = 20 intLargest = 20 • Start of iteration 3 intVal = 90 intLargest = 30 • End of iteration 3 intVal = 90 intLargest = 90 • End of iteration 4 intVal = -20 intLargest = 90 • Start of iteration 4 intVal = -20 intLargest = 90
Determining Number of Elements • Arrays have a Length property that holds the number of elements in the array • Note that length is number of array elements, not the upper subscript of the array • Length property always 1 greater than the upper subscript Dim intValues(25) As Integer For intCount = 0 to (intValues.Length – 1) MessageBox.Show(intValues(intCount).ToString) Next intCount
Total the Values in an Array • Variable to hold sum (intTotal)is initialized to zero prior to loop • Iterate over all elements, adding each element to intTotal Dim intUnits(24) as Integer 'Declare array Dim intTotal As Integer = 0 'Initialize accumulator Dim intCount as Integer 'Declare loop counter 'Find total of all values held in array For intCount = 0 To (intUnits.Length – 1) intTotal += intUnits(intCount) Next intCount
Average the Values in an Array • Similar to previous example but then divides total by number of elements to get average Dim intUnits(24) as Integer 'Declare array Dim intTotal As Integer = 0 'Initialize accumulator Dim dblAverage as Double 'Declare average var Dim intCount as Integer 'Declare loop counter 'Find total of all values held in array For intCount = 0 To (intUnits.Length – 1) intTotal += intUnits(intCount) Next intCount 'Use floating-point division to compute average dblAverage = intTotal / intUnits.Length
Find Highest & Lowest Array Values • Pick first element as the highest • Search rest of array for higher values • If a higher value is located, save the value • Use similar logic to find lowest value Dim intNumbers(24) as Integer Dim intCount as Integer Dim intHighest as Integer = intNumbers(0) For intCount = 1 To (intNumbers.Length - 1) If intNumbers(intCount) > intHighest Then intHighest = intNumbers(intCount) End If Next intCount
Array Copy Using Loop • Copy one element at a time • Note that array copy cannot be done by a simple assignment intNewValues = intOldValues • Causes intNewValues array to reference the same memory location as intOldValues • Thus any change to intOldValues will affect intNewValues and vice versa • This is because arrays are object variables For intCount = 0 To intOldValues.Length -1 intNewValues(intCount) = intOldValues(intCount) Next intCount
Array Copy Using Copy Method of Array Syntax: Array.Copy(SourceArray, DestArray, length) Dim a() As Integer = {1, 2, 3, 4, 5, 6, 7, 8} Dim b() As Integer = {2, 3, 4, 5} Array.Copy(b, a, 4) '4 is the number of elements in b ' This makes array a contain: ' { 2, 3, 4, 5, 5, 6, 7, 8}
Parallel Arrays • Sometimes it’s useful to store related data in two or more arrays called parallel arrays • Causes the nth element of one array to be related to the nth element of another • Allows related data to be accessed using the same subscript on both arrays
Parallel Arrays Example • Assume the following array declarations • Element 1 refers to the same person with name in one array and address in the other Dim strNames(4) As String Dim strAddresses(4) As String strNames(0) strNames(1) strNames(2) strNames(3) strNames(4) Person #1 Person #2 Person #3 Person #4 Person #5 strAddresses(0) strAddresses(1) strAddresses(2) strAddresses(3) strAddresses(4)
Parallel Arrays Processing • Use parallel array processing to add name and address of each person to a list box • Tutorial 8-2 has an example of parallel arrays Dim strNames(4) As String Dim strAddresses(4) As String For intCount = 0 To 4 lstPeople.Items.Add("Name: " & strNames(intCount) _ & " Address: " & strAddresses(intCount)) Next intCount
Array & List Box Parallel Processing • A list box selection used as an array index ' Initialize a List Box with names lstPeople.Items.Add("Jean James") ' Subscript 0 lstPeople.Items.Add("Kevin Smith") ' Subscript 1 lstPeople.Items.Add("Joe Harrison") ' Subscript 2 ' Initialize an Array with corresponding phone numbers phoneNumbers(0) = "555-2987" phoneNumbers(1) = "555-5656" phoneNumbers(2) = "555-8897" ' Process a selection If lstPeople.SelectedIndex > -1 And _ lstPeople.SelectedIndex < phoneNumbers.Length Then MessageBox.Show(phoneNumbers(lstPeople.SelectedIndex)) Else MessageBox.Show("That is not a valid selection.") End If
Searching Arrays, The Search • Find 1st instance of value 100 in array intScores • intPosition gives position of this value Dim blnFound as Boolean = False Dim intCount as Integer = 0 Dim intPosition as Integer = -1 ' Search for a 100 in the array Do While Not blnFound And intCount < scores.Length If intScores(intCount) = 100 Then blnFound = True intPosition = intCount End If intCount += 1 Loop
Searching Arrays, The Result • Indicates whether the value was found • If found, position is given as a test number ' Was 100 found in the array? If blnFound Then MessageBox.Show( _ "Congratulations! You made a 100 on test " & _ (intPosition + 1).ToString, "Test Results") Else MessageBox.Show( _ "You didn’t score a 100, but keep trying!", _ "Test Results") End If
Sorting an Array, Ascending • Arrays have a Sort method • Arranges elements in ascending order (lowest to highest) • Sort intNumbers in this order: {1, 3, 6, 7, 12} • Sort strNames in this order: {Alan, Bill, Kim, Sue} Dim intNumbers() As Integer = { 7, 12, 1, 6, 3 } Array.Sort(intNumbers) Dim strNames() As String = { "Sue", "Kim", _ "Alan", "Bill" } Array.Sort(strNames)
Sorting an Array, Descending • Use the Sort method in conjunction with the Reverse method • Arranges elements in descending order (highest to lowest) • Sort intNumbers in this order: {12, 7, 6, 3, 1} • Dim intNumbers() As Integer = { 7, 12, 1, 6, 3 } • Array.Sort(intNumbers) • Array.Reverse() • Sort strNames in this order: {Sue, Kim, Bill, Alan} • Dim strNames() As String = { "Sue", "Kim", _ • "Alan", "Bill" } • Array.Sort(strNames) • Array.Reverse()
Dynamically Sizing an Array ReDim [Preserve] Arrayname(UpperSubscript) • ReDim is a new keyword • Used to change the number of elements at run time • If Preserve is specified, the existing contents of the array are preserved • Arrayname names the existing array • UpperSubscript specifies the new highest subscript value • Can declare an array with no subscript and state number of elements later with ReDim
Resizing Example • Array sngScoresdeclared with no elements • User prompted for number of elements • ReDim resizes array based on user input Dim sngScores() As Single ' Declared with no elements Dim intNumScores as Integer ' Obtain number of elements from the user intNumScores = CInt(InputBox("Enter number of test scores")) If intNumScores > 0 Then ReDim sngScores(intNumScores - 1) Else MessageBox.Show("You must enter 1 or greater.") End If
Passing Arrays as Arguments to Procedures • Array intNumbers passed to DisplaySum sub • Sub computes & shows sum of array elements • Can pass any integer array to DisplaySum Dim intNumbers() As Integer = { 2, 4, 7, 9, 8, 12 } DisplaySum(intNumbers) Sub DisplaySum(ByVal intArray() As Integer) Dim intTotal As Integer = 0 ' Accumulator Dim intCount As Integer ' Loop counter For intCount = 0 To (intArray.Length - 1) intTotal += intArray(intCount) Next MessageBox.Show("Total is " & intTotal.ToString) End Sub
Passing Arrays: ByVal and ByRef • When passing an array ByVal • Calling procedure “sees” sub procedure changes to element values • Simple variables don’t work this way • If sub assigns array argument to another array, no effect on array in calling procedure • When passing an array ByRef • Calling procedure “sees” sub procedure changes to element values • If sub assigns array argument to another array, calling procedure array values affected
Passing Arrays Example • After ResetValues procedure executes, intNumbers array still contains { 1, 2, 3, 4, 5 } • If array passed ByRef, intNumbers array will contain { 0, 0, 0, 0, 0 } after procedure runs Dim intNumbers() As Integer = { 1, 2, 3, 4, 5 } ResetValues(intNumbers) Sub ResetValues(ByVal intArray() As Integer) Dim newArray() As Integer = {0, 0, 0, 0, 0} intArray = newArray End Sub
An Array Returned From a Function • Return type String() indicates array of strings returned • Thus the function result must be assigned to an array of strings Function GetNames() As String() ' Get four names from user ' Return them as an array of strings. Dim strNames(3) As String Dim strInput As String Dim intCount As Integer For intCount = 0 To 3 strInput = InputBox("Enter name " & _ (intCount + 1).ToString) strNames(intCount) = strInput Next Return strNames End Function
A Two Dimensional Array Picture • Thus far, arrays have been one-dimensional • Arrays can also be two-dimensional • A two-dimensional array looks like a spreadsheet with rows and columns Column 0 Column 1 Column 2 Column 3 Row 0 Row 1 Row 2
Two Dimensional Array Syntax Dim ArrayName(UpperRow, UpperColumn) As DataType • UpperRow and UpperColumn give the highest subscript for the row and column indices of the array • The array on the previous slide could be: • Defines three rows; 0, 1, and 2 • And four columns; 0, 1, 2, and 3 Dim array(2,3) As Single
Two Dimensional Array Subscripts Dim array(2,3) As Single Column 0 Column 1 Column 2 Column 3 Row 0 sngScores(0,0) sngScores(0,1) sngScores(0,2) sngScores(0,3) Row 1 sngScores(1,0) sngScores(1,1) sngScores(1,2) sngScores(1,3) Row 2 sngScores(2,0) sngScores(2,1) sngScores(2,2) sngScores(2,3)
Nested Loops And Two Dimensions • Must use two subscripts to indicate a single element in a two dimensional array • Nested loops are often used to specify subscripts for two-dimensional array processing • For example, a nested loop below is used to insert a value into every element of array scores For intRow = 0 To 2 For intCol = 0 To 3 intNum = Val(InputBox("Enter a score.")) sngScores(intRow, intCol) = intNum Next intCol Next intRow
Implicit Sizing and Initialization • Can be used with multi-dimensional arrays: • Row 0 values • Row 1 values • Row 2 values • Initializes array intNumberswith the following values Dim intNumbers(,) As Integer = _ { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }
Sum Columns, 2-Dimensional Array • Code below uses nested loops to compute sum of elements in each column of a 2 dimensional array • Outer loop controls column subscript Dim intValues(,) As Integer = {{1, 2, 3, 4}, _ {5, 6, 7, 8}, _ {9, 10, 11, 12}} For intCol = 0 to 3 intTotal = 0 'Initialize accumulator For intRow = 0 to 2 'Sum rows in this column intTotal += intValues(intRow, intCol) next intRow 'Display the sum of the column MessageBox.Show("Column " & intCol.ToString() _ & " sum is " & intTotal.ToString) Next intCol
Three-Dimensional Arrays & Beyond • VB allows arrays of up to 32 dimensions • Can think of a 3 dimensional arrayas having multiple pages of two dimensional arrays • Arrays beyond three dimensions are difficult to visualize • But, all one needs to do is to be consistent in the use of the different indices
Enabled Property • Most controls have an Enabled property • If this Boolean property is set to false, the control is disabled, meaning the control: • Cannot receive the focus • Cannot respond to user generated events • Will appear dimmed, or grayed out • Default value for this property is true • May be set in code when needed as shown: btnExample.Enabled = False
Timer Control • A Timer control generates Tick events • Double-click on Timer tool in Toolbox to add • Appears in component tray • Standard prefix is tmr • Can perform a process at regular intervals by coding the process in a Tick event procedure • Two important properties • Enabled must be true to generate Tick events • Interval (milliseconds) decides tick frequency • Interval of 1000 causes 1 timer tick per second • Tutorial 8-5 demonstrates the Timer control
Splash Screens • A form, often with an application logo, that is displayed while an application is loading • A splash screen usually: • Has Topmost property set to True so it is displayed over the forms of other applications • Disappears shortly by using a Timer • Is modeless so the application continues to load while the splash screen is displayed • Tutorial 8-6 demonstrates a splash screen
Anchor Property • Anchor - a property of various form controls • A control anchored to a form edge keeps the same distance to the form edge • Controls may be anchored to any, all, or none of the right, left, top, or bottom edges • Default is to anchor to top and left edges • Can just as easily anchor to bottom right • If anchoring to opposing sides, control is resized when form is resized • Anchoring to all 4 sides causes control to be resized proportionally to form
Dock Property • Dock - a property of various form controls • A control docked to a form edge is placed directly against the form edge • Controls may be docked to • Any one form edge but not more than one • No edge or not docked (the default) • Length or width of docked control changes to match length or width of the form edge
Initial Random Number Generation • Often used for games and simulations • Must create an instance of the Random class to use random number methods and properties • May supply a seed number as below so the same set of random numbers are generated every time • If no seed number is supplied when instantiated: • VB uses its default random number seed • Causes each sequence to be unique Private rand as New Random Private rand as New Random(25)