使用输入框时 indexOutofRange BubbleSort
indexOutofRange BubbleSort when using inputbox
它已经困扰我好几个小时了,因为它总是在 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]);
}
抛开您使用文本框的方式的奇怪之处,即使没有它们,您抛出异常的问题也会发生,因为它就在这里,在您的内部循环中:
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 会动态调整大小并不意味着它会以某种方式让您访问不存在的项目。无论您使用何种数据结构,您都应该始终花时间检查您的边界条件。
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 迭代。当然没有错误检查。希望有所帮助。
它已经困扰我好几个小时了,因为它总是在 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]);
}
抛开您使用文本框的方式的奇怪之处,即使没有它们,您抛出异常的问题也会发生,因为它就在这里,在您的内部循环中:
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 会动态调整大小并不意味着它会以某种方式让您访问不存在的项目。无论您使用何种数据结构,您都应该始终花时间检查您的边界条件。
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 迭代。当然没有错误检查。希望有所帮助。