c++课程设计报告矩阵.docx
- 文档编号:28421324
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:18
- 大小:106.55KB
c++课程设计报告矩阵.docx
《c++课程设计报告矩阵.docx》由会员分享,可在线阅读,更多相关《c++课程设计报告矩阵.docx(18页珍藏版)》请在冰豆网上搜索。
c++课程设计报告矩阵
南京理工大学紫金学院VC++课程设计报告
课程:
VC++课程设计
系别:
计算机系
班级:
计算机科学与技术一班
学号:
120601103
姓名:
储琴琴
课题名称:
矩阵旋转反射
矩阵乘法计算
起止时间:
2013.11.26~2013.12.11
指导教师:
朱俊
2013年12月
1.程序功能介绍
第一题:
矩阵旋转反射
设计一个矩阵类,对矩阵进行多种方式的赋值增加类的构造函数与成员函数来实现矩阵的旋转、反射功能的程序。
第二题:
矩阵乘法计算
仿照矩阵的旋转反射实验程序,判断两个矩阵是否满足乘法运算条件,实现矩阵乘法运算的程序。
2.课程设计要求
第一题:
矩阵旋转反射
(1)设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。
(2)修改程序结构,使程序可以反复执行,直至按键选择退出为止。
(3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[n][n]来放置数据,其中n为用户可输入的任意整数。
(4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以通过键盘赋值,还可以通过读数据文件输入。
(5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行验证。
(6)增加程序功能,除实现n*n矩阵的旋转反射外,还增加
a)求矩阵的模;
b)可以通过键入的行号与列号,任意修改矩阵中的元素值;
c)可以给定矩阵中的某一元素值,查询其所在的行号与列号,并修改其值。
第二题:
矩阵乘法计算
(1)设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。
(2)修改程序结构,使矩阵可以反复执行,直至按键选择退出为止。
(3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[m][n]来放置数据,其中m,n为用户可输入的任意整数。
(4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化时赋值,也可以通过键盘赋值,还可以通过读数据文件输入。
(5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序时,分别定义两个整型矩阵和两个浮点型矩阵进行乘法验证。
(6)完成矩阵的乘法运算,在运算之前判断这两个矩阵能否满足乘法运算的条件,若不满足,则给出提示信息。
3.对课程题目的分析
第一题:
矩阵旋转反射
(1)类的结构
定义一个矩阵类将相关的数据和操作封装起来,该矩阵类使用模板的形式,类中的数据类型用模板定义,在定义对象时再用具体的数据类型代替模板类型。
由于给定的矩阵大小未知,所以类中的矩阵用指针变量代替,定义类的对象时根据nNum的大小再动态分配空间。
(2)main函数结构
main函数采用菜单形式,让用户选择输入矩阵的方式,输入矩阵后同样让用户选择对矩阵的具体操作,操作可循环执行,直到用户选择退出为止。
(3)行列式求模的算法
行列式的模用高斯消去法计算,其算法为消去行列式对角线上方或下方的数据,这样对角线上数据的乘积即为行列式的模。
第二题:
矩阵乘法计算
(1)类的结构
实现乘法运算需要有两个矩阵类对象参与,结果存放在另外一个矩阵类的对象中,重载乘法运算符*,并把这个重载函数定义为类的友元函数。
(2)函数结构
函数采用菜单形式,让用户选择输入矩阵的方式,输入矩阵后进行乘法,乘法运算可反复进行,直到用户选择退出为止。
(3)矩阵乘法的算法
4.程序设计和说明(说明算法思想、设计思路,给出重要的、关键的代码)
第一题:
矩阵旋转反射
矩阵旋转反射在定义类CMatrix的时候用到模板的形式,类中的数据类型用模板定义,在定义对象时在用具体的数据类型代替模板类型。
类的结构如下所示:
template
classCMatrix
{
T**Mat;//矩阵的头指针
intnNum;//矩阵的行数或列数
T**MatR;//变换后的矩阵
T**MatRefl;//旋转后的矩阵
T**Matr;
T**Matre;
public:
CMatrix();//缺省的构造函数
CMatrix(T**mat,intn);//构造函数
CMatrix(intn);//构造函数
~CMatrix();//析构函数
voidShow(intk=0);//输出矩阵,k=0为原矩阵
voidR90();//旋转90度
voidR180();//旋转180度
voidR270();//旋转270度
voidReflectX(intk=0);//X轴反射,k=0为对旋转过的矩阵反射,否则为对原矩阵反射
voidReflectY(intk=0);//Y轴反射,k=0为对旋转过的矩阵反射,否则为对原矩阵反射
voidReflectO(intk=0);//对角线反射,k=0为对旋转过的矩阵反射,否则为对原矩阵反射
intLookForData();//查找数据
intModifyData();//修改数据,先查找,再修改
intModefyData(introw,intcolumn);//修改(row,column)处的数据
doubleRange();//求行列式的值
voidInputFromFile(char*filename);//从文件中输入矩阵
voidInputFromKeyboard();//从键盘中输入矩阵
};
在矩阵旋转反射中,由于给定的矩阵大小未知,所以类中的矩阵用指针变量代替,定义类的对象时根据nNum的大小再动态分配空间。
template
CMatrix
:
CMatrix()
{
inti,j,k=0;
Tn=1.0;
cout<<"矩阵旋转反射\n";
cout<<"请输入矩阵行数:
";
cin>>nNum;
Mat=newT*[nNum];//分配矩阵每一行的空间
MatR=newT*[nNum];
MatRefl=newT*[nNum];
for(i=0;i { Mat[i]=newT;//分配矩阵每一行中数据的空间 MatR[i]=newT; MatRefl[i]=newT; } for(i=0;i for(j=0;j { Mat[i][j]=n; n+=1.0; } } template voidCMatrix : Show(intk) { intr,c; if(k==1)Matre=Mat; if(k==2)Matre=MatR; if(k==3)Matre=MatRefl; for(r=0;r {for(c=0;c { if(Matre[r][c]<10) cout<<""< else cout< } cout< } } 第二题: 矩阵乘法计算 template classCMatrix { structmrep { Vector intrefcnt;//被引用次数 intlength;//矩阵的行数 T**tmppointer; }*p; public: Vector CMatrix();//默认构造 CMatrix(intxsize,intysize,Tinit=0);//构造函数 CMatrix(intxlength,constVector CMatrix(CMatrix ~CMatrix();//析构函数 CMatrix introw()const;//返回行数 intcol()const;//返回列数 Vector operatorT**();//重载** voidReadFromFile();//从文件中读入矩阵 friendCMatrixcpy(CMatrix&v);//拷贝函数 friendstd: : ostream&operator<<(std: : ostream&s,constCMatrix friendstd: : istream&operator>>(std: : istream&s,constCMatrix friendCMatrix }; template CMatrix : CMatrix(intxlength,constVector { if(xlength<=0)cout<<"error! ! "; p=newmrep; p->length=xlength; p->f=newVector for(inti(0);i p->f[i]=newVector } template CMatrix : ~CMatrix()//析构函数 { if(--p->refcnt==0) { if(p->f! =NULL) { intlen=p->length; for(inti(0);i deletep->f[i]; if(p->tmppointer! =NULL) deletep->tmppointer; deletep->f; } } } template voidCMatrix : ReadFromFile()//从文件中读入矩阵 { charfilename[256]; cin>>filename; ifstreaminfile; introw,col; infile.open(filename,ios: : in); if(! infile) { cout<<"不能打开输入文件! "< exit (1); }; infile>>row>>col; CMatrix infile>>v1[0][0]; cout< for(inti(0);i for(intj(0);j infile>>v1[i][j]; *this=v1; } template CMatrix { inti,j; intm1rows=m1.row(); intm1cols=m1.col(); intm2rows=m2.row(); intm2cols=m2.col(); if(m1cols! =m2rows) cout<<"error! "< CMatrix CMatrix for(i=0;i for(j=0;j flip[j][i]=m2[i][j]; for(i=0;i for(j=0;j v[i][j]=dot_prod(m1[i],flip[j]); returnv; } 5.课程设计中遇到的问题及解决方法 第一题: 矩阵旋转反射 问题1: 原程序十分的简单,如何设计一个类,将相应的函数和数据封装在类中,简化程序? 解决办法: 这个矩阵类使用的是模板的形式,类中的数据类型是用模板定义,在定义对象时再用具体的数据类型代替模板类型。 问题2: 如何求行列式的模? 解决办法: 行列式的模是用高斯消去法计算的,起算法为消去行列式对角线上方或下方的数据,这样对角线数据的乘积即为行列式的模。 第二题: 矩阵乘法计算 问题1: 怎样实现要求中对程序的反复执行? 解决办法: 在主函数中设计了voidchoiceid(),voidprocessint(),voidprocessdouble(),通过这几个函数来设计菜单,同时使这几个函数能彼此调用,通过函数的反复调用,就实现了程序的反复执行,直到选择按键退出为止。 以voidchoiceid()为例: voidchoiceid() { cout<<"请输入矩阵类型: \n1.整型2.浮点型\n"; intchoice; cin>>choice; switch(choice) { case1: processint(); break; case2: processdouble(); break; default: break; } } 问题2: 怎么样从文件中读入矩阵? 解决办法: 通过参考各类c++的书籍以及对其他同学程序的借鉴,在定义的类中设计了一个从文件中输入矩阵的成员函数(无返回值),将其命名为ReadFromFil并在该函数内使用了输入与输出流来打开文件,若不能打开文件,则给出 相关的提示信息。 template voidCMatrix : ReadFromFile()//从文件中读入矩阵 { charfilename[256]; cin>>filename; ifstreaminfile; introw,col; infile.open(filename,ios: : in); if(! infile) { cout<<"不能打开输入文件! "< exit (1); }; infile>>row>>col; CMatrix } 6.课程设计中所改变的功能模块 (1)课程设计中所删除的功能模块 第一题: 矩阵旋转反射 删除的功能有: 用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,在执行程序时,分别定义一个整型矩阵和一个浮点型矩阵进行验证。 但在实际的编程过程中并没有设计这一功能来定义一个整型矩阵和一个浮点型矩阵进行验证。 第二题: 矩阵乘法计算 删除的功能有: 在完成矩阵的乘法运算,在运算之前没有判断这两个矩阵能否满足乘法运算的条件,若不满足没有给出提示信息。 (2)课程设计中所增加的功能模块 第一题: 矩阵旋转反射 在课程设计要求中有增加程序功能,,除实现n*n矩阵的旋转反射外,还增加了查找,替换,求模等功能。 在求模是分为对原矩阵求模,对旋转后的矩阵求模,对反射后的矩阵求模等功能。 7.课程设计结果 第一题: 矩阵旋转反射 图1.初始界面 图2.矩阵旋转界面 图3.矩阵反射界面 图4.矩阵其他操作界面 图5.矩阵其他操作界面 图6.矩阵其他操作界面 第二题: 矩阵乘法计算 图1.初始界面 图2.程序运行界面 (1) 图3.程序的运行界面 (2) 图4.运行结束界面 8.还存在的不足之处 第一题: 矩阵旋转反射 课程设计要求中“有用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,在执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行验证。 ”但在实际的编程中没有设计这一功能定义一个一个整型矩阵和一个浮点型矩阵进行验证。 只是默认的用的是整型矩阵来进行矩阵的旋转反射。 第二题: 矩阵乘法计算 在完成矩阵的乘法运算时,在运算之前没有设计判断这两个矩阵能否满足乘法运算的条件,若不满足给出提示信息的程序。 所以第二题中没有编写这一个功能,这是第二题的不足之处。 9.对课程设计的感想和心得体会 通过这次短学期的C++程序设计的学习,我对C++的理解和操作都有了比较大的进步。 C++是一门很有实用价值的科目,它是所有程序设计语言中最有活力和应用最广泛的一种。 它对我们的逻辑思维有很高的要求,很好的训练了我们的思维能力。 这次的设计作业对我们来说也是一次自我的检验和挑战。 在此之前我们从来没有自己动手做过一个这么大的完整的程序,所以在这次的作业过程中我们遇到了很多的困难。 但是正是这些困难让我们更加了解C++的程序设计的精华,让我们对C++有了更正确的认识。 以前以为只要自己想好算法后其他就不难了,但真正自己编的时候才知道,原来编程要求那么高,要有很好的逻辑思维。 有些东西书本上很难学到,只有自己上机实践了才知道怎么做,所以要多上级积累经验,才能真正学会编程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计 报告 矩阵
![提示](https://static.bdocx.com/images/bang_tan.gif)