Two dimensional arrays Two dimensional arrays A two

  • Slides: 41
Download presentation
Two dimensional arrays

Two dimensional arrays

Two dimensional arrays • A two dim array is doubly subscripted… • It has

Two dimensional arrays • A two dim array is doubly subscripted… • It has rows and columns • Tables of data are examples of two-dim arrays. • As with one-dim arrays, row and column length is fixed once the array is allocated • Arrays are homogeneous, so an array can’t store (for example) both floats and Strings

Applications in this ppt • • • UPS lookup using comboboxes UPS lookup using

Applications in this ppt • • • UPS lookup using comboboxes UPS lookup using textboxes Yearly Rainfall simulator Roster/exam grades Processing rows (or columns) of a 2 -d array

Manipulating 2 -d arrays • For a one dimensional array we usually use 1

Manipulating 2 -d arrays • For a one dimensional array we usually use 1 loop to traverse contents. • For 2 -D array we’ll usually use 2 loops, a “row” loop and a “column” loop. • The “outer” loop is the slow loop and determines the order of the traversal. • Each row (or column) or a 2 -d array is a 1 D array

Declaring data • If the data is known in advance it can be declared

Declaring data • If the data is known in advance it can be declared and initialized as a field value Dim data(, ) As Integer = {{12, 34, 56, 75}, {9, 2, 100, 6}, {500, 400, 300, 200}}

To display the data (row by row) in a listbox: For row = 0

To display the data (row by row) in a listbox: For row = 0 To 2 strdata = "" For col = 0 To 3 strdata = strdata & data(row, col) & Control. Chars. Tab Next Listdata. Items. Add(strdata) Next

exercises • For the previous example, write code for summing all the contents of

exercises • For the previous example, write code for summing all the contents of the array. • For the previous example, write code for finding the largest (smallest) element in the array. • What code would access the “diagonal” elements of a square array? • What code would “transpose” the contents of a square array? (swap rows to columns)

Row by row traversal

Row by row traversal

We might be interested in row (or column) computations – say sum contents of

We might be interested in row (or column) computations – say sum contents of a row Dim row, col, sum As Integer sum = 0 'one loop needed to traverse a one dimensional subarray row = Integer. Parse(txtrow. text) For col = 0 To 3 sum = sum + data(row, col) Next

Display of functionality

Display of functionality

The UPS rates application using comboboxes

The UPS rates application using comboboxes

Contents of weight combobox

Contents of weight combobox

Contents of zone combobox

Contents of zone combobox

Global (field) array declarations – note doubly subscripted array Dim rates(, ) As Decimal

Global (field) array declarations – note doubly subscripted array Dim rates(, ) As Decimal = {{1 D, 1. 5 D, 1. 65 D, 1. 85 D}, _ {1. 58 D, 2. 4 D, 3. 05 D}, _ {1. 71 D, 2. 52 D, 3. 1 D, 4 D}, _ {2. 04 D, 3. 12 D, 4 D, 5. 01 D}, _ {2. 52 D, 3. 75 D, 5. 1 D, 7. 25 D}} Dim weight() As Integer = {1, 3, 5, 10} Dim zone() As String = {"A", "B", "C", "D"}

Same, but using textboxes

Same, but using textboxes

The button code Dim weightindex, zoneindex As Integer Dim wtin As Integer wtin =

The button code Dim weightindex, zoneindex As Integer Dim wtin As Integer wtin = Integer. Parse(txtwt. Text) Dim wtfound, zonefound As Boolean wtfound = False zonefound = False weightindex = 0 zoneindex = 0 While (Not wtfound) And weightindex <= 3 If wtin <= weight(weightindex) Then wtfound = True Else weightindex += 1 End If End While If wtfound = False Then weightindex = 4 End If While zonefound = False And zoneindex <= 3 If Me. txtzone. Text. To. Upper() = zone(zoneindex) Then zonefound = True Else zoneindex += 1 End If End While If zoneindex <= 3 Then ' txtdisplay. Text = weightindex & " " & zoneindex txtdisplay. Text = rates(weightindex, zoneindex). To. String("N") Else Message. Box. Show("weight or zone incorrect", "data error", Message. Box. Buttons. OK, Message. Box. Icon. Exclamation) End If

A Rainfall simulator

A Rainfall simulator

remarks • This is not very realistic, as I did not use real rainfall

remarks • This is not very realistic, as I did not use real rainfall data to fill my rainfall array. • Real data could easily be incorporated: get (historic) max and min rainfall for each day, and use these numbers in your random generator. • But it shows how a simulator could be built to model weather (or something else). For example, a temperature simulator could be built similarly.

Global (field) values Dim rain(12, 31) As Double Dim nummonths As Integer = 12

Global (field) values Dim rain(12, 31) As Double Dim nummonths As Integer = 12 Dim months As String() = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} Dim days As Integer() = {31, 28, 31, 30, 31}

