对VB.net中的数组感到困惑

时间:2014-01-12 11:37:37

标签: arrays vb.net

我正在开设一个大学项目,我必须创建一个程序,在教师表格中存储20个问题和答案,然后在学生表格上一个接一个地显示(点击下一个按钮后)

我遇到的问题是我可以输入问题和答案(数组0到19)但是当学生回答问题时,只会显示19个问题而最后一个问题没有出现。

让我知道我可以告诉你什么来帮助解决我的问题。

Module Module1
    Public myQ(0 To 19) As String
    Public myA(0 To 19) As String
End Module


Public Class frmTeacher
Public myCounter As Integer


Private Sub frmTeacher_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    myCounter = (0)
End Sub


Private Sub btnTeacherNext_Click(sender As Object, e As EventArgs) Handles btnTeacherNext.Click

    If myCounter < 19 Then

        myQ(myCounter) = txtTeacherQ.Text
        myA(myCounter) = txtTeacherA.Text
        myCounter = myCounter + 1

        txtTeacherQ.Text = ""
        txtTeacherA.Text = ""
    Else
        MsgBox("20 Questions Created, Moving on To Student Screen")
        Me.Hide()
        frmStudent1.Show()
    End If
End Sub

Public Class frmStudent1
    Dim myScore As Integer
    Dim MyCounter2 As Integer
    Public myNames As String
    Private Sub btnStudentHelp_Click(sender As Object, e As EventArgs) Handles btnStudentHelp.Click
        MsgBox("Questions will be shown to the left, Place your answer into the box on the right and click next")
    End Sub


    Private Sub frmStudent1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        lblStudentQ.Text = myQ(0)
        HideItAll()
        txtStudentName.Visible = True
        btnStart.Visible = True
    End Sub
    Private Sub HideItAll()
        lblStudentQ.Visible = False
        txtStudentA.Visible = False
        txtStudentName.Visible = False
        btnStudentHelp.Visible = False
        btnNextStudent.Visible = False
        btnStart.Visible = False
        btnStudentNext.Visible = False

    End Sub

    Private Sub btnStudentNext_Click(sender As Object, e As EventArgs) Handles btnStudentNext.Click

        If MyCounter2 < 19 Then
            If txtStudentA.Text = myA(MyCounter2) Then
                myScore = myScore + 1
            End If
            MyCounter2 = MyCounter2 + 1
            lblStudentQ.Text = myQ(MyCounter2)


        Else

            MsgBox("Your score is " + Str(myScore))
            myNames = myNames + txtStudentName.Text + ":  " + Str(myScore) + vbNewLine
            HideItAll()
            btnNextStudent.Visible = True
        End If
    End Sub

    Private Sub btnNextStudent_Click(sender As Object, e As EventArgs) Handles btnNextStudent.Click
        Me.Refresh()
        HideItAll()
        txtStudentName.Visible = True
        btnStart.Visible = True
    End Sub

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        myScore = 0
        MyCounter2 = 0
        If txtStudentName.Text = "teacher" Then
            MsgBox("The scores are as follows:  " + vbNewLine + myNames)
        End If
        HideItAll()
        lblStudentQ.Visible = True
        txtStudentA.Visible = True
        btnStudentHelp.Visible = True
        btnStudentNext.Visible = True
    End Sub
End Class

2 个答案:

答案 0 :(得分:2)

改变这个:

If MyCounter2 < 19 Then

为:

If MyCounter2 < 20 Then

或:

If MyCounter2 <= 19 Then

答案 1 :(得分:0)

将阵列声明为

Public myQ(0 To 19) As String

你已经有效地创建了一个可以托管20个字符串的数组,它们的索引最大为0到19。这意味着您的myCounter2变量可以具有最大值19,否则您将超出数组的范围。同时,如果您只显示索引少于19的问题和答案,那么您将丢失最后几个问题/答案

您应该使用这种条件

来修复您的代码
If MyCounter2 < myQ.Length Then
 .....

Array.Length返回可以存储在数组的所有维度中的元素数量(20) 使用此属性更好,因为如果您更改数组大小(假设您要问40个问题得到40个答案),那么您不需要检查代码的每一行来调整出现在各处的幻数。

但是,在更改之后,当MyCounter2值为19时,btnStudentNext_Clicks事件的这一行失败

    ' MyCounter2 = 19 + 1
    MyCounter2 = MyCounter2 + 1

    ' this fails because at this point MyCounter2 is 20
    lblStudentQ.Text = myQ(MyCounter2) 

您的代码可能会重构

Private Sub btnStudentNext_Click(sender As Object, e As EventArgs) Handles btnStudentNext.Click

    If MyCounter2 < myQ.Length Then
        If txtStudentA.Text = myA(MyCounter2) Then
            myScore = myScore + 1
        End If
        MyCounter2 = MyCounter2 + 1
    End if

    if MyCounter2 >= myQ.Length Then
       ShowResults();
    else            
        lblStudentQ.Text = myQ(MyCounter2)
        txtStudentA.Text = ""
    Endif
End Sub

Private Sub ShowResults()
    MsgBox("Your score is " + Str(myScore))
    myNames = myNames + txtStudentName.Text + ":  " + Str(myScore) + vbNewLine
    HideItAll()
    btnNextStudent.Visible = True
End Sub