1

这只是我的一段代码,但它给我带来了问题。代码的预期目的是获取用户输入并使其成为数组的大小。但是,无论我输入什么值,它都会给我错误“索引超出数组范围”。

这是代码:

Option Explicit On
Option Strict On

Imports System

Module numbers
    Sub Main()
        'index decides number of candidates.
        Dim index as integer
        Dim candidate(index) as integer

        Console.Write("Please enter the number of candidates in the election: ")
        index=Convert.toInt32(Console.Readline())

        Do Until candidate(index) >= 0
            Console.Write(" Enter the name of candidate: ")
            candidate(index)=Convert.toInt32(Console.Readline())

            candidate(index) -=1
        Loop
    End Sub
End Module
4

3 回答 3

1

当仍然等于 0 时,您正在声明数组的大小。index您需要将数组声明移动到index设置为输入值的行下方:

' ...
Console.Write("Please enter the number of candidates in the election: ")
index=Convert.toInt32(Console.Readline())
Dim candidate(index) as integer
' ...

就循环而言,我对您要完成的工作完全感到困惑,但看起来确实有更好的方法来做到这一点。如果您要解释您对该循环的意图,我可能会建议一个更好的算法。

于 2012-10-09T13:22:23.777 回答
1

你这里有几个问题。

首先,您需要在知道数组有多大之后对其进行初始化。

其次,你会发现 For 循环比 Do 循环更容易实现逻辑,因为你不需要手动跟踪循环计数器。

最后,您将候选名称转换为整数。大多数人的名字都不是数字!

Sub Main()
    'index decides number of candidates.
    Dim index as integer

    Console.Write("Please enter the number of candidates in the election: ")
    index=Convert.toInt32(Console.Readline())

    ' We now know how big the array needs to be so you can initialise it.
    Dim candidate(index) as integer

    ' We use a For loop so that we don't have to worry about the 
    ' loop counter ourselves.
    For i As Integer = 0 to (index - 1)
        Console.Write(" Enter the name of candidate: ")
        ' Your candidate names appear to be an integer - 
        ' Surely that's not right??! I think you meant
        ' candidate(i) = Console.Readline()
        candidate(i)=Convert.toInt32(Console.Readline())
    Next
End Sub
于 2012-10-09T13:22:41.687 回答
0

如果我没看错,您正在使用 Index 给候选人一个大小。但是你在它从控制台获取值之前使用它。所以它的大小为 0。将 Dim 状态移到 readline 之后。此外,您应该使用 integer.tryparse 之类的东西来读取控制台。

另外,我不明白你 do while 的目的,a for i = to index 会更清楚......

于 2012-10-09T13:24:31.833 回答