您好我是c#的初学者,我不明白为什么在下面显示的程序中抛出异常
方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int n, i, x=0, y=0;
Console.WriteLine("Enter the degree of matrix:");
n = int.Parse(Console.ReadLine());
int[,] num = new int[n, n];
int p = n * n;
for (i = 1; i <= p; i++)
{
num[x, y] = i;
if (num[x, y] % n == 0) { y++; }
if (y % 2 == 0) { x++; }
if (y % 2 != 0) { x--; }
}
for (i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
Console.Write(num[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}
必修结果:
Enter order of matrix:
4
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13
但是在num [x,y] = i中抛出了主题中所述的异常; 。我不明白为什么发生System.IndexOutOfRangeException,因为循环明确地在2d数组的末尾结束。
P.S。该程序只能运行一次。
答案 0 :(得分:0)
也许我错了,但是如果你插入2作为矩阵的度数,那么变量p等于4。
外部循环
for (i = 1; i <= p; i++)
循环4次,从1到4.但是当i == 4时,X等于-1,并且您无法访问具有负索引的矩阵。你会得到与degree = 4相同的行为,就像你的例子一样。
答案 1 :(得分:0)
您不能在更改x
值的同一循环迭代中更改y
值,因为这样做,您不会填充第二列中的最后一个位置并随后迭代低至x = -1
这是一个无效的索引。
for (i = 1; i <= p; i++)
{
num[x, y] = i;
if (i % n == 0) {
y++;
}
else {
if (y % 2 == 0) { x++; }
if (y % 2 != 0) { x--; }
}
}
for (i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
Console.Write(num[i, j] + " ");
}
Console.WriteLine();
}
答案 2 :(得分:0)
你可以尝试一下......
你犯了一个基本的错误,这里x是在y增量时递减,使用继续语句跳过循环后y,我保证这个工作100%
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
int n, i, x = 0, y = 0;
Console.WriteLine("Enter the degree of matrix:");
n = int.Parse(Console.ReadLine());
int[,] num = new int[n, n];
int p = n * n;
for (i = 1; i <= p; i++)
{
try
{
num[x, y] = i;
if (num[x, y] % n == 0) { y++; continue; }
if (y % 2 == 0) { x++; }
if (y % 2 != 0) { x--; }
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
for (i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(num[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}