1、数据结构与算法综合设计课程设计指导书合肥工业大学计算机与信息学院2014 年 6 月一、概述课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。通常,课程设计中的问题比平时的习题复杂的多,也更接近实际。课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活” ,起到深化理解和灵活掌握教学内容的目的。平时的习题较偏重于如何编写功能单一的“小”算法,局限于一个或两个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计基本技能和技
2、巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。此外,还有很重要的一点是:计算机是比任何教师更严厉的检查者。为达到上述目的,使学生更好地掌握程序设计的基本方法和 C+语言的应用,本课程安排了课程设计环节,提供了各类题目供学生选择。每个设计题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等五个部分组成。问题描述旨在为学生建立问题提出的背景,指明问题“是什么” 。基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求。测试数据部分旨在为检查学生上机作业提供方便。在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示,提
3、示的实现方法未必是最好的,学生不应拘泥与此,而应努力设计和开发更好的方法和结构。选做部分向那些尚有余力的读者提出了更高的要求,同时也能开拓其它读者的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改、扩充和重用。二、总体要求1系统分析与系统设计“分析就是在采取行动之前,对问题的研究” (Demarco,1978) 。系统分析在软件开发过程中是非常重要的,其任务就是通过对问题本身的研究,产生一个系统需要做什么的规范的、一致的和可行的需求说明。在此基础上,确定系统中所需考虑的类(对象) 、类之间的关系、本系统中各个类所涉及的属性及针对这
4、些属性的操作。类及类之间的关系可用类图来表示,对象之间的消息传递可用箭头表示,另外一些重要的操作应给出规格说明。2详细设计与编码对类中的属性和操作从实现的角度(如可扩充、在派生类中能否直接使用或只需少量修改、访问的效率和方便性等)进一步考察;对类中的操作(即方法)进一步求精:用 if、while、for 和赋值语句加上自然语言写出算法框架;同时考虑能否使用已有类库(包括直接使用或通过派生)以减少编程的工作量和提高程序的可靠性。编码,即程序设计,是对详细设计的结果的进一步求精,用面向对象语言(如 C+)表达出来。在充分理解和把握语言运行机制的基础上,编写出正确的、清晰的、易读易改和高效率的程序。
5、另外,在标识符的命名、代码的长度(一个方法长度一般不超过 40 行,否则应划分为两个或多个方法) 、程序书写的风格(如缩进格式、空格(空行)的应用、注释等)方面也应注意,遵循统一的规范。3上机调试和测试上机时要带一本面向对象语言的教材,若有开发环境的用户指南(手册)及类库(库函数)手册则更好。应仔细阅读程序编译和连接时的错误信息(通常是英文的) ,弄清其确切含义,提高调试效率。要学习并掌握开发环境所提供的调试工具。经过调试,能够运行的的程序并非就是一个正确的程序。实际上,在上机之前,就应根据系统的需求设计相应的测试数据集,特别是一些异常情况的处理(如用户输入数据未按指定格式、数据极大或极小时程
6、序如何处理等一些极端的情况) 。4课程设计报告课程设计报告的内容及要求:(1)需求和规格说明描述问题,简述题目要解决的问题是什么?规定软件做什么。原题条件不足时补全(2)设计1)设计思想:程序结构(如类图) ,重要的数据结构。主要算法思想(文字描述,不要画框图)2)设计表示:类名及其作用,类中数据成员名称及作用,类中成员函数原型及其功能,可以用表格形式表达。3)实现注释:各项要求的实现程度、在完成基本要求的基础上还实现了什么功能?4)详细设计表示:主要算法的框架及实现此算法的成员函数接口。(3)用户手册即使用说明(包括数据输入时的格式要求) 。(4)调试及测试调试过程中遇到的主要问题是如何解决
7、的;对设计和编码的回顾讨论和分析;程序运行的时空效率分析;测试数据集;运行实例;改进设想;经验和体会等。(5)附录1)源程序清单:打印文本和磁盘文件,磁盘文件是必须的。源程序要加注释,除原有注释外再用钢笔加一些必要的注释和断言。2)测试数据:即列出测试数据集3)运行结果:上面测试数据输入后程序运行的结果注意事项:以上要求为一般的要求,针对具体问题和具体的开发过程,某些方面可以做适当的增减。各种文档资料要在程序开发过程中逐渐形成,而不是最后补写(但不排斥最后誉清) 。各种文档要以统一格式的稿纸用钢笔书写,也可录入计算机用 Word 及其它文字编辑软件排版后打印输出。三、课程设计示例封面: 课程设
8、计报告设计题目: 小型公司人员信息管理学生姓名:专 业:班 级:学 号:指导教师:完成日期:合肥工业大学计算机与信息学院(1) 需求和规格说明某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号基数为 1000,每输入一个人员的信息,编号顺序加 1。程序要对所有人员有提升级别的功能。为简单起见,所有人员的初始级别均为 1 级,然后进行升级,经理升为 4 级,技术人员和销售经理升为 3 级,推销员仍为 1 级。月薪计算办法是:经理拿固定月薪 8000 元;技术人员按每小时 100 元领取月薪;推销员的月薪
9、按该推销员当月销售额的 4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售总额的5。(2) 设计根据上述需求,设计一个基类 employee,然后派生出 technician(技术人员)类、manager(经理)类和 salesman(推销员)类。由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承 manager 和 salesman 两个类。在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。但是各类人员的月薪计算方法不同,不能在基类 e
10、mployee 中统一定义计算方法。各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。因此,在 employee 类中用纯虚函数的方式定义了计算月薪函数 pay()和显示信息函数 displayStatus(),然后在派生类中再根据各自的同名函数实现具体的功能。由于 salesmanager 的两个基类又有公共基类 employee,为避免二义性,这里将 employee 类设计为虚基类。 、系统类图属性和方法定义类名 成员类别 类型 成员名 描述char * name 雇员姓名int individualEmpNo 个人编号int grade 级别float accumPay
11、月薪总额属性int employeeNo 本公司雇员编号目前最大值void pay() 计算月薪函数(为纯虚函数)void promote(int) 升级函数employee方法void DisplayStatus() 显示人员信息(为纯虚函数)employeechar *nameint individualEmpNo;int grade;float accumPay;static int employeeNo;virtual void pay();void promote(int);vitual void displayStatus();technicianfloat hourlyRatei
12、nt workHoursvirtual void pay();vitual void displayStatus();managerfloat monthlyPayvirtual void pay();vitual void displayStatus();salesmanfloat CommRate;float sales;virtual void pay();vitual void displayStatus();salesmanagervirtual void pay();vitual void displayStatus();类名 成员类别类型 成员名 描述float hourlyRa
13、te 每小时酬金属性 int workHours 当月工作时数void pay() accumPay=hourlyRate*workHourstechnician方法 void DisplayStatus() 显示技术人员信息属性float monthlyPay 固定月薪数void pay() AccumPay=monthlyPaymanager方法 void DisplayStatus() 显示经理信息float CommRate 按销售额提取酬金百分比属性 float sales 当月销售额void pay() accumPay=sales*CommRatesalesman方法 void
14、DisplayStatus() 显示推销员信息属性void pay() accumPay=monthlyPay+CommRate*salessalesmanager方法 void DisplayStatus() 显示销售经理信息(3) 用户手册程序运行时,首先提示输入雇员姓名。对于经理直接输出其工资及其它信息;对于技术人员,程序提示输入其本月工作时数,然后输出其工资及其它信息;对于推销员,程序提示输入其本月销售额,然后输出其工资及其它信息;对于销售经理,程序提示输入其管辖部门本月销售总额,然后输出其工资及其它信息。(4) 调试及测试由于公司每增加一个雇员,无论他(她)是哪一类人员,其编号均是顺
15、序加1,也就是 employee 类的所有派生类对象创建时,都要访问同一个employeeNo,因此将 employeeNo 定义为静态数据成员。运行实例:please input employees name: zhangplease input employees name: wangplease input employees name: Liplease input employees name: zhaoinput zhang the workHours of this month: 56Technician: zhang No: 1001 month salary: 5600Tec
16、hnician: zhang No: 1001 grade: 3 this month salary: 5600Manager: wang No: 1002 month salary: 8000Manager: wang No: 1002 grade: 4 this month salary: 8000input Li the sales of this month: 47900Salesman: Li No: 1003 month salary: 1916Salesman: Li No: 1003 grade: 1 this month salary: 1916input zhao the
17、total sales of the department of this month: 123654salesman: zhao No: 1004 month salary: 5618.27salesmanager: zhao No: 1004 grade: 3 this month salary: 5618.27(5)进一步改进(1)目前程序中,经理月薪,技术人员的小时酬金和销售人员的销售额提成比例均是固定的,这不适应不同公司的需要,可考虑用带参数的构造函数来解决。(2)销售经理月薪计算中,要输入其管辖部门当月销售总额。实际上,这可以通过将本部门所有推销员销售额相加而得到。可以考虑在推销员
18、类中增加所属部门等属性来完成这方面的功能。(6)附录源程序四、课程设计题目题 1:求字符串之间距离目的:字符串是一种基础且广泛使用的数据结构,与字符串相关的题目既可以考察基本程序设计能力和技巧,也可以考查较强算法设计能力。要求:设有字符串 X,称在 X 的头尾及中间插入任意多个空格后构成的新字符串为 X 的扩展串,如字符串 X 为“abcbcd” ,则字符串“abcbcd” , “abcbcd”和“abcbcd”都是 X 的扩展串,这里“”代表空格字符。 如果 A1 是字符串 A 的扩展串,B1 是字符串 B 的扩展串,A1 与 B1 具有相同的长度,那么定义字符串 A1 与 B1 的距离为相
19、应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的 ASCII 码的差的绝对值,而空格字符与其它任意字符之间的距离为已知的定值 K,空格字符与空格字符的距离为 0。在字符串A、B 的所有扩展串中,必定存在两个等长的扩展串 A1、B1,使得 A1 与 B1 之间的距离达到最小,将这一距离定义为字符串 A、B 的距离。请编写程序,求出字符串 A、B 的距离。题 2:后缀表达式计算器目的:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:2 1 + 3 *,即(2 + 1) * 3. 通过本课程设计,应使学生掌
20、握后缀表达式的特点、栈的基本方法和基本原理,培养学生运用语言编程及调试的能力,运用数据结构解决简单的实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。要求:实现一个简单的后缀表达式计算器。假定表达式里的基本数值为实数,可用的运算符包括+,-,*,/,,其中的 表示求幂运算。1) 假定输入表达式里的数和运算符之间都有空格,这样可以简化输入的处理;2) 输入的算术表达式以分号为结束符。计算器应该能输入并计算一系列表达式,遇到一行的第一个字符就是分号时程序结束。 3)上题的计算器增加一元函数功能,允许表达式里写 sin, cos, tan, log(自然对数)等函数,还可以考虑加入自定义的其
21、他数学函数。题 3:两个小游戏目的:很多精妙的数学理论往往都以有趣的游戏形式表现出来,正是这些有趣的小游戏使得高深的数学理论被广泛的传播和接受。通过编程实现这些“数学游戏”可以提高学生的编程技巧和算法设计能力,提高解决实际问题的能力。要求:(1)猜数字(文曲星游戏)电脑随机生成一个 09999 之间的整数,若为 23,则记为 0023。玩家去猜,电脑将对玩家的答案做个评价,然后玩家再按电脑的评价重新猜,一共 8 次机会,猜对为赢。比如:电脑随机生成 7859,若玩家第一次输入:1234,程序返回 0A0B,表示猜测的 结果有 0 个 A,0 个 B, A 代表数字和位置都猜对,B 代表数字猜对
22、,但位置不对。若玩家第二次输入:5678,则返回 0A2B,因为 78 都是原整数中的,但是位置不对。若玩家第三次输入:0896,则返回 1A1B依次,直至玩家输入 7859,返回 4A0B 并终止程序。记住,只有 8 次机会哦。扩展:可用机器模拟人进行猜数字,设计多种策略,并比较哪种策略较优.(2)生命游戏(经典游戏,实现起来不难,正因为实现简单却变化繁复所以才成为经典)http:/ 的空间就有 N*N 个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把 3*3 的 9 个格子构成的正方形看
23、成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的 8 个格子。 每个格子的生死遵循下面的原则: 1) 如果一个细胞周围有 3 个细胞为生(一个细胞周围共有 8 个细胞) ,则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。 2) 如果一个细胞周围有 2 个细胞为生,则该细胞的生死状态保持不变; 3) 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案) 。题 4:二叉树结点染色问题目的:二叉树是常用的重要非线性数据
24、结构,在客观世界中有着广泛的应用。通过本题可以加深对于二叉树这一数据结构的理解。掌握二叉树的存储结构及各种操作。要求:一棵二叉树可以按照如下规则表示成一个由 0、1、2 组成的字符序列,我们称之为“二叉树序列 S”:例如,图 1 所表示的二叉树可以用二叉树序列 S=21200110 来表示。图 1 二叉树序列示意图任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。题 5:打印机任务队列目的:通过本
25、课程设计,应使学生掌握队列的基本方法和基本原理,培养学生运用语言编程及调试的能力,运用数据结构解决简单的实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。要求:打印机的打印队列中,每一个打印任务都有一个优先级,为 19 的一个整数(9 的优先级最高,1 的优先级最低) ,打印按如下方法进行。(1)取出打印队列中队首的打印任务 J;(2)如果打印队列中存在优先级高于 J 的打印任务,则将 J 移动到打印队列的队尾;否则,打印 J.现在的问题是,要确定你要打印的文件何时打印完毕。给定当前打印队列(一个优先级队列)和你的打印任务在当前打印队列中的位置,确定你的打印任务完成时需要多长时间。为了
26、简化问题,假定没有新的打印任务加入到打印队列中;并且,假定完成任何一个打印任务均需要 1min 时间,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。例如,当前打印队列为“1 1 9 1 1 1”且你的打印任务在队首时,需要5min。题 7:求解布尔表达式目的:本课程设计是求中缀算术表达式真值问题。求中缀算术表达式值的问题是数据结构中栈的一个典型应用。通过本题,学生应掌握中缀表达式和后缀表达式的转换方法和后缀表达式求值问题。要求:已知某种类型的布尔表达式由“V” 、 “F”、 “!” 、 “ 设 X 的所有取值为 V1, V2,Vn,依据这些取值将 S 划分为 n 个子集
27、 S1, S2, , Sn,建 T 的 n 个孩子节点 Ti,并分别以 Vi 作为从 T 到 Ti 的分支标号; 对每对(Si,Ti,A-X) ,递归调用 ID3 算法建立一棵以 Ti 为根的子树;END举例:对表 1 运用算法构建决策树表 1. 一个训练数据集编号 天况 温度 湿度 风况 分类1 晴 热 大 无 N2 晴 热 大 有 N3 多云 热 大 无 Y4 雨 中 大 无 Y5 雨 冷 正常 无 Y6 雨 冷 正常 有 N7 多云 冷 正常 有 Y8 晴 中 大 无 N9 晴 冷 正常 无 Y10 雨 中 正常 无 Y11 晴 中 正常 有 Y12 多云 中 大 有 Y13 多云 热
28、正常 无 Y14 雨 中 大 有 N对下列样例输入使用构建的决策树模型预测其分类属性:表 2. 一个待分类的数据集编号 天况 温度 湿度 风况 分类1 晴 热 正常 无 ?2 晴 热 正常 有 ?3 雨 热 正常 无 ?4 晴 中 正常 无 ?5 晴 冷 大 有 ?6 晴 冷 大 无 ?要求:设计合理的数据结构,编程实现决策树构造算法;给定训练数据集,运用构建的决策树模型,设计合理的文件格式,保存于外存之中;设计决策树分类算法,根据保存在外存的决策树模型,实现决策树的分类过程,完成对未知类别属性数据样例的分类。题 21:关联规则求解简介:关联分析是数据挖掘中的一个重要任务,Apriori 算法
29、是一种典型的关联分析算法。多用于超市的销售决策,如通过统计一段时间内,用户买商品 A 和 B 同时发生的概率,得出了顾客买 A 则很可能会买 B 的一条规则。本课题要求对给定的训练数据,实现 Apriori 算法,构件关联规则集合。Apriori 算法描述如下:输入:训练样例集 S,属性集 A,支持度阈值 minsup,置信度阈值 minconf输出:关联规则集(1)令 k=1(2)生成长度为 1 的频繁项集 (3)重复以下操作直到不在生成新的频繁项集(a)剪除一些候选项集,它们包含非频繁的长度为 K 子集(b)从长度为 k 的频繁项集中生成长度为 k+1 的候选项集(c)通过扫描数据库,计算
30、每个候选项集的支持度(d)除去那些非频繁的候选项集,只留下那些频繁的候选项集END示例:表 3 基本概念表:关联规则的简单例子TID 网球拍 网 球 运动鞋 羽毛球1 1 1 1 02 1 1 0 03 1 0 0 04 1 0 1 05 0 1 1 16 1 1 0 0用一个简单的例子说明。表 3 是顾客购买记录的数据库 D,包含 6 个事务。项集 I=网球拍,网球,运动鞋,羽毛球。考虑关联规则(频繁二项集):网球拍与网球,事务 1,2,3,4,6 包含网球拍,事务 1,2,6 同时包含网球拍和网球,支持度(XY)/D=0.5,置信度(XY)/X=0.6。若给定最小支持度 = 0.5,最小置
31、信度 = 0.6,认为购买网球拍和购买网球之间存在关联。要求:设计合理的数据结构,编程实现算法;给定训练数据集,设计合理的文件格式,保存于外存中;设计 Apriori 算法,保存关联规则在外存中。题 22:老鼠走迷宫程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。要求:1)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2)迷宫的墙足够结实,老鼠不能穿墙而过;3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5)找出走出
32、迷宫的所有路径,以及最短路径;6)利用序列化功能实现迷宫地图文件的存盘和读出等功能。题 23:广义表实现选择合适的存储结构表示广义表,并能实现下列运算要求: (1)用大写字母表示广义表,用小写字母表示原子,并提供设置广义表的值的功能。(2)取广义表 L 的表头和表尾的函数 head(L)和 tail(L)。(3)能用这两个函数的复合形式求出广义表中的指定元素,完成广义表的遍历访问。(4)由广义表的字符串形式到广义表的转换函数 Lists Str_ToLists(S);例如:Str_ToLists_(“ (a,(a,b),c)”)的值为一个广义表。(5)由广义表到广义表的字符串形式的转换函数 c
33、har * Lists_To_Str(L)。(6) * 能设置多个广义表。课题 24-25 提示简单路径:如果一条路径上的顶点除了起点和终点可以相同外,其它顶点均不相同,则称此路径为一条简单路径;起点和终点相同的简单路径称为回路(或环) 。题 24:无向图的简单路径1)求出无向图中从起点到终点的所有简单路径。其中起点和终点可以由用户自行设定。2)求出无向图中从起点到终点的指定长度(如 K)的所有简单路径。其中起点和终点可以由用户自行设定。题 25:有向图的简单路径1)求出有向图中从起点到终点的所有简单路径。其中起点和终点可以由用户自行设定。2)求出有向图中从起点到终点的指定长度(如 K)的所有
34、简单路径。其中起点和终点可以由用户自行设定。题 26:指针式时钟功能分析,如图 9 所示:(1)正确显示系统时钟;(2)能准确定位时钟刻度和时分秒针的位置;(3)能随窗口大小的变化而变化。算法设计及程序设计中技术重点:在应用程序中,经常有一些任务在后台处理,实现方式有两种:计时器和OnIdle 循环处理。计时器是程序中最常用的后台任务机制之一,其时间间隔最低约 55 毫秒,被广泛用于时钟、磁盘备份程序或需要在某一时刻运行的程序等。多媒体计时器能编程设定 1 毫秒或者更小,它是诸如 MIDI 序列发生器之类的专用型应用程序的理想选择,在 Windows API 中有很多查询时钟的函数,利用它们就
35、可以编写出高精度的计时器。使用计时器只需要了解两个函数:CWnd:SetTimer()函数用来设置一个计时器以指定的时间间隔触发,CWnd:SetTimer()函数用来使一个正在运行的计时器停止。计时器以两种方式通知应用程序计时器间隔时间已到:发送 WM-TIMER 消息和调用应用程序定义的回调函数。其中前者相对比较简单,但对于多个计时器则应使用回调函数。计时器消息发送给应用程序时都是低优先级,因此只有当消息对列中没有其他消息时才回处理它们。计时器消息不能在消息队列中积存,这避免了出现永远无法清空消息队列的状态。尽管如此,Windows 应用程序决不应该花费过量的时间来处理消息,除非该处理过程
36、已经委派给辅助线程。如果主线程运行时间过长而没有检查消息队列,则程序的响应能力会受到影响。图 9 程序运行结果示意图题 27:工资管理系统设计某单位职工工资管理系统,功能如下:对于每位职工存储以下信息:职工编号、基本工资、津贴、岗位津贴、应发数、个人所得税、应扣数、实发数。个人所得税计算方法设为:工资少于2000 元的部分为 0,20003000 元部分为 5%,30004000 部分为 10%,40005000 部分为 15%,5000 元以上部分为 20%。(1)创建存储职工工资信息的存储文件;(2)添加某职工的工资信息;(3)删除某职工的工资信息;(4)修改某职工的部分工资信息(当月开始
37、增加或减少某些项工资或扣款数变化) ;(5)输出指定编号职工的工资信息(查询用)(6)输出全体职工的工资信息(发工资用) 。题 28:学生成绩管理系统需求与功能分析 学生成绩管理系统的数据结构表如下: 序号 字段名 数据类型 长度 含义 1 class2 char 20 班级 2 num int 学号 3 name char 10 姓名 4 cprog float C 程序设计 5 media flaot 多媒体技术 6 eng float 大学英语 7 math float 高等数学 8 sport float 大学体育 9 ave float 平均成绩 10 order int 名次 要求
38、完成学生成绩的录入、统计、查询、修改、删除、输出。题 29:散列表的设计与实现任务:设计散列表实现电话号码查找系统。要求:(1) 设每个记录有下列数据项:用户名、电话号码、地址;(2) 从键盘输入各记录,以用户名(汉语拼音形式)为关键字建立散列表;(3) 采用一定的方法解决冲突; (4) 查找并显示给定电话号码的记录; 可以选作内容:(1) 系统功能的完善;(2) 设计不同的散列函数,比较冲突率;(3) 在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。题 30:宿舍管理查询软件任务:为宿舍管理人员编写一个宿舍管理查询软件要求:(1)采用交互工作方式(2)可以增加
39、、删除、修改信息(3)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(选择、快速排序、堆排序等任选一种)(4)查询: a.按姓名查询 ;b.按学号查询 ;c 按房号查询(5)打印任一查询结果(可以连续操作)题 31:最长公共子串求解 2 个字符串的最长公共子串。输入的 2 个字符串可以从键盘读入,也可以从两个文本文件中读入。实现提示:可以采用动态规划法和后缀树算法,分析算法的时间复杂和空间复杂度。题 32:英文文章统计给出一篇英文文章,文件不小于 5M 的大小。统计其中的每个不同英文单词和总单词的数量。实现提示:分别用链表和哈希表来实现,注意要给出不同大小文件耗费的时间,对时间性能
40、进行进一步分析。关于英文文章,请自动生成文本文件。也可以从网络上下载几篇英文的文章,然后合并生成。题 33:本科生导师制问题问题描述:在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带领 n 个学生,如果老师还带研究生,那么研究生也可直接负责本科生。本科生导师制问题中的数据元素具有如下形式: 导师带研究生:(老师,(研究生 1,(本科生 1, , 本科生 m), ) 导师不带研究生: (老师,(本科生 1, , 本科生 m)导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。功能要求:要求完成以下功能: 插
41、入:将某位本科生或研究生插入到广义表的相应位置; 删除:将某本科生或研究生从广义表中删除; 查询:查询导师、本科生(研究生)的情况; 统计:某导师带了多少个研究生和本科生; 输出:将某导师所带学生情况输出。题 34:镜像树实现二叉树到其对应的 Mirror Tree(镜像树)转化。所谓镜像树如图 10所示图 10 镜像树示例题 35:堆栈应用要求:1) 设计一个堆栈类,实现对于软件操作中常用的撤销/重做(Undo/Redo)的支持。2) 使用控制台或者图形界面,测试这个堆栈类的使用。解题思路:可以在标准的堆栈操作函数里实现对于临时文件名的出入栈,文件名作为临时文件名命名的规则可以这样形式:fi
42、le0.tmp,file1.tmp。为了使得临时文件名能够循坏,可以使得加入的临时文件名的编号与堆栈的指针编号相同,例如当栈顶位置为 6 时,进栈的临时文件名可为:file6.tmp。题 36:矩阵位置旋转(80 分)要求:1) 设计一个矩阵类,实现矩阵的 90 度、180 度、270 度的旋转。2) 使用控制台或者图形界面,测试这个矩阵类的使用。解题思路:矩阵里面的数据是离散的,可以用坐标来表示,例如(0,0)、(2,3)等,根据此坐标和整个矩阵的宽度和高度计算旋转后的此坐标新的坐标,填入新矩阵相应新坐标位置。题 37:记事簿要求:1)设计一个记事簿类,实现文字输入、文字删除、复制、粘贴、打
43、开、保存的功能。2)使用控制台或者图形界面,测试这个记事簿类的使用。解题思路:记事簿的文字存储,可以申请连续内存存储来存储字符,同时设置一个数组来存贮关于行的信息,例如第一行的字符数等。复制和粘贴功能的实现是因为有一个共同的申请的存储区域,当复制时就从存储区域复制字符,粘贴时则相反操作。题 38:集合运算问题描述:设有两个用单链表表示的集合 A、B,其元素类型是 int 且以非递减方式存储,其头结点分别为 a、b。要求下面各问题中的结果集合同样以非递减方式存储,结果集合不影响原集合。实现要求: 编写集合元素测试函数 IN_SET,如果元素已经在集合中返回 0,否则返回 1; 编写集合元素输入并
44、插入到单链表中的函数 INSERT_SET,保证所输入的集合中的元素是唯一且以非递减方式存储在单链表中; 编写集合元素输出函数,对建立的集合链表按非递增方式输出; 编写求集合 A、B 的交 C=AB 的函数,并输出集合 C 的元素; 编写求集合 A、B 的并 D=AB 的函数,并输出集合 D 的元素; 求集合 A 与 B 的对称差 E=(A-B)(B-A) 的函数,并输出集合 D 的元素; 设计一个菜单,具有输入集合元素、求集合 A、B 的交 C、求集合A、B 的并 D、求集合 A 与 B 的对称差 E、退出等基本的功能。测试数据:由读者自定,但集合 A、B 的元素个数不得少于 16 个。题
45、39:矩阵的操作设有两个矩阵 A=(aij)mn,B=(b ij)pq。实现要求: 编写矩阵输入函数 INPUT_MAT,通过该函数完成矩阵的输入并返回保存矩阵的三元组(不能使用全局变量) ; 编写矩阵输出函数 OUTPUT_MAT,通过该函数完成矩阵的输出,输出的形式是标准的矩阵形式(即二维数组的形式) ; 求矩阵的转置,矩阵的转置 A=(aji)nm,转置前输出原矩阵,转置后输出转置矩阵; 求矩阵 A、B 的和。矩阵 A 和 B 能够相加的条件是:m=p,n=q;矩阵 A和 B 如果不能相加,请给出提示信息;若能够相加,则求和矩阵 C 并输出 C;C=A+B=(cij)mn,其中 cij=
46、aij+bij 求矩阵 A、B 的差。矩阵 A 和 B 能够相减的条件是:m=p,n=q;矩阵 A和 B 如果不能相减,请给出提示信息;若能够相减,则求差矩阵 C 并输出 C;C=A-B=(cij)mn,其中 cij=aij-bij 求矩阵 A、B 的积。矩阵 A 和 B 能够相乘的条件是:p=n;矩阵 A 和 B如果不能相乘,请给出提示信息;若能够相乘,则求积矩阵 D 并输出 D;D=AB=(dij)mq,其中 dij=a ikbkj,k=1,2,n 设计一个菜单,具有求矩阵的转置、求矩阵的和、求矩阵的积、退出等基本的功能。在求矩阵的和或求矩阵的积时要求能够先提示输入两个矩阵的,然后再进行相
47、应的操作。题 40:保龄球计分问题描述:打保龄球是用一个滚球去撞击 10 个站立的瓶,将瓶击倒。一局分 10 轮,每轮可滚球 1 次或多次,以击到的瓶数为依据计分,一局得分为 10 轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。计分规则如下:a) 若某一轮的第一次滚球就击倒全部 10 个瓶,则本轮不再滚球(若是第10 轮还需加 2 次滚球) ,该轮得分为本次击倒瓶数 10 与以后 2 次滚球所击倒瓶数之和。b) 若某一轮的第一次滚球未击倒全部 10 个球,则对剩下未击倒的瓶再滚球一次,如果这 2 次滚球击倒全部 10 个瓶,则本轮不再滚球(若是第 10 轮还需加 1 次滚球) ,该轮得分为这 2 次击倒瓶数 10 与以后 1 次滚球所击倒瓶数之和。c) 若某一轮 2 次滚球未击倒全部 10 个瓶,则本轮不在滚球,该轮得分为这 2 次滚球所击倒瓶数之和。实现提示:a) 模拟 10 个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分。b) 逐人逐轮逐次输入一次滚球击倒的瓶数。c) 对 10 人的得分由低到高排序并显示。d) 最后,把排序的存入文件中。测试数据:自定模拟数据