2016-03-02 15 views
6

Mam proste zadanie transponse kwadratowy 2D tablicy: (muszę to zrobić w bardzo zwykły sposób, bez pojemników itp)Tablica 2D nie będzie transponse C#

static void Main(string[] args) 
    { 


     double[,] a = new double[5, 5]; 
     Random random = new Random(); 

     for(int i = 0; i < 5; i++) 
     { 
      for(int j = 0; j < 5; j++) 
      { 
       a[i, j] = random.NextDouble(); 
      } 
     } 

     for (int i = 0; i < 5; i++) 
     { 
      for (int j = 0; j < 5; j++) 
      { 
       Console.Write(a[i, j] + " "); 

      } 
      Console.WriteLine(); 
     } 


     for (int i = 0; i < 5; i++) 
     { 
      for (int j = 0; j < 5; j++) 
      { 
       double temp = a[i, j]; 
       a[i, j] = a[j, i]; 
       a[j, i] = temp; 
      } 
     } 

     Console.WriteLine("\n\n\n"); 
     for (int i = 0; i < 5; i++) 
     { 
      for (int j = 0; j < 5; j++) 
      { 
       Console.Write(a[i, j] + " "); 

      } 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 


    } 
} 

Spodziewałem odwrócona tablica jako wyjście. Jednak mam tutaj tę samą tablicę. Proszę, pomóż mi dowiedzieć się, co zrobiłem źle? Console output. The double array won't transponse

Odpowiedz

6

Dzieje się tak dlatego, że wykonanie zarówno for pętle z 0 do 5. Więc robisz transpozycję dwa razy.

Na przykład dla i=0 i j=1 ty transpozycji a[0,1] z a[1,0] i kiedy i=1 i j=0 wartości a[1,0] i a[0,1] wraca do swojej pierwotnej pozycji.

Możesz dokonać wewnętrznego for z 0 na i, więc pozycje są zamieniane tylko raz.

for (int i = 0; i < 5; i++) 
{ 
    for (int j = 0; j < i; j++) 
    { 
     double temp = a[i, j]; 
     a[i, j] = a[j, i]; 
     a[j, i] = temp; 
    } 
} 
1

trzeci swapy pętli obie ukośne połówki matrycy, trzeba wymienić tylko te elementy od połowy:

for (int i = 0; i < 5; i++) 
{ 
    for (int j = 0; j < i; j++) 
    { 
     double temp = a[i, j]; 
     a[i, j] = a[j, i]; 
     a[j, i] = temp; 
    } 
} 
0

W pętli wymiany należy zmienić wewnętrzny limit pętli, aby uniknąć problemu podwójnej wymiany. Zmień: for(j = 0; j < 5; j++) na for(j = 0; j < i; j++)