2016-03-25 50 views
-1

Dizinin köşeleri & kenarlarını dikkate alırken aşağıdaki kodumda listelenen 1'leri nasıl tanımlayacağımı bulmakta sorun yaşıyorum.Bir dizideki komşular

#include <stdio.h> 
/* define grid size */ 
#define SIZE 7 
int grid[SIZE][SIZE]; 
/* function to find the number of occupied adjacent cells */ 
int neighbors (int i, int j); 
void main() 
{ 
    int i, j, n; 
/* initialize the entire grid to be zero */ 
for (i = 0; i < SIZE; i++) 
    for (j = 0; j < SIZE; j++) 
     grid[i][j] = 0; 
/* introduce a few ones */ 
    grid[1][2] = 1; 
    grid[2][2] = 1; 
    grid[1][4] = 1; 
    grid[2][4] = 1; 
    grid[3][2] = 1; 
    grid[3][3] = 1; 
    grid[3][4] = 1; 
    grid[5][3] = 1; 
    grid[6][2] = 1; 
for (i = 0; i < SIZE; i++) 
    for (j = 0; j < SIZE; j++) { 
     n = neighbors(i,j); 
     printf ("Number of neighbors to element %d,%d =%d\n",i,j,n); 
} 
return; 
} 
/* function to compute the neighbors */ 
int neighbors (int i, int j) 

Ben ifadeleri i = 0 veya i = 6 yanı sanki j = 0 veya j = 6, ama nasıl emin değilsem kod çalışacaktır biçimini değiştirmek eğer kullanabileceği anlamaya Devam etmek için. Herhangi bir yardım çok takdir edilecektir

+1

sorunuzu kodunuzu girinti edin. – jdarthenay

+0

Ayrıca 7 zaten matrisinizin sınırları dışında, sanırım son cümlede "i == 1 veya i == 6, aynı şekilde j == 1 veya j == 6" olsun – jdarthenay

+0

@jdarthenay doğru, uygun düzenlemeler yapıldı –

cevap

0

Bir soyutlama katmanındaki diziye doğrudan erişimi sarmak mümkündür. Bu katman erişim mantığını ve ek kontrolleri gizleyebilir. şöyle birşey:

int get_grid(int i, int j) 
{ 
    if (i>=0 && i<SIZE) 
     return grid[i][j]; 
    return 0; 
} 

Ve çağıran işlevi:

int neighbors (int i, int j) 
{ 
    return get_grid(i-1, j-1) + get_grind(i-1, j) + ... 
} 
0

Önerim:

int neighbors (int i0, int j0) 
{ 
    int imax = (i0 < SIZE) ? (i0 + 1) : SIZE; 
    int jmax = (j0 < SIZE) ? (j0 + 1) : SIZE; 
    int result = 0; 

    for (int i = (i0 > 0) ? (i0 - 1) : 0; i <= imax; i++) 
    { 
     for (int j = (j0 > 0) ? (j0 - 1) : 0; j <= jmax; j++) 
     { 
      if ((i != i0 || j != j0) && grid[i][j] != 0) 
      { 
       result++; 
      } 
     } 
    } 

    return result; 
} 
+0

C99 modu nedir? Bunu henüz öğrenmedim ve kodun nasıl test edileceğinden emin olamadım. –

+0

@Christian Littner Neden bunun cevabını bir yorum olarak sorduğunu merak ediyorum. C99 daha yeni bir standarttır, '-std = C99' derleme seçeneği ile size izin veren bazı kodlar eski standartlar tarafından etkinleştirilmeyecektir. – jdarthenay