这是一个求矩阵鞍点的程序,鞍点就是该元素在矩阵 所在的行中最大,所在的列中最小。找到错误并修改。

这是一个求矩阵鞍点的程序,鞍点就是该元素在矩阵 所在的行中最大,所在的列中最小。找到错误并修改。,第1张

#include "stdioh"

typedef struct node

{

int x,y;

}anstype;

int matrix[1000][1000];

anstype ans[1000];

int lenx=0,leny=-1;

void prepare();

void work();

void printans();

int main()

{

prepare();

work();

printans();

return 0;

}

void prepare()

{

ans[0]x=0;

char tem;

int Intem=-1;

printf("输入一个矩阵\n");

while(1){

leny=0;

while(1){

while(tem=getchar(),tem==' ');

if((tem=='\n')||(tem==EOF)) break;

matrix[lenx][leny]=tem-'0';

leny=leny+1;

}

if(leny>Intem) Intem=leny;

if(tem==EOF) break;

lenx=lenx+1;

}

leny=Intem;

}

void remember(int x,int y)

{

ans[0]x=ans[0]x+1;

ans[ans[0]x]x=x;

ans[ans[0]x]y=y;

}

void work()

{

int i,j,j1,k;

int tem;

int ColIndex[100]={0};

for(i=0;i<lenx;i=i+1){

tem=0;

for(j=1;j<leny;j=j+1) 

  if(matrix[i][j]>matrix[i][tem])tem=j; //行上最大值是matrix[i][tem] 

for(j1=1;j1<leny;j1++)

  if(matrix[i][j1]==matrix[i][tem]){ //matrix[i][j1]也是行上最大值

k=1;

for(j=0;j<leny;j=j+1) 

  if(matrix[j][j1]<matrix[i][j1])k=0;

if(k)remember(i,j1);

}

}

}

void printans()

{

if(ans[0]x==0){

printf("no result found\n");

return;

}

int i;

for(i=1;i<=ans[0]x;i=i+1){

printf("the %dth saddle position is (%d,%d)\n",i,ans[i]x+1,ans[i]y+1);

}

}

1、代码中 exit for 语句的执行是需要满足条件的,所以说这个不一定会被执行。

2、对于FOR循环来说,只要中途不退出循环,那么最终的 变量值=上限+不进值,也就是最终 JJ=M+1 。

3、JJ>M 这个主要是用来判断循环是否执行完,换句话说就是 判断 exit for 语句是否被执行,再往上看就是 如果JJ>M 那么 A(JJ, MaxJ) >= Max 。

4、exit for 语句执行后就退出循环了,所以如果JJ=1时候退出,那么JJ=2是不会执行了。

#define N 10

#define M 10

void main( )

{ int i, j, k, m, n, flag1, flag2, a[N][M], max, maxj;

printf("输入行列数n,m:");

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

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

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

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

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])

{ printf("第%d 行,第%d 列的%d 是鞍点\n", i,maxj,max);

flag2=1;}

if(flag1) flag1=0;

}

if(!flag2) printf(" 矩阵中无鞍点!\n");

}

1、首先,定义3个整型变量,保存控制数组元素的变量,以及左侧对角线元素的和、右侧对角线元素的和。

2、接着,给数组赋初值,即输入一个44方阵。

3、设置suml和sumr的初值为0。

4、用for循环控制读入方阵对角线上的各元素,实现对角线上各元素的和。

5、计算左侧对角线和右侧对角线上各元素的和,用累加的方式实现运算。

6、最后,分别输出方阵左侧对角线和右侧对角线上各元素的和。

第一题(不需要添加控件,点击窗体就可以执行,n能到30,但窗体不好显示哦):

Private Sub Form_click()

n = Val(InputBox("请输入n:"))

ReDim a(n + 1, n + 1), b(n + 1, n + 1)

Cls

k = 8 '建议选择偶数

For i = 1 To n

Print String((n - i) k / 2 + 1, " ");

For j = 1 To i

a(i, 1) = 1

a(i, i) = 1

a(i + 1, j + 1) = a(i, j) + a(i, j + 1)

b(i, j) = Trim(Str(a(i, j)))

Print b(i, j); String(k - Len(b(i, j)), " ");

Next j

Print

Next i

End Sub

第二题(不需要添加控件,点击窗体就可以执行,是用笨办法来求的,小女子是英语专业,其实都不知道什么叫鞍点,百度后才知道的)

