求马鞍点实验报告资料Word文档下载推荐.docx
- 文档编号:981941
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:21
- 大小:100.63KB
求马鞍点实验报告资料Word文档下载推荐.docx
《求马鞍点实验报告资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《求马鞍点实验报告资料Word文档下载推荐.docx(21页珍藏版)》请在冰点文库上搜索。
M)
操作结果:
初始化矩阵M
CreateTSMatrix(&
创建一个随机矩阵M
CreateMatrixSelf(&
手动创建一个矩阵M
PrintTSMatrix(M)
初始条件:
矩阵M已存在
以阵列形式输出矩阵
GetSaddlePoint(M,&
saddle)
找出矩阵M的马鞍点用三元组形式存储到saddle中
PrintSaddlePoint(M,&
矩阵M已存在,其马鞍点存储在三元组saddle中
输出矩阵M的马鞍点,即saddle中的元素
ClearMatrix(&
清空矩阵
ClearSaddlePoint(&
saddle中存储了矩阵的马鞍点三元组形式
清空马鞍点
}ADTMatrix;
⒊本程序模块结构
1主函数模块
voidmain(){
while(命令不是退出){
printf("
选项:
\n"
);
YourChoice:
"
if(创建新的矩阵){
清空之前的矩阵和马鞍点;
}
switch(choice){
case1:
自己创建新矩阵;
case2:
创建随机的新矩阵;
case3:
输出创建的矩阵;
case4:
找出马鞍点并输出;
default:
退出;
}
}
三、详细设计
1、基本数据类型操作
⑴typedefintElemType;
typedefstruct{
inti,j;
ElemTypee;
}Triple;
//数据类型三元组
Triple*base;
//矩阵基址
intMatrixSize;
//当前的矩阵大小
intmu,nu;
//当前长度
}Matrix;
//矩阵抽象数据类型
2、参数设置:
#defineMAXMATRIXSIZE10000
//----------基本操作的算法描述--------------------
StatusInitMatrix(Matrix*M){
M->
base=(Triple*)malloc(MAXMATRIXSIZE*sizeof(Triple));
if(!
M->
base)
exit(OVERFLOW);
mu=M->
nu=0;
MatrixSize=MAXMATRIXSIZE;
returnOK;
}
StatusCreateMatrix(Matrix*M){
//创建一个随机矩阵,p从1开始
srand((int)time(NULL));
printf("
PleaseInputTheLinesAndColumnsOfTheMatrix:
scanf(M->
mu,M->
nu);
for(m=1;
m<
=M->
mu;
m++){
for(n=1;
n<
nu;
n++){
if(rand()%2)
M->
base[p].e=rand()%20;
else
base[p].e=rand()%20-20;
M->
base[p].i=m;
base[p].j=n;
p++;
StatusCreateMatrixSelf(Matrix*M){
//手动创建一个矩阵,即手动输入,p从1开始
scanf("
%d"
&
base[p].e);
voidClearMatrix(Matrix*M){
//将矩阵行数和列数置为0,即清空矩阵M
StatusPrintMatrix(MatrixM){
//按阵列形式输出矩阵M
if(M.mu==0&
&
M.nu==0){
矩阵为空!
returnFALSE;
矩阵为:
for(i=1;
i<
=M.mu;
i++){
for(j=1;
j<
=M.nu;
j++){
printf("
%4d"
p->
e);
k++;
returnTRUE;
StatusGetSaddlePoint(MatrixM,Triple*saddle){
//找出矩阵M的马鞍点存入saddle中
for(row=1;
row<
row++){
p=(row-1)*M.nu;
//行首元素的下标
l_min[row]=M.base[p].e;
//令每行的第一个元素为最大值
for(col=2;
col<
col++){//从每行的第二个元素开始遍历
//同一行元素存储位置连续,下标下移
if(l_min[row]>
M.base[p].e)
l_min[row]=M.base[p].e;
for(col=1;
col++){
w_max[col]=M.base[col-1].e;
//令每列的第一个元素为最大值
for(row=2;
row++){//从每列的第二个元素开始遍历
q=(row-1)*M.nu+col-1;
//col列的第row个元素的下标,完成同一列元素的依次遍历
if(w_max[col]<
M.base[q].e)
w_max[col]=M.base[q].e;
for(p=1;
p<
p++){
for(q=1;
q<
q++){
if(l_min[p]==w_max[q]){//第p行的最小元素等于第q列的最大元素,则(p,q)为马鞍点位置
saddle[order].i=p;
saddle[order].j=q;
saddle[order++].e=l_min[p];
}
saddle[order].i=0;
saddle[order].j=0;
saddle[order].e=0;
//将0作为封闭条件,0以前的全部为马鞍点
StatusPrintSaddlePoint(MatrixM,Triple*saddle){
//依次输出M的全部马鞍点
Triple*p=saddle;
if(p->
i==0&
p->
j==0){
无马鞍点!
各马鞍点的坐标及值:
\n\n"
行列元素值\n"
while(p->
i>
0){
%3d%4d%6d\n"
i,p->
j,p->
p++;
voidClearSaddlePoint(Triple*saddle){
//清空马鞍点
p->
e=0;
p->
i=0;
j=0;
⑶主函数算法:
while(status!
=OK){
**************************************************\n"
1、CreateNewMatrixByYourself\n"
2、CreateNewMatrixRandomly\n"
3、PrintMatrix\n"
4、PrintSaddlePoint\n"
5、Exit\n"
scanf("
choice);
if(choice==1||choice==2){
ClearMatrix(&
M);
ClearSaddlePoint(saddle);
break;
CreateMatrix(&
PrintMatrix(M);
GetSaddlePoint(M,saddle);
PrintSaddlePoint(M,saddle);
status=OK;
}
四、调试分析
1、矩阵采用三元组顺序表表示,设计存储结构时,给矩阵一个首地址及初始大小,由初始化分配内存空间。
2、寻找马鞍点时采取的算法是分别求出每行最小值和每列最大值用两个数组存储,再用两层for循环控制两个数组的每个元素进行比较,当值相同时,对应的行标和列标即为马鞍点位置。
开始将行最小值和列最大值分别赋为对应行行首元素值和对应列列首元素值,向后遍历时应从行或列的第二个元素开始。
3、由于马鞍点的情况较少,一般情况下都不存在马鞍点,尤其是对随机生成的矩阵,因此又设计了手动创建矩阵的功能,便于验证,同时在主函数中设计了循环,提供创建新矩阵命令时则才会将之前的矩阵和马鞍点清空,提供退出命令时才退出。
五、用户说明
1、本程序的运行环境为windows7(64位)操作系统,执行文件为求马鞍点.exe;
2、进入演示程序后,即显示可进行操作的菜单,根据菜单输入相应的操作序号即可进行相应的操作。
如图所示:
选项1:
手动创建新矩阵
按提示依次输入行数、列数和相应的所有元素值
选项2:
创建随机新矩阵
按提示输入行数和列数后自动完成矩阵的创建
选项3:
输出创建的矩阵
输出m行n列的矩阵
选项4:
输出矩阵的马鞍点
依次输出各马鞍点的三元组形式
选项5:
退出
按任意键退出
六、测试结果
1、手动创建一个存在马鞍点的矩阵
2、创建一个随机矩阵
七、附录(源代码及部分注释)
#include"
stdio.h"
#include"
stdlib.h"
time.h"
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-1
#defineINIT0
typedefintElemType;
typedefintStatus;
inti,j;
ElemTypee;
Triple*base;
intMatrixSize;
intmu,nu;
StatusInitMatrix(Matrix*M);
//初始化矩阵M
StatusCreateMatrix(Matrix*M);
//创建随机矩阵
StatusCreateMatrixSelf(Matrix*M);
//手动创建矩阵
voidClearMatrix(Matrix*M);
//清空矩阵
voidClearSaddlePoint(Triple*saddle);
//清空马鞍点
StatusPrintMatrix(MatrixM);
//以阵列形式输出矩阵
StatusPrintSaddlePoint(MatrixM,Triple*saddle);
//输出矩阵的马鞍点
StatusGetSaddlePoint(MatrixM,Triple*saddle);
//求矩阵M的马鞍点
voidmain()
{
MatrixM;
Triplesaddle[25];
intchoice;
Statusstatus=INIT;
intm,n,p=0;
intvalue;
TheLineNumber:
scanf("
mu);
TheColumnNumber:
inti,j,k=0;
Triple*p=M.base;
introw,col;
intp=0,q=0,order=0;
intl_min[25],w_max[25];
//col列的第row个元素的下标,完成同一列元素的依次遍历
if(l_min[p]==w_max[q]){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 马鞍 实验 报告 资料
![提示](https://static.bingdoc.com/images/bang_tan.gif)