Chapter 7 – Arrays 7.1 Creating and Accessing Arrays 7.4 Two-Dimensional Arrays 1 Simple and Array Variables • A scalar variable (or simple variable) is a name to which Visual Basic can assign a single value. • These are the variables we have used to date • An array variable is a collection of simple variables of the same type to which Visual Basic can efficiently assign a list of values. 2 Example Suppose you want to evaluate the exam grades for 30 students and to display the names of the students whose scores are above average. We need a total of 60 simple variables! Private Sub btnDisplay_Click(...) _ Handles btnDisplay.Click Dim student0 As String, score0 As Double Dim student1 As String, score1 As Double . . Dim student29 As String,score29 As Double How practical is this? 3 Using Arrays Upper bound of subscripts in the array Dim students(29) As String Dim scores(29) As Double Array name Data type Only two array variables needed for 30 data items 4 Putting Values into an Array students(0) = "Tom Brown" Subscript (index) Read: "students sub zero equals Tom Brown" Which means that the string "Tom Brown" is being stored at the first location in the array called students because all arrays begin counting at 0. 5 Array Terminology • Dim arrayName(n) As DataType • 0 is the lower bound of the array • n is the upper bound of the array–the last available subscript in this array • The number of elements, n + 1, is the size of the array. 6 Example 7.1.1: Form mtbNumber txtWinner 7 Example 7.1.1: Code Subscript (also called Index) 8 Example 7.1.1: Code and Output Subscript starts at 0 Count starts at 1 Assigning the selected element of the array into the TextBox’s Text property. The array is local, and is assigned values every time the button is clicked. 9 Load Event Procedure Occurs as the Form loads in memory (when the program first executes) Private Sub frmName_Load(...) _ Handles MyBase.Load The keyword MyBase refers to the form being loaded. This event procedure is a good place to assign values to an array. Why should array variables be assigned when form loaded? 10 Form Load Example 7.1.2: Code Class variable, not local variable. Array loads when form is run By making the array a class variable and loading it in the Form Load, you only need to create the array once. 11 Initializing Arrays Arrays may be initialized when created: Dim arrayName() As DataType = {value0, value1, value2, ..., valueN} declares an array having upper bound N and assigns value0 to arrayName(0), value1 to arrayName(1), ..., and valueN to arrayName(N). Rather than explicitly specifying the array’s size, it is determined based on the number of initial values that are assigned. Example: Dim teamNames() As String = {"Packers", "Packers", "Jets", "Chiefs"} 12 Array Methods arrayName.Count number of elements arrayName.Max highest value arrayName.Min lowest value arrayName.First first element arrayName.First is same as arrayName(0) arrayName.Last last element 13 Methods for Numeric Arrays numArrayName.Average average value of elements numArrayName.Sum sum of values of elements 14 Using Loops Instead of Methods • In Example 7.1.4 the greatest value in a numeric array ages is determined. • The value of the variable max is set to the first element of the array. • Then a For…Next loop successively examines each element of the array and resets the value of max when appropriate. 15 Loop reading array Example 7.1.4: Code Dim ages() As Integer = {55, 56, 61, 52, 69, 64, 46, 54, 47} 'last 9 presidents Dim max As Integer = ages(0) For i As Integer = 1 To ages.Count - 1 If ages(i) > max Then Start at position 0 max = ages(i) The loop counter is the subscript End If Next txtOutput.Text = "Greatest age: " & max Output: Greatest age: 69 16 For Each Loops For i As Integer = 1 To ages.Count - 1 If ages(i) > max Then max = ages(i) End If Next can be replaced with For Each age As Integer In ages If age > max Then max = age End If Next 17 For Each Loops (continued) • In the For…Next loop, the counter variable i can have any name. • In the For Each loop, the looping variable age can have any name. • The primary difference between the two types of loops is that in a For Each loop no changes can be made in the values of elements of the array. 18 Passing an Array Element A single element of an array can be passed to a procedure just like any ordinary numeric or string variable. Private Sub btnDisplay_Click(...) Handles _ btnDisplay.Click Dim num(20) As Integer num(5) = 10 lstOutput.Items.Add(Triple(num(5))) End Sub Function Triple(ByVal x As Integer) As Integer Return 3 * x End Function 19 Passing Arrays to Procedures • An array declared in a procedure is local to that procedure. • An entire array can be passed to a Sub or Function procedure. • The calling statement uses the name of the array without parentheses. • The header of the Sub or Function procedure uses the name with an empty set of parentheses. 20 Example: 7.1.6 Variation of Example 7.1.4 Function procedure used to find the largest number in an array. The loop counter is the subscript What is the scope of the array? 21 Input assigned to array Example 7.1.7 3-Use of Average Method 1-Set size of array based on user input 2-Loop saving each grade to the array 22 User-Defined Array-Valued Functions Headers have the form Function FunctionName(ByVal var1 As Type1, ByVal var2 As Type2, ...) As DataType() 23 Searching for an Element in an Array A statement of the form numVar = Array.IndexOf(arrayName, value) assigns to numVar the index of the first occurrence of value in arrayName. Or assigns -1 if the value is not found. 24 Searching an Array: Example 7.1.8 -1 if item not found No error checking – name must be in correct case 25 Copying an Array If arrayOne and arrayTwo have been declared with the same data type, then the statement arrayOne = arrayTwo makes arrayOne an exact duplicate of arrayTwo. Actually, they share the same location in memory. 26 Split Method • Facilitates working with text files. • Split can convert a string containing commaseparated data into a string array. • The 0th element of the array contains the text preceding the first comma, the 1st element contains the text between the first and second commas, ..., and the last element contains the text following the last comma. 27 Split Example For instance, suppose the string array employees has been declared without an upper bound, and the string variable line has the value “Bob,23.50,45”. employees = line.Split(","c) • • • • sets the size of employees to 3 sets employees(0) = “Bob” sets employees(1) = “23.50” sets employees(2) = “45” 28 Split Comments employees = line.Split(","c) • In this example, the character comma is called the delimiter for the Split method, and the letter c specifies that the comma has data type Character instead of String • Any character can be used as a delimiter. If no character is specified, the space character will be used as the delimiter. 29 Example Private Sub btnConvert_Click(...) _ Handles btnConvert.Click Dim stateData(), line As String line = "California,1850,Sacramento,Eureka" stateData = line.Split(","c) For Each entry As String In stateData lstOutput.Items.Add(entry) Next End Sub 30 Example Output California 1850 Sacramento Eureka 31 Example 7.1.9 Letter ‘c’ designates character instead of string 32 Join Function The reverse of Split method is Join function. Join concatenates the elements of a string array into a string containing the elements separated by a specified delimiter. Sets up Array Dim greatLakes() As String = {"Huron", "Ontario", "Michigan", "Erie", "Superior"} Dim lakes As String lakes = Join(greatLakes, ",") Join & assign to lakes txtOutput.Text = lakes Output: Huron,Ontario,Michigan,Erie,Superior 33 Out of Range Error The following code references an array element that doesn't exist. This will cause an error. How many items are in the Tree array? What are the subscripts? 34 Text Files • Hold data to be processed by programs. • Can be created, viewed, and managed by word processors, Notepad, or by the Visual Basic IDE. • Have the extension .txt • Normally placed in the bin\Debug folder in the Solution Explorer • Can be used to “load” array with loop 35 A Text File Displayed in the Visual Basic IDE (7.1.3) The file contains the ages of the first 44 U.S. presidents when they assumed office. 36 Using a Text File to Populate a String Array • Assume that the previous text file is in the program’s bin\Debug folder. • The text file can be used to fill a string array with the statement Dim strAges() As String = IO.File.ReadAllLines("AgesAtInaugural.txt") • The array strAges will have size 44 and upper bound 43. 37 Populating a Numeric Array with a Text File Dim strAges() As String = IO.File.ReadAllLines("AgesAtInaugural.txt") Dim ages(43) As Integer For i As Integer = 0 To 43 ages(i) = CInt(strAges(i)) Next Class The File class’s ReadAllLines method opens the designated file, reads all lines, and returns a string array containing these values. (definition of object with properties and methods) Argument (data passed to a method) IO.File.ReadAllLines("AgesAtInaugural.txt") Namespace (a collection of related classes) Method (function or sub of a class) 38 Example 7.1.3 39 Example 7.1.3 Read data from file 40 Example 7.1.3 Convert from string to integer, and place into integer array 41 Example 7.1.3 Various methods of the Array class 42 Example 7.1.5 • This example illustrates several topics • Reading from a text file • Manipulating Form’s properties in the code • Looping through an array, using a flag to determine if something has been found • Resizing an array using the ReDim Preserve statement 43 44 Example 7.1.5 – Form Load Read from text file into array 45 Example 7.1.5 – Form Load Determine the number of elements in the array 46 Example 7.1.5 – Form Load Dynamically set the form’s title text 47 Example 7.1.5 – Form Load Dynamically set the button’s text 48 Example 7.1.5 – btnDisplay 49 Example 7.1.5 – btnDisplay Looping through the array to display the game numbers that the specified team has won. Note the use of the loop counter variable to index into the array 50 Flag Variables • Have type Boolean • Used when looping through an array • Provide information to be used after loop terminates. Or, allows for the early termination of the loop. 51 Example 7.1.5 – btnDisplay Use of the flag variable noWins to decide whether to display a no win message Start by assuming no wins If a win was found, set the flag to false Only if we never found a match will we display the No Games Won message 52 Example 7.1.5 – btnAddWinner Code for increasing the size of the array and adding a new winner to the list of Super Bowl winners 53 ReDim Statement The size of an array may be changed after it has been created. ReDim arrayName(m) or ReDim Preserve arrayName(m) where arrayName is the name of an already declared array and m is an Integer literal, variable, or expression, changes the upper bound of the array to m. Size may change but data type cannot 54 Preserve Keyword ReDim arrayName(m) resets all values to their default. This can be prevented with the keyword Preserve. ReDim Preserve arrayName(m) resizes the array and retains as many values as possible. 55 Example 7.1.5 – btnAddWinner Use ReDim Preserve to set a new size to the array and keep the existing data. Before ReDim Preserve After ReDim Preserve 56 Example 7.1.5 – btnAddWinner Modify the Form’s title and the text of the button. Before After 57 Simple File Write Example • This example illustrates the following: • Splitting a string into an array • Writing to a file • Catching a runtime error (an exception) and posting an error message when the exception occurs 58 Simple File Write Example 59 Simple File Write Example If it is a valid file path, the file will be written OK. 60 Simple File Write Example If it is a not a valid file path, or the string is empty, the file will be not be written and an error message will appear. 61 Simple File Write Example Splitting the string into an array (delimiter is the space character) 62 Simple File Write Example Writing the file from the array. The writeAllLines method takes two arguments: 1) The file path (including file name) 2) The array to write 63 Exception Handling • You can gracefully handle runtime errors (exceptions) using the Try-Catch block • In the Try portion, you have all the code that you want to try to execute, some of which may generate an exception • In the Catch portion, you have the code that should run in the event of an error • If an exception occurs during the Try code, processing will automatically branch to the Catch code 64 Simple File Write Example Exception-handling. If there is any problem writing the file, the error message will appear. Without the Try-Catch block, an exception would cause the program to abort…very ugly! 65 7.4 Two-Dimensional Arrays • Declaring a Two-Dimensional Array Variable • Implicit Array Sizing and Initialization • Filling a Two-Dimensional Array with a Text File • Various operations on a 2D Array • Other notes on 2D Arrays 66 Declaring a Two-Dimensional Array Variable • One-dimensional arrays store a list of items of the same type • Two-dimensional arrays store a table of items of the same type. • (i.e. 2D array is an array of 1D arrays) • Consider the rows of the table as numbered 0, 1, 2, ,,, m and the columns numbered 0, 1, 2, …, n. Then the array is declared with Dim arrayName(m, n) As DataType Item in ith row, jth column: arrayName(i,j) 67 Implicit Array Sizing and Initialization Arrays can be initialized when they are declared. Dim arrayName(,) As DataType = {{ROW0}, {ROW1}, {ROW2}, ..., {ROWn}} declares a two-dimensional array where ROW0 consists of the entries in the top row of the corresponding table delimited by commas, and so on. R0Wn is a 1D array! 68 Example 7.4.PracProb1 69 Road-Mileage Table Chicago LA NY Philly Chicago 0 2054 802 738 LA 2054 0 2786 2706 NY 802 2786 0 100 Philly 738 2706 100 0 70 Road-Mileage Array Dim rm(,) As Double = {{0, 2054, 802, 738}, {2054, 0, 2786, 2706}, {802, 2786, 0, 100}, {738, 2706, 100, 0}} declares and initializes an array of roadmileages. Some elements of the array are rm(0,0)=0, rm(0,1)=2054, rm(1,2)=2786 Note: Always rm(m,n) = rm(n,m). It makes no difference what city you start with. ChicagoLA is the same as LA Chicago 71 Filling a Two-Dimensional Array with a Text File Dim rm(3, 3) As Double 'road mileage Dim rowOfNums() As String = IO.File.ReadAllLines("Distances.txt") Dim line, data() As String For i As Integer = 0 To 3 line = rowOfNums(i) data = line.Split(""c) For j As Integer = 0 To 3 rm(i, j) = CDbl(data(j)) Next Next Text File Distances.txt 0,2054,802,738 2054,0,2786,2706 802,2786,0,100 738,2706,100,0 For each row or the 2D array, create a temporary 1D array for the corresponding element of the rowOfNums array array, then fill the row of the 2D array with the values from the 1D array. 72 Example: TwoDArrayExample 73 Example: TwoDArrayExample Nested loop produces output from array. Outer loop goes row by row. Inner loop goes column by column. 74 Example: TwoDArrayExample User inputs to determine the row and column to retrieve. 75 Example: TwoDArrayExample • NumericUpDown Control • Displays numbers in a list that can be scrolled; selected number can also be typed • Important properties: • Minimum – lowest number in the list • Maximum – highest number in the list • Increment – units of change (default=1) 76 Example: TwoDArrayExample Nested loop to search for a value in the array. Outer loop counter is the row. Inner loop counter is the column. 77 Notes on Two-Dimensional Arrays An unsized two-dimensional array can be declared with a statement of the form Dim arrayName(,) As varType 78 GetUpperBound Method After execution of the statement Dim arrayName(r, s) As varType the value of arrayName.GetUpperBound(0) is r, and the value of arrayName.GetUpperBound(1) is s. 79 ReDim and Two-Dimensional Arrays • An already-created array can be resized with ReDim arrayName(r, s) which loses the current contents, or with ReDim Preserve arrayName(r, s) • When Preserve is used, only the columns can be resized. • ReDim cannot change the number of dimensions in the array. 80