2013-07-18 42 views
1

指令是編寫一個使用二維數組的程序來查找比所有鄰居都大的元素。C中鄰居查找程序的代碼

For example if my input is: 

1 2 11 
13 5 6 
7 6 9 

The output would be: 11, 13, 9 

由於某種原因,儘管它根本不顯示數字。有人可以幫助糾正代碼。

下面是代碼:

#include <stdio.h>           
#include "genlib.h" 
#include "simpio.h" 

#define N 3             

bool neighbourCheck(int array[N+2][N+2], int i, int j);  
void getArray(int array[N+2][N+2]); 

main()             
{ 
     int array[N+2][N+2], i, j; 

     printf("This program will ask you to enter nine integers of an aray.\n"); 
     getArray(array); 
     for (i=1; i<N+1; i++) 
     { 
       for(j=1; j<N+1; j++) 
       { 
         if(neighbourCheck(array, i, j)==TRUE) 
         { 
             printf("%d\t", array[i][j]);    
         }   
       } 
     } 
     getchar(); 
} 

void getArray(int array[N+2][N+2]) 
{ 
     int i, j; 

     for(j=0;j<=N+1;j++) 
     { 
       i=0; 
       array[i][j]=-1; 
       i=4; 
       array[i][j]=-1;     
     } 
     for(i=1;i<N+1;i++) 
     { 
       j=0; 
       array[i][j]=-1; 
       j=4; 
       array[i][j]=-1;     
     } 
     for(i=1;i<N+1;i++) 
     { 
       for(j=1;j<4;j++) 
       { 
           printf("\nEnter a positive integer: "); 
           array[i][j]=GetInteger();     
       } 
     } 
} 

bool neighbourCheck(int array[N+2][N+2], int i, int j)      
{ 
    int l, m; 

    for(l=i-1; l<i+1; l++) 
    { 
       for(m=j-1; m<j-1; m++) 
       { 
         if(array[l][m]>=array[i][j]) 
         { 
             return(FALSE);        
         } 
         return(TRUE); 
       } 
    } 
} 

謝謝:d

+0

你可以更具體的問你嗎? –

+0

如何讓程序返回正確的值,因爲目前它只是打印每個數字 –

回答

1

你必須改變部分

for(l=i-1; l<i+1; l++) 
{ 
     for(m=j-1; m<j-1; m++) 

到:

for(l=i-1;l<=i+1;l++) 
{ 
     for(m=j-1;m<=j-1;m++) 

乾杯!

+0

非常感謝:)! –

0

在鄰居檢查功能下面的代碼

for(l=i-1; l<i+1; l++) 
{ 
    for(m=j-1; m<j-1; m++) 
    { 
    if(array[l][m]>=array[i][j]) 
    { 
     return(FALSE);        
    } 
    return(TRUE); 
    } 
} 

意味着lm值將包括i並且j在那時測試變成

if(array[i][j]>=array[i][j]) 

這將永遠是TRUE,你就會返回FALSE

此外,進一步看,在return TRUE並不似乎是在它應該。在測試所有可能的組合後,您只應該返回TRUE,而不僅僅是第一個。雖然這讓你很驚訝,你不打印任何數字。

在迴應的意見,一種可能的方法是以下替換:

for(l=i-1; l<i+1; l++) 
{ 
    for(m=j-1; m<j+1; m++) 
    { 
    if (l == i && m == j) 
     continue; 

    if(array[l][m]>=array[i][j]) 
    { 
     return(FALSE);        
    } 
    } 
} 
return(TRUE); 
+0

,那麼我該怎麼做才能改變這種情況? –

+0

但如果我這樣做不會打印所有數字的程序,因爲它返回TRUE? –

+0

不,因爲如果發現有任何相等或更大的鄰居,它將首先返回'FALSE'。如果它與所有鄰居相比較,它只返回「TRUE」,並發現它們都較小。 – torak

1

我不認爲你正在檢查所有的鄰居。

bool neighbourCheck(int array[N+2][N+2], int i, int j)      
{ 
    int l, m; 
    for(l=i-1; l<i+1; l++) 
    { 
      for(m=j-1; m<j-1; m++) 
      { 
        if(array[l][m]>=array[i][j]) 
        { 
            return(FALSE);        
        } 
        return(TRUE); 
      } 
    } 
} 

如果你想檢查(1,1),你必須將其與{(0,0),(0,1),(0,2),(1,0),(1比較,2),(2,0),(2,1),(2,2)}。但我不thik你的循環檢查一切。

bool neighbourCheck(int array[N+2][N+2], int i, int j)      
{ 
    int l, m; 
    for(l=i-1; l<=i+1; l++) 
    { 
     for(m=j-1; m<=j+1; m++) 
     { 
      // Returns false if any of the neighbour element is greater then & equal to current element. 
      if(array[l][m]>=array[i][j]) return(FALSE);       

     } 
    } 
    //You will reach end 
    return(TRUE); 
} 

上面的代碼會比較自己,對角線的鄰居,但仍然是條件是>它會避免混淆。

如果您只是想避免與對角線鄰居進行比較,那麼ins for for循環可以使用直接if else語句。

其工作正常... 這是完整的代碼。

#include <stdio.h> 
#include<stdbool.h>       
#define N 3             
bool neighbourCheck(int array[N+2][N+2], int i, int j);  
void getArray(int array[N+2][N+2]); 
int main()             
{ 
    int array[N+2][N+2], i, j; 
    printf("This program will ask you to enter nine integers of an aray.\n"); 
    getArray(array); 
    for (i=1; i<N+1; i++) 
    { 
     for(j=1; j<N+1; j++) 
     { 
      if(neighbourCheck(array, i, j)) 
       printf("%d\t", array[i][j]);    
     } 
    } 
    getchar(); 
} 

void getArray(int array[N+2][N+2]) 
{ 
    int i, j; 

    for(j=0;j<=N+1;j++) 
    { 
      i=0; 
      array[i][j]=-1; 
      i=4; 
      array[i][j]=-1;     
    } 
    for(i=1;i<N+1;i++) 
    { 
      j=0; 
      array[i][j]=-1; 
      j=4; 
      array[i][j]=-1;     
    } 
    for(i=1;i<N+1;i++) 
    { 
      for(j=1;j<4;j++) 
      { 
          printf("\nEnter a positive integer: "); 
          scanf("%d",&array[i][j]);    
      } 
    } 
} 

bool neighbourCheck(int array[N+2][N+2], int i, int j)      
{ 
    int l, m; 
    for(l=i-1; l<=i+1; l++) 
    { 
    for(m=j-1; m<=j+1; m++) 
    { 
     // Returns false if any of the neighbour element is greater then and equal to current element. 
     if(array[l][m]>=array[i][j]) return false;       

    } 
} 
//You will reach end 
return true; 
} 
+0

即使使用您的代碼,它仍然會打印所有數字 –

+0

我試過了linux中的代碼。它給了我正確的輸出。 –

+0

這是我的輸出結果.. http://www.imageurlhost.com/images/wvcc7xs7sofv6ulpukb.jpg –

0

對(M = J-1; M < J-1; M ++)

在上面的語句

各種的J值的,條件總是假,因此它不能進入​​循環。