数据结构课程设计教学计划安排系统Word格式.doc
《数据结构课程设计教学计划安排系统Word格式.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计教学计划安排系统Word格式.doc(23页珍藏版)》请在冰豆网上搜索。
总成绩:
评阅人签名:
目录
一、 课程设计的目的 4
二、 设计的内容与要求 4
三、 总体设计 4
四、 详细设计 5
五、 调试与测试 15
六、 课程设计的总结 17
一、课程设计的目的
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
二.设计的内容与要求
要建立一个图,因而要输入图的结点数和边数以及图的每一个结点的名称,要对所输入课程进行排课,因而要确定每一个结点的入度是否为零,并且将入度为零的结点分别进栈再出栈,再进另一个栈,最后出栈,最后实现对所输入的课程进行排课
三.总体设计
(1)该教学计划安排系统分为6个模块
1.建立图
2.栈的初始化
3.出栈
4.进栈
5求结点的入度
6拓扑排序
(2)算法描述(此程序中所包含的函数)
1.主函数main():
调用 CreateALGraph(G)函数和TopologicalSort(G)函数。
2.CreateALGraph()函数:
从键盘上输入所需要的值,并对每一个结点的*firstarc赋值为NULL。
3.InitStack()函数:
将栈分配存储空间,并对top和base赋值。
4.Push()函数:
进满足条件的元素压入栈中,并改变top指针的值
5.Pop()函数:
开始判断栈中的top和base指针是否相等,若相等则返回,否则进行出栈操作。
6.StackEmpty()函数:
通过判断栈是否为空来返回相应的值。
7.FindInDegree()函数:
通过循环求出每一个结点的入度
8.TopologicalSort()函数:
通过拓扑排序将相应的课程给输出来
四.详细设计
数据的组织描述(比如主要的变量类型,结构体等等),模块之间的参数设计(接口设计,模块的功能说明),系统控制流程图,各个模块的流程图,采用的算法
typedefstruct
{
SElemType*base;
//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
}SqStack;
typedefstructArcNode
intadjvex;
//该弧所指向的顶点的位置
structArcNode*nextarc;
//指向第一条依附该顶点的弧的指针
}ArcNode;
typedefstructVNode
chardata[10];
ArcNode*firstarc;
}AdjList[max_vertex_num];
AdjListvertices;
intvexnum,arcnum;
//图的当前顶点数和弧数
}ALGraph;
1.主函数模块
定义一个图的变量,调用CreateALGraph(G)函数,和TopologicalSort(G)函数。
2.创建图的模块
从键盘上输入学期数,再输入课程数目(即结点数)和课程之间的关系数(即边数),并把指向第一条依附该顶点的弧的指针赋值为NULL,同时把每一个结点所指向的其他结点形成一个链表。
为NULL。
3栈的初始化模块
使栈中base指针分配一定的存储空间,并使栈中top指针指向base指针。
4.栈的进栈模块
先开始判断这个栈是否为满,若满了,则重新分配一定的存储空间,栈中的top指针重新赋值之后,再使该元素进栈,并使top指针指向下一位。
5.栈的出栈模块
判断栈的top指针和base指针是否相等,若相等则为空,否则不为空。
6.栈空的模块
通过判断栈的top指针和base指针是否相等,来返回相应的值
7.求结点的入度模块
对每一个结点已经形成了一个链表进行查找,若发现有一个结点指向另一个结点,就把另一个结点的入度加1,直到循环结束
8.拓扑排序模块
首先对栈进行初始化,然后找出结点的入度为零的结点,若入度为零,则进栈。
当是S1不为空时,就将栈中的S1进行出栈操作,并把序号所对应的结点给输出来。
与此同时,把结点所对应的序号压入栈S2,同时将count加1,并判断栈S2是否为空,
若不为空,则把栈S2中的元素进行出栈操作,并把该结点所形成的链表中每一个结点的入度减一,若减之后,就把该结点的序号压入栈S1。
如此循环,直到该循环结束
图
(1)是CreateALGraph()函数
inti,semester_num,v,w,vex
CreateALGraph函数
semester_num>
8
输入学期数
N
vex>
=20
Y
课程数目
输入课程之间
的关系数
输入课程的名字
i<
G.vexnum
输入课程的之间的先后关系数v,w
G.arcnum
结束
图
(1)
图
(2)是InitStack()函数
图(3)
否
return1
e=*--S.top
return1
return0
是
S.top==S.base
图(3)是Pop()函数
图
(2)
S.base=(SElemType*)malloc(stack_init_size*sizeof(SElemType))
s.base!
=0
return0
S.top=S.base,
S.stacksize=stack_init_size
图(4)是Push函数
图(4)
S.top-S.base>
=S.stacksize
*S.top++=e
是
S.top=S.base+S.stacksize,
S.stacksize+=createstack;
S.base==0
S.base=(SElemType*)realloc(S.base,(S.stacksize+createstack)*sizeof(SElemType))
图(6)
图(6)是FindInDegree()函数
p=p->
nextarc
i++
结束
indegree[j]++
intj=0,j<
p->
adjvex==j
P==NULL
p=G.vertices[i].firstarc
i<
G.vexnum
inti=0
ArcNode*p
图(5)
图(5)是StackEmpty()函数
SqStackS1,S2;
ArcNode*p;
inti=0,count=0,k;
图(7)拓扑排序函数函数
indegree[i]==0
Push(S1,i)
i++,i<
StackEmpty(S1)!
输出相应的课程
Pop(S1,i),输出i号结点,Push(S2,i)
count++
StackEmpty(S2)!
Pop(S2,i)
p=G.vertices[i].firstarc;
p
Push(S1,k)
--indegree[k])==0
k=p->
adjvex
五.调试与测试
调试
1.在编程当中,由于要输入大量的程序,所以经常出现很多不让人注意的小错误。
例如大小写int写成Int(因为是在word中写的,会自动将字母大写)
2.关系运算符和赋值运算符总是用错,而这种错误也总是被忽略。
3.有时候会忘记加分号或是在不该加的地方加上了分号。
不过这种情况还是比较容易被发现的。
4.有时候大括号也会忘加,尤其是在if语句和for语句中。
5.最重要的是函数的应用,函数应该应用得当,否则程序会出现很大的错误,尤其是在如此庞大的程序中。
6.调试拓扑排序的时候,最头疼,有时候调试半天没有结果,最后问了一下同学,才有了思绪,错误逐渐浮出水面,让我明白究竟错在哪里。
7.总是忘了初始化,结果调试半天没有调试出来。
8.我对拓扑排序基本弄清楚了,但是程序不一定写的出来,稍微错了一点很难找出来。
9.在定义结构体时,纠结了半天,没有定义好结构体很多都是白搭,下面很多程序都不好写。
10.全程变量的运用错误导致很多错误,调试了半天。
测试
开始界面
输入课程数目
输入总边数
输入所有课程的名称
输入课程之间的先后关系
学期课程安排
六.课程设计的总结
通过这个课程设计,我们更加牢固的掌握了书本上的知识。
并对于以前不熟悉的知识有了更加深刻的了解。
在完成此次课程设计的过程中,虽然有些疲劳和困倦,但带给我很多的收获。
数据结构已经学了半个学期了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。
很多程序理论上说得过去,但真正上机了却会发现行不通。
所以说无论做什么事空有理论而不去实践都收获不到真正的果实。
说实话,我这个程序在所有程序当中算是简单的,所包含的知识也就是调用函数和结构体,当中穿插了一些拓扑排序算法,总体来说结构还是很清晰的,由各个模块小模块组成了一个排课系统。
但过程中也是遇到了不少的麻烦,很多地方都想不到或是想不全的。
所以说对待任何事情我们都不容小觑,一件自己没做过的事谁都不