“学期授课计划编制”实验报告一、实验目的1.题目:学期授课计划编制2.问题描述大学每个学期的课程授课有学分及授课门数上限的规定。课程之间有先行课的限制。设计编制学期授课计划,使得总的教学时长为最短的拓扑集合划分程序。3.实验要求设计大学四年制授课计划编制的模拟程序。(1)采用邻接表或邻接矩阵存储结构。(2)使用栈或队列等作为拓扑排序的辅助数据结构。(3)可以尝试采用深度优先遍历求解问题。二、需求分析1.根据我的调查及生活经验,学期授课计划的编制需要以下几个方面的信息汇总才可以实现(1)确定学期数,以及一个学期的最大学分上限和最大的课程数目上限。(2)确定一共需要上几门课,一级每门课的学分。(3)确定课程的先行关系。(4)综合以上信息采用拓扑排序制定出总的教学时长最短的教学授课计划。2.模块流程图主程序模块栈模块排序模块3.性能需求本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。三、程序实现本程序采取数据结构模块化编程,很好的实现了实验所要求的各项功能,本程序分为三个主要模块:主程序模块、栈模块、排序模块。1.主程序模块intmain(){printf("学期授课计划编制\n");printf("//AOV-网:顶点表示活动,弧表示活动间优先关系的有向图;intCONTINUE=1;while(CONTINUE!=0){printf("------------------------------------------------\n");ALGraphf;//图的邻接表存储;printf("请输入学期总数:");scanf("%d",&term_num);printf("请输入每学期的学分上限:");scanf("%d",&credit_lim);CreateGraph(f);Display(f);TopologicalSort(f);printf("\n按1继续,按0结束:");scanf("%d",&CONTINUE);}return0;}2.栈模块typedefenum{DG}GraphKind;//{有向图,有向网,无向图,无向网};typedefstructArcNode{//弧结构;intadjvex;//该弧所指向的顶点的位置;structArcNode*nextarc;//指向下一条弧的指针;InfoType*info;//网的权值指针;}ArcNode;//表结点;typedefstruct{VertexTypedata;//顶点信息;ArcNode*firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针;}VNode,AdjList[MAX_VERTEX_NUM];typedefstruct{AdjListvertices,vertices2;//分别存课程名和学分;intvexnum,arcnum;intkind;}ALGraph;intLocateVex(ALGraphG,VertexTypeu){inti;for(i=0;iadjvex=j;p->info=NULL;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}returnOK;}voidDisplay(ALGraphG){inti;ArcNode*p;switch(G.kind){caseDG:printf("有向图\n");}printf("%d个顶点:\n",G.vexnum);for(i=0;iadjvex]++;p=p->nextarc;}}}typedefintSElemType;#defineSTACK_INIT_SIZE10#defineSTACKINCREMENT2typedefstructSqStack{SEle...