当前位置:文档之家› 教学计划编制问题课程设计数据结构

教学计划编制问题课程设计数据结构

攀枝花学院本科毕业设计(论文)[教学计划编制问题]学生姓名:学生学号:院(系)年级专业:指导教师:助理指导教师:无二〇一一年六月攀枝花学院本科学生课程设计任务书注:任务书由指导教师填写。

目录摘要 (4)一需求分析 (5)1.1 实验内容和实验目的 (5)1.2设计要求 (5)1.3理论与实践教学体系的关系 (5)二流程图设计 (6)三概要设计 (8)3.1 抽象数据类型图的定义 (8)3.2主程序 (9)3.3程序模块调用关系 (10)四详细设计 (10)4.1头结点,表结点,邻接表的定义 (10)4.2 栈的定义 (11)4.3 主程序和其他算法 (11)五调试分析 (20)5.1 用户使用和说明 (20)5.2 测试数据 (22)5.3 测试结果 (23)5.4 实验过程中出现的问题及解决方法 (24)六实验分工 (24)七实验体会 (25)八参考文献 (26)摘要教学计划是学校保证教学质量和人才培养的关键,也是组织教学过程、安排教学过程、安排教学任务、确定教学编制的基本依据和课程安排的具体形式。

是稳定教学秩序、提高教学质量的重要保证。

从教学计划的设计、实施等方面,阐明了如何搞好教学管理,从而为提高教学质量提供保证。

随着教育改革的不断深入和社会发展的需要,原旧的教学计划在定位上的方向性偏差,已经不再适应社会的需求。

因此,应重视教学计划的改革和修订工作,以确保教育教学质量,提高教育教学水平。

教学计划编制中的思路:一是明确培养目标;二是注重学科设置的整体性、统一性和灵活性、全面性;三是与学分制改革有机结合.教学计划是高校实施常规教学活动的基本管理文档,由于传统的手工编制方式存在诸多弊端,开发基于Web应用程序形式的教学计划编制系统具有很好的应用价值。

使用C程序设计语言,研究开发教学计划编制系统Web应用系统。

关键词教学计划编制培养目标管理一需求分析1.1实验内容和实验目的大学的每个专业都要编制教学计划。

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限都相等。

每个专业开设的课程都是确定的,而且课程的开设时间的安排必须满足先修关系。

每个课程的先修关系都是确定的,可以有任意多门,也可以没有。

每一门课程恰好一个学期。

试在这样的情况下设置一个教学计划编制程序。

在大学的某个专业中选取几个课程作为顶点,通过各门课的先修关系来构建个图,该图用邻接表来存储,邻接表的头结点存储每门课的信息.本程序的目的是为用户编排课程,根据用户输入的信息来编排出每学期要学的课程.1.2设计要求针对计算机系本科课程,根据课程之间的依赖关系(如离散数学应在数据结构之前开设)制定课程安排计划,并满足各学期课程数目大致相同。

1.3理论与实践教学体系的关系理论教学体系和实践教学体系是培养职业能力的两个主导因素是相互联系的,要处理好两者关系。

基础理论教学要以应用为目的,以必需、够用为度,专业课教学要加强针对性和应用性。

实践教学要改变过分依附理论教学的状况,探索建立相对独立的实践教学体系,形成基本实践能力与操作技能,专业技术应用能力与专业技能,综合实践能力与综合技能有机结合的实践教学体系。

