2012级通信工程专业面向对象课程设计要求与指导.doc

上传人:jian****018 文档编号:9127179 上传时间:2020-04-03 格式:DOC 页数:33 大小:444.50KB
返回 下载 相关 举报
2012级通信工程专业面向对象课程设计要求与指导.doc_第1页
第1页 / 共33页
2012级通信工程专业面向对象课程设计要求与指导.doc_第2页
第2页 / 共33页
2012级通信工程专业面向对象课程设计要求与指导.doc_第3页
第3页 / 共33页
点击查看更多>>
资源描述
2012 级 面向对象课程设计 要求与指导 专业 通信工程 指导教师 任世卿 刘洋 马玉峰 李晓静 一 课程设计的目的 面向对象课程设计是通信工程专业非常重要的实践性环节之一 是学完面向对象程序 设计课程后的一次全面的综合练习 本课程设计主要在于巩固学生对面向对象程序设计的 基础理论的理解 掌握面向对象程序设计开发的基本方法 进一步提高学生综合运用所学 知识的能力 二 课程设计的要求及内容 一 课程设计的基本要求 以 Microsoft Visual C 6 0 作为集成开发环境 完成面向对象课程设计 要求每人 完成一个题目 题目由指导教师指派 学生与题目之间一一对应 即两个学生的题目不能 重复 学生进行程序分析 设计 编程与调试 功能测试 并最终完成课程设计报告 其 中每个题目必须采用类与对象进行编程 每个题目的程序必须用两种工程实现 一种是 Win32 Console Application 输入输出采用传统 DOS 的字符式交互界面 另一种是 MFC AppWizard exe 输入输出采用基于 Windows 的图形式交互界面 二 各题目具体要求 1 分数类的设计与实现 建立用于完成分数形式运算的类 RationalNumber 编写一个测试该类的程序 用整数 变量表示类的私有数据 即分子和分母 给类提供一个能够对所声明的对象初始化的构造 函数 为了能够在不提供初始化值的情况下也能对对象初始化 构造函数中应该包含默认 的值 构造函数还应该以最简分数的形式存储数据 即 2 4 应该在对象中存储成分子为 1 分母为 2 的形式 公有成员函数应该有以下功能 1 两个有理数相加 以最简形式保存结果 2 两个有理数相减 以最简形式保存结果 3 两个有理数相乘 以最简形式保存结果 4 两个有理数相除 以最简形式保存结果 5 以 a b 的形式输出有理数 a 是分子 b 是分母 6 以浮点形式输出有理数 2 一维数组类模板的设计与实现 建立一维数组数据结构的模板类 使一维数组中的数据元素可以是 char int float 等多种数据类型 类中的成员函数主要包括 1 排序函数 能够对数组元素进行升序排列 2 查找函数 能够在输入待查元素后 输出其在数组中的下标 3 构造函数 初始化输入数组元素 这里要求数组元素的个数 n 是一个变量 4 析构函数 释放数组元素所占用的堆内存 5 Set 函数 可以为指定的数组元素赋值 6 Get 函数 可以读取指定数组元素的值 7 Print 函数 可以输出数组元素的值 8 编写一个测试该模板类的程序 3 向量类的设计与实现 编写一个实现 n 维向量各种操作的类 功能包括 1 构造函数实现 n 维向量的初始化构造 这里 n 可变 2 析构函数实现向量动态内存的释放 3 拷贝构造函数实现向量的拷贝构造 4 重载赋值运算符 实现两个向量之间的赋值 5 编写成员函数求两个向量的内积 6 编写成员函数求两个向量的外积 7 编写成员函数求两个向量的和 8 编写成员函数求两个向量的差 9 编写成员函数判断两个向量之间的线性相关性 10 编写一个主函数测试多项式类的上述功能 4 多项式类的设计与实现 开发多项式类 Polynomial 多项式的每一项用链表的结点表示 每项包含一个系数和 一个指数 例如 2x 4的指数为 4 系数为 2 请开发一个完整的 Polynomial 类 包括构造 函数 析构函数以及 get 函数 读取值 和 set 函数 设置值 该类还要提供以下 重载的运算符 1 重载加法运算符 将两个多项式相加 2 重载加法运算符 将两个多项式相减 3 重载赋值运算符 将一个多项式赋给另外一个多项式 4 重载加法运算符 将两个多项式相乘 5 编写一个主函数测试多项式类的上述功能 5 基于成员函数的方阵类设计与实现 设计一个能够实现 n n 矩阵操作的类 这里的 n 可变 主要功能包括 1 使用构造函数完成方阵的初始化赋值 2 使用析构函数完成矩阵动态内存的释放 3 使用函数实现两个矩阵的和 4 使用函数实现两个矩阵的差 5 使用函数实现两个矩阵的积 6 使用函数实现矩阵的转置 7 使用函数求矩阵中的最大值 8 使用函数求矩阵中的最小值 9 编写一个主函数测试上述功能 6 基于运算符重载的方阵类设计与实现 设计一个能够实现 n n 矩阵操作的类 这里的 n 可变 主要功能包括 1 使用构造函数完成方阵的初始化赋值 2 使用析构函数完成矩阵动态内存的释放 3 重载加法运算符 实现两个矩阵的和 4 重载加法运算符 实现两个矩阵的差 5 重载加法运算符 实现两个矩阵的积 6 重载加法运算符 实现两个矩阵之间的赋值 7 使用拷贝构造函数完成方阵的拷贝构造 8 重载加法运算符 为复数类的友元函数 其功能是按照以格式 real imag 10 输入复数 例如 如果复数的实部为 1 虚部为 2 则输入的格式是 1 2 11 重载运算符 为复数类的友元函数 其功能是按照以格式 real imag 12 输出复数 例如 如果复数的实部为 1 虚部为 2 则输出的结果是 1 2 13 以上函数在类的内部写出函数原型 在类的外部写出函数实现代码 最后编写 一个主函数 main 测试以上的函数功能 8 单链表类的设计与实现 编写一个实现学生信息单链表各种操作的类 学生信息包括学号 姓名和成绩 类实 现以下功能 1 初始化单链表为空表 2 实现单链表的插入操作的成员函数 3 实现单链表的删除操作的成员函数 4 实现单链表的查找操作的成员函数 给定学号 查找其学号 姓名和成绩 5 实现求单链表长度的成员函数 6 实现建立单链表的成员函数 单链表节点的个数不确定 7 编写一个主函数测试上述功能 9 大整数类的设计与实现 计算机中表示整数的位数是有限的 设计并实现一个能够进行任意长度整数准确计算 的类 完成以下功能 1 用构造函数实现大整数的构造 2 重载 运算符 实现两个大整数的相加运算 3 重载 运算符 实现两个大整数的相减运算 4 重载 运算符 实现两个大整数的相乘运算 5 重载 运算符 实现大整数的输出 提示 长整数用一维字符型数组来存储 数组的每一个元素顺序存储长整数的一位数 字 设有 k 位长整数 m 用数组 a 存储 m a k 10 k 1 a k 1 10 k 2 a 2 10 1 a 1 10 0 并用 a 0 存储长整数 m 的位数 即 a 0 k 10 小型人员信息管理系统的设计与实现 某小型公司主要有四类人员 经理 兼职技术人员 销售经理和兼职推销员 现在 需要存储这些人员的姓名 编号 级别 当月薪水 计算月薪总额并显示全部信息 人员编号基数为 1000 每输入一个人员信息编号顺序加 1 程序要有对所有人员提升级别的功能 本例中为简单起见 所有人员的初始级别均为 1 级 然后进行升级 经理升为 4 级 兼职技术人员和销售经理升为 3 级 推销员认为 1 级 月薪计算办法是 经理拿固定月薪 8000 元 兼职技术人员按每小时 100 元领取月薪 兼职推销员的月薪按该推销员当月销售额的 4 提成 销售经理即拿固定月薪也领取销售 提成 固定月薪为 5000 元 销售提成为所管辖部门当月销售总额的千分之五 要求为每一类人员单独建立文件 并在每个文件中手工录入一些人员基本信息 并根 据这些基本信息计算职工的月薪 并将计算结果保存入相应的磁盘文件中 要求编写程序 实现上述功能 并且可以通过实例演示上述功能 11 大学教师工资的计算与存储 某大学的教师的职称等级决定其工资等级 教师共有四种职称等级 助教 讲师 副 教授 教授 其月薪分别为 助教 900 元 月 讲师 1000 元 月 副教授 1300 元 月 教授 1600 元 月 编写一个计算教师工资的程序 要求如下 1 建立一个抽象基类 Teacher 其数据成员有 教师姓名 name 教师职称 position 教师工资 Salary 成员函数有 纯虚函数 CalcSalary 计算教师工资 纯虚 函数 Show 输出教师的姓名 职称和工资 2 分别从抽象基类 Teacher 中派生出四个具体类 Assistant Lecture AssociateProfessor Professor 分别表示助教 讲师 副教授 教授 在每一个类中实现三个成员函数 构造函数为教师初始化姓名和职称 CalcSalary 函 数计算教师工资 Show 输出教师的姓名 类别和工资 其中输出格式为 姓名 name 职称 position 工资 Salary 元 3 教师的姓名和职称信息包含在磁盘文件 teacher txt 中 要求建立 teacher txt 文本文件 并输入如下信息 王刚 助教 李铭 讲师 张莉 副教授 赵蒙 教授 程序从 Teacher txt 文件中读取上述信息 作为工资计算依据 4 编写一个主函数 main 测试以上各类 要求用一个基类的指针分别指向派生类对 象分别计算每一个人的工资 并将输出结果保存到 Teacher txt 文件中 例如输出如下结 果 王刚 助教 900 李铭 讲师 1000 张莉 副教授 1300 赵蒙 教授 1600 12 小型教师与干部管理信息系统的设计与实现 分别定义 Teacher 教师 类和 Cadre 干部 类 采用多重继承方式由这两个类派生 出新类 Teacher Cadre 教师兼干部 要求 1 在两个基类中都包含姓名 年龄 性别 地址 电话等数据成员 2 在 Teacher 类中还包含数据成员 title 职称 在 Cadre 类中还包含数据成 员 post 职务 在 Techear Cadre 类中还包含数据成员 wages 工资 3 对两个基类中的姓名 年龄 性别 地址 电话等数据成员用相同的名字 在 引用这些数据成员时 指定作用域 4 在类体中声明成员函数 在类外定义成员函数 5 在派生类 Teacher Cadre 的成员函数 show 中调用 Teacher 类中的 display 函 数 输出姓名 年龄 性别 职称 地址 电话 然后再用 cout 语句输出职 务与工资 6 人员的基本信息分别存储在磁盘文件 Teacher txt Cadre txt 和 Teacher Cadre txt 文件中 Teacher txt 的格式是 姓名 年龄 性别 地址 电话 职称 Cadre txt 的格式是 姓名 年龄 性别 地址 电 话 职务 Teacher Cadre txt 的格式是 姓名 年龄 性别 地址 电 话 职称 职务 工资 要求在操作系统中建立上述文件 并按照上述格式 手工录入几条记录 程序首先从文件中读取相应数据 然后完成上述功能 13 图形面积的计算与存储 写一个程序 定义抽象基类 Shape 由它派生出 5 个派生类 Circle 圆形 Squre 正方形 Rectangle 矩形 Trapezoid 三角形 用虚函数分别计算几种图形 面积 并求它们的和 要求用基类指针数组 使它的每个元素指向一个派生类对象 要求 将计算的各种图形面积以及它们和的结果存到磁盘文件 ShapeArea txt 中 14 约瑟夫环问题的求解与仿真 约瑟夫环 Joseph 问题的一种描述是 编号为 1 2 n 个人按顺时针方向围坐 一圈 每人持有一个密码 正整数 一开始任选一个正整数作为报数的上限值 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 3 程序运行后 首先要求用户指定初始报数的上限值 然后读取个人的密码 可设 n 30 此题所用的循环链表中不需要 头结点 请注意空表和非空表的界限 4 将上述功能改为在顺序结构上实现 15 集合类的设计与实现 通过类与对象的设计 编制一个能演示执行集合的并 交和差运算的程序 要求如下 1 集合的元素限定为小写字母字符 a z 2 演示程序以用户和计算机的对话方式执行 3 以有序链表表示集合 4 可进一步实现集合的元素判定和子集判定运算 16 基于插入排序方法的类模板设计与实现 建立一维数组数据结构的模板类 使一维数组中的数据元素可以是 char int float 等多种数据类型 并对数组元素实现插入类排序 主要完成如下功能 1 实现数组数据的输入和输出 2 实现直接插入排序功能 3 实现 2 路插入排序功能 4 实现希尔排序功能 5 将每种排序功能作为类的成员函数实现 编写主函数测试上述排序功能 17 基于交换排序方法的类模板设计与实现 建立一维数组数据结构的模板类 使一维数组中的数据元素可以是 char int float 等多种数据类型 并对数组元素实现交换类排序 主要完成如下功能 1 实现数组数据的输入和输出 2 实现单向起泡排序功能 3 实现双向起泡排序功能 4 实现快速排序功能 5 将每种排序功能作为类的成员函数实现 编写主函数测试上述排序功能 18 基于选择排序方法的类模板设计与实现 建立一维数组数据结构的模板类 使一维数组中的数据元素可以是 char int float 等多种数据类型 并对数组元素实现选择类排序 主要完成如下功能 1 实现数组数据的输入和输出 2 实现简单选择排序功能 3 实现树形选择排序功能 4 实现堆排序功能 5 将每种排序功能作为类的成员函数实现 编写主函数测试上述排序功能 19 静态查找类模板的设计与实现 建立一维数组数据结构的模板类 使一维数组中的数据元素可以是 char int float 等多种数据类型 并对数组元素进行静态查找 主要完成如下功能 1 实现数组数据的输入和输出 2 对数组进行顺序查找 3 对有序数组进行折半查找 递归算法 4 对有序数组进行折半查找 非递归算法 5 将每种查找功能作为类的成员函数实现 编写主函数测试上述查找功能 20 动态查找类模板的设计与实现 实现以二叉排序树为代表的动态查找表类模板 数据元素可以是 char int float 等 多种数据类型 包括以下功能 1 采用二叉链表存储结构实现二叉排序树的存储 2 实现二叉排序树的建树 3 实现二叉排序树结点的插入 4 实现二叉排序树结点的删除 5 实现二叉排序树结点的查找 6 将上述功能作为类的成员函数实现 编写主函数测试上述查找功能 21 基于开放地址法的哈希表类模板设计与实现 实现哈希表类模板 数据元素可以是 char int float 等多种数据类型 包括以下功 能 1 实现哈希表的建立 散列函数采用除留余数法 2 使用开放地址法处理冲突 3 实现哈希表元素的插入 4 实现哈希表元素的删除 5 实现哈希表的查找 6 将上述功能作为类的成员函数实现 编写主函数测试上述查找功能 22 基于链地址法的哈希表类模板设计与实现 实现哈希表类模板 数据元素可以是 char int float 等多种数据类型 包括以下功 能 1 实现哈希表的建立 散列函数采用除留余数法 2 使用链地址法处理冲突 3 实现哈希表元素的插入 4 实现哈希表元素的删除 5 实现哈希表的查找 6 将上述功能作为类的成员函数实现 编写主函数测试上述查找功能 23 赫夫曼编码的设计与实现 进行赫夫曼编码类的设计并实现 包括以下功能 1 设计类的数据成员和成员函数 实现赫夫曼树的存储 2 根据给定的通信字符出现的概率 实现赫夫曼树的建立 3 遍历赫夫曼树 求赫夫曼编码 4 给出一段字符串 进行赫夫曼编码 5 将上述功能作为类的成员函数实现 编写主函数测试上述功能 24 二叉树类模板的设计与实现 进行二叉树类模板的设计并实现 数据元素可以是 char int float 等多种数据类型 包括以下功能 1 采用顺序存储结构或链式存储结构实现二叉树的存储 2 实现二叉树的建树 3 实现二叉树的前序 中序 后序遍历 4 能够求解二叉树的结点总数和叶子结点总数 5 能够求解二叉树的高度 6 将上述功能作为类的成员函数实现 编写主函数测试上述功能 25 队列类模板的设计与实现 进行队列类模板的设计并实现 队列采用循环队列实现 数据元素可以是 char int float 等多种数据类型 包括以下功能 1 实现初始化队列操作 建立一个空队列 2 实现清空队列操作 3 实现判断队列是否为空的操作 4 实现求队列长度的操作 5 实现返回队首元素的操作 6 实现入队操作 7 实现出队操作 8 实现队列的遍历操作 输出队列的每个元素 9 将上述功能作为类的成员函数实现 编写主函数测试上述功能 26 栈类模板的设计与实现 进行栈类模板的设计并实现 栈采用链式存储结构 数据元素可以是 char int float 等多种数据类型 包括以下功能 1 实现初始化栈操作 建立一个空栈 2 实现清空栈操作 3 实现判断栈是否为空的操作 4 实现求栈长度的操作 5 实现返回栈顶元素的操作 6 实现入栈操作 7 实现出栈操作 8 实现栈的遍历操作 输出栈的每个元素 9 将上述功能作为类的成员函数实现 编写主函数测试上述功能 27 表达式求值的设计与实现 表达式求值是程序设计语言编译中的一个最基本问题 要求进行类的设计与实现 采 用算符优先法实现表达式求值 具体要求如下 1 用顺序栈作为表达式求值过程中运算符栈和操作数栈的实现 2 用二维数组存储算符间的优先关系 3 采用算符优先法实现表达式求值 4 将上述功能作为类的成员函数实现 编写主函数测试上述功能 28 基于 Dijkstra 算法的最短路径问题求解 进行类的设计与实现 解决最短路径问题 具体要求如下 1 采用图的邻接矩阵或邻接表实现最短路径问题中图的存储 2 采用 Dijkstra 算法求从某个源点到其余各顶点的最短路径 3 将上述功能作为类的成员函数实现 编写主函数测试上述功能 29 基于 Floyd 算法的最短路径问题求解 进行类的设计与实现 解决最短路径问题 具体要求如下 1 采用图的邻接矩阵或邻接表实现最短路径问题中图的存储 2 采用 Floyd 算法求每一对顶点的最短路径 3 将上述功能作为类的成员函数实现 编写主函数测试上述功能 30 基于 DFS 算法的图的遍历问题求解 进行类的设计与实现 解决图的遍历问题 具体要求如下 1 采用图的邻接矩阵或邻接表实现最短路径问题中图的存储 2 采用递归程序实现图的深度优先搜索 DFS 3 将上述功能作为类的成员函数实现 编写主函数测试上述功能 31 基于 BFS 算法的图的遍历问题求解 进行类的设计与实现 解决图的遍历问题 具体要求如下 1 采用图的邻接矩阵或邻接表实现最短路径问题中图的存储 2 采用队列实现图的广度优先搜索 BFS 3 将上述功能作为类的成员函数实现 编写主函数测试上述功能 32 基于 Prim 算法的最小生成树问题求解 进行类的设计与实现 解决无向连通图的最小生成树的遍历问题 具体要求如下 1 采用图的邻接矩阵或邻接表实现最短路径问题中图的存储 2 采用普里姆 Prim 算法实现最小生成树问题的求解 3 将上述功能作为类的成员函数实现 编写主函数测试上述功能 33 字符串类的设计与实现 进行字符串类的设计 具体要求如下 1 使用堆分配存储表示实现字符串的存储 2 实现串赋值操作 StrAssign 4 实现求串长操作 StrLength S 5 实现串连接操作 Concat 8 将上述功能作为类的成员函数实现 编写主函数测试上述功能 三 课程设计时间安排 本课程设计在学完面向对象程序设计课程后进行 具体时间为第 17 19 周 共 3 周 四 课程设计考核办法 1 课程设计报告 不少于 5000 字 报告除了在封面中应有题目 班级 姓名 学号和课程设计日期以外 其正文一般包括需求分析 类与对象设计 算法设计 图形界面设计 调试问题分析 参 考文献等部分 课程设计报告字体格式采用宋体 小四 行距为最小值 20 磅 具体可参照 后面的课程设计报告范例 2 程序演示和验收答辩情况 在课程设计的后期 指导教师在实验室进行课程设计程序的验收与答辩 由学生演示 编制的程序 并回答教师提出的问题 教师检查学生程序的编写情况 3 课程设计的考勤与纪律遵守情况 五 课程设计报告范例 下面给出了一个课程设计报告范例 作为同学撰写课程设计报告的参考 封 皮 按学校要求手工填写 课 程 设 计 任 务 书 学院 信息科学与工程学院 专业 通信工程 学生姓名 XXX 学号 1003060XXX 设计题目 基于全选主元高斯消去法的线性方程组求解 内容及要求 很多自然科学和工程技术中的问题的解决最终都归结到线性方程组的求解 高斯消去法是线性方程组解法中很经典的算法 由它改进 变形得到的全选主 元消去法 是一种效率很高 较为常用的线性方程组解法 要求采用 C 语言实现线性方程组的求解 具体要求如下 1 进行类的设计 实现线性方程组的存储与操作 2 方程组的求解采用全选主元高斯消去法 3 编写主函数测试程序的功能 进度安排 第 17 周 分析题目 查阅课题相关资料 进行类设计 算法设计 第 18 周 程序的设计 调试与实现 第 19 周 程序测试与分析 撰写课程设计报告 进行答辩验收 指导教师 签字 年 月 日 学院院长 签字 年 月 日 目 录 1 需求分析 1 2 算法基本原理 1 3 类设计 2 4 详细设计 3 4 1 类的接口设计 3 4 2 类的实现 5 4 3 主函数设计 10 5 DOS 界面程序运行结果及分析 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 很多自然科学和工程技术中的问题的解决最终都归结到线性方程组的求 解 高斯消去法是线性方程组解法中很经典的算法 由它改进 变形得到的全 选主元消去法 是一种效率很高 较为常用的线性方程组解法 2 线性方程组的一般形式为 Ax b 其中 A 是线性方程组的系数矩阵 x 是 列向量 是方程组的解 b 也是列向量 这里假定 A 是非奇异矩阵 3 程序测试数据来自徐士良先生编著的 C 常用算法程序集 中 所选的 方程是 1 2 算法基本原理 设有 n 元线性方程组 2 将 2 写成矩阵形式 其中 bAx 3 将系数矩阵 A 和向量 b 放在一起 形成增广矩阵 B 4 全选主元消去就在这个 B 矩阵上进行 整个过程分为两个步骤 5471 190 37 01245 6 686580 2 9 3320 310 xx 11 1 0 1 11 101 0 0nnnn nbxaaxx 10101 1 0 1 001 nnnnn bxaa 10 1 0 1 01 nnnbaa 第一步 消去过程 对于 k 从 0 开始到 n 2 结束 进行以下三步 1 首先 从系数矩阵 A 的第 k 行 k 列开始的子矩阵中选取绝对值最大的 元素作为主元素 例如 5 然后交换 B 的第 k 行与第 i1 行 第 k 行与第 j1 列 这样 这个子矩阵中 的具有最大绝对值的元素被交换到第 k 行 k 列的位置 2 其次 进行归一化计算 计算方法为 6 3 最后 进行消去运算 7 第二步 回代过程 8 在这里 只是列出简要地给出了全选主元高斯消去法的算法步骤 具体推 导及详细过程可参考数值分析方面的有关资料 3 类设计 从上面的算法分析可以看到 本设计面临的计算问题的关键是矩阵运算 可以定义一个矩阵类 Matrix 作为基类 然后由矩阵类派生出线性方程组类 Linequ 矩阵类 Matrix 只处理 n n 类型的方阵 方阵用一个一维数组来存放 矩阵类 Matrix 的数据成员包括数组的首地址和 n 矩阵类 Matrix 的功能有设置 矩阵的值 SetMatrix 和显示矩阵 PrintM 等 从问题的需要来看 线性方程组类 Linequ 的数据除了由矩阵类 Matrix 继承 过来用于存放系数矩阵 A 的成员外 还应该包括存放解向量 x 和方程右端向量 b 的数组首地址 线性方程组类 Linequ 的主要操作有设置 SetLinequ 显示 PrintL 求解 Solve 及输出方程的解 showX 可以通过定义线性方程组类 Linequ 的新增成员函数来实现这些针对方程组求解的功能 0max1 ijnji 1 2 1 njakjkj kab 1 2 1 nijakjikjij kbiii 1 1 nnx 0 1 21 ixabijjii 矩阵类 Matrix 和线性方程组类 Linequ 的组成及相互关系如图 1 所示 图 1 Matrix 类和 Linequ 类的派生关系的 UML 图形表示 在线性方程组的求解过程中 在线性方程组类 Linequ 的成员函数 Solve 中 需要访问基类矩阵类 Matrix 的数据成员 利用公有继承方式派生 同时将 Matrix 类中的数据成员的访问控制设置为保护类型 这样 经过公有派生之后 基类的保护成员在派生类中依然是保护成员 可以被派生类的成员函数访问 4 详细设计 整个程序分为三个独立的文档 Linequ h 文件中包括矩阵类 Matrix 和线性 方程组类 Linequ 的声明 Linequ cpp 文件中包括这两个类的成员函数实现文件 main cpp 文件包括程序的主函数 主函数中定义了一个类 Linequ 的对象 通过 这个对象求解一个四元线性方程组 4 1 类的接口设计 Linequ h 文件 实现类的声明 include M a t r i x i n d e x i n t M a t r i x d o u b l e M a t r i x d i m s i n t 2 M a t r i x S e t M a t r i x r m a t r d o u b l e v o i d P r i n t M v o i d l i n e q u s u m s d o u b l e s o l u d o u b l e L i n e q u d i m s i n t 2 L i n e q u S e t L i n e q u a d o u b l e b d o u b l e v o i d P r i n t L v o i d S o l v e i n t S h o e X v o i d include using namespace std class Matrix 基类 Matrix 声明 public 外部接口 Matrix int dims 2 构造函数 Matrix 析构函数 void SetMatrix double rmax 矩阵赋初值 void PrintM 显示矩阵 protected int index 方阵的行数 double MatrixA 矩阵存放数组首地址 class Linequ public Matrix 公有派生类 Linequ 声明 public 外部接口 Linequ int dims 2 构造函数 Linequ 析构函数 void SetLinequ double a double b 方程赋值 void PrintL 显示方程 int Solve 全选主元高斯消去法求解方程 void ShowX 显示方程的解 private 私有数据 double sums 方程右端项 double solu 方程的解 经过公有派生 Linequ 类获得了除构造函数 析构函数之外的 Matrix 类的 全部成员 由于基类的成员是公有和保护类型 因此在派生类中的成员函数中 基类继承来的成员全部可以访问 而对于建立 Linequ 类对象的外部模块来讲 基类的保护成员是无法访问的 通过保护访问类型和公有的继承方式 实现了 基类 Matrix 的数据的有效共享和可靠保护 在程序中 方程的系数矩阵 解以 及右端项全部采用了动态内存分配技术 这些工作都是在基类 派生类的构造 函数中完成 它们的清理工作在析构函数中完成 4 2 类的实现 Linequ cpp 文件 类实现 include linequ h 包含类的声明头文件 Matrix 类的实现 void Matrix SetMatrix double rmatr 设置矩阵 for int i 0 i index index i MatrixA i rmatr i 矩阵成员赋初值 Matrix Matrix int dims 矩阵 Matrix 类的构造函数 index dims 矩阵行数赋值 MatrixA new double index index 动态内存分配 Matrix Matrix 矩阵 Matrix 类的析构函数 delete MatrixA 内存释放 void Matrix PrintM 显示矩阵元素 cout The Matrix is endl for int i 0 i index i for int j 0 j index j cout MatrixA i index j cout endl 派生类 Linequ 的实现 Linequ Linequ int dims Matrix dims 派生类 Linequ 的构造函数 使用参数调用基类构造函数 sums new double dims 动态内存分配 solu new double dims Linequ Linequ 派生类 Linequ 的析构函数 delete sums 释放内存 delete solu void Linequ SetLinequ double a double b 设置线性方程组 SetMatrix a 调用基类函数 for int i 0 i index i sums i b i void Linequ PrintL 显示线性方程组 cout The line equation is endl for int i 0 i index i for int j 0 j index j cout MatrixA i index j cout sums i endl void Linequ ShowX 输出方程组的解 cout The result is endl for int i 0 i index i cout X i solu i endl int Linequ Solve 全选主元高斯法求解方程 int js l k i j is p q double d t double MatrixB 声明局部矩阵 MatrixB MatrixB new double index index 将矩阵 MatrixA 赋值给 MatrixB for i 0 i index index i MatrixB i MatrixA i js new int index 分配动态内存 l 1 for k 0 k index 2 k 消去过程 d 0 0 for i k i index 1 i 选取主元素 for j k jd d t js k j is i if d 1 0 1 0 主元素为零 l 0 else 主元素交换 if js k k for i 0 i index 1 i p i index k q i index js k t MatrixB p MatrixB p MatrixB q MatrixB q t if is k for j k j index 1 j p k index j q is index j t MatrixB p MatrixB p MatrixB q MatrixB q t t sums k sums k sums is sums is t if l 0 若主元素为零 求解失败 delete js cout fail endl return 0 d MatrixB k index k 归一化计算 for j k 1 j index 1 j p k index j MatrixB p MatrixB p d sums k sums k d for i k 1 i index 1 i 消去计算 for j k 1 j index 1 j p index i j MatrixB p MatrixB p MatrixB i index k MatrixB k index j sums i sums i MatrixB i index k sums k d MatrixB index 1 index index 1 if fabs d 1 0 1 0 delete js cout fail 0 i t 0 0 for j i 1 j 0 k if js k k t solu k solu k solu js k solu js k t delete js return 1 在类的成员函数实现过程中 派生类的构造函数使用参数调用了基类的构 造函数 为矩阵动态分配了内存空间 而派生类的析构函数同样也调用了基类 的析构函数 只是整个调用过程中完全是由系统内部完成 基类的保护数据成 员 经过公有派生之后 在派生类中是以保护成员的身份出现的 派生类的成 员函数可以自由地进行访问 全选主元高斯消去法求解函数返回值为整数 正常完成之后 返回值为 1 非正常结束后 返回值为 0 根据函数的返回值 就可以判断求解过程的完 成情况 4 3 主函数设计 main cpp 主函数 include linequ h int main 主函数 double a 系数矩阵 0 2368 0 2471 0 2568 1 2671 0 1968 0 2071 1 2168 0 2271 0 1581 1 1675 0 1768 0 1871 1 1161 0 1254 0 1397 0 1490 double b 4 1 8471 1 7471 1 6471 1 5471 方程右端项 Linequ equ1 4 定义一个四元方程组对象 equ1 SetLinequ a b 设置方程组 equ1 PrintL 输出方程组 if equ1 Solve 求解方程组 equ1 ShowX 输出方程组的解 else cout Fail endl 求解失败 return 1 在程序的主函数部分 选择了一个四元方程组作为一个实际例子来验证算 法 方程组的系数及右端项数据都使用一维数组来存储 首先定义一个四元方 程组对象 equ1 在定义过程中调用派生类的构造函数 通过派生类的构造函数 又调用了基类的构造函数 对进一步求解动态分配了内存 接着给方程组的系 数和右端项赋初值 把我们选定的方程组输入到新定义的方程组对象 equ1 中 对象成员函数 PrintL Solve 和 ShowX 分别完成了输出方程组 求解方程组和 输出求解结果的任务 5 DOS 界面程序运行结果及分析 5 1 程序运行结果 程序运行结果如图 2 所示 图 2 程序运行结果 从图 2 中可以看出 程序能够实现全选主元高斯消去法对于线性方程组的 求解 但是 对于求解结果的正确性问题却无法获知 为了能够验证求解结果 的正确性 考虑将求解结果 x 带入原方程 Ax b 中 如果满足原方程 即说明 求解结果是正确的 否则 说明求解存在问题 需对程序进行进一步调试分析 为此 考虑在 Linequ 类中增加测试函数 Test 用以验证求解结果的正确性 void Linequ test 求解结果验证函数 double b2 b2 new double index for int i 0 i index i 将解 solu 带入原方程求出新的右端项 b2 b2 i 0 for int j 0 j index j b2 i b2 i MatrixA i index j solu j for i 0 i index i 输出新的右端项 cout b2 i cout endl 在主函数 main 中增加语句 equ1 test 验证求解结果 经过验证的程序运行结果如图 3 所示 图 3 程序运行结果的验证 从图 3 中可以看出 方程组求解验证的右端项结果与原右端项结果完全一 致 这说明了方程组求解的正确性 5 2 运行结果分析 整个程序中的矩阵存储采用的是一维数组和动态内存分配方式 基类是专门处理矩阵的类 公有派生类 Linequ 是针对线性方程组而设计的 除了继承基类的基本特征之外 结合问题的实际需要 增加了很多线性方程组 所特有的成员 使基类 Matrix 进一步具体化 特殊化 达到对问题的有效描述 和处理 程序的访问控制也是根据问题的需要而设计的 基类的数据成员的存储 维护着矩阵数据 这正是派生类方程组的系数矩阵 使派生类解方程成员函数 必须访问的 利用保护成员特征 将基类数据成员的访问控制属性设置为保护 型 在公有派生类 Linequ 中就可以访问到基类继承下来的保护成员 而对于类 外的其余模块 这些数据无法访问 这样 就在数据的共享与隐藏之间寻找到 一个比较恰当的结合点 在派生过程中 基类的构造函数和析构函数无法继承下来 因此在派生类 中需要添加构造函数 析构函数来完成派生类的初始化和最后清理工作 派生 类的构造函数通过调用基类的构造函数来对基类数据进行初始化 本设计中 派生类 Linequ 的构造函数调用了基类 Matrix 的构造函数并传递必须的初始化参 数 派生类的析构函数调用基类的构造函数 共同完成清理任务 6 基于 MFC 的图形界面程序开发 MFC 的图形界面程序设计可在上述类设计的基础上进行改造 MFC 的图 形界面程序与 DOS 界面程序的主要不同点是 MFC 图形界面程序与 DOS 界面 程序的输入输出方式不同 DOS 界面程序采用字符交互式实现数据输入输出 主要通过 cin cout 等 I O 流实现 而 MFC 的图形程序界面采用标准 Windows 窗口和控件实现输入输出 因此必须在 MFC 类的框架下加入上面所设计的矩阵 和方程组类 并通过图形界面的输入输出改造来完成 6 1 基于 MFC 的图形界面程序设计 1 界面设计 首先在 VC 中建立 MFC AppWizard exe 工程 名称为 GuassLineGUI 并在 向导的 Step1 中选择 Dialog based 即建立基于对话框的应用程序 如下图 4 5 所示 图 4 建立 MFC AppWizard exe 工程 图 5 建立基于对话框的应用程序 将对话框资源中的默认对话框利用工具箱改造成如下界面 如图 6 所示 图 6 方程组求解程序界面设计 图 6 所示的界面中包含了 3 个 Static Text 控件 3 个 Button 控件 和 24 个 Edit Box 控件 控件的基本信息列表如下表 1 所示 表 1 控件基本信息 控件类别 控件 ID 控件 Caption 说明 系数矩阵 A 方程组右端项 bStatic Text IDC STATIC 解 X IDC BUTTON Read 读入数据 IDC BUTTON CALC 计算求解Botton IDC BUTTON Exit 退出 IDC EDIT A00 IDC EDIT A33 矩阵 A 的 16 个元 素 IDC EDIT b0 IDC EDIT b3 向量 b 的 4 个元素 Edit Box IDC EDIT X0 IDC EDIT X3 解 X 的 4 个元素 2 代码设计 为了能够将对话框界面上的控件能够与代码联系起来 需要为 24 个 Edit Box 控件建立 Member Variables 按 Ctrl w 键进入 MFC ClassWizard 界面 选 择 Member Variables 选项卡 可显示成员变量设置界面 如图 7 所示 图 7 成员变量设置界面 通过该界面设置与 24 个 Edit Box 控件对应的成员变量 具体如表 2 所示 表 2 控件基本信息 控件 ID 成员变量类型 成员变量名称 IDC EDIT A00 IDC EDIT A33 double m A00 m A33 IDC EDIT b0 IDC EDIT b3 double m b0 m b3 IDC EDIT X0 IDC EDIT X3 double m X0 m X3 下面是编写代码的重要阶段 可以借鉴在设计基于 DOS 界面的控制台应用 程序的代码 并将其作必要的改写 具体改写的步骤与内容如下 将 Linequ h 文件和 Linequ cpp 文件合并成一个文件 重新命名为 Linequ h 并将其加入 MFC 工程 修改 Linequ h 文件具体包括 将显示矩阵 PrintM 函数和显示方程 PrintL 函数注释掉 因为在图形 界面的程序上已经不需要连个函数承担输出功能了 将输出方程组的解 ShowX 函数加入参数 double x 变成 ShowX double x 以实现将所求的解输出至参数 x 中 并最终完成在对话框界面上 的显示 将全选主元高斯法求解函数 Solve 中的两处 cout 语句去掉 因为不需 要也不能够使用 cout 流实现输出 在对话框类的实现文件 GuassLineGUIDlg cpp 中加入 include Linequ h 以实现在该文件中可使用 Linequ 类 在 GuassLineGUIDlg cpp 文件中加入以下全局变量的定义 以实现 GuassLineGUIDlg 类和 Linequ 类之间的通信 具体代码如下 double a 系数矩阵 0 2368 0 2471 0 2568 1 2671 0 1968 0 2071 1 2168 0 2271 0 1581 1 1675 0 1768 0 1871 1 1161 0 1254 0 1397 0 1490 double b 4 1 8471 1 7471 1 6471 1 5471 方程右端项 double X 存放方程组的解 编写读入数据按钮的消息处理函数 实现将矩阵和右端项的数据刷新到 界面上 具体代码如下 void CGuassLineGUIDlg OnBUTTONRead TODO Add your control notification handler code here m A00 a 0 m A01 a 1 m A02 a 2 m A03 a 3 m A10 a 5 m A11 a 6 m A12 a 7 m A13 a 8 m A20 a 9 m A21 a 10 m A22 a 11 m A23 a 12 m A30 a 13 m A31 a 14 m A32 a 15 m A33 a 16 m b0 b 0 m b1 b 1 m b2 b 2 m b3 b 3 UpdateData FALSE 编写计算求解按钮的消息处理函数 实现将方程求解 具体代码如下 void CGuassLineGUIDlg OnButtonCalc TODO Add your control notification handler code here Linequ equ1 4 定义一个四元方程组对象 equ1 SetLinequ a b 设置方程组 X new double 4 if equ1 Solve 求解方程组 equ1 ShowX X 输出方程组的解 m X0 X 0 m X1 X 1 m X2 X 2 m X3 X 3 UpdateData FALSE else MessageBox 求解失败 求解失败 退出按钮比较简单 代码如下 void CGuassLineGUIDlg OnBUTTONExit TODO Add your control notification handler code here OnOK 6 2 程序测试 运行程序后 首先出现的界面如图 8 所示 图 8 程序初始运行界面 单击读入数据按钮后 可将系数矩阵 A 和方程组右端项 b 的数据在界面上 显示出来 如图 9 所示 图 9 读入数据后的界面 单击计算求解按钮 实现求解并将解显示出来 如图 10 所示 图 10 求解方程组后的界面 单击退出按钮后 程序能够正常实现退出 6 3 MFC 程序编写总结 MFC 程序与 DOS 界面程序编写的最大不同是程序员需要将编程精力放在 图形界面设计 图形界面输入输出以及界面元素和代码对应转换等问题上 而 这些问题在 DOS 界面程序中是不存在的 因此 初学 MFC 的编程者会对此感 到困难 然而 当你编写出一个基于 Windows 界面的程序时 所获得的满足程 度远远大于简单的 DOS 界面程序 况且基于 Windows 的图形界面的程序设计 已成为主流 作为程序员而言 是非学会不可的 本次课程设计作为编写 Windows 程序的初步尝试 能够实现程序的主要功 能 可以说是取得了成功 然而好的程序绝不仅仅是只有功能性这一个指标 本此编写的 MFC 程序虽然能实现所需功能 但从面向对象程序设计理念和图形 界面设计要求来说 尚存在不足 主要包括以下几个方面 1 使用全局变量存储矩阵系数 方程组右端向量和解向量本身有悖面向 对象程序设计理念 需要将其改进 利用局部变量和其它方式实现存储 作者 认为最理想的方式是使用文件 2 将类的定义与实现放在同一个头文件 Linequ h 中也违背了面向对象程 序设计理念 需要将二者分开成定义文件和实现文件 3 图 10 所示的界面中对解的显示没有格式化 导致界面看起来不够规 范 需要对解的输出进行小数点固定位数显示 7 参考文献 1 徐士良 C 常用算法程序集 北京 清华大学出版社 1995 2 郑莉 董渊 张瑞丰 C 语言程序设计 第 3 版 北京 清华大学出版社 2007 3 钱能 C 程序设计教程 第二版 北京 清华大学出版社 2007 4 陈志泊 王春玲 面向对象的程序设计语言 C 北京 人民邮电出版社 2002 5 李庆扬 王能超 易大义 数值分析 湖北 华中理工大学出版社 1986
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!