Ошибка 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();
    }
Другие вопросы по тегам