程序与算法综合设计课程设计指导书.docx

上传人:b****7 文档编号:10854879 上传时间:2023-02-23 格式:DOCX 页数:45 大小:147.25KB
下载 相关 举报
程序与算法综合设计课程设计指导书.docx_第1页
第1页 / 共45页
程序与算法综合设计课程设计指导书.docx_第2页
第2页 / 共45页
程序与算法综合设计课程设计指导书.docx_第3页
第3页 / 共45页
程序与算法综合设计课程设计指导书.docx_第4页
第4页 / 共45页
程序与算法综合设计课程设计指导书.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

程序与算法综合设计课程设计指导书.docx

《程序与算法综合设计课程设计指导书.docx》由会员分享,可在线阅读,更多相关《程序与算法综合设计课程设计指导书.docx(45页珍藏版)》请在冰豆网上搜索。

程序与算法综合设计课程设计指导书.docx

程序与算法综合设计课程设计指导书

数据结构与算法综合设计

课程设计指导书

合肥工业大学

计算机与信息学院

2014年6月

一、概述

课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。

通常,课程设计中的问题比平时的习题复杂的多,也更接近实际。

课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。

平时的习题较偏重于如何编写功能单一的“小”算法,局限于一个或两个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。

此外,还有很重要的一点是:

计算机是比任何教师更严厉的检查者。

为达到上述目的,使学生更好地掌握程序设计的基本方法和C++语言的应用,本课程安排了课程设计环节,提供了各类题目供学生选择。

每个设计题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等五个部分组成。

问题描述旨在为学生建立问题提出的背景,指明问题“是什么”。

基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求。

测试数据部分旨在为检查学生上机作业提供方便。

在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示,提示的实现方法未必是最好的,学生不应拘泥与此,而应努力设计和开发更好的方法和结构。

选做部分向那些尚有余力的读者提出了更高的要求,同时也能开拓其它读者的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改、扩充和重用。

二、总体要求

1.系统分析与系统设计

“分析就是在采取行动之前,对问题的研究”(Demarco,1978)。

系统分析在软件开发过程中是非常重要的,其任务就是通过对问题本身的研究,产生一个系统需要做什么的规范的、一致的和可行的需求说明。

在此基础上,确定系统中所需考虑的类(对象)、类之间的关系、本系统中各个类所涉及的属性及针对这些属性的操作。

类及类之间的关系可用类图来表示,对象之间的消息传递可用箭头表示,另外一些重要的操作应给出规格说明。

2.详细设计与编码

对类中的属性和操作从实现的角度(如可扩充、在派生类中能否直接使用或只需少量修改、访问的效率和方便性等)进一步考察;对类中的操作(即方法)进一步求精:

用if、while、for和赋值语句加上自然语言写出算法框架;同时考虑能否使用已有类库(包括直接使用或通过派生)以减少编程的工作量和提高程序的可靠性。

编码,即程序设计,是对详细设计的结果的进一步求精,用面向对象语言(如C++)表达出来。

在充分理解和把握语言运行机制的基础上,编写出正确的、清晰的、易读易改和高效率的程序。

另外,在标识符的命名、代码的长度(一个方法长度一般不超过40行,否则应划分为两个或多个方法)、程序书写的风格(如缩进格式、空格(空行)的应用、注释等)方面也应注意,遵循统一的规范。

3.上机调试和测试

上机时要带一本面向对象语言的教材,若有开发环境的用户指南(手册)及类库(库函数)手册则更好。

应仔细阅读程序编译和连接时的错误信息(通常是英文的),弄清其确切含义,提高调试效率。

要学习并掌握开发环境所提供的调试工具。

经过调试,能够运行的的程序并非就是一个正确的程序。

实际上,在上机之前,就应根据系统的需求设计相应的测试数据集,特别是一些异常情况的处理(如用户输入数据未按指定格式、数据极大或极小时程序如何处理等一些极端的情况)。

4.课程设计报告

课程设计报告的内容及要求:

(1)需求和规格说明

描述问题,简述题目要解决的问题是什么?

规定软件做什么。

原题条件不足时补全

(2)设计

1)设计思想:

程序结构(如类图),重要的数据结构。

主要算法思想(文字描述,不要画框图)

2)设计表示:

类名及其作用,类中数据成员名称及作用,类中成员函数原型及其功能,可以用表格形式表达。

3)实现注释:

各项要求的实现程度、在完成基本要求的基础上还实现了什么功能?

4)详细设计表示:

主要算法的框架及实现此算法的成员函数接口。

(3)用户手册

即使用说明(包括数据输入时的格式要求)。

(4)调试及测试

