-1

它一直困扰着我几个小时,因为它总是在 numbers[i] 处返回 0,我无法弄清楚问题所在。代码适用于不同的程序,但我必须对其进行更改,以便它可以具有自定义数组大小,而那时一切都出错了。任何帮助都会很棒。提前致谢。

int[] numbers = new int[Convert.ToInt16(TxtArray.Text)];
int j = 0;
for (j = numbers.Length; j >= 0; j--)
{
    int i = 0;
    for (i = 0; i <= j - 1; i++)
    {
        string NumbersInput = Microsoft.VisualBasic.Interaction.InputBox("Enter Numbers to be sorted",
                "Numbers Input", "", -1, -1);
        numbers[i] = Convert.ToInt16(NumbersInput);     
       //returns 0 in if statement
        if (numbers[i] < numbers[i + 1])
        {           
            int intTemp = 0;
            intTemp = numbers[i];
            numbers[i] = numbers[i + 1];
            numbers[i + 1] = intTemp;
        }
    }
}

for (int i = 0; i < numbers.Length; i++)
{
    LstNumbers.Items.Add(numbers[i]);
}
4

2 回答 2

0
 private void button1_Click(object sender, EventArgs e)
{
  int sizeOfArrayInt = Convert.ToInt32(arraySize.Text);
  int[] array = new int[sizeOfArrayInt];
  string numbers = arrayValues.Text;
  string[] numbersSplit = numbers.Split(',');

  int count = 0;
  foreach (string character in numbersSplit)
  {
    int value;
    bool parse = Int32.TryParse(character, out value);
    if (value != null)
    {
      array[count] = value;
    }

    count++;
  }

  array = this.SortArray(array);
  foreach (int item in array)
  {
    this.listBox.Items.Add(item);
  }
}

private int[] SortArray(int[] arrayToSort)
{
  //int[] sortedArray = new int[arrayToSort.Length];
  int count = arrayToSort.Length;
  for (int j = count; j >= 0; j--)
  {
    int i = 0;
    for (i = 0; i <= j - 2; i++)
    {
      if (arrayToSort[i] < arrayToSort[i + 1])
      {
        int intTemp = 0;
        intTemp = arrayToSort[i];
        arrayToSort[i] = arrayToSort[i + 1];
        arrayToSort[i + 1] = intTemp;
      }
    }
  }

  return arrayToSort;
}

强文本

我必须作为 Windows 窗体工作,并且输出显示在列表框中,作为每个数组项或单个 i 对数组的迭代。当然没有错误检查。希望有帮助。

于 2015-03-05T16:54:19.333 回答
0

撇开你如何使用文本框的奇怪不谈,即使没有它们,你抛出异常的问题也会发生,因为它就在这里,在你的内部循环中:

for (i = 0; i <= j - 1; i++)

假设numbers.Length == 2. 这意味着j == 2. 因此,在第一次通过外循环时,您会在这些条件下到达内循环。第一次通过,i == 0。你得到 if 语句:

if (numbers[i] < numbers[i + 1])

numbers[0]存在,并且numbers[1]存在,所以这个迭代很好地进行并且i递增。

现在i == 1。现在循环检查它的边界条件。i <= j - 1 == true,所以循环继续。现在,当您点击该 if 语句时,它会尝试访问不存在的 ,numbers[i + 1]即 ,并抛出.numbers[2]IndexOutOfRangeException

编辑:回来并意识到我遗漏了解决方案(无论如何都是例外)。为了使冒泡排序起作用,您的内部循环的边界条件应该是i <= j - 2,因为j的初始值是== numbers.Length,它不是从零开始的,而数组索引是。

第二次编辑:请注意,使用列表实际上并不能解决此问题。您必须使用正确的边界条件。试图访问list[list.Count()]会抛出一个ArgumentOutOfRangeException. 仅仅因为 List 会动态调整大小并不意味着它会以某种方式让您访问不存在的项目。无论您使用什么数据结构,您都应该花时间检查您的边界条件。

于 2015-03-05T16:34:48.350 回答