c语言求鞍点的程序,求告知我错在哪里了

c语言求鞍点的程序,求告知我错在哪里了,第1张

楼上说的对,你在定义数组的时候,计算机会在内存中为你的数组分配空间,这个过程在你输入之前就已经完成了,而你的n是个未知数,所以就造成这个错误了。问题在于,你是知道了n,但计算机不知道,要么直接定义一个大一点的数组,比如a100100,输入别超过100就行,这样的话应该就没问题了。

// 首先来看你之前的代码

for (i=0;i<m;i++) // for A

{

i1=i;

for (max=a[i][0],j=0;j<n;j++) // for B

{

if (max<a[i][j])

{

max=a[i][j];

}

}

for (j=0;j<n;j++) // for C

{

for (min=a[i][j],i=0;i<m;i++)  // for D

{

if (min>a[i][j])

{

min=a[i][j];

}

}

i=i1;

if (a[i][j]==max&&a[i][j]==min) 

{

printf("a[%d][%d]=%d ",i,j,a[i][j]);

flag++;

}

}

}

//

/

 首先我们知道在矩阵中,鞍点的定义是这样的“在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点”

 所以我们就按照这个要求来求去所有的鞍点

 执行的逻辑是先找到每行的最大值,然后看看这个值在所在列的最小值,如果这两个数在同一个位置则表示这个数是一个鞍点数据

 1、执行for A 是为了执行每一行

 2、执行for B是为了在第i行中找出最大值的位置和最大的那个值。但是我们发现在对i行的各列遍历完得到第i行最大值之后会执行 for C和for D 这两个过程会变化i, 则需要事先将i保留出来(其实也可以在这两个for里面定义新的变量用i初始化)

 3、for C 执行的是对每个列的遍历,效果如同for A。找到第j列的最小值,然后将之前保留的i(保存到了i1中)重新赋值回来,然后比较得到最终的结果

 4、其实这个过程明显就已经出现了无用功。 因为在for C中我们其实只要看看外面的for B获取的那个最大值的列索引的值在这列的所有行中是不是最小的就可以了

/

//

// 下面执行鞍点搜索

int jindex = -1;

for (i=0;i<m;i++) // for A

{

// 遍历i行的所有数据, 找到第i行中最大的数据和所在的列索引

for (max=a[i][0],j=0, jindex=j;j<n;j++) // for B

{

if (max<a[i][j])

{

max=a[i][j];

jindex = j;

}

}

// 对前面搜索到的列索引, 看a[i][jindex] 在jindex列中是否为最小的

bool the_a_i_jindex_is_min = true;

for (int ii=1; ii<m; ii++)

{

if (max > a[ii][jindex])

{

the_a_i_jindex_is_min = false;

break;

}

}

if (the_a_i_jindex_is_min)

{

printf("a[%d][%d]=%d is AnDian\n", i, jindex, a[i][jindex]);

flag++;

}

}

if(flag==1){//当前的数字为鞍点

程序代码:

#include <stdioh>

#include <stdlibh>

int main(){

int a[100][100];

printf("Please input the order of the matrix:");

int n,m,count=0;

scanf("%d %d",&n,&m);

//Initialization the matrix

printf("Please input the number of your matrix\n");

for(int i=0;i<n;i++){

for(int j=0;j<m;j++){

scanf("%d",&a[i][j]);

}

}

for(int i=0;i<n;i++){

int max=a[i][0],tempi=i,tempj=0;

for(int j=1;j<m;j++){//Find the max number of the row and noted the cols of the max number

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

max=a[i][j];

tempj=j;

}

}

int flag=1;

for(int k=0;k<n;k++){//Verify whether the number "max" is the least number in this cols

//If the number that in this row is smaller than the number "max"

//That can explain the number "max" is not a saddle point

if(a[k][tempj]<max){

flag=0;

break;

}

}

if(flag==1){//当前的数字为鞍点

count++;

printf("\nThe saddle point of this matrix is (%d,%d):%d\n",tempi,tempj,max);

}

}

if(count==0){

printf("This matrix have no saddle point\n");

}

return 0;

}

