#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
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
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语言程序编写 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)