Form load fills rainfall array randomly Private Sub Rain. Fall_Load(By. Val sender As System.

Form load fills rainfall array randomly Private Sub Rain. Fall_Load(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles My. Base. Load Dim r As New Random(Date. Time. Now. Millisecond) Dim i, j As Integer For i = 0 To nummonths - 1 For j = 0 To days(i) - 1 rain(i, j) = r. Next. Double() * r. Next(0, 5) ’ not a very realistic simulation Next End Sub

The day-of-max-rain button Private Sub btnmaxday_Click(By. Val sender As System. Object, By. Val e

The day-of-max-rain button Private Sub btnmaxday_Click(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles btnmaxday. Click Dim i, j, m, d As Integer m=0 d=0 For i = 0 To nummonths - 1 For j = 0 To days(i) - 1 If rain(i, j) > rain(m, d) Then m=i d=j End If Next List. Box 1. Items. Add("Day of max rain was " & months(m) & d & "amt=" & rain(m, d). To. String("N 2")) End Sub

The month-of-min-rain button Private Sub btnminmon_Click(By. Val sender As System. Object, By. Val e

The month-of-min-rain button Private Sub btnminmon_Click(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles btnminmon. Click Dim i, j, m, d As Integer Dim sum, tot As Double tot = 99999 For i = 0 To nummonths - 1 sum = 0 For j = 0 To days(i) - 1 sum += rain(i, j) Next If sum < tot Then m=i tot = sum End If Next List. Box 1. Items. Add("Month of min rain was " & months(m) & " amt= " & tot. To. String("N 2")) End Sub

Other buttons and functionality • I didn’t code the other buttons. • You could

Other buttons and functionality • I didn’t code the other buttons. • You could add a button: Redo simulation to refill the rain array again randomly

An exam recorder

An exam recorder

Recording grades

Recording grades

Add grades for students

Add grades for students

Compute averages for each student

Compute averages for each student

Fields (globals) used Const classsize = 4 Public students As String() = {"Bob", "Marcy",

Fields (globals) used Const classsize = 4 Public students As String() = {"Bob", "Marcy", "Jane", "Pete"} Dim exams(classsize, 3) As Integer

Add a grade button code • use selectedindex from the two comboboxes to see

Add a grade button code • use selectedindex from the two comboboxes to see which student/ which exam score is being entered. • Check to make sure a legal row/col was selected and insert the grade into position (row=student#, col=exam#) of the exams array.

Add a grade button code Private Sub btnadd_Click(By. Val sender As System. Object, By.

Add a grade button code Private Sub btnadd_Click(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles btnadd. Click Dim row, col As Integer col = cboexam. Selected. Index() row = cbostudent. Selected. Index() If row >= 0 And row < 4 And col >= 0 And col < 3 Then exams(row, col) = Integer. Parse(txtexam. Text) Else Message. Box. Show("row=" & row & " col=" & col, "error", Message. Box. Buttons. OK) End If txtexam. Text = "" End Sub

Display button • Clear listbox. • Show names and which grades have been recorded.

Display button • Clear listbox. • Show names and which grades have been recorded. • Exams are all initialized to -99. In the loop, if a legal grade has not been recorded, a message is displayed for this exam. • 2 loops needed to traverse a 2 -D array, only one loop is needed for a 1 -D array. The outer loop adds a name from the name list onto the string to display, the inner loop adds an exam for this student, each time it goes around.

Display button code Private Sub btndisplay_Click(By. Val sender As System. Object, By. Val e

Display button code Private Sub btndisplay_Click(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles btndisplay. Click Dim i, j As Integer Dim displaystring As String List. Box 1. Items. Clear() For i = 0 To classsize - 1 displaystring = students(i) For j = 0 To 2 If exams(i, j) = -99 Then displaystring = displaystring & Control. Chars. Tab & "no grade" Else displaystring = displaystring & Control. Chars. Tab & exams(i, j) End If Next List. Box 1. Items. Add(displaystring) Next End Sub

Calculate averages • Clear listbox. • You need a sum (and, optionally, an ave

Calculate averages • Clear listbox. • You need a sum (and, optionally, an ave variable) of type double • For each set of scores (for each student) set sum=0. • Add across the row (inner loop) to the sum. • Display the name and average in the listbox.

Additions and improvements • Add labels for checkboxes • Add a clear-all button •

Additions and improvements • Add labels for checkboxes • Add a clear-all button • Have number of exams be a constant like number of students in this example. • Provide (buttons or combobox for) other exam statistics, like high grade, low grade, and overall mean.

Generic array manipulation

Generic array manipulation

About this example • An array is declared as a field value and filled

About this example • An array is declared as a field value and filled (either at compile or in form load) • Buttons provided to add across any given row or column • Array declaration at the top of class: Dim data(, ) As Integer = {{12, 34, 56, 75}, {9, 2, 100, 6}, {500, 400, 300, 200}}

About this example: formload displays array contents in listbox Private Sub Form 1_Load(By. Val

About this example: formload displays array contents in listbox Private Sub Form 1_Load(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles My. Base. Load Dim row, col As Integer Dim strdata As String For row = 0 To 2 strdata = "" For col = 0 To 3 strdata = strdata & data(row, col) & Control. Chars. Tab Next Listdata. Items. Add(strdata) Next End Sub

Sum by row button Private Sub btnrow_Click(By. Val sender As System. Object, By. Val

Sum by row button Private Sub btnrow_Click(By. Val sender As System. Object, By. Val e As System. Event. Args) Handles btnrow. Click Dim row, col, sum As Integer sum = 0 'one loop needed to traverse a one dimensional subarray row = Integer. Parse(txtrow. text) For col = 0 To 3 sum = sum + data(row, col) Next ‘outside loop list results Listdata. Items. Add("sum of row " & row & "=" & sum) End Sub

Sum by row

Sum by row

Sum a column

Sum a column