二概要设计2.1抽象数据类型图的定义ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在直接先修关系}基本操作P:void CreatGraph(ALGraph *);void FindInDegree(ALGraph , int * );void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);}ADT Graph栈的定义:ADT Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0}数据关系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n}基本操作:void InitStack (SqStack *S);int StackEmpty(SqStack S);void Push(SqStack *S, int );int Pop(SqStack *S, int *e);}ADT Stack2.2主程序int main() //主函数{int numterm; //学期总数int uplcredit; //一个学期的学分上限int selectway;ALGraph G;printf("请输入学期总数:\n");scanf("%d",&numterm);printf("请输入一个学期的学分上限:\n");scanf("%d",&uplcredit);CreatGraph(&G);printf("请选择编排策略:1.课程尽可能集中到前几个学期;2.课程尽量均匀分布\n");scanf("%d",&selectway);if(selectway==1)TopologicalSort_1(G,numterm,uplcredit);if(selectway==2)TopologicalSort_2(G,numterm,uplcredit);system("pause");return 0;}三代码设计3.1头结点,表结点,邻接表的定义#define MAX_VERTEX_NUM 100 //最大课程总数typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{char name[24]; //课程名int classid; //课程号int credit; //课程的学分int indegree; //该结点的入度int state; //该节点的状态ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum;}ALGraph;邻接表的基本操作:void CreatGraph(ALGraph *);创建邻接表void FindInDegree(ALGraph , int * );求一个结点的入度void TopologicalSort_1(ALGraph G,int numterm,int maxcredit); 拓扑排序来编排课程void TopologicalSort_2(ALGraph G,int numterm,int maxcredit); 拓扑排序来编排课程3.2栈的定义#define STACk_INIT_SIZE 100 //存储空间的初时分配量#define STACKINCREMENT 10 //存储空间的分配增量typedef int ElemType;typedef struct{AdjList vertices;int vexnum, arcnum;}ALGraph;基本操作:void InitStack (SqStack *S);栈的初始化int StackEmpty(SqStack S);判断栈是否为空void Push(SqStack *S, int );入栈操作int Pop(SqStack *S, int *e);出栈操作3.3主程序和其他算法int main() //主函数{ int numterm; //学期总数int uplcredit; //一个学期的学分上限int selectway;ALGraph G;printf("请输入学期总数:\n");scanf("%d",&numterm);printf("请输入一个学期的学分上限:\n");scanf("%d",&uplcredit);CreatGraph(&G);printf("请选择编排策略:1.课程尽可能集中到前几个学期;2.课程尽量均匀分布\n");scanf("%d",&selectway);if(selectway==1)TopologicalSort_1(G,numterm,uplcredit);if(selectway==2)TopologicalSort_2(G,numterm,uplcredit);system("pause");return 0;}void CreatGraph(ALGraph *G)//构件图{ int i, m, n;ArcNode *p;printf("请输入需要编排课程总数:\n");scanf("%d",&G->vexnum);for( i=1;i<=G->vexnum;i++){printf("请输入课程名\n");scanf("%s",&G->vertices[i].name);printf("请输入课程号\n");scanf("%d",&G->vertices[i].classid);printf("请输入该课程的学分\n");scanf("%d",&G->vertices[i].credit);G->vertices[i].indegree=0;G->vertices [i].state=NOTSTUDY;G->vertices[i].firstarc=NULL;}printf("请输入课程先修关系总数:");scanf("%d",&G->arcnum);printf("请顺序输入每个课程先修关系(先修课程在前并以逗号作为间隔):\n");for (i = 1; i <= G->arcnum; i++){printf("\n请输入存在先修关系的两个课程的序号:");scanf("%d,%d",&n,&m);while (n < 0 || n > G->vexnum || m < 0 || m > G->vexnum){printf("输入的顶点序号不正确请重新输入:");scanf("%d,%d",&n,&m);}p = (ArcNode*)malloc(sizeof(ArcNode));if (p == NULL){printf("memory allocation failed,goodbey");exit(1);}p->adjvex = m;p->nextarc = G->vertices[n].firstarc;G->vertices[n].firstarc = p;}printf("\n建立的邻接表为:\n"); //输出建立好的邻接表for(i=1;i<=G->vexnum;i++){printf("%d:->",G->vertices[i].classid);for(p=G->vertices[i].firstarc;p!=NULL;p=p->nextarc)printf("%d->",p->adjvex);printf("NULL");printf("\n");}}void InitStack(SqStack *S){S->base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));if (!S->base){printf("ERROR");exit(1);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;}int StackEmpty(SqStack *S){if(S->top==S->base)return OK;elsereturn ERROR;}void Push(SqStack *S,int e){if(S->top - S->base >= S->stacksize){S->base = (int *) realloc (S->base , (S->stacksize + STACKINCREMENT) * sizeof(int));if(!S->base){printf("ERROR");exit(1);S->top = S->base + S->stacksize;S->stacksize += STACKINCREMENT;}*S->top++ = e;}int Pop(SqStack *S, int *e){if(S->top == S->base) exit(1);*e = * --S->top;return 0;}void FindInDegree(ALGraph G, int indegree[])//求图中各节点的入度{int i;for (i = 1; i <= G.vexnum; i++)indegree[i] = 0;for (i = 1; i <= G.vexnum; i++){while (G.vertices[i].firstarc)indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc =G.vertices[i].firstarc->nextarc;}}}void TopologicalSort_1(ALGraph G,int numterm,int uplcredit){FILE *fp;fp=fopen("bianpai.txt","w");ArcNode *p;SqStack S;int indegree[M];//存放各节点的入度int i,j, k, m,n;int count; //课程编排数目计数器int sumcredit;//每个学期的课程学分累加器FindInDegree(G, indegree);for (i = 1; i <= G.vexnum; i++)G.vertices[i].indegree=indegree[i];InitStack(&S);count=0;k=0;while(count!=G.vexnum && k<=numterm){sumcredit=0;for(i=1;i<=G.vexnum;i++) //入度为零的节点入栈,即无先修的课程入栈if((G.vertices[i].indegree==0)&&(G.vertices[i] .state==NOTSTUDY)){Push(&S,i);G.vertices[i].state = STUDY;//避免入度为零节点重复入栈}if(!StackEmpty(&S)&&(sumcredit<=uplcredit)){k= k+1;printf("\n");printf("第%d个学期学得课程有:\n",k);sumcredit = 0;for(i=1;i<=G.vexnum;i++)//入度为零的节点入栈,即无先修的课程入栈if((G.vertices[i].indegree==0)&&(G.verti ces[i].state==NOTSTUDY))Push(&S,i);while((!StackEmpty(&S))&&(sumcredit<uplcredit))/ /栈非空&&学分总数小于学分上限{Pop(&S,&j);sumcredit = sumcredit +G.vertices[j].credit;if(sumcredit <= uplcredit){printf(" %s",G.vertices[j].name);fprintf(fp," %s",G.vertices[j].name);count++;for(p=G.vertices[j].firstarc;p;p=p ->nextarc)//对j号顶点每个邻接点的入度减一G.vertices[p->adjvex].in degree--;}else Push(&S,j);//将未输出的节点重新压入栈}}fprintf(fp,"\n");}printf("\n");if(count<G.vexnum)printf("\n课程编排出错\n");else{printf("\n课程编排成功\n");}fclose(fp);}void TopologicalSort_2(ALGraph G,int numterm,int uplcredit) {FILE *fp;fp=fopen("bianpai.txt","w");ArcNode *p;SqStack S;int indegree[M];int i,j, k, m,n;int maxnum;int sumnum;int count; //课程编排数目计数器int sumcredit;//每个学期的课程学分累加器FindInDegree(G, indegree);for (i = 1; i <= G.vexnum; i++)G.vertices[i].indegree = indegree[i];InitStack(&S);count=0;k=0;maxnum = G.vexnum/numterm+1;sumnum = 0;while(count!=G.vexnum && k<=numterm){for(i=1;i<=G.vexnum;i++)if((G.vertices[i].indegree==0)&&(G.v ertices[i].state==NOTSTUDY)){Push(&S,i);G.vertices[i].state = STUDY;}if(!StackEmpty(&S)&&(sumcredit<=uplcredit)&&(sum num<=maxnum)){k= k+1;printf("\n");printf("第%d个学期学得课程有:",k);sumcredit = 0;sumnum = 0;for(i=1;i<=G.vexnum;i++)//入度为零的节点入栈,即无先修的课程入栈if((G.vertices[i].indegre e==0)&&(G.vertices[i].state==NOTSTUDY))Push(&S,i);while((!StackEmpty(&S))&&(sumcre dit<uplcredit)&&(sumnum<maxnum))//栈非空&&学分总数小于学分上限&&学期课程数目小于学期最大数目{Pop(&S,&j);//出栈sumcredit = sumcredit + G.vertices[j].credit;sumnum = sumnum+1;if((sumcredit <= uplcredit)&&(sumnum <= maxnum)){printf(" %s ",G.vertices[j].name);fprintf(fp," %s ",G.vertices[j].name);count++;for(p=G. vertices[j].firstarc;p;p=p->nextarc)//对j号顶点每个邻接点的入度减一G .vertices[p->adjvex].indegree--;}else Push(&S,j);}}fprintf(fp,"\n");}printf("\n");if(count<G.vexnum)printf("课程编排出错\n");else{printf("课程编排成功\n");}fclose(fp);}3.4程序模块调用关系主程序模块→拓扑排序模块四流程图设计流程图如下所示:void FindInDegree(ALGraph G, int indegree[])//求图中各节点的入度(如图4.1)void CreatGraph(ALGraph *G)//构件图(如图4.2)图4.1 图4.2void TopologicalSort_1(ALGraph G,int numterm,int uplcredit) //有向图G采用邻接表存储结构(如图4.3)void TopologicalSort_2(ALGraph G,int numterm,int uplcredit) //有向图G采用邻接表存储结构(如图4.4)图4.3 图4.4主函数:void main() 图4.4五调试分析5.1用户使用和说明使用VC++,打开教学计划编制问题.cpp文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。

相关主题