c++课程设计.docx
- 文档编号:25125347
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:28
- 大小:251.74KB
c++课程设计.docx
《c++课程设计.docx》由会员分享,可在线阅读,更多相关《c++课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
c++课程设计
课程名称
C++语言课程设计
设计题目
矩阵类的设计
指导教师
兰孝文
时间
2010-2011春学期第17、18周
一、教学要求
1.巩固和加深学生对C++语言课程的基本知识的理解和掌握
2.掌握C++语言编程和程序调试的基本技能
3.利用C++语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C++语言解决实际问题的能力
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,可根据设计内容适当修改题目名称。
矩阵类的设计
定义矩阵类,包含行、列和矩阵数据元素;
要求至少设计以下各功能模块:
v输入矩阵
v输出矩阵
v矩阵的加法
v矩阵的乘法
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
4.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
六、建议参考资料
1.《C++面向对象程序设计》,吴敏、杨国林主编,内蒙古大学出版社
2.《C++语言程序设计(第三版)》,郑莉,清华大学出版社
目录
前言3
第一章C++简介4
第二章需求分析7
第三章设计分析12
2.1功能模块12
2.2流程图15
第四章运行及测试结果12
第五章课程设计总结23
附录26
参考文献38
前言
在当今社会,C++的应用越来越广泛,Forrester最新的调查显示,C++、微软、VisualBasic和java是众多公司产品体系的首选语言。
对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。
传统上认为,C++相对于目前一些新潮的语言,如Java、C#,优势在于程序的运行性能。
这种观念并不完全。
如果一个人深信这一点,那么说明他并没有充分了解和理解C++和那个某某语言。
同时,持有这种观念的人,通常也是受到了某种误导。
对于这些公司而言,他们隐藏了C++同某某语言间的核心差别,而把现在多数程序员不太关心的差别,也就是性能,加以强化。
因为随着cpu性能的快速提升,性能问题已不为人们所关心。
这叫“李代桃僵”。
很多涉世不深的程序员,也就相信了他们。
这次主要是关于C++方面的程序设计,通过一周的时间,最终交上设计说明书,并完成答辩,方可合格,本次做的,是关于矩阵加法和减法的运算
语言在软件工程上的好坏,依赖于语言的抽象能力。
从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。
但在实践中,人们发现面向对象无法解决所有软件工程中的问题。
于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。
通过对c++认识,我们也慢慢的崇中认识到,c与c++相比存在着很多不足之处。
无论兼容性和设计思想,还是代码质量,c++都有显著的提高,通过上面的调查,我们也可以看出,现在有很多很潮的语言相许诞生,而且一种比一种强大,对网络编辑和游戏编辑的作用越来越大,我感觉,学好几门语言,对以后这方面的变成作用很大,也为适应这个飞速发展的社会而奋斗,是否能掌握一手先进的知识决定着你是否是一位人才,你是否能在这个社会上立足。
在这个物竞天择的社会,只有不断的提高自己的能力才能更好的适应这个社会,才能跟上社会的发展。
第一章C++简介
C++的发展史:
语言的发展是一个逐步递进的过程,C++是直接从C语言发展过来的,而C语言是从B语言发展过来的,B语言是BCPL的一个解释性后代,BCPL是BasicCPL。
其中最有趣的是CPL中C的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C表示剑桥,伦敦人员加入之后,C表示Combined组合。
还有一种非正式的说法,C表示Christopher,因为Christopher是CPL背后的主要动力。
最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。
同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。
在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。
当时不是叫做C++,而是Cwithclass,这是把它当作一种C语言的有效扩充。
由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:
C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。
在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:
从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
1983年8月,第一个C++实现投入使用,1983年12月,RickMascitti建议命名为CPlusPlus,即C++。
1985年2月,第一个C++ReleaseE发布。
10月,CFront的第一个商业发布,CFrontRelease1.0。
10月,Bjarne博士完成了经典巨著TheC++ProgrammingLanguage第一版。
1986年11月,C++第一个商业移植CFront1.1,Glockenspiel。
1987年2月,CFrontRelease1.2发布。
11月,第一个USENIXC++会议在新墨西哥州举行。
1988年10月,第一次USENIXC++实现者工作会议在科罗拉多州举行。
1989年12月,ANSIX3J16在华盛顿组织会议。
1990年3月,第一次ANSIX3J16技术会议在新泽西州召开.5月,C++的又一个传世经典ARM诞生。
7月,模板被加入。
1991年6月,TheC++ProgrammingLanguage第二版完成。
6月,第一次ISOWG21会议在瑞典召开。
10月,CFrontRelease3.0发布。
1993年3月,运行时类型识别在俄勒冈州被加入。
7月,名字空间在德国慕尼黑被加入。
1994年8月,ANSI/ISO委员会草案登记。
1997年7月,TheC++ProgrammingLanguage第三版完成。
10月,ISO标准通过表决被接受。
1998年11月,ISO标准被批准。
C++的特点:
C++语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,但它比C语言更容易为人们学习和掌握。
C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。
面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃,C++完美地体现了面向对象的各种特性。
C++既具有适合于系统程序设计的C语言所具有的可适应性和高效性,又能在其程序组织结构方面具有像Simula那样的语言设施。
在设计的时候,还做了很大的努力,使得引借自Simula的高层次的程序设计技术能够应用于系统程序设计之中。
这即是说,C++所提供的抽象机制能够被应用于那些对效率和可适应性具有极高要求的程序设计任务之中。
在C++的设计中只要在不严重影响其对强型别检查的支持的地方,都尽量做到与C的“source-link”方式相兼容。
除了某些微小的细节差别之外,C++将C[Kernighan,1978][Kernighan,1988]作为一个子集包含了进来。
C++与C的兼容性使得C++程序员立刻就能有一个完整的语言和工具集可用。
还有两点也很重要,一是有大量关于C的高质量的教学素材已经存在,二是C++程序员可以利用C++与C的兼容性而直接并有效的使用大量现成的程序库。
在决定将C作为C++的基础的时候,C还没有像后来那样出类拔萃、炙手可热,所以在考虑这个问题的时候,与C语言所提供的可适应性和高效性相比,C语言的流行程度只是个次要的考虑因素。
然而,与C的兼容性也使得C++在某些语法和语义上保留了C的一些瑕疵之处。
比如,C语言的声明语法就实在远不及优美;而其内建型别的隐式转换规则也是混乱无章法的。
还有另一个大问题,就是许多从C转向C++的程序员并没有认识到,代码质量上的显著提高只能通过在程序设计风格上的显著改变来达到。
第二章需求分析
题目是矩阵类设计,所实现的功能是定义矩阵类,包含行、列和矩阵数据元素并输入输出矩阵,并实现矩阵加法和乘法及减法的功能。
矩阵是线性代数的一个主要内容,又是解决众多问题的有力工具。
因此,深入理解矩阵运算的来龙去脉,对学好线性代数便会起到极其有益的作用。
然而,在矩阵的运算中,矩阵的加法,数与矩阵之积,都与实数或向量中相应的运算较为一致,因而易于接受,便于掌握。
唯独矩阵的乘法,则与学过的各种乘法大相径庭,相差甚殊,不仅初学者感到莫名其妙,难以接受,甚至学完这门课程仍大惑不解而心存疑窦。
第三章设计分析
2.1功能模块
下图显示了,源码程序所实现的所有功能。
其中包括矩阵的加法、乘法和减法。
图4-1总功能图
类的定义:
classMatrix
//上述定义了一个Matrix类
{
public:
//类的共享形式,为共享。
Matrix():
row(0),column(0),m(0){}
Matrix(constMatrix&ma);进行构造函数的声明,为下面的构造函数的建立提供一个前提。
~Matrix();//给Matrix类加入一个内联的空析构函数。
voidsetMatrix(intr,intc,double**ma);
intgetRow(){returnrow;}
intgetColumn(){returncolumn;}
voiddisplay();将矩阵显示函数的定义
Matrix&operator=(constMatrix&ma);运算符=重载成员函数
Matrixoperator+(constMatrix&ma)const;运算符+重载成员函数
Matrixoperator-(constMatrix&ma)const;运算符重载成员函数
Matrixoperator*(constMatrix&ma)const;运算符重载成员函数
private:
//私有的数据成员
introw;
intcolumn;
double**m;
};
2.2流程图
1、总操作流程图
2、矩阵加法模块图3-2总流程图
功能:
实现任意两个可加性矩阵相加
MatrixMatrix:
:
operator+(constMatrix&ma)const/重载运算符+函数实现
{
double**result=newdouble*[this->row];定义个变量,为double型,将动态储存空间的double型值赋予他。
for(inti=0;i
result[i]=newdouble[this->column];同上赋值过程
for(inti6=0;i6
for(intj=0;j
result[i6][j]=this->m[i6][j]+ma.m[i6][j];实现矩阵的加法运算
Matrixtemp;定义类对象
temp.setMatrix(this->row,this->column,result);对象的成员函数实现
for(inti7=0;i7
delete[]result[i7];释放内存
delete[]result;
returntemp;
}
图3-3矩阵加法流程图
3、矩阵的乘法模块
功能:
实现任意两个可乘性矩阵相乘
MatrixMatrix:
:
operator*(constMatrix&ma)const重载运算符*函数实现
{
for(inti=0;i
result[i]=newdouble[this->column];给变量result赋值
doubleentry;定义对象
for(inti11=0;i11
for(intj=0;j entry=0; for(intk=0;k entry=entry+(this->m[i11][k])*(ma.m[k][j]);实现矩阵乘法功能 result[i11][j]=entry; } Matrixtemp; temp.setMatrix(this->row,ma.column,result); for(inti12=0;i12 delete[]result[i12]; delete[]result; returntemp; } 图3-4矩阵乘法流程图 7、退出 第四章运行及测试结果 运行很顺利,经过测试,程序运行处相应的结果。 并根据题意的要求,做到矩阵的输入,矩阵的加法和乘法,并运行出结果输出矩阵。 1、显示主功能菜单 图4-1主功能菜单 2、矩阵加法执行结果 图4-2矩阵的加法功能 3、矩阵减法执行结果 图4-3矩阵的减法功能 4、矩阵乘法执行结果 图4-4矩阵的乘法功能 5、输出矩阵形式 图4-5矩阵输出 第五章课程设计总结 在课程设计中,牵涉到了很多知识点,我看的最多的书就是谭浩强的关于C++方面的书,其中用到C++中关于重载函数的知识,还有类的定义,构造函数和析构函数的建立。 通过程序编辑、编译、连接、运行和调试编译,来实现矩阵相加相乘。 头文件的作用,加强安全检测,通过头文件可能方便地调用库功能,而不必关心其实现方式,这样更为简单的读出程序。 还有派生类的构造函数应在初始化表里调用基类的构造函数;派生类和基类的析构函数应加Virtual关键字。 不要小看构造函数和析构函数,其实编起来还是不容易。 内存的分配方式,分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 1、静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 2、栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 3、堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 内存分配的注意事项: 用new或malloc分配内存时,必须要对此指针赋初值。 用delete或free释放内存后,必须要将指针指向NULL,不能修改指向常量的指针数据。 关于const和#define的比较: const有数据类型,#define没有数据类型 个别编译器中const可以进行调试,#define不可以进行调试,在类中定义常量有两种方式: 1、在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 2、用枚举代替const常量。 当然还有很多知识,这里不一一罗列啦,通过这次C++课程设计,我也从中学习了很多知识,说实话,以前对C++的重要性缺乏认识,不知道他的重要性所在,在这次学习中,我也从网上收集了很多的资料,先理解,然后在一一分析,在分析的过程中不断的学习,不断的领悟。 在这个过程中,每次的浏览都让自己感触很深,我们真的什么也不会,真的。 在上网浏览的过程中,我也加了几个专业的群,里面都是一些编程人员。 原本想通过他们能给自己一些帮助,但是当我想他们求助的时候却引起了他们的质疑,他们说在这个群里基本上都是一些编程人员,你怎么会提出这么简单的问题呢,再说了,要求都给你写啦,为什么这么简单的还没有搞明白,自己也不动脑子想想。 被群主这么一说,我真的无地自容啦,真的什么也不会什么也不懂,跟那些专业的编程人员比起来,我们真的太次啦。 在以后,学好一门办成语言的重要性,我心里也很清楚,在以前自己也很想静下心来去学几门语言,但总是半途而废,怎么坚持都坚持不下来。 那个时候就开始想着那些很牛的编程人员是不是天生的啊,为什么都有那么大的恒心,那么大的毅力。 在班里面也有很多同学在编程方面很厉害,感觉他们的水平也是很高的,但是通过他们的所作所为,让我慢慢的打消了以前的念头,编程员不是天生的,他们是在不断的练习中让自己变得很强。 他们所做的和我们所做的截然不同,他们才是才子,而我们呢,就是过客,真的很后悔自己没有好好的学习一门语言,没好好的学习C。 最近大四的学长都离校啦,他们的很多书都在外边出售。 我的心里面彭生了一种意念,那就是捡起他们的资源,来让自己更丰富。 我就去买书,买了好多,基本上都是关于编程语言的,想在暑假好好的学一学,让自己也变成这方面的非文盲,让自己强大起来,这次必须说到做到,因为这次的课程设计对我打击太大了,让我深深的感触到自己到底与别人相差多远,相差多大。 我买到了一本C#,开始还不知道他是干什么用的,通过网上我明白了他是在C、C++的基础上有发展出来的另一种很潮流的汇编语言,相对于C、C++他有很多的优越性,他吸收了C、C++的很多优点,并且解决了C、C++出现的很多问题,是一种很好的汇编语言。 这个暑假自己就想好好的发奋一下,好好做,争取能学好这个汇编语言。 附录 源代码为: #include #include usingstd: : cout;//作用域 usingstd: : cin; usingstd: : endl; /***********************矩阵类的定义**********************************/ classMatrix//定义矩阵类 { public: Matrix(): row(0),column(0),m(0){}//构造函数 Matrix(constMatrix&ma);//构造函数的声明 ~Matrix(); voidsetMatrix(intr,intc,double**ma);//成员函数 intgetRow(){returnrow;} intgetColumn(){returncolumn;} voiddisplay();//陈列函数 Matrix&operator=(constMatrix&ma);//运算符=重载成员函数 Matrixoperator+(constMatrix&ma)const;//运算符+重载成员函数 Matrixoperator-(constMatrix&ma)const;//运算符重载成员函数 Matrixoperator*(constMatrix&ma)const;//运算符重载成员函数 private: //私有的数据成员 introw; intcolumn; double**m; }; /***********************构造函数**********************************/ /*****************************************************************/ Matrix: : Matrix(constMatrix&ma)//构造函数的实现 { this->row=ma.row;//字符串的行和列 this->column=ma.column; m=newdouble*[row];//动态分配存储空间 for(inti1=0;i1 m[i1]=newdouble[column]; for(inti2=0;i2 for(intj=0;j m[i2][j]=ma.m[i2][j]; } /**************************析构函数***************************************/ Matrix: : ~Matrix()//析构函数的实现 { for(inti=0;i delete[]m[i]; delete[]m; } /*****************************************************************/ voidMatrix: : setMatrix(intr,intc,double**ma)//设置输入矩阵的实现 { for(inti=0;i delete[]m[i]; delete[]m; this->row=r; this->column=c; m=newdouble*[row]; for(inti3=0;i3 m[i3]=newdouble[column]; for(inti4=0;i4 for(intj=0;j m[i4][j]=ma[i4][j];//赋值m是指针变量 } /*********************输出矩阵********************************************/ voidMatrix: : display()//显示函数的实现 { if(m==0)cout<<"矩阵无法实现\n"; else{ for(inti=0;i for(intj=0;j cout< cout< } } } /************************重载“=”*****************************************/ Matrix&Matrix: : operator=(constMatrix&ma)//重载运算符=函数实现 { if(m! =0) { for(inti=0;i delete[]m[i]; delete[]m; } this->row=ma.row; this->column=ma.colu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)