Ошибка System.Indexofrangeexception не понята
Привет, я новичок в 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, поскольку цикл четко заканчивается в конце 2-го массива.
PS программа предназначена для запуска только один раз.
3 ответа
Может быть, я ошибаюсь, но если вы вставите 2 в качестве степени матрицы, переменная p будет равна 4.
Внешний для цикла
for (i = 1; i <= p; i++)
циклически 4 раза, от 1 до 4. Но когда i == 4, X равен -1, и вы не можете получить доступ к матрице с отрицательным индексом. Вы получаете такое же поведение со степенью = 4, как в вашем примере.
Вы можете попробовать это...
Вы делаете просто базовую ошибку, здесь x - уменьшение во время увеличения y, используя пропущенный цикл оператора продолжения после увеличения y, я гарантирую, что это работает на 100%
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stackru
{
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();
}
}
}
Вы не должны менять свой 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();
}