教学计划编制问题
- 格式:doc
- 大小:226.00 KB
- 文档页数:19
目录摘要 (1)前言 (2)正文 (3)1.问题描述 (3)2.逻辑设计 (3)3.详细设计 (6)4.称序编码 (11)5.程序调试与测试 (14)6.软件安装和使用说明书 (15)设计总结 (16)参考文献 (17)致谢 (18)摘要大学的每个专业都要制定教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
试在这样的前提下设计一个教学计划编制程序。
关键词:数据、结构、教学、计划前言随着科学技术和市场经济的迅速发展,技术和产品的生命周期日益缩短,市场需求日益多样化和个性化,社会对人才的需求也越来越呈现多样化、专业化和个性化[1-2]。
高等学校学历教育的主要任务是传授专业基础知识、培养可持续发展的综合素质。
学生毕业后,面对瞬变的人才市场,常感到无所适从,而企业方面又常感到合适的人才难求。
顺应社会的需求,针对具体行业需求的定制式教学悄然兴起。
近年来,伴随着经济发展轨道的变化,广东省的一些企业向高校提出了定制式教学培训的要求。
例如某摩托车生产企业为了开拓海外市场,要对原产品进行改造,要求开设机械设计理论课程,主要目的是提高技术队伍人员的动力学分析与综合水平。
定制式教学需求属于同一工程领域,教学目标呈现多样化特征,所需基础涉及若干门课程,但不是这些课程的简单组合,亦无法照搬学校现成的教学计划。
为了迅速响应社会需求,需要研究面向定制式教学的多样化教学计划设计方法。
正文1.问题描述根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。
采用第二种策略:使课程尽可能地集中在前几个学期中;根据教学计划中的课程及其关系和学分定义图的顶点和边的结构体创建图GrateGraph():结合先修关系的AOV网,显示代号所对应课程及课程的先修课程拓扑排序TopologicalOrder (G):将课程排序后并决定出每学期所学课程,输出图G的信息Display(G):将图的顶点和弧边输出。
(1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)学分和直接先修课的课程号。
(2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。
计划的表格格式自行设计2.逻辑设计CreatGraph(ALGraph *G)//构件图(如下右图)void FindInDegree(ALGraph G, int indegree[])//求图中各节点的入度(如下左图)void TopologicalSort_1(ALGraph G,int numterm,int uplcredit) //有向图G 采用邻接表存储结构(如下左图)void TopologicalSort_2(ALGraph G,int numterm,int uplcredit) //有向图G 采用邻接表存储结构(如下右图)主函数:void main()3.详细设计1 、图的邻接表的存储表示,即结构体的定义typedef struct ArcNode{int AdjOfV; // 该弧所指向的顶点的位置struct ArcNode *next; //指向下一条弧的指针}ArcNode;typedef char VertexType[MAXOfNAME];typedef struct //链接表{VertexType data; //顶点信息int grades; //存储学分信息ArcNode *first; //指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VER]; // 头结点typedef struct{AdjList ver; //vertices 存储课程名int vexnum, arcnum; // 图的当前顶点数和弧数}ALGraph;2 、利用前插法,建立图的邻接链表printf("请输入下列课程的先修课程(无先修课程输入0 结束后也输入0)\n");for (h=0;h<G.vexnum;++h) // 构造表结点链表,利用前插法{printf("%s的先修课程:",G.ver[h].data);scanf("%s",va);getchar();while (va[0]!='0'){i = LocateVex(G, va); //弧头j = h; //弧尾p = (ArcNode*)malloc(sizeof(ArcNode));p->AdjOfV = j;p->next = G.ver[i].first; // 插在表头G.ver[i].first = p;scanf("%s",va);getchar();}}3 、输出图的顶点和边printf("%d个顶点", G.vexnum);for (i = 0;i < G.vexnum;++i)printf("%4s", G.ver[i].data);printf(" \n%d条弧边:\n",G.arcnum);for (i = 0;i < G.vexnum;i++){ p = G.ver[i].first;while (p){ printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data);p = p->next;}}4 、通过栈实现拓扑排序int TopologicalOrder(ALGraph G,AdjList R,struct Name name[]) {int i, k, j = 0, count, indegree[MAX_VER];SqStack S;ArcNode *p;FindInDegree(G, indegree); // 对各顶点求入度InitStack(S); // 初始化栈for (i = 0;i < G.vexnum;++i) //建零入度顶点栈Sif (!indegree[i]) Push(S, i); // 入度为0者进栈count = 0; // 对输出顶点计数while (!StackEmpty(S)){Pop(S, i);printf("%s(%d学分),",G.ver[i].data,G.ver[i].grades);R[j++] = G.ver[i]; //将当前的拓扑序列保存起来++count; // 输出i号顶点并计数for (p =G.ver[i].first; p; p=p->next)// 对i号顶点的每个邻接点的入度减1{k = p->AdjOfV;if (!(--indegree[k])) // 若入度减为0,则入栈Push(S, k);}}if (count < G.vexnum){printf("此有向图有回路无法完成拓扑排序");return 0;}else printf( " 为一个拓扑序列");printf("\n");int q=1,Z=0;while (q <= TotalOfTerms){int C = R[Z].grades ;printf("\n第%d个学期应学课程:",q);while (C <= MaxScores){C = C + R[Z+1].grades;if (Z < G.vexnum){CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/++Z;}}printf("\n");if (q == TotalOfTerms)printf( "\nOK Over!");q++;}return 1;/**/}4.称序编码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.主程序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.本程序只有两个模块,调用关系简单.主程序模块↓拓扑排序模块。