1

指令是编写一个程序,该程序使用一个二维数组来查找比所有相邻元素都大的元素。

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

4

4 回答 4

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)}。但我不认为您的循环会检查所有内容。

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

上面的代码将与自身、对角邻居进行比较,但条件仍然是 > 它将避免混淆。

如果您只想避免与对角线邻居进行比较,则可以使用 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;
}
于 2013-07-18T05:55:42.533 回答
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++)

干杯!

于 2013-07-18T07:52:06.350 回答
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包括ij,此时测试变为

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);
于 2013-07-18T04:28:47.087 回答
0

for(m=j-1; m < j-1; m++)

在上述各种j值的语句中,条件始终为假,因此不能进入循环。

于 2013-07-18T06:39:03.250 回答