矩阵运算 数值转换.docx
《矩阵运算 数值转换.docx》由会员分享,可在线阅读,更多相关《矩阵运算 数值转换.docx(30页珍藏版)》请在冰豆网上搜索。
矩阵运算数值转换
南京邮电大学通达学院
程序设计(上机)报告
题目:
R018MP007M
专业市场营销(物流管理)
学生姓名
班级学号
指导教师
日期2010.6.14
评分细则
评分项
优秀
良好
中等
及格
不及格
遵守机房规章制度
上机表现
学习态度
基础知识水平
程序设计能力
课题功能实现情况
算法设计合理性
用户界面友好性
报告书写认真程度
报告内容完整性
文字表达清楚程度
问题回答准确性
评分等级
教师签名:
年月日
备注
注:
评分等级分为五种:
优秀、良好、中等、及格、不及
矩阵运算程序设计报告
一、问题描述
设计一个支持矩阵加减乘运算的程序
二课题分析
本题要求设计一个支持矩阵加减乘运算的程序,简单的功能框图如下:
根据上图显示的功能要求,可以将问题转化为设计一个具有三个主要功能模块(矩阵相加、矩阵相减、矩阵相乘)的矩阵运算系统。
同时,为了配合矩阵运算的需要,该矩阵运算系统必须包含输入和输出矩阵的功能。
为简化运算量,这里,只考虑任意两个矩阵相加、相减和相乘的问题,三个或三个以上矩阵的运算并不执行。
程序运行后,计划达到的目标如下:
(1)提供可操作的主菜单:
程序运行时,首先输出菜单,用于显示若干个可选
的功能选项。
根据用户输入的选项来运行不同的功能,运行不同的函数。
(2)输入信息:
根据不同用户的需要,输入参与运算的矩阵,系统临时保存。
(3)输出信息:
将运算结果以矩阵的格式显现出来。
(4)矩阵相加:
任意输入两个矩阵,如果满足相加条件,界面输出相加结果。
如果不满足相加条件,输出“矩阵不匹配”的提示,请用户重新操作。
(5)矩阵相减:
任意输入两个矩阵,如果满足相加条件,界面输出相减结果。
如果不满足相减条件,输出“矩阵不匹配”的提示,请用户重新操作。
(6)矩阵相乘:
任意输入两个矩阵,如果满足相乘条件,界面输出相乘结果。
如果不满足相乘条件,输出“矩阵不匹配”的提示,请用户重新操作。
三数据结构的设计
classStr
{
private:
intm,n;//表示矩阵的行数和列数
doubles[100][100];//双精度,定义二维数组存储矩阵
public:
intgetm();
intgetn();//调用私有数据
voidinput();//输入矩阵函数
voidoutput();//输出矩阵函数
friendStroperator+(StrA,StrB);
friendStroperator-(StrA,StrB);
friendStroperator*(StrA,StrB);//运算符的重载
};
矩阵类的各个主要部分具体设计方案如下:
(1)矩阵相加:
首先判断要进行相加的两个矩阵是否匹配,即行数和列数是否相等,如果相等,则将两个矩阵类中对应位置的数组元素相加,结果保存到另一个矩阵类的数组中。
(2)矩阵相减:
首先判断要进行相减的两个矩阵是否匹配,即行数和列数是否相等,如果相等,则将两个矩阵类中对应位置的数组元素相减,结果保存到另一个矩阵类的数组中。
(3)矩阵相乘:
首先判断要进行相乘的两个矩阵是否匹配,即第一个矩阵的列数和第二个矩阵的行数是否相等,如果相等,根据矩阵相乘的定义,将两个矩阵类中对应位置的数组元素相乘后叠加,结果保存到另一个矩阵类的数组中。
为了使程序简洁明了,矩阵相加、相减和相乘函数均使用两个参数,用来表示参与运算的两个矩阵。
同时,创建友元运算符函数operator()来实现“+”、“-”和“*”的重载,使其可以自由访问私有数据。
矩阵的匹配判断程序设计在主函数中,而不出现在矩阵相加、相减和相乘函数中。
主函数的设计:
(1)显示欢迎界面和选择菜单。
(2)使用switch()函数,使用户能够自由选择需要的运算。
(3)如果用户选择的选项不在菜单中,提示输入错误,并支持用户重新输入。
可以用default语句及循环实现。
(4)在执行某一选定的操作中,先调用类函数input()来输入进行运算的矩阵,然后进行矩阵是否匹配的判断。
如果矩阵不匹配,马上终止运算并提示用户。
如果矩阵匹配,则调用相应的重载运算符函数进行运算,并将运算结果用output()函数输出。
(5)利用while(i)不断循环,支持用户连续运算,仅当用户选择退出时,才退出操作系统。
四处理结构的设计
(1)矩阵相加(减)函数
矩阵相减函数的流程图与之类似。
(2)矩阵相乘函数
五源程序
#include
usingnamespacestd;
classStr
{
private:
intm,n;//表示矩阵的行数和列数
doubles[100][100];//定义二维数组存储矩阵
public:
intgetm();
intgetn();
voidinput();
voidoutput();
friendStroperator+(StrA,StrB);
friendStroperator-(StrA,StrB);
friendStroperator*(StrA,StrB);//运算符的重载
};
Stroperator+(StrA,StrB)//矩阵相加函数
{
StrC;
inti,j;
for(i=0;ifor(j=0;jC.s[i][j]=A.s[i][j]+B.s[i][j];
C.m=A.m;C.n=A.n;
returnC;
}
Stroperator-(StrA,StrB)//矩阵相减函数
{
StrC;
inti,j;
for(i=0;ifor(j=0;jC.s[i][j]=A.s[i][j]-B.s[i][j];
C.m=A.m;C.n=A.n;
returnC;
}
Stroperator*(StrA,StrB)//矩阵相乘函数
{
StrC;
inti,j,k;
for(i=0;ifor(j=0;j{
C.s[i][j]=0;
for(k=0;kC.s[i][j]=C.s[i][j]+A.s[i][k]*B.s[k][j];
}
C.m=A.m;C.n=B.n;
returnC;
}
voidStr:
:
input()//矩阵输入函数
{
inti,j;
do{cout<<"请输入矩阵的行数、列数:
"<cin>>m>>n;}while(m<1||m>100||n<1||n>100);//保证输入矩阵的行数和列数有效
cout<<"请输入矩阵:
"<for(i=0;i{
for(j=0;jcin>>s[i][j];
}
}
voidStr:
:
output()//矩阵输出函数
{
inti,j;
cout<<"得到的矩阵是:
"<for(i=0;i{
for(j=0;jcout<
cout<}
}
intStr:
:
getm()
{
returnm;
}
intStr:
:
getn()
{
returnn;
}
voidmenu()
{
cout<<"1、矩阵相加运算"<cout<<"2、矩阵相减运算"<cout<<"3、矩阵相乘运算"<cout<<"4、退出运算系统"<}
intmain()
{
intchoice,i=1;
StrA,B,C;
cout<<"*******09005307宋丹丹设计*******"<cout<cout<cout<<"欢迎使用矩阵运算系统"<cout<cout<menu();
while(i)//循环结构,使完成运算后自动进行下一次运算
{
cout<<"请选择:
"<cin>>choice;
switch(choice)
{
case1:
cout<<"矩阵A:
"<A.input();
cout<<"矩阵B:
"<B.input();
if(A.getm()==B.getm()&&A.getn()==B.getn())//判断是否符合运算条件
{
C=A+B;
C.output();
}
else
cout<<"矩阵不匹配!
\n\n";
menu();//回到菜单,进行下一次运算
break;//使用break语句,跳入下一个循环
case2:
cout<<"矩阵A:
"<A.input();
cout<<"矩阵B:
"<B.input();
if(A.getm()==B.getm()&&A.getn()==B.getn())
{
C=A-B;
C.output();
}
else
cout<<"矩阵不匹配!
\n\n";
menu();
break;
case3:
cout<<"矩阵A:
"<A.input();
cout<<"矩阵B:
"<B.input();
if(A.getn()==B.getm())
{
C=A*B;
C.output();
}
else
cout<<"矩阵不匹配!
\n\n";
menu();
break;
case4:
cout<<"************谢谢使用!
************\n\n\n";
cout<<"谢谢老师的辛勤教导我会继续努力!
\n\n\n";i=0;//使其不符合循环条件,跳出循环
break;
default:
cout<<"ErrorInput!
"<}
}
return0;
}
六程序测试记录及调试记录
程序运行后,显示的主菜单界面:
*******09005307宋丹丹设计*******
欢迎使用矩阵运算系统
1、矩阵相加运算
2、矩阵相减运算
3、矩阵相乘运算
4、退出运算系统
请选择:
(1)矩阵相加测试:
输入:
1
输出:
矩阵A:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
1.12.2
3.34.4
输出:
矩阵B:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
4.43.3
2.21.1
输出:
得到的矩阵是:
5.55.5
5.55.5
(2)矩阵相减测试:
输入:
2
输出:
矩阵A:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
9.63.7
2.58.1
输出:
矩阵B:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
3.31.8
0.73.5
输出:
得到的矩阵是:
6.31.9
1.84.6
(3)矩阵相乘测试:
输入:
3
输出:
矩阵A:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
1.22
2.31
输出:
矩阵B:
请输入矩阵的行数、列数:
输入:
22
输出:
请输入矩阵:
输入:
3.23.1
2.34
输出:
得到的矩阵是:
8.4411.72
9.6611.13
(4)退出矩阵运算系统测试
输入:
4
输出:
************谢谢使用!
************
(5)在输入菜单选项时如果输入的内容不是1-4之间的数字,而是其他数字,系统将提示“ErrorInput!
”,若输入的为其他字符(字母或符号),也会出现这种结果。
(6)在输入的矩阵不匹配时,系统提示:
矩阵不匹配!
并重新显示菜单,请用户重新选择。
七相关运行界面
(1)矩阵相加运算:
(2)矩阵相减运算
(3)矩阵相乘运算
(4)矩阵不匹配测试
(5)退出矩阵运算系统
数制转换程序涉及报告
一问题描述
编制不同数制间的转换程序。
要求提供输入输出界面,当输完一个任意十进制数字,程序能自动将其转化为另外的数制表示的值,包括二进制、八进制和十六进制,其中转化用算法实现,而不是用printf函数显示。
二课题分析
将十进制数转换为其他进制的数,其实质是以将被换为的进制数作为除数,从给出的数起依次作除求余,直至整除后结果为零,然后将运算中所得的余数按倒序排列即得到数制转换后所得的数。
在定义数组时需要注意到无符号长整型数的取值范围,提供足够但有效地数组长度。
转换为二进制的数与转换为八进制的数的算法基本一致,即依次记下求余所得,并判断整除后是否为零决定是否继续运算,而转换为十六进制的数时需要注意前十个为数字表示,而后面六个数为用大写的’A’~’F’表示。
运算结束后需要按照从后向前的顺序依次输出,此时需要注意因转换运算中的’i++’,此时数组最后一个位置没有数据存储,需要回到前一个位置。
考虑到充分满足使用者的需求,完成一次运算后自动询问是否继续,继续则继续运算,否则即退出系统。
三数据结构的设计
unsignedlonga,temp;//存储所要转换的数和整除后的数
charb[64];//存储二进制数的数组
charo[21];//存储十进制数的数组
charh[16];//存储十六进制数的数组
在此,所定义的三个数组的长度即分别有效地考虑到无符号长整型数的取值范围
b[i]=temp%2+'0';//求余;强制类型转换为实数
temp/=2;//整除运算
在此需根据temp的值判断是否运算完毕
while(i>=0)
{printf("%c",b[i]);
i--;//从后向前依次输出
}
while(temp&&i<16)
{
intx=temp%16;
if(x<10)h[i]=x+'0';
elseh[i]=x-10+'A';//前十个为数字,后六个为字母
temp/=16;
i++;
}
intm=1;
while(m)
{……
scanf("%d",&m);
switch(m)
{case1:
continue;
case0:
printf("************谢谢使用本系统************");
}}
While循环的设计可有效提高系统的方便性和实用性。
四处理结构的设计
主函数
二进制转换部分函数
八进制与之类似
十六进制转换部分函数
输出部分函数
是
否
五源程序
#include
intmain()
{
unsignedlonga,temp;//定义无符号长整型
charb[64];
charo[21];
charh[16];//无符号长整型数的取值范围
inti,m=1;
printf("*********09005307宋丹丹设计*********\n\n\n");
while(m)
{
printf("Inputnumber:
");
scanf("%ld",&a);
temp=a;
i=0;
while(temp&&i<64)
{
b[i]=temp%2+'0';//求余;强制类型转换为实数
temp/=2;//整除运算
i++;
}
printf("\n二进制:
");
i--;//返回最后一个数的位置
while(i>=0)
{
printf("%c",b[i]);
i--;//从后向前依次输出
}
printf("\n");
temp=a;
i=0;
while(temp&&i<21)
{
o[i]=temp%8+'0';
temp/=8;
i++;
}
printf("八进制:
");
i--;
while(i>=0)
{
printf("%c",o[i]);
i--;
}
printf("\n");
temp=a;
i=0;
while(temp&&i<16)
{
intx=temp%16;
if(x<10)h[i]=x+'0';
elseh[i]=x-10+'A';//前十个为数字,后六个为字母
temp/=16;
i++;
}
printf("十六进制:
");
i--;
while(i>=0&&i<16)
{
printf("%c",h[i]);
i--;
}
printf("\n\n\n");
do{
printf("1、继续\n0、退出\n请选择:
\n");
scanf("%d",&m);
}while(m<0||m>1);
switch(m)
{
case1:
continue;
case0:
printf("************谢谢使用本系统************");
}
}
printf("\n\n\n");
printf("**谢谢老师的辛勤教导我会继续努力!
**\n\n\n");
return0;
}
六调试记录
程序运行后,输出界面:
*********09005307宋丹丹设计*********
Inputnumber:
第一次输入:
65
输出:
二进制:
1000001
八进制:
101
十六进制:
41
1、继续
0、退出
输入:
1
输出:
Inputnumber:
第二次输入:
165
输出:
二进制:
10100101
八进制:
245
十六进制:
A5
1、继续
0、退出
输入:
0
输出:
************谢谢使用本系统************
七相关界面