对应的测试数据和结果如下:

存在鞍点的情况:

扩展资料:

scanf函数用法:

scanf("输入控制符",输入参数);

功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

用scanf()函数以%s格式读入的数据不能含有空白符时,所有空白符都被当做数据结束的标志。所以题中函数输出的值只有空格前面的部分。

如果想要输出包括空格在内的所有数据,可以使用gets()函数读入数据。gets()函数的功能是读取字符串,并存放在指定的字符数组中,遇到换行符或文件结束标志时结束读入。换行符不作为读取串的内容,读取的换行符被转换为字符串结束标志'\0'。

设计思路:

使用两个相同的二维数组,一个存数据,一个存是鞍点的可能性,可能性若为0,则不是鞍点;若为1,则不是鞍点,但是行最大数或者列最小数;若为2,则是鞍点;

首先,获取每行最大数,并赋给max,并将改行中与max相等的数是鞍点的可能性设为1,其他数的可能性设为0;

其次,获取每列最小数,并赋给min,并将该列中与min相等的数是鞍点的可能性增加1;

最后,判断每个数是鞍点的可能性,若是2,则是鞍点,输出。

流程图自己画吧

#include <stdioh>

#include <stdlibh>

#include <stringh>

#define ROW     3

#define COL    3

void main()

{

  int a[ROW][COL];

  int flag[ROW][COL];    //记录每个元素是鞍点的可能性,

  int i, j, max, min, count=0;

  printf("输入数组内容(%d行%d列):\n", 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=1; j<COL; j++)

      {

          max = (max < a[i][j])a[i][j]:max;

      }

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

      {

          if (a[i][j] == max)//若是最大数,则鞍点可能性设为1,否则为0

              flag[i][j] = 1;

          else

              flag[i][j] = 0;

      }

  }

  for (j=0; j<COL; j++) //查找每列最小数,并设置每个数是鞍点的可能性

  {

      min = a[0][j];

      for (i=1; i<ROW; i++)

      {

          min = (min > a[i][j])a[i][j]:min;

      }

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

      {

          if (a[i][j] == min)//若是最小数,则鞍点可能性增加1

          {

              flag[i][j]++;

              count++;

          }

      }

  }

  printf("鞍点个数为:%d \n", count);

  for (i=0; i<ROW; i++)  //输出鞍点信息

  {

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

      {

          if (flag[i][j] == 2)

              printf("%d, (%d行%d列)\n", a[i][j], i, j);

      }

  }

  return;

}

dim A()as Integer

redim A(m,n)as Integer

'请自己给A数组赋值

dim f as boolean,fmin as boolean,i as integer,j as integer,rmax as integer,rmaxn as integer

f=False

for i=1 to m

rmaxn=1

rmax=A(i,rmaxn)

'找到当前行中最大的数的位置rmaxn

for j=2 to n

if A(i,j)>rmax then

rmax=A(i,j)

rmaxn=j

end if

next

'检查这个数是否是本列中最小的

fmin=true

for j=2 to m

if A(j,rmaxn)<rmax then fmin=false:exit for

next

if fmin then

print "鞍点A("& i &","& rmaxn &")=" & A(i,rmaxn)

f=True

end if

next

if f=False then Print "没有鞍点"

你可以参考<<谭浩强C程序设计题解pdf>>一书的数组这一章,里面有原题。 就你的提问,你有必要将该书所有程序都上机运行一遍,这是基础中的基础。 用百度搜索一下,该书的电子版网上多得很。

以上就是关于c语言求鞍点的程序,求告知我错在哪里了全部的内容,包括:c语言求鞍点的程序,求告知我错在哪里了、这是一个c语言中求鞍点的问题,就是这个程序中有一小部分不太明白,求指导,谢谢了、二维数组的鞍点是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10078614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存