一道C语言改错题
二维数组的局部鞍点定义如下:对任意一个二维数组中的元素,若该元素的值比其上下2个相邻元素的值都小并且比其左右2个相邻元素的值都大,则称该元素是一个局部鞍点。位于矩阵拐角和边界的元素分别只有2个和3个相邻元素。
函数localmax的形参a指向输入数组,b指向输出数组。该函数的功能是找出输入数组中所有局部鞍点,若输入数组的某个元素是局部鞍点,则将输出数组的相同位置处的元素置1;否则置0
【含有错误的源程序】
#include <stdio.h>
#define MIN –32768
#define MAX 32767
void localmax(int a[6],int b[6])
{int i,j,k,m;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{ b[i][j]=1;
for(k=-1;k<=1;k++)
for(m=-1;m<=1;m++)
{ if(k==-1||k==1 && m==-1||m==1) continue;
if((k==0&&a[i][j]<a[i+m][j+k])||(m==0 &&a[i][j]>a[i+m][j+k]))
b[i][j]=0;
}
}
}
main()
{ int b[][];
int i,j,a[6][6]={{0},{0,6,9,2,4},{0,3,6,8,5},{0,2,1,4,1},{0,6,2,9,4}};
for(j=0;j<6;j++)
{ a[0][j]=MAX; a[j][0]=MIN; a[5][j]=MAX; a[j][5]=MIN; }
localmax(a,b);
for(i=1;i<=4;i++)
{ for(j=1;j<=4;j++) printf("%8d",a[i][j]); printf("\n"); }
for(i=1;i<=4;i++)
{ for(j=1;j<=4;j++) printf("%8d",b[i][j]); printf("\n"); }
}
追问:额。。有四个错误。。我把localmax的函数定义改成了int a[][6],这应该算一个错误,其他的三个就找不出来了,输出数组成了16个0.。。
答案:#include <stdio.h>
#define MIN -32768 // 小写的 -
#define MAX 32767
void localmax(int a[][6],int b[][6])
{
int i,j,k,m;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
b[i][j]=1;
for(k=-1;k<=1;k++)
for(m=-1;m<=1;m++)
{
if(m*k!=0 || m+k==0) continue;
if((k==0&&a[i][j]>=a[i+m][j])||(m==0 &&a[i][j]<=a[i][j+k]))
b[i][j]=0;
}
}
}
main()
{
int b[6][6];
int i,j,a[6][6]={{0},{0,6,9,2,4},{0,3,6,8,5},{0,2,1,4,1},{0,6,2,9,4}};
for(j=0;j<6;j++)
{
a[0][j]=MAX;
a[j][0]=MIN;
a[5][j]=MAX;
a[j][5]=MIN;
}
localmax(a,b);
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
printf("%8d",a[i][j]);
printf("\n");
}
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
printf("%8d",b[i][j]);
printf("\n");
}
}
其他:我个人认为你应该把错误现象也要描述一下 fun(char*pstr[6]) 这是什么?char*pstr[6],这是一个指针数组,有六个5.及时总结自己的学习经验,养成写C语言日记的习惯。软件有编程日记功能。 6 1:int b[][]; //必须有完整的元素个数,不能这样写。
2:void localmax(int a[6],int b[6]) 修改为void localmax(int (*a)[6],int (*b)[6]);
3: #define MIN –32768 这里混杂汉字了,重新在英语下输入。 fun(char*pstr[6]) 这是什么?char*pstr[6],这是一个指针数组,有六个元素,每个元素都是一个指针,指针的指向是待比较字符串的首地址。
p=*(pstr+i);这里边*(pstr+i)是数组里的第i个元素的内容,是一个指针,你能把一个指针给一个字符变量吗?
上一个:求一份湖南省二级C语言题库,谢谢…… 365534402@qq.com
下一个:C语言作业题