调试过程中遇到的主要问题是如何解决的;对设计和编码的回顾讨论和分析;程序运行的时空效率分析;测试数据集;运行实例;改进设想;经验和体会等。

(5)附录

1)源程序清单:

打印文本和磁盘文件,磁盘文件是必须的。

源程序要加注释,除原有注释外再用钢笔加一些必要的注释和断言。

2)测试数据:

即列出测试数据集

3)运行结果:

上面测试数据输入后程序运行的结果

注意事项:

以上要求为一般的要求,针对具体问题和具体的开发过程,某些方面可以做适当的增减。

各种文档资料要在程序开发过程中逐渐形成,而不是最后补写(但不排斥最后誉清)。

各种文档要以统一格式的稿纸用钢笔书写,也可录入计算机用Word及其它文字编辑软件排版后打印输出。

三、课程设计示例

封面:

课程设计报告

设计题目:

小型公司人员信息管理

学生姓名:

专业:

班级:

学号:

指导教师:

完成日期:

合肥工业大学计算机与信息学院

(1)需求和规格说明

某小型公司,主要有四类人员:

经理、技术人员、销售经理和推销员。

要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。

人员编号基数为1000,每输入一个人员的信息,编号顺序加1。

程序要对所有人员有提升级别的功能。

为简单起见,所有人员的初始级别均为1级,然后进行升级,经理升为4级,技术人员和销售经理升为3级,推销员仍为1级。

月薪计算办法是:

经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5‰。

(2)设计

根据上述需求,设计一个基类employee,然后派生出technician(技术人员)类、manager(经理)类和salesman(推销员)类。

由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类。

在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。

但是各类人员的月薪计算方法不同,不能在基类employee中统一定义计算方法。

各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。

因此,在employee类中用纯虚函数的方式定义了计算月薪函数pay()和显示信息函数displayStatus(),然后在派生类中再根据各自的同名函数实现具体的功能。

由于salesmanager的两个基类又有公共基类employee,为避免二义性,这里将employee类设计为虚基类。

 

系统类图

salesmanager

 

virtualvoidpay();

vitualvoiddisplayStatus();

salesman

floatCommRate;

floatsales;

virtualvoidpay();

vitualvoiddisplayStatus();

manager

floatmonthlyPay

 

virtualvoidpay();

vitualvoiddisplayStatus();

technician

floathourlyRate

intworkHours

virtualvoidpay();

vitualvoiddisplayStatus();

employee

char*name

intindividualEmpNo;

intgrade;

floataccumPay;

staticintemployeeNo;

virtualvoidpay();

voidpromote(int);

vitualvoiddisplayStatus();

 

属性和方法定义

类名

成员类别

类型

成员名

描述

employee

属性

char*

name

雇员姓名

int

individualEmpNo

个人编号

int

grade

级别

float

accumPay

月薪总额

int

employeeNo

本公司雇员编号目前最大值

方法

void

pay()

计算月薪函数(为纯虚函数)

void

promote(int)

升级函数

void

DisplayStatus()

显示人员信息(为纯虚函数)

 

类名

成员类别

类型

成员名

描述

technician

属性

float

hourlyRate

每小时酬金

int

workHours

当月工作时数

方法

void

pay()

accumPay=hourlyRate*workHours

void

DisplayStatus()

显示技术人员信息

manager

属性

float

monthlyPay

固定月薪数

方法

void

pay()

AccumPay=monthlyPay

void

DisplayStatus()

显示经理信息

salesman

属性

float

CommRate

按销售额提取酬金百分比

float

sales

当月销售额

方法

void

pay()

accumPay=sales*CommRate

void

DisplayStatus()

显示推销员信息

salesmanager

属性

方法

void

pay()

accumPay=monthlyPay+CommRate*sales

void

DisplayStatus()

显示销售经理信息

(3)用户手册

程序运行时,首先提示输入雇员姓名。

对于经理直接输出其工资及其它信息;

对于技术人员,程序提示输入其本月工作时数,然后输出其工资及其它信息;

对于推销员,程序提示输入其本月销售额,然后输出其工资及其它信息;

对于销售经理,程序提示输入其管辖部门本月销售总额,然后输出其工资及其它信息。

(4)调试及测试

由于公司每增加一个雇员,无论他(她)是哪一类人员,其编号均是顺序加1,也就是employee类的所有派生类对象创建时,都要访问同一个employeeNo,因此将employeeNo定义为静态数据成员。

运行实例:

pleaseinputemployee'sname:

zhang

pleaseinputemployee'sname:

wang

pleaseinputemployee'sname:

Li

pleaseinputemployee'sname:

zhao

inputzhangtheworkHoursofthismonth:

56

Technician:

zhangNo:

1001monthsalary:

5600

Technician:

zhangNo:

