2016-07-21 31 views
0

Hallo, Ich bin ein Anfänger in C# und es verstand nicht, warum die Ausnahme auf dem Programm geworfen wird unten gezeigtSystem.IndexOutOfRangeException Fehler nicht verstanden

PROGRAMM:

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

gewünschtes Ergebnis:

Enter order of matrix: 
4 

1 8 9 16 
2 7 10 15 
3 6 11 14 
4 5 12 13 

Aber eine Ausnahme wie im Thema angegeben wird auf num [x, y] = i geworfen; . Ich verstehe nicht, warum System.IndexOutOfRangeException auftritt, da die Schleife eindeutig am Ende des 2d-Arrays endet.

P.S. Das Programm soll nur einmal ausgeführt werden.

Antwort

0

Vielleicht bin ich falsch, aber wenn man 2 als Grad der Matrix einzufügen, die Variable p gleich 4

Die externe für Zyklus

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

Zyklen 4 mal, von 1 bis 4 Aber wenn i == 4, X gleich -1, und Sie können nicht auf eine Matrix mit negativem Index zugreifen. Sie erhalten das gleiche Verhalten mit Grad = 4, wie in Ihrem Beispiel.

0

Sie müssen nicht Ihre x Wert in der gleichen Schleife Iteration ändern, in dem Sie den y Wert ändern, weil das zu tun, müssen Sie die letzte Position in der zweiten Spalte nicht ausfüllen und anschließend durchlaufen bis zu x = -1 welche ein ungültiger Index ist.

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

Diesen kann man versuchen ...

Sie machen nur grundlegende Fehler, hier x decreament zum Zeitpunkt der y increament, Aussage Schleife nach increament y überspringen verwenden weiterhin, das garantiere ich dieses Arbeits 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(); 
     } 
    } 
} 
Verwandte Themen