计14DS课设任务书文档格式.docx
- 文档编号:17006666
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:51
- 大小:501.20KB
计14DS课设任务书文档格式.docx
《计14DS课设任务书文档格式.docx》由会员分享,可在线阅读,更多相关《计14DS课设任务书文档格式.docx(51页珍藏版)》请在冰豆网上搜索。
32
103
21
15
47
57
1
2
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
20
63
48
51
80
23
8
18
16
问题3:
成绩管理
编制一应用软件实现对班级成绩管理。
基本功能有学生信息的增删(转入或退学)、查找(从当前点向前或向后双向的)、录入、统计(如总分,及格率等)。
建议用双链表实现。
测试数据自定,不少于20条记录,字段不少于5个。
问题4:
成绩排序
对某次考试成绩排序,输入为多门课程成绩,可以任一课程成绩/总分/界值(如80分以上)为关键字进行检索。
建议采用快速排序等算法效率高的算法。
问题5:
迷宫求解
用迷计算机模拟“迷宫问题”,求出其中一条通道。
用数组MAZE[1...M,1..N]表示迷宫,有的可以通行(0表示),有的是路障(1表示),MAZE[1][1]为迷宫入口,MAZE[M][N]为迷宫出口,用非递归算法求出一条通路并用“■”标示所输出的路径(见运行示例)否则说明没有通路,继续生成迷宫,直到有通路。
算法思想及提示:
实现这一算法的具体方法很多(如堆栈,队列等),但基本思想一般是回溯法使用MAZE[M][N]表示迷宫(如图2),为判定过程中是否越界,在其外围加一圈1作为路障,mark[M][N]作为标志数组,move[8][2]是行列增量数组(见图1-2);
建堆栈.约定(i,j)表示I行j列,direction表示方向,从入囗开始探索路径:
沿0-1八个方向依次试探,若某方向可通(为0),则该点连同方向入堆栈,从该点继续试探;
若八个方向都不通,则取出堆栈顶点,从其标记的方向开始试探其余方向;
直至找到出口(有通路)或堆栈为空(没有通路).
下面右图是利用一随机函数生成的0/1方阵及运行示例:
问题6:
一元多项式计算。
对于任意输入的多项式A=anxn+an-1xn-1+…a1x+a0和B=bmxm+bm-1xm-1+…b1x+b0,用链表存储后实现A+B;
A-B。
a.
;
b.;
c.
d.
e.
问题7:
通讯录管理
设计一个通讯录管理,包括通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询以及信息修改等。
要求有运行界面,从菜单中进入选项。
二.设计要求:
1.选题:
每位学生需完成两个课题,其中一个必选,另一个自选,必选题次为,学号/7+1。
2.课程设计报告内容说明
1)需求分析程序的功能;
输入输出的要求。
2)概要设计程序的模块构成以及模块之间的层次结构、各模块的调用关系;
每个模块的功能;
课题涉及的数据结构和数据库结构;
即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
3)详细设计采用C语言定义相关的数据类型;
写出各模块的类C码算法;
画出各函数的调用关系图、主要函数的流程图。
4)调试分析以及设计体会测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果;
程序调试中遇到的问题以及解决问题的方法;
课程设计过程经验教训、心得体会。
5)使用说明用户使用手册:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)书写格式见附带说明。
7)附录参考书目;
源程序清单(带注释)
3.成绩评定:
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:
①平时出勤(占10%)②系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)③程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)④设计报告(占30%)注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
⑤独立完成情况(占10%)。
三进度安排
第1周
星期一
星期二
星期三
星期四
星期五
上午
8:
00~12:
00
√
下午
13:
30~17:
30
第2周
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为22。
正文的内容:
一、课题的主要功能;
二、课题的功能模块的划分(要求画出模块图);
三、主要功能的实现(至少要有一个主要模块的流程图);
四、程序调试;
五、总结;
六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
目录
一、拓扑排序·
·
1、需求分析·
2、概要设计·
3、详细设计·
4、调试分析以及设计体会·
5、使用说明·
二、一元多项式计算·
1、需求分析·
5、使用说明·
三、附录·
1、拓扑排序·
2、一元多项式计算·
一、拓扑排序
1、需求分析
拓扑排序是指由某个集合上的一个偏序得到该集合上的一个全序。
更直观地讲,一个偏序是自反的、反对称的,用图表示时每个点都有环且只有单向边。
拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。
该程序的功能主要是根据图的拓扑排序算法,依某专业的课程先、后修关系图,实现该专业课程的排布。
其中,每门课程需设定课时,而各学期的总课时不能超过上限。
首先,创建课程先、后关系图。
其中,需要输入该关系图的结点数(课程数)、结点信息及弧的信息等;
然后,输入该专业课程的学期数,并在拓扑排序过程中,依次输入某学期的课程安排。
所以,最终输出为各个学期所安排的课程结果,并且,课程安排符合课程先、后关系图的一个拓扑排序。
2、概要设计
1.模块功能图,如图2.1:
图2.1模块功能图
2.程序调用关系及模块功能运行流程如图2.2:
12
3
图2.2程序调用关系及模块功能流程图
图的存储结构有邻接矩阵和邻接表。
在该程序中采用了邻接表来存储有向图。
在邻接表中,需要定义头结点的结构体数据类型,用以存储图的结点信息,并且在每个头结点后连接一个单链表,用以存储以该头结点为弧尾,链表中结点为弧头的弧。
所以还需定义表结点的结构体数据类型,用以存储图中弧的信息。
最后,定义有向图的结构体数据类型,其中的数据项包含一个指向头结点首地址的指针和顶点数、弧数的整型数据类型。
3、详细设计
3.1采用C语言定义结构体数据类型
1.1头结点的顶点信息结构体数据类型
typedefstructVertexType{
charname[20];
//顶点编号,即课程编号
charsbname[20];
//课程名称
intOutdegree;
//顶点的出度
intIndegree;
//顶点的入度
intweight;
//课时
boolmark;
//在拓扑排序时,标记该结点是否已访问
intid;
//确定该课程属于哪个学期
}VertexType;
1.2头结点结构体数据类型
typedefstructVNode{
VertexTypedata;
//顶点信息
ArcNode*first;
//指向第一条依附该结点的弧的指针
}VNode;
1.3表结点结构体数据类型
typedefstructArcNode{
intadjvex;
//该弧所指向的顶点的位置
structArcNode*next;
//指向下一条弧的指针
}ArcNode;
1.4图的结构体数据类型
typedefstructGraph{
VNode*head;
//指向头结点首地址的指针
intvexnum,arcnum;
//图的定点数和弧数
}Graph;
1.5学期课程结构体数据类型
TypedefstructSubject{
intcount;
//某学期所安排的课程数
int*head;
//某学期所安排课程对应结点在图中的存储置
}Subject,*PSubject;
3.2各模块的类C码算法
2.1创建有向图的类C码算法:
StatusGCreate(Graph&
G){
scanf("
%d"
G.vexnum);
if(!
(G.head=(VNode*)malloc(G.vexnum*sizeof(VNode))))
exit(OVERFLOW);
for(i=0;
i<
G.vexnum;
i++)
%s%s%d"
&
G.head[i].data.name,
&
G.head[i].data.sbname,&
G.Head[i].data.weight);
//输入结点信息,各头结点的入度、出度、学期编号id均初始化为零
//访问标记mark初始化为false,并给指针域first分配内存空间
j=0;
while
(1){//输入弧,并以输入字符"
#"
结束
%s%s"
ch1,ch2);
if(strcmp(ch1,"
)==0)
break;
n=GLocateVex(G,ch1);
//获取弧尾结点存储位置
m=GLocateVex(G,ch2);
//获取弧头结点存储位置
if(n!
=-1&
&
m!
=-1){//输入的弧存在
j++;
ptr1=G.head[n].first;
while(ptr1->
next!
=NULL)
ptr1=ptr1->
next;
(ptr2=(ArcNode*)malloc(sizeof(
ArcNode))))exit(OVERFLOW);
ptr2->
adjvex=m;
ptr1->
next=ptr2;
Ptr2->
next=NULL;
G.head[n].data.Outdegree++;
G.head[m].data.Indegree++;
}
returnOK;
2.2拓扑排序的类C码算法:
StatusGSort(GraphG,intMAX){
n);
//输入学期数
PSubjectp;
//对p分配连续的n个空间,并对p进行初始化
//其中,count初始化为零,指针head分配连续的G.vexnum个空间
k=0;
i=0;
while(k<
=n){
while(i<
G.vexnum){
max=0;
x=0;
mark=false;
//max标记某学期的总课时,x标记某学期的课程数
//mark用于判断有向图中是否存在回路
for(j=0;
j<
j++){
if(G.head[j].data.Indegree==0&
G.head[j].data.
mark==false){
printf(G.head[j].data);
//输出该头结点信息
mark=true;
if(G.head[j].data.id==k)
G.head[j].data.id++;
mark)returnERROR;
//图中存在回路,拓扑排序失败
while
(1){//根据当前学期输出的可安排课程,选择所要安排的
课程,输入"
表示当前学期课程选择结束
scanf("
%s"
name);
if(strcmp(name,"
m=GLocateVex(G,name);
//获取当前课程所对应头
结点的存储位置
if(m!
=-1){
if(G.head[m].data.Indegree==0&
G.head[m].data.id==k+1)
{//所选课程符合当前学期安排
max+=G.head[m].data.weight;
if(max>
MAX)
max-=G.head[m].data.weight;
//若所选课程的总课时超出上限,则选择其
它可选课程或退出当前学期的课程安排
选择
else{
if(k==n)
//课程安排已超过所安排的
学期数,则推出课程选择
p[k].head[x]=m;
//存储该学期所选
课程所对应头结点在在图中的存储位置
G.head[m].data.mark=true;
//标
记该头结点已被排序了
ptr2=G.head[m].first->
i++;
x++;
while(ptr2!
=NULL){//使以该头结
点为弧尾的所有弧的弧头结点的入度减
一及其学期标号作相应的变换
if(G.head[ptr2->
adjvex].
data.id==k+1)
G.head[ptr2->
data.id++;
data.Indegree--;
ptr2=ptr2->
if(n==k){//若课程安排已超过所安排的学期数,则重新设定
学期数或重新进行课程安排
y);
//输入操作选择项
switch(y){
case1:
//重新设定学期数
//重新输入学期数,并对p重
新分配连续的n个空间,并对其进行初始化
break;
case2:
//重新进行课程安排
default:
break;
G=SetG(G);
//对图进行初始化处理,并依存储结构产生各
头结点的度值
i=0;
k=0;
continue;
p[k].count=x;
k++;
//课程以选完,而学期的课程没有安排完
if(k==n)
printf("
......\n"
);
//输出课程已安排完,该学期没有课程
安排
printf(p);
//输出各学期的课程安排
returnOK;
4、调试分析及设计体会
4.1调试分析
1.1测试数据:
(如下图所示的有向图)
图4.1课程先、后修关系图
另外,学期课时上限数为:
120
1.2测试方案
(1)正确的输入及输出:
1、构建图4.1所示的有向图,输入图中的顶点信息如图4.2:
图4.2输入图中的顶点信息
2、输入图中的弧,如图4.3:
图4.3输入图中的弧
2、拓扑排序过程(即课程安排过程),如图(4.4-4.11):
图4.4课程安排
图4.5第二、三学期的课程安排
图4.6第四学期的课程安排
图4.7学期课程安排已超过学期数并重新输入学期数或重新安排学期课程
图4.8重新安排第一、二学期的课程
图4.9重新安排第三、四学期的课程
图4.10重新安排第五、六学期的课程
图4.11各学期课程安排结果
4.2程序调试过程中遇到的问题及解决方法
在开始调试程序的过程中,遇到的主要问题是逻辑错误及程序不能实现所需的要求。
第一个问题是:
怎样依拓扑排序的算法来产生某个学期的课程安排,另外,怎样确定某个学期到底安排几门课程。
若把所有拓扑排序结果都输出出来,显然,这是一个非常不好的想法。
经过对这个问题的思考后,若把某个学期所能选的课都显示出来,然后,用户根据显示出来的课程来安排该学期的课程,随后,依安排结果产生下个学期所能选的课程的集合。
该种想法不仅解决了怎样依拓扑排序来安排某个学期的课程,并且给用户安排课程提供了很大的灵活性,用户可以根据需求来安排某个学期的课程。
第一个问题得到解决并编写程序后,便产生了第二个问题:
在产生的某个学期所能安排的课程范围里存在有先后关系的课程或程序不能结束。
经过分析发现:
在选取某个学期所能安排课程的集合的过程中,会使图中的某些结点的入度由非零减到成零,使原本应为下一学期的课程变换到当前学期中,所以应设定一个课程学期标号,标记课程在拓扑排序过程中所对应的学期。
由此,在头结点的信息域中增设了一个整型变量id,用以标记在拓扑排序中该结点应该属于哪个学期,并为拓扑排序增设了一个条件限制。
4.3心得体会
通过对该课题的设计过程,不仅让我对图的存储方法及图的拓扑排序算法加深了理解,更让我深深的了解到理论知识与实践应用上的区别。
该课题在理论上是应用了图的拓扑排序的思想,然而它不是单纯的拓扑排序,而是在拓扑排序的基础上,应用图的拓扑排序来解决课程安排的问题。
课程安排的结果不仅要符合拓扑排序的要求,并且在同一学期的课程是相互独立的,所以,这就要设计新的算法,对拓扑序列的产生添加新的限制条件。
同时,也让我认识到算法在程序设计中的重要性,算法是程序设计的灵魂。
5、使用说明
虽然程序能处理一些错误的数据输入,但输入的数据应该要按程序运行的要求,以防止因某些数据的错误输入而导致程序运行产生错误。
另外,在构建有向图时,输入其结点标号时,不能输入有标号相同的结点。
并且一般是先构造课程先、后修关系图,后进行拓扑排序。
操作上没什么特殊要求,在程序运行的过程中,一般有操作的提示说明,但要按提示说明进行操作。
例如,在选择某学期的课程时,若所选课程已超过学期课时上限数,
此时程序会显示选择该课程会使总课时超过上限,并提示用户选择其它可选课程或结束课程选择。
此时,用户按提示信息操作就可以了。
二、一元多项式计算
1.需求分析
在一元多项式的计算中,人工求解对于未知数系数比较大或指数比较大时是非常麻烦同时也是容易出错的,因此需要一个一元多项式计算系统来针对这种情况进行求解。
本系统定义了链表结点结构体类型,多项式计算结果输出函数,需要处理的多项式输出函数,结点插入函数,多项式输入函数,结点删除函数,多项式相加函数,多项式相减函数以及一个主函数,通过主函数调用其他几个函数最终实现多项式的加减计算。
2.概要设计
本系统定义了链表结点结构体类型,定义了Print2()、Print1()、Insert()、Input()、Delete()、AddPolyn()、ReducPolyn()等函数来实现系统所需功能。
如图5.1:
图5.1功能模块
流程图
3.详细设计
3.1该结构体定义了两个整型变量分别用来存放系数和指数,并定义了一个指针用来存放下一个结点的位置。
typedefstructterm{//定义链表结点结构体类型
intcoef;
//系数
intexpn;
//指数
structterm*next;
}term,*polynomial;
3.2多项式计算结果输出函数算法
StatusPrint2(polynomialz){
//对多项式计算结果进行输出
while(z){
if(z->
coef!
=0){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14 DS 任务书