1001grade:

3thismonthsalary:

5600

Manager:

wangNo:

1002monthsalary:

8000

Manager:

wangNo:

1002grade:

4thismonthsalary:

8000

inputLithesalesofthismonth:

47900

Salesman:

LiNo:

1003monthsalary:

1916

Salesman:

LiNo:

1003grade:

1thismonthsalary:

1916

inputzhaothetotalsalesofthedepartmentofthismonth:

123654

salesman:

zhaoNo:

1004monthsalary:

5618.27

salesmanager:

zhaoNo:

1004grade:

3thismonthsalary:

5618.27

(5)进一步改进

(1)目前程序中,经理月薪,技术人员的小时酬金和销售人员的销售额提成比例均是固定的,这不适应不同公司的需要,可考虑用带参数的构造函数来解决。

(2)销售经理月薪计算中,要输入其管辖部门当月销售总额。

实际上,这可以通过将本部门所有推销员销售额相加而得到。

可以考虑在推销员类中增加所属部门等属性来完成这方面的功能。

(6)附录源程序

四、课程设计题目

题1:

求字符串之间距离

目的:

字符串是一种基础且广泛使用的数据结构,与字符串相关的题目既可以考察基本程序设计能力和技巧,也可以考查较强算法设计能力。

要求:

设有字符串X,称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为“abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。

如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其它任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为0。

在字符串A、B的所有扩展串中,必定存在两个等长的扩展串A1、B1,使得A1与B1之间的距离达到最小,将这一距离定义为字符串A、B的距离。

请编写程序,求出字符串A、B的距离。

题2:

后缀表达式计算器

目的:

后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:

21+3*,即(2+1)*3.通过本课程设计,应使学生掌握后缀表达式的特点、栈的基本方法和基本原理,培养学生运用语言编程及调试的能力,运用数据结构解决简单的实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。

要求:

实现一个简单的后缀表达式计算器。

假定表达式里的基本数值为实数,可用的运算符包括+,-,*,/,^,其中的^表示求幂运算。

1)假定输入表达式里的数和运算符之间都有空格,这样可以简化输入的处理;

2)输入的算术表达式以分号为结束符。

计算器应该能输入并计算一系列表达式,遇到一行的第一个字符就是分号时程序结束。

3)上题的计算器增加一元函数功能,允许表达式里写sin,cos,tan,log(自然对数)等函数,还可以考虑加入自定义的其他数学函数。

题3:

两个小游戏

目的:

很多精妙的数学理论往往都以有趣的游戏形式表现出来,正是这些有趣的小游戏使得高深的数学理论被广泛的传播和接受。

通过编程实现这些“数学游戏”可以提高学生的编程技巧和算法设计能力,提高解决实际问题的能力。

要求:

(1)猜数字(文曲星游戏)

电脑随机生成一个0~9999之间的整数,若为23,则记为0023。

玩家去猜,电脑将对玩家的答案做个评价,然后玩家再按电脑的评价重新猜,一共8次机会,猜对为赢。

比如:

电脑随机生成7859,若玩家第一次输入:

1234,程序返回0A0B,A代表数字和位置都猜对,B代表数字猜对,但位置不对。

若玩家第二次输入:

5678,则返回0A2B,因为78都是原整数中的,但是位置不对。

若玩家第三次输入:

0896,则返回1A1B……

依次,直至玩家输入7859,返回4A0B并终止程序。

记住,只有8次机会哦。

(2)生命游戏

(经典游戏,实现起来不难,正因为实现简单却变化繁复所以才成为经典)

我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。

而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。

每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。

每个格子的生死遵循下面的原则:

1)如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)。

2)如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;

3)在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案)。

题4:

二叉树结点染色问题

目的:

二叉树是常用的重要非线性数据结构,在客观世界中有着广泛的应用。

通过本题可以加深对于二叉树这一数据结构的理解。

掌握二叉树的存储结构及各种操作。

要求:

一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:

例如,图1所表示的二叉树可以用二叉树序列S=21200110来表示。

图1二叉树序列示意图

任务是要对一棵二叉树的节点进行染色。

每个节点可以被染成红色、绿色或蓝色。

并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。

给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。

题5:

打印机任务队列

目的:

通过本课程设计,应使学生掌握队列的基本方法和基本原理,培养学生运用语言编程及调试的能力,运用数据结构解决简单的实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。

要求:

打印机的打印队列中,每一个打印任务都有一个优先级,为1~9的一个整数(9的优先级最高,1的优先级最低),打印按如下方法进行。

(1)取出打印队列中队首的打印任务J;

(2)如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J.

现在的问题是,要确定你要打印的文件何时打印完毕。

