c语言鞍点找错~~具体指出错误。谢谢大家
发布网友
发布时间:2022-04-28 12:00
我来回答
共1个回答
热心网友
时间:2023-10-08 20:44
首先声明一个问题:一个数组如果有鞍点的话,那么它仅有一个鞍点。好,下面开始分析你的程序。
从这个地方开始:
if(max<a[i][j])
{max=a[i][j];
p=i;m=j;}
该处你应该是找出了第i行的最大值了吧,其实这时候你只要记下列数就可以了(没必要记下行数,因为后面只要跟同一列的数比较就可以了)
你之后的程序思路就错了,事实上我们只要看一下刚刚找到的最大值是否是这一列的最小值就可以了。所以没必要在设置min等变量再去找最小值。
不妨修改如下(前面请自己定义一个flag变量,以作为是否找到鞍点的标志。同时下面我用到的maxj你也可以自己定义一下,maxj就是求出一行的最大值时记下的该数所在的列数):
for(i=0;i<3;i++)
{ max=a[i][0];
maxj=0;
for(j=0;j<3;j++)
{ if(max<a[i][j])
max=a[i][j];
maxj=j;
}
flag=1; /*先假设是鞍点,并用flag=1表示*/
for(k=0;k<3;k++)
if(max>a[k][maxj])
{flag=0;
continue; /*如果一行的最大值不是该列的最小值,就不是鞍点*/
}
if(flag)
printf("鞍点是:a[%d][%d]=%d\n",i,maxj,max);
} /*注意该处的大括号对应的是我所写程序的第一个大括号*/
if(!flag)
printf("it is not exist!");
呃……不是吧!不过说实话我就是根据你的程序改的,现在我把我编的程序给你参考一下吧:
#include <stdio.h>
#define N 4
#define M 5
void main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please enter the matrix:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
{
max=a[i][0];
maxj=0;
for(j=0;j<M;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
}
flag=1;
for(k=0;k<N;k++)
{
if(max>a[k][maxj])
{
flag=0;
continue;
}
}
if(flag)
{
printf("a[%d][%d]=%d\n",i,maxj,max);
break;
}
}
if(!flag)
printf("It is not exist!\n");
}
热心网友
时间:2023-10-08 20:44
首先声明一个问题:一个数组如果有鞍点的话,那么它仅有一个鞍点。好,下面开始分析你的程序。
从这个地方开始:
if(max<a[i][j])
{max=a[i][j];
p=i;m=j;}
该处你应该是找出了第i行的最大值了吧,其实这时候你只要记下列数就可以了(没必要记下行数,因为后面只要跟同一列的数比较就可以了)
你之后的程序思路就错了,事实上我们只要看一下刚刚找到的最大值是否是这一列的最小值就可以了。所以没必要在设置min等变量再去找最小值。
不妨修改如下(前面请自己定义一个flag变量,以作为是否找到鞍点的标志。同时下面我用到的maxj你也可以自己定义一下,maxj就是求出一行的最大值时记下的该数所在的列数):
for(i=0;i<3;i++)
{ max=a[i][0];
maxj=0;
for(j=0;j<3;j++)
{ if(max<a[i][j])
max=a[i][j];
maxj=j;
}
flag=1; /*先假设是鞍点,并用flag=1表示*/
for(k=0;k<3;k++)
if(max>a[k][maxj])
{flag=0;
continue; /*如果一行的最大值不是该列的最小值,就不是鞍点*/
}
if(flag)
printf("鞍点是:a[%d][%d]=%d\n",i,maxj,max);
} /*注意该处的大括号对应的是我所写程序的第一个大括号*/
if(!flag)
printf("it is not exist!");
呃……不是吧!不过说实话我就是根据你的程序改的,现在我把我编的程序给你参考一下吧:
#include <stdio.h>
#define N 4
#define M 5
void main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please enter the matrix:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
{
max=a[i][0];
maxj=0;
for(j=0;j<M;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
}
flag=1;
for(k=0;k<N;k++)
{
if(max>a[k][maxj])
{
flag=0;
continue;
}
}
if(flag)
{
printf("a[%d][%d]=%d\n",i,maxj,max);
break;
}
}
if(!flag)
printf("It is not exist!\n");
}
热心网友
时间:2023-10-08 20:44
首先声明一个问题:一个数组如果有鞍点的话,那么它仅有一个鞍点。好,下面开始分析你的程序。
从这个地方开始:
if(max<a[i][j])
{max=a[i][j];
p=i;m=j;}
该处你应该是找出了第i行的最大值了吧,其实这时候你只要记下列数就可以了(没必要记下行数,因为后面只要跟同一列的数比较就可以了)
你之后的程序思路就错了,事实上我们只要看一下刚刚找到的最大值是否是这一列的最小值就可以了。所以没必要在设置min等变量再去找最小值。
不妨修改如下(前面请自己定义一个flag变量,以作为是否找到鞍点的标志。同时下面我用到的maxj你也可以自己定义一下,maxj就是求出一行的最大值时记下的该数所在的列数):
for(i=0;i<3;i++)
{ max=a[i][0];
maxj=0;
for(j=0;j<3;j++)
{ if(max<a[i][j])
max=a[i][j];
maxj=j;
}
flag=1; /*先假设是鞍点,并用flag=1表示*/
for(k=0;k<3;k++)
if(max>a[k][maxj])
{flag=0;
continue; /*如果一行的最大值不是该列的最小值,就不是鞍点*/
}
if(flag)
printf("鞍点是:a[%d][%d]=%d\n",i,maxj,max);
} /*注意该处的大括号对应的是我所写程序的第一个大括号*/
if(!flag)
printf("it is not exist!");
呃……不是吧!不过说实话我就是根据你的程序改的,现在我把我编的程序给你参考一下吧:
#include <stdio.h>
#define N 4
#define M 5
void main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please enter the matrix:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
{
max=a[i][0];
maxj=0;
for(j=0;j<M;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
}
flag=1;
for(k=0;k<N;k++)
{
if(max>a[k][maxj])
{
flag=0;
continue;
}
}
if(flag)
{
printf("a[%d][%d]=%d\n",i,maxj,max);
break;
}
}
if(!flag)
printf("It is not exist!\n");
}