'鞍点是该行最小,该列最大

Private Sub Form_Click()

Dim a(1 To 5, 1 To 5)

Dim b(1 To 5, 1 To 5) As Boolean '用来标志是否鞍点

Dim i, j, k, n

Cls

Print "55矩阵如下:"

For i = 1 To 5

For j = 1 To 5

a(i, j) = Val(InputBox("请输入a(" & i & "," & j & "):"))

b(i, j) = True

Print a(i, j),

Next

Print

Next

For i = 1 To 5

For j = 1 To 5

For k = 1 To 5

If a(i, j) > a(i, k) Then b(i, j) = False

If a(i, j) < a(k, j) Then b(i, j) = False

Next

Next

Next

n = 0

For i = 1 To 5

For j = 1 To 5

If b(i, j) = True Then

Print "第" & i & "行,第" & j & "列:" & a(i, j) & "是鞍点"

n = n + 1

End If

Next

Next

If n = 0 Then Print "上述矩阵没有鞍点"

End Sub

#include "stdafxh"

#include "stdlibh"

#include "timeh"

#include <iomanip>

#include <iostream>

using namespace std;

int main(int argc, char argv[])

{

int a[5][4];

int i,j,k,m,n;

int flag=1;

// 用随机函数给数组赋值

srand(time(NULL));

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

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

a[i][j]=rand()%5;

//输出数组

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

{

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

cout<<setw(4)<<a[i][j];

cout<<endl;

}

//寻找鞍点

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

{

for(m=0,j=1;j<4;j++)

if(a[i][m]<a[i][j]) m=j; //找出每行最大数

for(k=0;k<4;k++)

if(a[i][k]==a[i][m]) //凡等于该行最大数者,都与所在列的元素比较,

{

for(n=i,j=0;j<5;j++)

if(a[n][k]>a[j][k]) {n=j;break;} //如果该元素所在列有小于它的元素,结束比较

//如果该元素所在列有元素都不大于它,则它是最小数,将其输出,并标记flag,以示有鞍点

if(n==i){flag=0; cout<<i+1<<"行"<<k+1<<"列"<<",鞍点元素:"<<a[i][k]<<endl;}

}

}

if(flag) cout<<"\n没有鞍点。"<<endl;

return 0;

}

//在给数组元素赋值方面有许多方法,此处用随机函数赋值的方法

//因为赋值是随机的,程序运行到出现鞍点时快时慢,看运气吧

//改变a[i][j]=rand()%5; %后的数字,出现的快慢会改变(越小越快)

设计思路:

使用两个相同的二维数组,一个存数据,一个存是鞍点的可能性,可能性若为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;

}

我以前写过一个类似的程序,是C++,现稍作修改,使之符合你的要求,代码如下:

#include <stdioh>

int main()

{

int b[5][4] = { { 1, 2, 3, 4 }, { -1, 0, 3, 2 }, { 4, 5, 6, 8 }, { 0, 4, 1, 7 }, { 2, 1, 5, 6 } };

int i, j, k, r, c, rmax, count = 0;

c = sizeof(b[0]);

r = sizeof(b) / c;

c >>= 2;

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

{

rmax = b[i][0];

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

if(b[i][j] > rmax)

rmax = b[i][j];

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

{

if(b[i][j] == rmax)

{

for(k = 0; k < r; k++)

if(b[k][j] < b[i][j])

goto next;

printf("b[%d][%d] = %d is a saddle point\n", i, j, b[i][j]);

count++;

}

next: ;

}

}

if(!count)

printf("There's no saddle point in this array\n");

return 0;

}

你可以任意修改数组b的大小,程序都能正确运行;对某行或列中有多个鞍点、或整个数组中没有鞍点的情况都能正确处理。在Visual Studio 60中调试通过,如果你用纯C编译器不行,请把错误信息贴出来,我再改~~~

不过你怎么不给点分啊~~我还是看在以前做过的份上才答的

以上就是关于这是一个求矩阵鞍点的程序,鞍点就是该元素在矩阵 所在的行中最大,所在的列中最小。找到错误并修改。全部的内容,包括:这是一个求矩阵鞍点的程序,鞍点就是该元素在矩阵 所在的行中最大,所在的列中最小。找到错误并修改。、vb中exit for的问题、用c语言程序编写 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存