Today we talked about dealing with student grades using arrays. We would have an array that would hold the students' identifying information (such as name or ID number) and then arrays for all of the students' grades. Remember, these are called
Parallel Arrays.
Example:
Public Class Form1
'Global Variables:
Dim students(5) As String
Dim hw1(5) As Double
Dim hw2(5) As Double
Dim hw3(5) As Double
...
...
We have declared these arrays as
Global so that we will be able to use them in all subroutines, and also so that we will not loose the information stored in them for the duration of the program. Here are what the resulting arrays look like:
students()
0 1 2 3 4
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
hw1()
0 1 2 3 4
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
hw2()
0 1 2 3 4
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
hw3()
0 1 2 3 4
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
As we can see,
Student1's information will reside in
index 1 of all the arrays.
CodeWe wrote two subroutines, one to get the information from the user and one to find and print the information for a particular student.
Here is the code for getting the student information:
Sub form_load()
For i As Integer=0 To students.GetUpperBound(0)
students(i) = InputBox("Enter student " & _
CStr(i) & "'s name:")
hw1(i) = CDbl(InputBox("Enter homework 1:"))
hw2(i) = CDbl(InputBox("Enter homework 2:"))
hw3(i) = CDbl(InputBox("Enter homework 3:"))
Next
End Sub
Here is the code for a linear search of a student:
Sub btnSearch_Click()
Dim sname As String
Dim found As Boolean = False
sname = InputBox("Enter student's name:")
For i As Integer = 0 To students.GetUpperBound(0)
If sname = students(i) Then
listbox1.Items.Add(hw1(i))
listbox1.Items.Add(hw2(i))
listbox1.Items.Add(hw3(i))
found = True
Exit For
End If
Next
If Not found Then
MsgBox("Student not found",,"")
End If
End Sub
2-Dimensional ConversionWe can convert the 1-dimensional grade parallel arrays into a two dimensional array. The names of the students must remain a separate 1-dimensional array, however since its type is different. Here are the declarations:
Public Class Form1
'Global Variables:
Dim students(5) As String
Declare hw() with 3 rows and 5 columns:
Dim hw(3,5) As Double
...
...
Resulting in the following arrays:
students()
0 1 2 3 4
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
hw()
0 1 2 3 4
+----+----+----+----+----+
0 | | | | | |
+----+----+----+----+----+
1 | | | | | |
+----+----+----+----+----+
2 | | | | | |
+----+----+----+----+----+
Rewritten CodeIn the hw() array, each row represents a HW grade and each column represents the grades for each student. Now we will rewrite our subroutines:
Sub Form_Load()
For i As Integer=0 To students.GetUpperBound(0)
students(i) = InputBox("Enter student " & _
CStr(i) & "'s name:")
hw(0,i) = CDbl(InputBox("Enter homework 1:"))
hw(1,i) = CDbl(InputBox("Enter homework 2:"))
hw(2,i) = CDbl(InputBox("Enter homework 3:"))
Next
End Sub
Here is the code for a linear search of a student:
Sub btnSearch_Click()
Dim sname As String
Dim found As Boolean = False
sname = InputBox("Enter student's name:")
For i As Integer = 0 To students.GetUpperBound(0)
If sname = students(i) Then
listbox1.Items.Add(hw(0,i))
listbox1.Items.Add(hw(1,i))
listbox1.Items.Add(hw(2,i))
found = True
Exit For
End If
Next
If Not found Then
MsgBox("Student not found",,"")
End If
End Sub
If we wanted to reduce the three lines dealing with the HW grades into one line, we could add another
For loop to loop through the grades:
Sub Form_Load()
For i As Integer=0 To students.GetUpperBound(0)
students(i) = InputBox("Enter student " & _
CStr(i) & "'s name:")
For j As Integer=0 To hw.GetUpperBound(0)
hw(j,i) = CDbl(InputBox("Enter homework " & CStr(j)))
Next
Next
End Sub
Here is the code for a linear search of a student:
Sub btnSearch_Click()
Dim sname As String
Dim found As Boolean = False
sname = InputBox("Enter student's name:")
For i As Integer = 0 To students.GetUpperBound(0)
If sname = students(i) Then
For j As Integer=0 To hw.GetUpperBound(0)
listbox1.Items.Add(hw(j,i))
Next
found = True
Exit For
End If
Next
If Not found Then
MsgBox("Student not found",,"")
End If
End Sub
.GetUpperBoundRemember for 1-dimensional arrays the
.GetUpperBound() function returns the number of the last possible index so:
students.GetUpperBound(0)
returns 4.
For 2-dimensional arrays we have two indeces in which we are interested: one that indicates the highest index of rows, and one that indicates the highest index of columns. Therefore there are two possible
GetUpperBound() calls:
'Get the last index of rows
hw.GetUpperBound(0)
'Get the last index of columns
hw.GetUpperBound(1)
We have used this in our rewritten subroutines above.