当前位置: 代码迷 >> C语言 >> 鞍点 C/C++
  详细解决方案

鞍点 C/C++

热度:347   发布时间:2007-09-24 08:28:53.0
鞍点 C/C++
烦请大家帮我看一下这个程序有什么问题,
这是一个关于输入一个二位数组的鞍点的程序
鞍点就是一行中最大一列中最小的点
#include<iostream>
#include<stdio.h>
using namespace std;
#define M 5
void main()
{
int a[M][M],an[M];
int m,n,flag=0,s=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
for(int j=1;j<M;j++)
{
if(a[i][j]>=a[i][j-1])
{
an[i]=a[i][j];
m=i,n=j;
}
else
{
an[i]=a[i][j-1];
m=i,n=j-1;
}
}
for(int k=0;k<M;k++)
{
if(an[i]<=a[k][n])
flag=1;
else
flag=0;
}
if(flag==1)
{
s++;
cout<<"第"<<s<<"个鞍点是a["<<m<<"]["<<n<<"]="<<an[i]<<endl;
}
if(s==0)
cout<<"此数列无鞍点!"<<endl;
}
}
搜索更多相关的解决方案: 鞍点  include  std  void  

----------------解决方案--------------------------------------------------------

我想说的是你的编程风格不好啊,看着眼花!不看了


----------------解决方案--------------------------------------------------------

#include<iostream> #include<stdio.h>
using namespace std ; #define M 5 void main() { int a[M][M],an[M]; int m,n,flag=0,s=0 ; for(int i=0;i<M;i++) { cout<<"请输入一行数字:"<<endl ; for(int j=0;j<M;j++) cin>>a[i][j]; } for(i=0;i<M;i++) { for(int j=0;j<M;j++) printf("%4d",a[i][j]); cout<<endl ; } for(i=0;i<M;i++) { for(int j=1;j<M;j++) { if(a[i][j]>=a[i][j-1]) { an[i]=a[i][j]; m=i,n=j ; } else { an[i]=a[i][j-1]; m=i,n=j-1 ; } } for(int k=0;k<M;k++) { if(an[i]<=a[k][n]) flag=1 ; else flag=0 ; } if(flag==1) { s++; cout<<"第"<<s<<"个鞍点是a["<<m<<"]["<<n<<"]="<<an[i]<<endl ; } if(s==0) cout<<"此数列无鞍点!"<<endl ; } }

[此贴子已经被作者于2007-9-24 12:48:14编辑过]


----------------解决方案--------------------------------------------------------

[CODE]
#include<iostream>
using namespace std;

#define M 5

int get_max(int a[M][M],int i) /* 求第i行最大数下标 */
{
int j,index=0,tmp;
tmp=a[i][0];
for(j=1;j<M;j++)
{
if(a[i][j]>tmp)
{
tmp=a[i][j];
index=j;
}
else if(a[i][j]==tmp)
return -1;
}
return index;
}

int get_min(int a[M][M],int j) /* 求第j列最小数下标 */

{
int i,index=0,tmp;
tmp=a[0][j];
for(i=1;i<M;i++)
{
if(a[i][j]<tmp)
{
tmp=a[i][j];
index=i;
}
else if(a[i][j]==tmp)
return -1;
}
return index;
}

int main()
{
int a[M][M];
int i_index,j_index,count=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
i_index=get_max(a,i);
if(i_index<0)
{
cout<<i+1<<"行无鞍点!"<<endl;
continue;
}
j_index=get_min(a,i_index);
if(j_index<0)
{
cout<<i_index+1<<"列无鞍点"<<endl;
continue;
}
count++;
cout<<"第"<<count<<"个鞍点为:"<<a[j_index][i_index]<<endl;
}
return 0;
}

[/CODE]
----------------解决方案--------------------------------------------------------

先谢谢三楼的帮我把程序重写了一遍,3Q
四楼的程序我运行了一遍,结果还是不对
不知道我的理解对不对:按点就是以行里最大,一列中最小的一个数。
四楼的函数分别定义的风格觉得不错,值得借鉴


