c语言 求二维数组的鞍点

#include<stdio.h>
int main()
{
int a[4][5],i,j,i1,j1=0,max,s=1; /*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");

for(i=0;i<=3;i++)
{
i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
for(i=0;i<=3;i++)
if(max>a[i][j1])break;
if(i>3)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return 0;
}

输入一个鞍点存在的数组,输出是正确的
但输入一个暗点不存在的数组,却没有输出,请问错在哪里?
还有如果数组中所有元素都是1,这个数组有鞍点吗?
鞍点,既该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。

sample input
1 2 3 4 5回车2 4 6 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
a[0][4]=5

sample input
1 12 3 4 5回车2 4 16 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
鞍点不存在.

#include&lt;stdio.h&gt;

#define N 3

#define M 4

int main()

{

int i,j,k,max,min;

int array[N][M];

printf("请输入数组元素:\n");

for(i=0;i&lt;N;i++)

{

for(j=0;j&lt;M;j++)

scanf("%d",&array&lt;i&gt;[j]);

}

printf("数组有:\n");

for(i=0;i&lt;N;i++)

{

for(j=0;j&lt;M;j++)

printf("%-5d\t",array&lt;i&gt;[j]);

printf("\n");

}

for(i=0;i&lt;N;i++)

{

max=array&lt;i&gt;[0];//用列来进行当前行来比较

for(j=0;j&lt;M;j++)

{

if(max&lt;array&lt;i&gt;[j])

max=array&lt;i&gt;[j];

k=j;//记录下当前一行中最大的小标

}

min=array[0][k];

for(j=0;j&lt;N;j++)//用行来进行列比较

{

if(min&gt;array&lt;i&gt;[k])//若在该列中有更小的,则赋值与min

min=array&lt;i&gt;[k];

}

if(min==max)

{

printf("小标为%d,%d,鞍点为:%d",i+1,k,max);

}

}

printf("搜索结束\n");

return;

}

扩展资料:

define作用

被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

宏定义的作用范围仅限于当前文件,即file1.c中定义#define PI 3.14,在file2.c中该宏定义不起作用;

通过将#define PI 3.14定义在common.h中,file1.c和file2.c分别#include"common.h"的方式,该宏定义在file1.c和file2.c中都起作用。

在C或C++语言中,“宏”分为有参数和无参数两种。

参考资料:

百度百科——define(计算机专业用语)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-04-07

这是我思考后的程序代码,能够运行,还可以进一步精简变量的(如果有这个想法的话)

#include <stdio.h>

#define N 3

int main()//行最大,列最小 

{

int a[N][N],i,j,k,t;//

for(i=0;i<N;i++)

for(j=0;j<N;j++)

scanf("%d",&a[i][j]);//按行对数组进行输入

int temp,b,c,min,flag=0;

for(i=0;i<N;i++)//求出行的最大值 

{ temp=a[i][0];

   for(j=0;j<N;j++)

    {if(a[i][j]>temp)

     temp=a[i][j],b=j,c=i;//每行的最大值,保留行最大值的列号b、行号a 

    for(k=0,min=a[0][b];k<N;k++) {//每列的最大值

if(a[k][b]<min)

    min=a[k][b],t=k;

}     

    if(t==c)//判断行最大与列最小是否共同指向一个数 

flag=1,printf("%d ",min);//输出该鞍点 

}

if (flag==0)

printf("该二维数组没有鞍点");

 } 

第2个回答  2020-02-21
#include<stdio.h>
int
main()
{
int
a[4][5],i,j,i1,j1=0,max,s=1;
int
i2;/*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<=3;i++)
{
i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
for(i2=0;i2<=3;i2++)
if(max>a[i2][j1])break;
if(i2>3)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return
0;
}
/******************程序在VC++6.0里运行成功********************************/
说明:我定义了一个整形变量i2。
循环体里最好不要出现循环变量,因为随时会改变循环
第3个回答  2016-01-24

#include <stdio.h>

#include <time.h>

#include <stdlib.h> //添加随机数需要的头文件

#define N 3   //预处理设置N的值


int main()

{

srand((unsigned int) time (NULL)); //设置随机数种子为时间

int array[N][N];

int i,j,k;

int point,max,min,flag=0;

for (i=0;i<N;i++)

{

{

for (j=0;j<N;j++)

{

array[i][j]=rand();

printf("%d\t",array[i][j]); //用随机数初始化数组

}

putchar('\n');

}

}

for (i=0;i<N;i++)

{

max=0;

for (j=0;j<N;j++)

{

if (array[i][j]>array[i][max]) //行内比较大小

max=j;

}

min=i;

for (j=0;j<N;j++)

{

if (array[j][max]<array[min][max]) //行内最大值在列内比较

min=j;

}

if (min==i)

{

printf("鞍点为array[%d][%d] = %d\n",min,max,array[min][max]); //若有鞍点,输出,并改变flag的值

flag=1;

}

}

if (flag==0)

printf("此二维数组无鞍点!\n"); //若无鞍点,提示

getchar(); //等待键入结束


}

第4个回答  推荐于2018-02-19
#include<stdio.h>
int main()
{
int a[4][5],i,j,i1,j1=0,max,s=1;
int i2;/*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<=3;i++)
{
i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
for(i2=0;i2<=3;i2++)
if(max>a[i2][j1])break;
if(i2>3)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return 0;
}

/******************程序在VC++6.0里运行成功********************************/
说明:我定义了一个整形变量i2。
循环体里最好不要出现循环变量,因为随时会改变循环本回答被提问者和网友采纳