给定当前打印队列(一个优先级队列)和你的打印任务在当前打印队列中的位置,确定你的打印任务完成时需要多长时间。

为了简化问题,假定没有新的打印任务加入到打印队列中;并且,假定完成任何一个打印任务均需要1min时间,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。

例如,当前打印队列为“119111”且你的打印任务在队首时,需要5min。

题6:

题目:

约瑟夫双向生死游戏是在约瑟夫生者死者游戏的基础上,正向计数后反向计数,然后再正向计数。

具体描述如下:

30(NumofPeople)个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半(NumofKilled)的旅客投入海中,其余人才能幸免遇难。

无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,顺时针依次报数,数到第9(ForwardCount)人,便把他投入大海中,然后从他的下一个人数起,逆时针数到第5(ReverseCount)人,将他投入大海,然后从他逆时针的下一个人数起,顺时针数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。

问哪些位置是将被扔下大海的位置。

要求:

1分别采用链表和顺序表两种结构实现该算法。

2对比分析上述两种方法的性能优缺点。

题7:

求解布尔表达式

目的:

本课程设计是求中缀算术表达式真值问题。

求中缀算术表达式值的问题是数据结构中栈的一个典型应用。

通过本题,学生应掌握中缀表达式和后缀表达式的转换方法和后缀表达式求值问题。

要求:

已知某种类型的布尔表达式由“V”、“F”、“!

”、“&”和“|”组成,其中,“V”代表真值True,“F”代表真值False,“!

”代表逻辑非运算,“&”代表逻辑或运算。

并且,运算符“!

”、“&”和“|”的优先级为:

“!

”最高,“|”最低,“&”介于“!

”和“|”之间。

你的任务是,计算给定布尔表达式的真值。

例如,布尔表达式“(V|V)&F&(F|V)”的真值为“F”.

题8:

谣言传播问题

目的:

通过本课程设计,应使学生掌握如何用图结构解决实际问题的能力,加深对于图结构的理解和认识。

掌握图的存储方法和关于图的经典算法。

提高学生的程序设计能力。

要求:

股票经纪人往往对谣言很敏感,你老板希望你能找到一个好方法向他们散布谣言,从而使他在股市占有战术优势。

为了达到最有效果,需要谣言传播的尽量快。

不幸的是,股票经纪人只相信从他们信任的信源传播来的消息,因此,在你散布谣言之前,需要对他们的联系网进行详细考察。

对于一个股票经纪人,他需要一定时间才能将信息传送给他联系人,给你这些信息,你的任务是,决定选谁作为第一个传送谣言的人,以使谣言传遍所有人的时间最短,当然,如果谣言不能传遍所有人的话,你也要给出说明。

例如,假设共有3个联系人,联系人1传递信息给联系人2和3所有的时间分别为4和5;联系人2传送信息给联系人1和3所有的时间分别为2和6;联系人3传送信息给联系人1和2所有的时间均为2,则选择联系人3作为第一个传送谣言的人,可以使谣言传遍所有的人时间最短,为2.

(选择有向图中的一个源点,使它到其余各顶点的最短路径中最长的一条路径最短)

题9:

分形问题

目的:

递归是基本的算法思想和设计方法之一,也是数据结构重点讲授的部分,是许多算法的基础,对它们的理解和运用直接关系着其他算法的理解和应用。

因此,熟练掌握递归是十分重要的。

通过本题,应使学生加深对于递归方法的理解,提高运用递归解决问题的能力。

要求:

分形是一种具有自相似性的现象,在分形中,每一组成部分都在特征上和整体相似,只不过仅仅是缩小了一些而已,一种盒子分形定义如下:

(1)规模为1的盒子分形为

X

(2)规模为2的盒子分形为

XX

X

XX

(3)若用B(n-1)表示规模为n-1的盒子分形,则规模为n的盒子分形为

B(n-1)B(n-1)

B(n-1)

B(n-1)B(n-1)

你的任务是,输出规模为n的盒子分形。

例如,规模为3的盒子分形输出如下:

XXXX

XX

XXXX

XX

X

XX

XXXX

XX

XXXX

题10:

网络布线

计算机网络要求网络中的计算机被连接起来,本问题考虑一个“线性”的网络,在这一网络中计算机被连接到一起,并且除了首尾的两台计算机只分别连接着一台计算机外,其它任意一台计算机恰连接着两台计算机。

图2中用圆点表示计算机,它们的位置用直角坐标表示。

网络连接的计算机之间的距离单位为英尺。

图2网络布线示意图

由于很多原因,我们希望使用的电缆长度应可能地短。

你的问题是去决定计算机应如何被连接以使你所使用的电缆长度最短。

在设计方案施工时,电缆将埋在地下

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1