当前位置:文档之家› 教学计划安排检验程序正文

教学计划安排检验程序正文

目录1 实验目的 (1)2 问题描述 (1)3 需求分析 (1)4 概要设计 (2)4.1设计思想 (2)4.2设计流程图 (2)4.3 数据库设计 (3)4.4函数及功能要求 (3)4.5模块调用关系 (4)5详细设计 (4)5.1制定课程计划伪码 (4)6 测试分析 (8)7 使用说明 (11)8 总结 (12)9 参考文献 (13)10 附录 (14)教学计划安排检验(德州学院计算机系,山东德州253023)1 实验目的本次数据结构课程设计的主要目的是检验和巩固专业知识,提高综合素质和能力。

并在实际操作中掌握:1.邻接表的存储结构。

2.栈的基本操作。

3.拓扑排序的思想。

通过实习,可以将我们课堂上掌握的理论知识与处理数据的业务相结合,以检验我们掌握知识的宽度、深度及对知识的综合运用能力。

2 问题描述针对学院的计算机系本科课程,根据课程之间的依赖关系,制定课程安排计划,并满足各学期课程数大致相同。

按照用户输入的课程数,学期数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出每学期应学的课程。

3 需求分析该程序的工作是制定课程安排计划,并满足各学期课程数大致相同。

此程序规定:1、输入的形式和输入值的范围:输入间用空格隔开。

要求用户输入的课程数小于20,学期数小于或是等于8,课程名的长度小于等于10个字符。

2、程序所能达到的功能:按照用户的输入,给出每学期应学的课程。

3、测试数据:输入:学期数:5,课程数:12,课程间的先后关系数:16,课程的代表值:v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12。

课程间两两间的先后关系:v1 v2,v1 v3, v1 v4,v1 v12,v2 v3,v3 v5,v3 v7,v3 v8,v4 v5, v5 v7,v6 v8,v9 v10, v9 v11 , v9 v12,v10 v12,v11v6输出:第1学期应学的课程:v1 v9第2学期应学的课程:v2 v4 v10 v11第3学期应学的课程:v3 v6 v12第4学期应学的课程:v5 v8第5学期应学的课程:v74 概要设计4.1设计思想总体思想是利用拓扑排序的思想和堆栈思想编写相应函数。

首先根据课程的先后关系画出AOV网,网中的结点代表课程,有向边表示各学科之间的次序关系。

可以采用邻接表作AOV网的存储结构,且在头结点中增加一个存放顶点入度的数组。

为了避免重复检测入度为零的顶点,可另设一栈暂存所有入度为零的顶点。

然后根据拓扑排序依次输出应学的课程。

4.2设计流程图图1 流程图4.3 数据库设计ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。

数据系统用到的抽象数据类型定义:1.关系R:R={VR}VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义和信息}基本操作:(1)Status CreateDG(ALGraph&G);(2)void FindInDegree(ALGraph G);(3)Status TopologicalSort(ALGraph G);}ADT Graph2. ADT Stack{数据对象:D={ai |ai∈ElemSet,i=1,2,…,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}约定an 端为栈顶,a1端为栈底。

基本操作:(1)Status InitStack(SqStack&S);(2)Status Push(SqStack&S,SElemType e);(3)Status Pop(SqStack&S,SElemType&e);(4)Status StackEmpty(SqStack S);}ADT Stack4.4函数及功能要求(1)Status InitStack(SqStack&S):构造一个空栈。

(2)Status Push(SqStack&S,SElemType e):插入元素e为新的栈顶元素。

(3)Status Pop(SqStack&S,SElemType&e):若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。

(4)Status StackEmpty(SqStack S):判断栈是否为空,为空返回TRUE,否则返回FALSE。

(5)Status CreateDG(ALGraph&G):建立邻接表。

(6)void FindInDegree(ALGraph G):求图的入度。

(7)void print(int n[],ALGraph G):排序输出顶点数据。

(8)Status TopologicalSort(ALGraph G):拓扑排序,有向图G采用邻接表存储结构。

4.5模块调用关系各程序模块之间的调用关系(子程序编号见上):主函数可调用子程序5,8。

子程序8可调用子程序1,2,3,4,6,7。

