2016-04-08 24 views
0

Bu, düşük göz atma sorunu olarak düşünülebilir. Yine de, herhangi bir kod ya da programlama dilimde bu konuyla ilgili nasıl gidileceğini tartışan herhangi bir forum bulamadım. Çok fazla deneme yapıldı ve hepsi yeni dizilerde pratik olarak "kodlama" yapıyor.Dikey/Yatay 2d dizisini çevir

Dikey olarak denemeye çalışıyorum, sonra 2d dizisini yatay olarak çeviriyorum. Yeterince kolay görünüyordu, sadece sistematik bir şekilde geçti ve her satır ve sütun değerini manipüle etti. Ama, ya sadece bir 3x3 dizisi olmayan bir dizi hakkında gitmek istersem ne olur? 11x11 veya 15x15 gibi mi?

**CODE SNIPPET:** 

int array[3][3]= { {1,2,3}, 
        {4,5,6}, 
        {7,8,9} }; 

int vertFlip[3][3], 
    horzFlip[3][3]; 

for(i = 0; i < rows; i++) 
{ 
    for(j = 0; j < cols; j++) 
    { 
    vertFlip[0][i]= array[2][i]; 
    vertFlip[1][i]= array[1][i]; 
    vertFlip[2][i]= array[0][i]; 
    } 
} //and so on for horizontal, obviously my nested for loop was different. 

Ama

, bu dizi çok daha büyük bir şey, (123x123 büyüklüğünde dizi) ne olursa kimse bu görevi başarmak için etkili bir yol biliyor?

+0

N boyutunda bir dizi nasıl döndürüldüğünü düşünün. Tamamlandığında, bir marjiyi çevirmek neredeyse aynıdır. –

+0

Bakın, bunu örnek olarak kullanmayı denedim ama bu sadece diziyi yatay olarak çeviriyor. Biraz daha düşüneceğim. – DancingDylan

+0

Kodunuz "i" sütun dizini kullanıyor ve "j" yi kullanmıyor. – user3386109

cevap

0

Basit bir yaklaşımla başlarım. Yatay kapak için: Yukarıdaki kodu girişinin içeriğini değiştirir

// Reuse swap 
void FlipColumn(int **array, int column, int rows) 
{ 
    // Flip column 'column' of an array that has n rows. 
    for (int row = 0; row < rows/2; row++) 
    { 
     swap(array[row]+column, array[rows-1-row]+column); 
    } 
} 

void VFlipArray(int **array, int columns, int rows) 
{ 
    for (int column = 0; column < columns; column++) 
    { 
     FlipColumn(array, column, rows); 
    } 
} 

Not:

int swap(int *a, int *b) 
{ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

void FlipRow(int *row, int columns) 
{ 
    // A row is a simple one dimensional array 
    // just swap item 0 with item n-1, 1 with n-2, ... 
    for (int index = 0; index < columns/2; index++) 
    { 
     swap(row+index, row+columns-1-index); 
    } 
} 

void HFlipArray(int **array, int columns, int rows) 
{ 
    for (int row = 0; row < rows; row++) 
    { 
     FlipRow(array[row], columns); 
    } 
} 

dikey kapak için, benzer bir yaklaşım kullanılır. Bu istenmiyorsa, kodu hedef ve kaynak dizilerinde geçirecek şekilde değiştirebilir ve döngülerinizi buna göre ayarlayabilirsiniz.

+0

Yaptığınız VFlipArray işlevi içinde, FlipColumn (dizi, sütun, satır); bana (** dizi **) derleyici hatalarımı veren olduğunu gösteren, uyumsuz bir işaretçi türü veriyor. Bu neden olabilir? ** BU SÖZ KONUSU ** Düzeltildi, hatayı gördüm. Yardımınız için teşekkürler, bu kodu temel olarak kullandım ve mantığın örneğiniz, orijinal olarak yanlış yaptığımı açıkça gösteriyor. Bunu hatırladığından emin ol. – DancingDylan

-1

Merhaba Eğer 2d diziyi çevirmek için basit bir yaklaşım deneyebilirsiniz: -

int ar[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
int i,j,ar1[3][3]; 
for(i = 0;i<3;i++) 
{ 
    for(j=0;j<3;j++) 
    { 
     ar1[i][j] = ar[j][i]; 
    } 
} 

Eğer sadece dizi uzunluğuna ve ar1[i][j] = ar[j][i] çevirme işlemi gerçekleştirmek döngüye döngü yinelemek zorunda görebilirsiniz.

+0

diziyi çevirmiyorsunuz, bunun yerine onu çeviriyorsunuz – ijverig