2016-07-21 6 views
0

Привет Я новичок в C# и я не понимаю, почему исключение в программе, показанной нижеошибка System.IndexOutOfRangeException не понял

ПРОГРАММА:

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

Может быть, я ошибаюсь, но если вставить 2 как степень матрицы, переменная р = 4.

Внешний для цикла

for (i = 1; i <= p; i++) 

циклов в 4 раза, от 1 до 4 . Но когда i == 4, X равно -1, вы не можете получить доступ к матрице с отрицательным индексом. Вы получаете то же поведение со степенью = 4, как в вашем примере.

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(); 
    } 
0

Вы можете попробовать это ...

Вы делаете только основную ошибку, здесь х decreament во время у increament, используя оператор продолжать пропустить цикл после increament у, я гарантирую это работает 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(); 
     } 
    } 
}