5详细设计5.1制定课程计划伪码制定课程计划算法的伪码描述如下:Status CreateDG(ALGraph&G){//建立邻接表提示"请输入学期数目(学期数目必须小于等于8):";scanf("%d",&学期数目);if(学期数目>8){提示"请重新输入学期数目(学期数目必须小于等于8):";scanf("%d",&学期数目);}提示"请输入课程数目(课程数必须小于20):";scanf("%d",&课程数目);if(课程数目>=20){提示"请重新输入课程数目(课程数必须小于20):";scanf("%d",&课程数目);}图G的顶点数=课程数目;提示"请输入课程间的先后关系数:";scanf("%d",&图G的顶点数);提示"请输入课程的代表值(课程名的长度小于等于10个字符):";for(i=0;i<图G的顶点数;i++){scanf("%s",&图G的第i个顶点的数据);图G的第i个顶点指向的第一条弧 = NULL;}//输入顶点信息提示"请输入课程间两两间的先后关系:";for(i=0;i<图G的弧数;i++){//输入弧的信息scanf("%d,%d",&弧尾v, &弧头w);ArcNode *p= new ArcNode;//建立结点if(p为空) return ERROR;p所指向的顶点(p->adjvex)=w-1;p所指向的下一条弧(p->nextarc)=G.vertices[v-1].firstarc;//顶点v 的链表G.vertices[v-1].firstarc=p;//添加到最左边}return OK;}voidFindInDegree(ALGraph G){//求图各顶点的入度ArcNode* p;for(int i=0;i<图G的顶点数;i++){p=G.vertices[i].firstarc;while(p不为空){if(p所指向的顶点位置(p->adjvex)==j)第j个顶点的入度+1;p=p->nextarc;}}}void print(int n[],ALGraph G)//对刚出s1栈的数据进行排序然后输出{for(i=0;n[i]!=-1;i++)for(j=i+1;n[j]!=-1;j++)if(n[i]>n[j]){n[i]与n[j]交换;}for(i=0;n[i]!=-1;i++)输出“G.vertices[n[i]].data”;}Status TopologicalSort(ALGraph G){ //拓扑排序//有向图G采用邻接表存储结构SqStack S1,S2;ArcNode* p;inti,count,k,m,n[20];FindInDegree(G);InitStack(S1);InitStack(S2);for(i=0;i<20;i++)n[i]=-1;//将数组n全部赋值为-1if(第i个顶点的入度为0)把入度为0的压入栈S1count=0; //对输出顶点计数while(S1不为空栈){输出("第%d学期应学的课程:",count+1);m=0;while(S1不为空栈){将S1的栈顶元素删除,并将其值返回给I;n[m]=i;把i号顶点压入栈S2m++;}调用排序及输出函数将数组n全部赋值为-1count++; //计数while(S2不为空){将S1的栈顶元素删除,并将其值返回给I;for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex; //对i号顶点的每个邻接点的入度减1 if(!(--indegree[k])) //若入度减为0,则入栈将度为0的顶点入栈S1;}}}if(count<G.vexnum) //该有向图有回路return ERROR;else return OK;}//TopologicalSort6 测试分析1运行程序打开界面如下图,并根据提示,输入学期数目:图2 测试1输入出错时显示如下:图3 测试2 2 输入正确继续根据提示输入课程数目:图4 测试3 3输入错误时的显示如下:图5 测试44输入正确则继续根据界面提示输入课程的代表值:图6 测试55根据界面提示输入课程间两两间的先后关系:图7 测试66 输入课程间两两间的先后关系后,则输出每学期应学的课程:图8 测试77 使用说明运行程序,出现主页面,输入学期数目(学期数目必须小于等于8),输入完成后,按回车进行下一步;输入课程数目(课程数必须小于20),输入完成后,按回车进行下一步;输入课程间的先后关系,输入完成后,按回车进行下一步;输入课程的代表值(课程名的长度小于等于10个字符,课程名之间用空格隔开),输入完成后,按回车进行下一步;输入课程间两两间的先后关系(注意:只输入课程代表值的数字部分,两两关系间用逗号隔开,不同组的关系用空格隔开),输入完成后,按回车,主界面上将显示每学期的课程安排。

至此,本程序运行结束。

8 总结本程序充分应用了我们数据结构中所学的知识,完成了教学计划安排的检验。

相关主题