C++中找一个数的程序
以下这个程序哪里错了?
谢谢!
#include <stdio.h>
int main()
{
int a[8][8];
int i,j,r,p=0,max,min,row,minnum,maxnum,col;
scanf("%d,%d",&row,&col);
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
scanf("%d",&a[i][j]);
}
}
for(j=0;j<row;j++)
{
for (i=0;i<col;i++)
{
if(i==0)
{
max=a[j][i];
}
if(i!=0&&max<a[j][i])
{
max=a[j][i];
maxnum=i;
for(r=0;r<row;r++)
{
if(r==0)
{
min=a[r][i];
}
if(r!=0&&min>a[r][i])
{
min=a[r][i];
minnum=r;
}
}
if(min==max)
{
printf("%d+%d",maxnum,minnum);
p=1;
}
}
}
}
if(p!=1)
{
printf("No");
}
return 0;
} 展开
》改后的代码:》》:
代码不足之处:数组中的重复值不能太多,
你可以输入
3,4
1 2 3 4
4 5 3 6
3 5 6 7
或:
3,4
2 4 90 7
3 4 5 8
9 1 2 3
进行测试。
但不宜用
3,4
3 3 3 3
4 5 4 5
6 6 6 6
对这道题,也没必要吧标准定的那么高。
#include<stdio.h>
void main()
{
int i,j,r,row,col,flag1,p=0,a[8][8],max,minnum;
scanf("%d,%d",&row,&col);
for(i=0;i<row;i++)
for(j=0;j<col;j++)
scanf("%d",&a[i][j]);
for(i=0;i<row;i++)
{
max=a[i][0];
for(j=0;j<col;j++)
if(a[i][j]>max)
{
max=a[i][j];
minnum=j;
}
for(r=0,flag1=1;r<row&&flag1;r++)
if(max>a[r][minnum])
flag1=0;
if(flag1)
{
printf("%d+%d\n",i,minnum,max);
p=1;
}
}
if(p!=1)
printf("NO\n");
}
#include <stdio.h>
int main()
{
int a[8][8];
int i,j,r,p=0,max,min,row,minnum,maxnum,col;
scanf("%d,%d",&row,&col);
for (i=0;i<row;i++)
for (j=0;j<col;j++)
scanf("%d",&a[i][j]);
for(j=0;j<row;j++)
for (i=0;i<col;i++)
{
if(i==0)max=a[j][i];//这句是把每行的第一个元素赋给max,即给max赋一个初值,故可以简化成max=a[j][0]。
if(i!=0&&max<a[j][i])//可以简化成if(max<a[j][i])
{
max=a[j][i];//循环结束后,max存放的是第j行元素的最大值
maxnum=i;//记录最大元素的列标记
}//您少了这个括号
for(r=0;r<row;r++)
{
if(r==0)min=a[r][i];//可以简化成min=a[0][i]。
if(r!=0&&min>a[r][i])//可以简化成if(min>a[r][i])
{
min=a[r][i];
minnum=r;//记录最小元素的行标记
}
}
if(min==max)
{
printf("%d+%d",maxnum,minnum);//如果您是想输出满足条件的数的行标后然后输出列标的话,改成printf("%d+%d",minnum,maxnum);
p=1;
}
}
if(p!=1)
printf("No");
return 0;
}*/
/*//除了这些小错误外,程序算法上也有些错误
//错误一:
如果数组的行数和列数相等,那用:
for(j=0;j<row;j++)
for (i=0;i<col;i++)
{
……
}
就够了,但由于行数和列数不等,所以你想通过这样写来达到编程目的:
for(j=0;j<row;j++)
for (i=0;i<col;i++)
{
1……
for(r=0;r<row;r++)
{
2……
}
3……
}
如果我没理解错的话,您是想通过
for(j=0;j<row;j++)
for (i=0;i<col;i++)
{
1……
来找到一行中的最大值,并记录下其列下标
然后通过
for (i=0;i<col;i++)
{
1……
for(r=0;r<row;r++)
{
……
这个双重循环来找到列中的最小值,然后判断他们那是否相等
这样看似合理,实际上忽略了一个问题,那就是,由于
for (i=0;i<col;i++)
{
1……
for(r=0;r<row;r++)
{
2……
}
从属于for(j=0;j<row;j++),所以这个双重循环实际上和for (i=0;i<col;i++)这个单重循环是平行的
所以,当j取某个值时,for (i=0;i<col;i++)循环col次找到第j行的最大值时,此时循环
for (i=0;i<col;i++)
{
1……
for(r=0;r<row;r++)
{
2……
}
中的循环体2已经循环了col*row次。也就是说,当找列的最小值的双重循环循环row次时,找行的最大值的循环实际上只执行了1次。
所以您在执行结果中可能看到输出行列下标时,可能得到类似-828218781+1这样的结果。这是因为由于maxnum,minnum最初都没有赋值,而j变化一次输出一次结果。
在这期间,由于找最大值的循环只循环了一次,如果行的第一个数有小于max,那maxnum就得不到一个值,一个变量在没有赋值的情况下输出就得到一个乱七八糟的负数
我试着编了这个程序,这个循环结构我是这样处理的:
for(j=0;j<8;j++)
{
……
for (i=0;i<col&&j<row;i++)//第一个循环,找出行中最大值,在这个循环结构中i作
{
……
}
……
for(r=0;r<row&&j<col;r++)//第二个循环,找出列中最小值
{
……
}
……
}
这样找最大值和最小值的循环结构是平行的,也就是说第一个循环循环col次找到了最大值的同时,第二个循环恰好循环row次找到了最小值(实际上两个循环都只执行了min(row,col)次)
//错误二:算法错误.把上述错误一一改过之后,得到:(当然还有些不妥之处)
for(j=0;j<8;j++)
{
for (i=0;i<col&&j<row;i++)
{
if(i==0)max=a[j][i];
if(i!=0&&max<a[j][i])
{
max=a[j][i];
maxnum=i;
}
}//循环结束后,i的值变为min(row,col)(row、col两者中的最小值)
for(r=0;r<rowj<col;r++)
{
min=a[r][i];//改成min=a[r][maxnum];因为您找到最大值后,接下来要判断它是不是它这一列中的最小值
if(r!=0&&min>a[r][i])
{
min=a[r][i];
minnum=r;
}
}
if(min==max)
{
printf("%d+%d",minnum,maxnum);
p=1;
}
}
进一步修改:if语句不需要这样写了:
for(r=0;r<rowj<col;r++)
{
min=a[r][maxnum];
if(r!=0&&min>a[r][i])
{
min=a[r][i];
minnum=r;
}
}
if(min==max)
{
printf("%d+%d",minnum,maxnum);
p=1;
}
因为第一个循环结构已经找出了行的最大值,第二个循环结构仅仅判断这个最大值是不是他所在列的最小值,所以
您可以这样写:(参见标准答案)
for(r=0,flag1=1;r<row&&flag1;r++)
if(max>a[r][maxnum])
{
flag1=0;
minnum=r;
}
if(flag1)
{
printf("%d+%d",minnum,maxnum);
p=1;
}
设一个新的变量flag1,令他的初值为1;如果循环过程中,发现比a[r][maxnum];大的值,就领flag1=0,就不执行输出操作了
》参考答案:》》:
#define N 10
#define M 10
#include<stdio.h>
void main()
{
int i,j,k,m,n,flag1,flag2,a[N][M],max,maxj;
printf("请输入行数:\n");
scanf("%d",&n);
printf("请输入列数:\n");
scanf("%d",&m);
for(i=0;i<n;i++)
{
printf("第%d行的元素:\n",i);
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%4d",a[i][j]);
printf("\n");
}
flag2=0;
for(i=0;i<n;i++)
{
max=a[i][0];
for(j=0;j<m;j++)
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
for(k=0,flag1=1;k<n&&flag1;k++)
if(max>a[k][maxj])
flag1=0;
if(flag1)
{
printf("第%d行第%d列的%d是鞍点。\n",i,maxj,max);
flag2=1;
}
}
if(!flag2)
printf("没有鞍点。\n");
}