----------------解决方案--------------------------------------------------------
程序改一了下,这次应该是对的了
[CODE]

#include <iostream>
#include <iomanip>
using namespace std;

#define M 4

int get_max(int a[M][M],int i) /* 求第i行最大数下标 */
{
int j,index=0,tmp,count=0;
tmp=a[i][0];
for(j=1;j<M;j++)
{
if(a[i][j]>tmp)
{
tmp=a[i][j];
index=j;
}
}
for(j=0;j<M;j++)
{
if(a[i][j]==tmp)
count++;
}
if(count>1)
return -1;
return index;

}

int get_min(int a[M][M],int j) /* 求第j列最小数下标 */

{
int i,index=0,tmp,count=0;
tmp=a[0][j];
for(i=1;i<M;i++)
{
if(a[i][j]<tmp)
{
tmp=a[i][j];
index=i;
}
}
for(i=0;i<M;i++)
{
if(a[i][j]==tmp)
count++;
}
if(count>1)
return -1;
return index;
}

int main()
{
int a[M][M];
int i_index,j_index,count=0;
for(int i=0;i<M;i++)
{
cout<<"请输入一行数字:"<<endl;
for(int j=0;j<M;j++)
cin>>a[i][j];
}
for(i=0;i<M;i++)
{
for(int j=0;j<M;j++)
cout<<setiosflags(ios::left)<<setw(4)<<a[i][j];
cout<<endl;
}
for(i=0;i<M;i++)
{
i_index=get_max(a,i);
if(i_index<0)
{
cout<<i+1<<"行无鞍点"<<endl;
continue;
}
j_index=get_min(a,i_index);
if(j_index<0)
{
cout<<i_index+1<<"列无鞍点"<<endl;
continue;
}
count++;
cout<<"第"<<count<<"个鞍点为:"<<"a["<<j_index<<"]["<<i_index<<"]:"<<a[j_index][i_index]<<endl;
}
return 0;
}

[/CODE]

[此贴子已经被作者于2007-9-25 13:40:37编辑过]


----------------解决方案--------------------------------------------------------

for(int j=1;j<M;j++)
{
if(a[i][j]>=a[i][j-1])
{
an[i]=a[i][j];
m=i,n=j;
}
else
{
an[i]=a[i][j-1];
m=i,n=j-1;
}
}
这段程序有问题.
假如一行的数据为: 5 1 2 3 4
结果:an[i]==4 m=i,n=4

建议改写成:
for(a[i]=a[i][0],m=i,n=0,int j=1;j<M;j++)
{
if(a[i][j]>a[i] )
{
an[i]=a[i][j];
m=i,n=j;
}
}


----------------解决方案--------------------------------------------------------
回复:(xiuye1987)鞍点 C/C++
谢谢各位的帮忙,我的程序也改好了
#include<iostream>
#include<stdio.h>
using namespace std;
#define M 4
void An()
{
int i,j,t,m,n,k,flag=0,count=0,a[M][M];
for(i=0;i<M;i++)
{
cout<<"输入第"<<i+1<<"行数字:"<<endl;
for(j=0;j<M;j++)
cin>>a[i][j];
cout<<endl;
}
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf("%4d",a[i][j]);
cout<<endl;
}
for(i=0;i<M;i++)
{
t=a[i][0];
m=i;
n=0;
for(j=1;j<M;j++)
if(a[i][j]>t)
{
t=a[i][j];
m=i;
n=j;
}
for(k=0;k<M;k++)
if(t>a[k][n])
flag=1;
if(flag==0)
{
count++;
cout<<"第"<<count<<"个鞍点是:a["<<m<<"]["<<n<<"]="<<t<<endl;
}
else
cout<<"第"<<i+1<<"行无鞍点!"<<endl;
flag=0;
}
}
void main()
{
An();
}
----------------解决方案--------------------------------------------------------
6楼的程序我运行过了,OK
只是会反复输出同一个鞍点
7楼的意见不错
谢谢各位了
----------------解决方案--------------------------------------------------------
  相关解决方案