《2024级通信工程专业面向对象课程设计要求与指导.docx》由会员分享,可在线阅读,更多相关《2024级通信工程专业面向对象课程设计要求与指导.docx(33页珍藏版)》请在课桌文档上搜索。
1、2024级面对对象课程设计要求与指导专业:通信工程指导老师:任世卿,刘洋,马玉峰,李晓静一、课程设计的目的面对对象课程设计是通信工程专业特别重要的实践性环节之一,是学完面对对象程序设计课程后的一次全面的综合练习。本课程设计主要在于巩固学生对面对对象程序设计的基础理论的理解,驾驭面对对象程序设计开发的基本方法,进一步提高学生综合运用所学学问的实力。二、课程设计的要求及内容(一)课程设计的基本要求以MiCroSoftVisualC+6.0作为集成开发环境,完成面对对象课程设计。要求每人完成一个题目,题目由指导老师指派,学生与题目之间一一对应(即两个学生的题目不能重复),学生进行程序分析、设计、编程
2、与调试、功能测试,并最终完成课程设计报告。其中每个题目必需采纳类与对象进行编程,每个题目的程序必需用两种工程实现,一种是Win32ConsoleApplication,输入输出采纳传统DOS的字符式交互界面;另一种是MFCAppWizarcKexe),输入输出采纳基于WindoWS的图形式交互界面。(二)各题目具体要求1 .分数类的设计与实现建立用于完成分数形式运算的类RationalNumbero编写一个测试该类的程序。用整数变量表示类的私有数据(即分子和分母)。给类供应一个能够对所声明的对象初始化的构造函数。为了能够在不供应初始化值的状况下也能对对象初始化,构造函数中应当包含默认的值。构造
3、函数还应当以最简分数的形式存储数据,即2/4应当在对象中存储成分子为1、分母为2的形式。公有成员函数应当有以下功能:(1)(4)两个有理数相加, 两个有理数相减, 两个有理数相乘, 两个有理数相除,以最简形式保存结果; 以最简形式保存结果; 以最简形式保存结果; 以最简形式保存结果;(5) 以a/b的形式输出有理数(a是分子,b是分母);(6) 以浮点形式输出有理数。2 .一维数组类模板的设计与实现建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char,int,float等多种数据类型,类中的成员函数主要包括:(1) 排序函数,能够对数组元素进行升序排列;(2) 查找函数,能够在输
4、入待查元素后,输出其在数组中的下标;(3) 构造函数,初始化输入数组元素,这里要求数组元素的个数n是一个变量;(4) 析构函数,释放数组元素所占用的堆内存;(5) Set函数,可以为指定的数组元素赋值;(6) Get函数,可以读取指定数组元素的值;(7) Print函数,可以输出数组元素的值。(8) 编写一个测试该模板类的程序。3 .向量类的设计与实现编写一个实现n维向量各种操作的类,功能包括:(1) 构造函数实现n维向量的初始化构造,这里n可变;(2) 析构函数实现向量动态内存的释放;(3) 拷贝构造函数实现向量的拷贝构造;(4) 重载赋值运算符=实现两个向量之间的赋值;(5) 编写成员函数
5、求两个向量的内积;(6)编写成员函数求两个向量的外积;(7) 编写成员函数求两个向量的和;(8) 编写成员函数求两个向量的差;(9) 编写成员函数推断两个向量之间的线性相关性。(10)编写一个主函数测试多项式类的上述功能。4 .多项式类的设计与实现开发多项式类Polynomial,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如:2x的指数为4,系数为2。请开发一个完整的POIynonlial类,包括构造函数、析构函数以及“get”函数(读取值)和“set”函数(设置值)。该类还要供应以下重载的运算符:(1) 重载加法运算符+,将两个多项式相加。(2) 重载加法运算符一,将两个
6、多项式相减。(3) 重载赋值运算符=,将一个多项式赋给另外一个多项式。(4) 重载加法运算符*,将两个多项式相乘。(5) 编写一个主函数测试多项式类的上述功能。5 .基于成员函数的方阵类设计与实现设计一个能够实现nXn矩阵操作的类,这里的n可变,主要功能包括:(1) 运用构造函数完成方阵的初始化赋值;(2) 运用析构函数完成矩阵动态内存的释放;(3) 运用函数实现两个矩阵的和;(4) 运用函数实现两个矩阵的差;(5) 运用函数实现两个矩阵的积;(6) 运用函数实现矩阵的转置;(7) 运用函数求矩阵中的最大值;(8) 运用函数求矩阵中的最小值。(9) 编写一个主函数测试上述功能。6 .基于运算符
7、重载的方阵类设计与实现设计一个能够实现nXn矩阵操作的类,这里的n可变,主要功能包括:(1) 运用构造函数完成方阵的初始化赋值;(2) 运用析构函数完成矩阵动态内存的释放;(3) 重载加法运算符+,实现两个矩阵的和;(4) 重载加法运算符一,实现两个矩阵的差;(5) 重载加法运算符*,实现两个矩阵的积;(6) 重载加法运算符二,实现两个矩阵之间的赋值;(7) 运用拷贝构造函数完成方阵的拷贝构造;(8) 重载加法运算符实现矩阵依据行列的格式输出;(9) 编写一个主函数测试上述功能。7 .复数类的设计与实现设计一个第数类,复数类的数据成员是real和imag,它们的数据类型是double,分别表示
8、复数的实部和虚部,要求如下:(1)编写一个带有缺省参数的构造函数,默认值为(0,0),实现一个复数的构造。(2) 编写一个拷贝构造函数,实现一个复数的拷贝构造。(3) 编写一个析构函数,在函数中输出(real,imag)被析构,例如:假如复数的实部为1,虚部为2,则被析构时程序输出:“(1,2)被析构(4) 重载运算符“+”为复数类的成员函数,其功能是返回两个复数的相加的结果。(5) 重载运算符“一”为复数类的成员函数,其功能是返回两个复数的相减的结果。(6) 重载运算符为复数类的友元函数,其功能是返回两个复数的相乘的结果。(7) 重载运算符“/”为复数类的友元函数,其功能是返回两个复数的相除
9、的结果。(8) 重载单目运算符“一”为复数类的友元函数,其功能是返回当前复数的相反数。(9) 重载运算符“”为复数类的友元函数,其功能是依据以格式(real,imag)(10)输入复数。例如:假如复数的实部为L虚部为2,则输入的格式是“(1,2)”。(三)重载运算符“”为复数类的友元函数,其功能是依据以格式(real,imag)(12)输出复数。例如:假如复数的实部为L虚部为2,则输出的结果是“(1,2)”。(13)以上函数在类的内部写出函数原型,在类的外部写出函数实现代码,最终编写一个主函数main测试以上的函数功能。8 .单链表类的设计与实现编写一个实现学生信息单链表各种操作的类,学生信息
10、包括学号、姓名和成果,类实现以下功能:(1) 初始化单链表为空表;(2) 实现单链表的插入操作的成员函数;(3) 实现单链表的删除操作的成员函数;(4) 实现单链表的查找操作的成员函数(给定学号,查找其学号、姓名和成果);(5) 实现求单链表长度的成员函数;(6) 实现建立单链表的成员函数,单链表节点的个数不确定。(7) 编写一个主函数测试上述功能。9 .大整数类的设计与实现计算机中表示整数的位数是有限的,设计并实现一个能够进行随意长度整数精确计算的类,完成以下功能:(1) 用构造函数实现大整数的构造。(2) 重载“+”运算符,实现两个大整数的相加运算;(3) 重载“一”运算符,实现两个大整数
11、的相减运算;(4) 重载运算符,实现两个大整数的相乘运算;(5) 重载运算符,实现大整数的输出。提示:长整数用一维字符型数组来存储,数组的每一个元素依次存储长整数的一位数字。设有k位长整数m,用数组a口存储:m=ak*10(k-l)+ak-l*10(k-2)+.+a2*10l+al*100并用a0存储长整数m的位数,即aO=k.10 .小型人员信息管理系统的设计与实现某小型公司主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,须要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员信息编号依次加Io程序要有对全部人员提升级别
12、的功能。本例中为简洁起见,全部人员的初始级别均为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,推销员认为1级。月薪计算方法是:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理即拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的千分之五。要求为每一类人员单独建立文件,并在每个文件中手工录入一些人员基本信息,并依据这些基本信息计算职工的月薪,并将计算结果保存入相应的磁盘文件中。要求编写程序实现上述功能,并且可以通过实例演示上述功能。11 .高校老师工资的计算与存储某高校的老师
13、的职称等级确定其工资等级,老师共有四种职称等级:助教,讲师,副教授,教授,其月薪分别为:助教900元/月,讲师100O元/月,副教授1300元/月,教授1600元/月。编写一个计算老师工资的程序,要求如下:(1)建立一个抽象基类TeaCher,其数据成员有:老师姓名name,老师职称POSition,老师工资Sala”;成员函数有:纯虚函数CalCSalary()计算老师工资,纯虚函数ShoW()输出老师的姓名、职称和工资。(2)分别从抽象基类TeaCher中派生出四个具体类Assistant,Lecture,AssociateProfessor,Professor,分别表示助教,讲师,副教授
14、,教授。在每一个类中实现三个成员函数,构造函数为老师初始化姓名和职称;CalCSaIary()函数计算老师工资;ShoW()输出老师的姓名、类别和工资,其中输出格式为:姓名:name,职称:position,工资:SaIary元(3)老师的姓名和职称信息包含在磁盘文件teacher,txt中,要求建立teacher,txt文本文件,并输入如下信息:王刚助教李铭讲师,张莉副教授赵蒙教授程序从Teacher.txt文件中读取上述信息,作为工资计算依据。(4)编写一个主函数main测试以上各类,要求用一个基类的指针分别指向派生类对象分别计算每一个人的工资,并将输出结果保存到TeaCher.txt文件
15、中。例如输出如下结果:王刚助教900李铭讲师1000张莉副教授1300赵蒙教授160012 .小型老师与干部管理信息系统的设计与实现分别定义TeaCher(老师)类和Cadre(干部)类,采纳多重继承方式由这两个类派生出新类TeaCheJCadre(老师兼干部)。要求:(1) 在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。(2) 在TeaCher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在TeChearCadre类中还包含数据成员WageS(工资)。(3) 对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成
16、员时,指定作用域。(4) 在类体中声明成员函数,在类外定义成员函数。(5) 在派生类TeaCherCadre的成员函数ShOW中调用TeaCher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用CoUt语句输出职务与工资。(6) 人员的基本信息分别存储在磁盘文件Teacher.txt,Cadre.txt和TeaCherCadre.txt文件中,TeaCher.txt的格式是:(姓名、年龄、性别、地址、电话、职称),Cadre,txt的格式是:(姓名、年龄、性别、地址、电话、职务),Teacher_Cadre.txt的格式是:(姓名、年龄、性别、地址、电话、职称、职务、
17、工资),要求在操作系统中建立上述文件,并依据上述格式手工录入几条记录,程序首先从文件中读取相应数据,然后完成上述功能。13 .图形面积的计算与存储写一个程序,定义抽象基类ShaPe,由它派生出5个派生类:Circle(圆形)、Squre(正方形)、Rectangle(矩形)、Trapezoid(三角形)。用虚函数分别计算几种图形面积,并求它们的和。要求用基类指针数组,使它的每个元素指向一个派生类对象。要求将计算的各种图形面积以及它们和的结果存到磁盘文件ShapeArea.txt中。14 .约瑟夫环问题的求解与仿真约瑟夫环(JOSePh)问题的-一种描述是:编号为1,2,,n个人按顺时针方向围坐
18、一圈,每人持有一个密码(正整数)。一起先任选一个正整数作为报数的上限值m,从第一个人起先按顺时针方向自1起先依次报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起先重新从1报数,如此下去,直到全部人全部出列为止。试通过类的设计求解约瑟夫环问题的出列依次。具体的要求和说明如下:(1)利用单向循环链表存储结构模拟此过程,依据出列的依次输出个人的编号。(2) m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m的值为6(正确的出列依次应为:6,1,4,7,2,3,5)o(3)程序运行后,首先要求用户指定初始报数的上限值,然后读取个人
19、的密码。可设n=30,此题所用的循环链表中不须要“头结点”,请留意空表和非空表的界限。(4)将上述功能改为在依次结构上实现。15 .集合类的设计与实现通过类与对象的设计,编制一个能演示执行集合的并、交和差运算的程序,要求如下:(1)集合的元素限定为小写字母字符a,z,。(2)演示程序以用户和计算机的对话方式执行。(3)以有序链表表示集合。(4)可进一步实现集合的元素判定和子集判定运算。16 .基于插入排序方法的类模板设计与实现建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char,int,float等多种数据类型,并对数组元素实现插入类排序。主要完成如下功能:(1) 实现数组数据的
20、输入和输出;(2) 实现干脆插入排序功能;(3) 实现2-路插入排序功能;(4) 实现希尔排序功能;(5)将每种排序功能作为类的成员函数实现,编写主函数测试上述排序功能。17 .基于交换排序方法的类模板设计与实现建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char,int,float等多种数据类型,并对数组元素实现交换类排序。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 实现单向起泡排序功能;(3) 实现双向起泡排序功能;(4) 实现快速排序功能;(5) 将每种排序功能作为类的成员函数实现,编写主函数测试上述排序功能。18 .基于选择排序方法的类模板设计与实现建立一
21、维数组数据结构的模板类,使一维数组中的数据元素可以是char,int,float等多种数据类型,并对数组元素实现选择类排序。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 实现简洁选择排序功能;(3) 实现树形选择排序功能;(4) 实现堆排序功能;(5) 将每种排序功能作为类的成员函数实现,编写主函数测试上述排序功能。19 .静态查找类模板的设计与实现建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char,int,float等多种数据类型,并对数组元素进行静态查找。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 对数组进行依次查找;(3) 对有序数组进行折半
22、查找(递归算法);(4) 对有序数组进行折半查找(非递归算法);(5) 将每种查找功能作为类的成员函数实现,编写主函数测试上述查找功能。20 .动态查找类模板的设计与实现实现以二叉排序树为代表的动态查找表类模板,数据元素可以是Char,int,float等多种数据类型,包括以下功能:(1) 采纳二叉链表存储结构实现二叉排序树的存储;(2) 实现二叉排序树的建树;(3) 实现二叉排序树结点的插入;(4) 实现二叉排序树结点的删除;(5) 实现二叉排序树结点的查找;(6) 将上述功能作为类的成员函数实现,编写主函数测试上述查找功能。21 .基于开放地址法的哈希表类模板设计与实现实现哈希表类模板,数
23、据元素可以是Char,int,float等多种数据类型,包括以下功能:(1) 实现哈希表的建立,散列函数采纳除留余数法;(2) 运用开放地址法处理冲突;(3) 实现哈希表元素的插入;(4) 实现哈希表元素的删除;(5) 实现哈希表的查找;(6) 将上述功能作为类的成员函数实现,编写主函数测试上述查找功能。22 .基于链地址法的哈希表类模板设计与实现实现哈希表类模板,数据元素可以是Char,int,float等多种数据类型,包括以下功能:(1) 实现哈希表的建立,散列函数采纳除留余数法;(2) 运用链地址法处理冲突;(3) 实现哈希表元素的插入;(4) 实现哈希表元素的删除;(5) 实现哈希表的
24、查找;(6) 将上述功能作为类的成员函数实现,编写主函数测试上述查找功能。23 .赫夫曼编码的设计与实现进行赫夫曼编码类的设计并实现,包括以下功能:(1) 设计类的数据成员和成员函数,实现赫夫曼树的存储;(2) 依据给定的通信字符出现的概率,实现赫夫曼树的建立;(3) 遍历赫夫曼树,求赫夫曼编码;(4) 给出一段字符串,进行赫夫曼编码;(5) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。24 .二叉树类模板的设计与实现进行二叉树类模板的设计并实现,数据元素可以是Char,int,float等多种数据类型,包括以下功能:(1) 采纳依次存储结构或链式存储结构实现二叉树的存储;(2)
25、实现二叉树的建树;(3) 实现二叉树的前序、中序、后序遍历;(4) 能够求解二叉树的结点总数和叶子结点总数;(5) 能够求解二叉树的高度;(6) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。25 .队列类模板的设计与实现进行队列类模板的设计并实现,队列采纳循环队列实现,数据元素可以是char,int,float等多种数据类型,包括以下功能:(1) 实现初始化队列操作,建立一个空队列;(2) 实现清空队列操作;(3) 实现推断队列是否为空的操作;(4) 实现求队列长度的操作;(5) 实现返回队首元素的操作;(6) 实现入队操作;(7) 实现出队操作;(8) 实现队列的遍历操作,输出队
26、列的每个元素。(9) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。26 .栈类模板的设计与实现进行栈类模板的设计并实现,栈采纳链式存储结构,数据元素可以是Char,int,float等多种数据类型,包括以下功能:(1) 实现初始化栈操作,建立一个空栈;(2) 实现清空栈操作;(3) 实现推断栈是否为空的操作;(4) 实现求栈长度的操作;(5) 实现返回栈顶元素的操作;(6) 实现入栈操作;(7) 实现出栈操作;(8)实现栈的遍历操作,输出栈的每个元素。(9) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。27 .表达式求值的设计与实现表达式求值是程序设计语言编译中的一个最
27、基本问题,要求进行类的设计与实现,采纳算符优先法实现表达式求值。具体要求如下:(1)用依次栈作为表达式求值过程中运算符栈和操作数栈的实现;(2)用二维数组存储算符间的优先关系;(3) 采纳算符优先法实现表达式求值;(4) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。28 .基于DijkStra算法的最短路径问题求解进行类的设计与实现,解决最短路径问题。具体要求如下:(1) 采纳图的邻接矩阵或邻接表实现最短路径问题中图的存储;(2) 采纳Dijkstra算法求从某个源点到其余各顶点的最短路径;(3) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。29 .基于FIOyd算法的
28、最短路径问题求解进行类的设计与实现,解决最短路径问题。具体要求如下:(1) 采纳图的邻接矩阵或邻接表实现最短路径问题中图的存储;(2) 采纳Floyd算法求每一对顶点的最短路径;(3) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。30 .基于DFS算法的图的遍历问题求解进行类的设计与实现,解决图的遍历问题。具体要求如下:(1) 采纳图的邻接矩阵或邻接表实现最短路径问题中图的存储;(2) 采纳递归程序实现图的深度优先搜寻(DFS);(3) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。31 .基于BFS算法的图的遍历问题求解进行类的设计与实现,解决图的遍历问题。具体要求如下
29、:(1) 采纳图的邻接矩阵或邻接表实现最短路径问题中图的存储;(2) 采纳队列实现图的广度优先搜寻(BFS);(3) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。32 .基于Priln算法的最小生成树问题求解进行类的设计与实现,解决无向连通图的最小生成树的遍历问题。具体要求如下:(1)采纳图的邻接矩阵或邻接表实现最短路径问题中图的存储;(2) 采纳普里姆(Prim)算法实现最小生成树问题的求解;(3) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。33 .字符串类的设计与实现进行字符串类的设计,具体要求如下:(1) 运用堆安排存储表示实现字符串的存储;(2) 实现串赋值操
30、作StrASSign(&T,chars);(3) 实现串比较操作StrCompare(S,T);(4) 实现求串长操作StrLength(三);(5) 实现串连接操作Concat(&T,SI,S2)(6) 实现求子串操作SubStringCfeSub,S,pos,Ien)(7) 实现清空子串操作ClearString(&S);(8) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。三、课程设计时间支配本课程设计在学完面对对象程序设计课程后进行,具体时间为第1719周,共3周。四、课程设计考核方法(1)课程设计报告不少于5000字,报告除了在封面中应有题目、班级、姓名、学号和课程设计日期
31、以外,其正文一般包括需求分析、类与对象设计、算法设计、图形界面设计、调试问题分析、参考文献等部分。课程设计报告字体格式采纳宋体,小四,行距为最小值20磅,具体可参照后面的课程设计报告范例。(2)程序演示和验收答辩状况在课程设计的后期,指导老师在试验室进行课程设计程序的验收与答辩,由学生演示编制的程序,并回答老师提出的问题,老师检查学生程序的编写状况。(3)课程设计的考勤与纪律遵守状况五、课程设计报告范例下面给出了一个课程设计报告范例,作为同学撰写课程设计报告的参考。封皮(按学校要求手工填写)课程设计任务书学院信息科学与工程学院专业通信工程学生姓名XXX学号1003060XXX设计题目基于全选主
32、元高斯消去法的线性方程组求解内容及要求:许多自然科学和工程技术中的问题的解决最终都归结到线性方程组的求解,高斯消去法是线性方程组解法中很经典的算法,由它改进、变形得到的全选主元消去法,是一种效率很高、较为常用的线性方程组解法。要求采纳C+语言实现线性方程组的求解,具体要求如下:(1)进行类的设计,实现线性方程组的存储与操作。(2)方程组的求解采纳全选主元高斯消去法。(3)编写主函数测试程序的功能。进度支配:第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导老师(签字):年月日学院院长(签字
33、)年月日1需求分析-1-2算法基本原理-1-3类设计-2-4具体设计-3-4.1 类的接口设计-3-4.2 类的实现-5-4.3 主函数设计-10-5DOS界面程序运彳丁结果及分析-11-5.1 程序运行结果-11-5.2 运行结果分析-12-6基于MFC的图形界面程序开发-13-6.1 基于MFC的图形界面程序设计-13-6.2 程序测试-17-6.3 MFC程序编写总结-19-7参考文献-19-1需求分析(1)许多自然科学和工程技术中的问题的解决最终都归结到线性方程组的求解,高斯消去法是线性方程组解法中很经典的算法,由它改进、变形得到的全选主元消去法,是一种效率很高、较为常用的线性方程组解
34、法。(2)线性方程组的一般形式为Ax=b,其中A是线性方程组的系数矩阵,X是列向量,是方程组的解,b也是列向量,这里假定A是非奇异矩阵。(3)程序测试数据来自徐士良先生编著的C常用算法程序集中,所选的方程是:0.2368%+0.247Ix1+0.2568/+1.267Ix3=1.84710.1968x0+0.207Ix1+1.2168x2+0.227Ix3=1.7471O.1581xo+l.l675x1+0.1768x2+0.187Ix3=1.64711.1161xo+O.l245x1+0.1397x2+0.1490x3=1.54712算法基本原理设有n元线性方程组:!-l +,-l-l+4M
35、+ + %怎 T=二仇4t+,内+,Z=bn-将写成矩阵形式AX=仇其中,B=(A,b)=。00aIOaOI,an*boh(4)an-1.0an-,/1-1,M-I全选主元消去就在这个B矩阵上进行,整个过程分为两个步骤:第一步,消去过程。对于k从O起先到n-2结束,进行以下三步:(1)首先,从系数矩阵A的第k行、k列起先的子矩阵中选取肯定值最大的元素作为主元素,例如:K-=ljkjnWo(5)然后交换B的第k行与第il行,第k行与第jl列,这样,这个子矩阵中的具有最大肯定值的元素被交换到第k行、k列的位置。(2)其次,进行归一化计算。计算方法为:(6)akj=akjakk=+l,+2,n-lb
36、fi=bk!akk(3)最终,进行消去运算:aij=akj-aikakj,/,i=4+1,A+2,,一1bj=bj-ajkbk,i=Z+1,A+2,一1(7)其次步,回代过程。Xn-TTeTbi=bi-a,z=w-2,-1,0j=+在这里,只是列出简要地给出了全选主元高斯消去法的算法步骤,具体推导及具体过程可参考数值分析方面的有关资料。3类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。可以定义一个矩阵类Matrix作为基类,然后由矩阵类派生出线性方程组类Linequo矩阵类Matrix只处理nn类型的方阵,方阵用一个一维数组来存放,矩阵类Matrix的数据成员包括数组的首
37、地址和n,矩阵类Matrix的功能有设置矩阵的值SetMatrix()和显示矩阵PrinIM()等。从问题的须要来看,线性方程组类Linequ的数据除了由矩阵类Matrix继承过来用于存放系数矩阵A的成员外,还应当包括存放解向量X和方程右端向量b的数组首地址。线性方程组类Linequ的主要操作有设置SetLinequ()、显示PrintL()、求解SOIVe(汲输出方程的解ShoWX()。可以通过定义线性方程组类LineqU的新增成员函数来实现这些针对方程组求解的功能。矩阵类Matrix和线性方程组类Linequ的组成及相互关系如图1所示。图1Matrix类和Linequ类的派生关系的UML图
38、形表示在线性方程组的求解过程中,在线性方程组类Linequ的成员函数Solve中须要访问基类矩阵类Matrix的数据成员,利用公有继承方式派生,同时将Matrix类中的数据成员的访问限制设置为爱护类型。这样,经过公有派生之后,基类的爱护成员在派生类中依旧是爱护成员,可以被派生类的成员函数访问。4具体设计整个程序分为三个独立的文档,Linequ.h文件中包括矩阵类Matrix和线性方程组类Linequ的声明,Linequxpp文件中包括这两个类的成员函数实现文件;main.cpp文件包括程序的主函数,主函数中定义了一个类Linequ的对象,通过这个对象求解一个四元线性方程组。4.1类的接口设计/
39、Linequ.h文件,实现类的声明#include#includeusingnamespacestd;classMatrix基类Matrix声明(public:外部接口Matrix(intdims=2);构造函数-Matrix();析构函数voidSetMatrix(double*rmax);矩阵赋初值voidPrintM();显示矩阵protected:intindex;方阵的行数double*MatrixA;矩阵存放数组首地址classLinequ:publicMatrix公有派生类Linequ声明(public:外部接口1.inequ(intdims=2);构造函数-Linequ();析
40、构函数voidSetLinequ(double*a,double*b);方程赋值voidPrintL();显示方程intSolve();全选主元高斯消去法求解方程voidShowX();显示方程的解private:私有数据double*sums;方程右端项double*solu;方程的解经过公有派生,Linequ类获得了除构造函数、析构函数之外的Matrix类的全部成员,由于基类的成员是公有和爱护类型,因此在派生类中的成员函数中,基类继承来的成员全部可以访问,而对于建立Linequ类对象的外部模块来讲,基类的爱护成员是无法访问的。通过爱护访问类型和公有的继承方式,实现了基类Matrix的数据的
41、有效共享和牢靠爱护。在程序中,方程的系数矩阵、解以及右端项全部采纳了动态内存安排技术,这些工作都是在基类、派生类的构造函数中完成,它们的清理工作在析构函数中完成。4.2类的实现/Linequ.cpp文件,类实现#include,linequ.h包含类的声明头文件/Matrix类的实现voidMatrix:SetMatrix(double*rmatr)设置矩阵(for(inti=O;iindex*index;i+)MatrixAfi=rmatri;矩阵成员赋初值)Matrix:Matrix(intdims)矩阵Matrix类的构造函数(index=dims;矩阵行数赋值MatrixA=newdo
42、uble(index*index;动态内存安排)Matrix:-Matrix()/矩阵Matrix类的析构函数(deleteMatrixA;内存释放)voidMatrix:PrintM()/显示矩阵元素(coutTheMatrixis:endl;for(inti=0;iindex;i+)(for(intj=O;jindex;j+)cout*(MatrixA+i*index+j)n,;coutendl;派生类Linequ的实现1.inequ:Linequ(intdims):Matrix(dims)派生类Linequ的构造函数(运用参数调用基类构造函数sums=newdoubledims;动态内存
43、安排solu=newdoubledims;1.inequ:Linequ()派生类Linequ的析构函数(deletesums;释放内存deletesolu;voidLinequ:SetLinequ(double*a,double*b)设置线性方程组(SetMatrix(a);调用基类函数for(inti=O;iindex;i+)sumsi=bli;voidLinequ:PrintL()显示线性方程组(cout,Thelineequationis:VVend1;for(inti=O;iindex;i+)(for(intj=O;jindex;j+)cout*(MatrixA+i*index+j)n
44、,;coutn,sumsiendl;1)voidLinequ:ShowX()输出方程组的解coutTheresultis:endl;for(inti=O;iindex;i+)(cout,Xli=usoluiendl;)intLinequ:Solve()全选主元高斯法求解方程(i11t*js,l,k,i,j,is,p,q;doubled,t;double*MatrixB;声明局部矩阵MatrixBMatrixB=newdoubleindex*index;将矩阵MatrixA赋值给MatrixBfor(i=O;iindex*index;i+)MatrixBi=MatrixAi;js=newinti
45、ndex;安排动态内存1=1;for(k=0;k=index-2;k+)消去过程(d=0.0;for(i=k;i=index-l;i+)选取主元素for(j=k;jd)d=t;jsk=j;is=i;)if(d+1.0=1.0)主元素为零1=0;else主元素交换if(jsk!=k)for(i=0;i=index-1;i+)(p=i*index+k;q=i*index+jsk;t=MatrixBp;MatrixBp=MatrixBq;MatrixBq=t;)if(is!=k)(for(j=kj=index-1;j+)(p=k*index+j;q=is*index+j;t=MatrixBp;MatrixBp=MatrixBlq;MatrixBq=t;t=sumsk;sumsk=sum