1、软 件 学 院课程设计报告书课程名称 数据结构 设计题目 教学计划编制问题 专业班级 学 号 姓 名 指导教师 2013年 1 月1目录1 设计时间 -22 设计目的 -23设计任务 -24 设计内容 -24.1 需求分析 -24.2 总体设计 -34.3 详细设计 -64.4 测试与分析 -124.4.1测试 -124.4.2分析 -144.5 附录 -165 总结与展望 -276参考文献 -2821 设计时间2013 年 1 月 21 日-2013 年 1 月 27 日2 设计目的了解并掌握数据结构预算法的设计算法,具备初步的独立分析和设计能力。提高综合运用所学理论知识和方法独立分析和解决
2、问题的能力。掌握面向实际背景思考问题的方法。对于学生基本程序设计素养的培养和软件工作者工作作风的训练,起到显著的促进作用3 设计任务掌握数据结构的应用、算法的编写、类 C 语言的算法转换成 C 程序并上机调试的基本方法。大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占 3
3、 位的字母数字串) 、学分和直接先修课的课程号。允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽量可能地集中在前几个学期中。若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到屏幕。计划的表格格式自行设定。4 设计内容 4.1需求分析 1、程序所能达到的功能:为用户编排课程,根据用户输入的信息来编排出每学期要学的课程。2、输入的形式和输入值的范围:学期总数:6;学分上限:30;该专业共开设 12 门课,课程号从 S1 到 S12,29学分顺序为 2,3,4,3,2,3,4,4,7,5,2,3。先修关系源自软件学院部分实际课程。3、测试数据及程序
4、运行情况预测:编排方法输出结果为:第一学期学的课程有:高等数学 程序设计基础 第二学期学的课程有:大学物理上 线性代数 离散数学第三学期学的课程有:数据结构 概率论 大学物理下第四学期学的课程有:数据库第五学期学的课程有:JAVA 语言的设计和分析第六学期学的课程有:编译原理4.2总体设计内容包括:1.本程序中用到的所有抽象数据类型的定义如下: ADT Graph数据对象 V:V 是具有相同特性的数据元素的集合, 称为顶点集.数据关系 R:R=VRVR=(v,w)|v,wV,(v,w)表示 v 和 w 之间存在直接先修关系基本操作 P:int CreateGraph(ALGraph *pGra
5、ph) ;void FindInDegree(ALGraph G, int indegree)int TopoSort(ALGraph G, AdjList Temp)1ADT Graph栈的定义:ADT Stack数据对象:D=ai|aiElemSet,i=1,2,n,n=0数据关系:R1=ai-1 ai|ai-1,ai D,i=2,n基本操作:int InitStack(SqStack *pStack) int StackEmpty(SqStack S)int Pop(SqStack S, SElemType e)int Push(SqStack S, SElemType e) ADT S
6、tack2.各程序模块之间的层次(调用)关系如图1所示:1图 13 函数调用关系如图 2 所示:图 24.主程序 void main()1ALGraph G;AdjList Temp;OUTPUT();printf(“*教学计划编制问题*n“ );printf( “请输入学期总数:“);scanf(“%d“,printf(“请输入学期的学分上限:“);scanf(“%d“,CreateGraph(Display(TopoSort(G, Temp);printf(“nOKn“);getchar();4.3详细设计一个栈对入度为零的顶点进行存放。根首先利用拓扑排序对课程先后顺序进行分析,邻接表为主
7、要存储结构,栈为主要辅助结构,给出课程之间的先后有关系比如 AOE 网,然后进行拓扑排序,但当有向图中存在环时无法查找该图的的拓扑排序,当图中的所有顶点全部输出,表示对该图排序成功,实现拓扑排序算法时,相应的建立邻接表存储 AOE 网,为了避免重复检验入度为零 的顶点,建立据课程的先后关系,对各学期的的课程进行排序,输出。 (这是运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排序。内容包括:第一部分: 数据类型定义#include#include#include#define TRUE 1#define FALSE 01#define OK 1#define ERROR 0#defi
8、ne MAX_NAME 3#define MAXCLASS 100 /顶点字符串的最大长度#define MAX_VERTEX_NUM 100 /最大顶点数#define N 12typedef char VertexTypeMAX_NAME; int TotalTerms ; /学期总数int MaxScores; /学分上限/* -图的邻接表存储表示- */typedef struct ArcNodeint adjvex; / 该弧所指向的顶点的位置 弧的节点结构struct ArcNode *nextarc; / 指向下一条弧的指针ArcNode; / 链表结点typedef struc
9、t VNode /顶点结构 /链接表VertexType data; /顶点信息int grades; /存储学分信息ArcNode *firstarc; /指向第一条依附该顶点的弧的指针VNode, AdjListMAX_VERTEX_NUM; / 头结点typedef struct ALGraph /图结构AdjList vertices; /vertices 存储课程名 应包含邻接表int vexnum, arcnum; / 图的当前顶点数和弧数ALGraph;第二部分: 查找图中某个顶点位置并采用邻接表存储结构存储图int LocateVex(ALGraph G, VertexType
10、 u) /* 查找图中某个顶点位置 */1int i;for (i = 0; i vexnum);printf( “请输入各个课程的先修课程的总和(弧总数): “);scanf(“%d“,printf( “请输入%d个课程的课程号(最多%d个字符,数字+字母)和学分值n“, pGraph-vexnum, MAX_NAME);for (i = 0;i vexnum;+i) printf(“课程号:“);scanf(“%s“,printf(“学分值:“);scanf(“%d“,pGraph-verticesi.firstarc = NULL;printf(“n请输入下列课程的先修课程(无先修课程输
11、入0 结束后也输入0)n“);1for (k=0;kvexnum; +k) / 构造表结点链表,利用前插法 printf(“%s的先修课程:“,pGraph-verticesk.data);scanf(“%s“,while (va0!=0)i = LocateVex(*pGraph, va); /弧头/ 增加对返回值的校验,因为输入的课程代码有可能找不到if (iadjvex = k;pNode-nextarc = pGraph-verticesi.firstarc; / 插在表头pGraph-verticesi.firstarc = pNode;scanf(“%s“,va); return
12、OK;第三部分;对图的拓扑排序int TopoSort(ALGraph G, AdjList Temp) /*拓扑排序*/ int i, k, j = 0, count, indegreeMAX_VERTEX_NUM; int q=1,Z=0;SqStack S;ArcNode *p;1FindInDegree(G, indegree); / 对各顶点求入度InitStack( / 初始化栈for (i = 0;i nextarc) k = p-adjvex;if (!(-indegreek) / 若入度减为0,则入栈Push(S, k);if (count G.vexnum)printf(“
13、此有向图有回路无法完成拓扑排序n“);return ERROR;else printf( “ 为一个拓扑序列n“);1while (q#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define MAX_NAME 3#define MAXCLASS 100 /顶点字符串的最大长度#define MAX_VERTEX_NUM 100 /最大顶点数#define N 12typedef char VertexTypeMAX_NAME; int TotalTerms ; /学期总数int MaxScor
14、es; /学分上限/* -图的邻接表存储表示- */typedef struct ArcNode1int adjvex; / 该弧所指向的顶点的位置 弧的节点结构struct ArcNode *nextarc; / 指向下一条弧的指针ArcNode; / 链表结点typedef struct VNode /顶点结构 /链接表VertexType data; /顶点信息int grades; /存储学分信息ArcNode *firstarc; /指向第一条依附该顶点的弧的指针VNode, AdjListMAX_VERTEX_NUM; / 头结点typedef struct ALGraph /图结
15、构AdjList vertices; /vertices 存储课程名 应包含邻接表int vexnum, arcnum; / 图的当前顶点数和弧数ALGraph;const char *CourseCodesN = “S1“, “S2“, “S3“, “S4“, “S5“, “S6“, “S7“, “S8“, “S9“, “S10“, “S11“, “S12“;const char *CourseNamesN = “程序设计基础“, “大学物理下“, “数据库“, “离散数学“, “语言的设计和分析“, “概率论“, “编译原理“, “JAVA“, “高等数学“,“线性代数“, “大学物理上“
16、, “数据结构“;void OUTPUT() /int s;printf(“tt 欢迎使用教学计划编制系统 n“);printf(“tt 请您根据系统提示按需求输入相关信息 n“);printf(“ n“);1printf(“tt 教学计划编制菜单 n“);printf(“tt 课程代码 | 课程名称 |优先课程 n“);printf(“ttS1 |程序设计基础 | 无 n“);printf(“ttS2 |大学物理下 | S1 n“); printf(“ttS3 |数据库 | S1,S2 n“);printf(“ttS4 |离散数学 | S1 n“);printf(“ttS5 |语言的设计和分
17、析 | S3,S4 n“);printf(“ttS6 |概率论 | S11 n“);printf(“ttS7 |编译原理 | S5,S3 n“);printf(“ttS8 |JAVA | S3,S6 n“);printf(“ttS9 |高等数学 | 无 n“);printf(“ttS10 |线性代数 | S9 n“);printf(“ttS11 |大学物理上 | S9 n“);printf(“ttS12 |数据结构 | S9,S10,S1 n“);/* 查找图中某个顶点位置 */int LocateVex(ALGraph G, VertexType u) int i;for (i = 0; i
18、 vexnum);printf( “请输入各个课程的先修课程的总和(弧总数): “);scanf(“%d“,printf( “请输入%d 个课程的课程号(最多%d 个字符,数字+字母)和学分值n“, pGraph-vexnum, MAX_NAME);for (i = 0;i vexnum;+i) printf(“课程号:“);scanf(“%s“,printf(“学分值:“);scanf(“%d“,pGraph-verticesi.firstarc = NULL;printf(“n 请输入下列课程的先修课程( 无先修课程输入 0 结束后也输入 0)n“);for (k=0;kvexnum; +
19、k) / 构造表结点链表,利用前插法 printf(“%s 的先修课程:“,pGraph-verticesk.data);scanf(“%s“,while (va0!=0)i = LocateVex(*pGraph, va); /弧头/ 增加对返回值的校验,因为输入的课程代码有可能找不到1if (iadjvex = k;pNode-nextarc = pGraph-verticesi.firstarc; / 插在表头pGraph-verticesi.firstarc = pNode;scanf(“%s“,va); return OK;/* 输出图 G 的信息*/void Display(ALG
20、raph *pGraph) int i;ArcNode *pNode;printf(“有向图n“);printf(“%d 个顶点“, pGraph-vexnum);for (i = 0;i vexnum;+i)printf(“%4s“, pGraph-verticesi.data);printf(“ n%d 条弧边:n“,pGraph-arcnum);for (i = 0;i vexnum;i+)pNode = pGraph-verticesi.firstarc;1while (pNode)printf(“%s-%sn“,pGraph-verticesi.data,pGraph-vertice
21、spNode-adjvex.data);pNode = pNode-nextarc;/*求顶点的入度*/void FindInDegree(ALGraph G, int indegree) int i;ArcNode *pNode;for (i = 0;i adjvex+;pNode = pNode-nextarc;void OutputNameByCode(char *theCode)1int i;for (i=0; i base = (SElemType *)malloc(Stack_NUM * sizeof(SElemType);if (!pStack-base)exit(-1);pSt
22、ack-top =pStack-base;1pStack-stacksize =Stack_NUM;return OK;/*判断栈是否为空*/int StackEmpty(SqStack S) if (S.top = S.base)return TRUE;elsereturn FALSE;/*出栈*/int Pop(SqStack S, SElemType e) if (S.top = S.base)return ERROR;e = *-S.top;return OK;/*入栈*/int Push(SqStack S, SElemType e) if (S.top - S.base = S.s
23、tacksize)S.base = (SElemType *) realloc ( S.base, (S.stacksize + Stack_MoreNUM) * sizeof(SElemType);1if ( !S.base ) exit(-1);S.top =S.base +S.stacksize;S.stacksize +=Stack_MoreNUM;*S.top+ = e;return OK;/*拓扑排序*/ int TopoSort(ALGraph G, AdjList Temp) int i, k, j = 0, count, indegreeMAX_VERTEX_NUM; int
24、 q=1,Z=0;SqStack S;ArcNode *p;FindInDegree(G, indegree); / 对各顶点求入度InitStack( / 初始化栈for (i = 0;i nextarc) k = p-adjvex;if (!(-indegreek) / 若入度减为 0,则入栈Push(S, k);if (count G.vexnum)printf(“此有向图有回路无法完成拓扑排序n“);return ERROR;else printf( “ 为一个拓扑序列n“);while (q= TotalTerms)int C=TempZ.grades ;printf(“n 第%d
25、个学期应学课程:“,q);while (C = MaxScores)C = C + TempZ+1.grades;if (Z G.vexnum)OutputNameByCode(TempZ.data);+Z;1printf(“n“);if (q = TotalTerms)printf( “n 课程编制完成!“);q+;return OK;void main()ALGraph G;AdjList Temp;OUTPUT();printf(“*教学计划编制问题*n“ );printf( “请输入学期总数:“);scanf(“%d“,printf(“请输入学期的学分上限:“);scanf(“%d“,
26、CreateGraph(Display(TopoSort(G, Temp);printf(“nOKn“);getchar();15 总结与展望通过两个星期的努力,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。看着劳动成果,很欣慰!这是我第一次做课程设计,虽然这不是我一个人做的,有老师同学的帮助也有上网搜索一些资料,但是我从中学到了很多知识。刚开始,可以说是没有头绪,于是就去图书馆找资料,找到了一些关于画图方面的,可是这点小进展远远不够,这只是一个小小的开始。下一步是上网查,找到了些与我们题目相似的,那时我很高兴,可是那还不是我要的,于是又上网查到了些有关的函数等等,终于在我的努力下,完成
27、了这个程序。虽然对着电脑做程序,有点累有点烦躁,可是当看到劳动成果时,心里特别高兴。世上无难事,只怕有心人,的确如此。做完这个程序最大的收获就是感受到了个人的努力和付出是很重要的!做完这个课程设计,我的自信一下子提高了,我也会写程序了;尽管对于有些人这种程1序会很简单,可对我这个初学者来说,已经很不容易了。这次的课程设计为以后的学习增强了信心。此外, 此次数据结构课程设计的过程中还有很多不足,并且在代码设计中显得不完美,归纳了一下有几点不尽人意的地方:1.代码的运行效率没有尽可能提高2.有部分程序没有成功运行3.觉得程序不是很完整,还有待于完善我会继续研究直到程序可以完整的运行出来,不管是现在的课程设计还是以后的学习,我都会认真的对待。我希望我以后的学习会有更好的发展。参考文献1 数据结构(C 语言版) 严蔚敏、吴伟民编著清华大学出版社,20102 C 程序设计 ,谭浩强编著3 版北京:清华大学出版社,2005(2007 重印)3实用数据结构 ,谭浩强,清华大学出版社。4零基础学数据结构 ,陈锐,北京机械工业出版社,20105数据结构(C 语言版) ,夏燕,张兴科,北京大学出版社。6数据结构C 语言描述 ,马国均,科学出版社。7百度文库:http:/ 教师签字