版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
“学期授课计划编制”实验报告实验目的题目:学期授课计划编制问题描述大学每个学期的课程授课有学分及授课门数上限的规定。课程之间有先行课的限制。设计编制学期授课计划,使得总的教学时长为最短的拓扑集合划分程序。实验要求设计大学四年制授课计划编制的模拟程序。(1)采用邻接表或邻接矩阵存储结构。(2)使用栈或队列等作为拓扑排序的辅助数据结构。(3)可以尝试采用深度优先遍历求解问题。需求分析根据我的调查及生活经验,学期授课计划的编制需要以下几个方面的信息汇总才可以实现确定学期数,以及一个学期的最大学分上限和最大的课程数目上限。确定一共需要上几门课,一级每门课的学分。确定课程的先行关系。综合以上信息采用拓扑排序制定出总的教学时长最短的教学授课计划。模块流程图排序模块栈模块主程序模块
排序模块栈模块主程序模块性能需求本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。三、程序实现本程序采取数据结构模块化编程,很好的实现了实验所要求的各项功能,本程序分为三个主要模块:主程序模块、栈模块、排序模块。主程序模块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;}栈模块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;i<G.vexnum;++i)if(strcmp(u,G.vertices[i].data)==0)returni;return-1;}StatusCreateGraph(ALGraph&G){inti,j,k;VertexTypev1,v2;//顶点信息;ArcNode*p;//指向第一条依附某顶点的弧的指针;printf("请输入教学计划的课程数:");scanf("%d",&G.vexnum);printf("请输入课程先修关系数(弧的数目):");scanf("%d",&G.arcnum);printf("请输入%d个课程的代表值(如:c01):\n",G.vexnum);for(i=0;i<G.vexnum;++i){scanf("%s",G.vertices[i].data);G.vertices[i].firstarc=NULL;}printf("请输入%d个课程的学分值:\n",(G).vexnum);for(i=0;i<G.vexnum;++i){scanf("%s",G.vertices2[i].data);}printf("请顺序输入每条弧的弧尾和弧头(以空格作为间隔):\n");for(k=0;k<G.arcnum;++k){scanf("%s%s",v1,v2);i=LocateVex(G,v1);j=LocateVex(G,v2);p=(ArcNode*)malloc(sizeof(ArcNode));//新建一个节点;p->adjvex=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;i<G.vexnum;++i)printf("%s",G.vertices[i].data);printf("\n%d条弧:\n",G.arcnum);for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;}printf("\n");}}voidFindInDegree(ALGraphG,intindegree[]){inti;ArcNode*p;for(i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}typedefintSElemType;#defineSTACK_INIT_SIZE10#defineSTACKINCREMENT2typedefstructSqStack{SElemType*base;SElemType*top;intstacksize;}SqStack;StatusInitStack(SqStack*S){(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);(*S).top=(*S).base;(*S).stacksize=STACK_INIT_SIZE;returnOK;}voidClearStack(SqStack*S){//清空栈的操作S->top=S->base;}StatusStackEmpty(SqStackS){if(S.top==S.base)returnTRUE;elsereturnFALSE;}排序模块StatusPop(SqStack*S,SElemType*e){if((*S).top==(*S).base)returnERROR;*e=*--(*S).top;returnOK;}StatusPush(SqStack*S,SElemTypee){if((*S).top-(*S).base>=(*S).stacksize){(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT;}*((*S).top)++=e;returnOK;}Statuszxf(ALGraphG){intz=0;for(inti=0;i<G.vexnum;i++){z+=atoi(G.vertices2[i].data);}returnz;}typedefintpathone[MAX_CLASS_NUM];typedefintpathtwo[MAX_CLASS_NUM];StatusTopologicalSort(ALGraphG){inti,k,count,indegree[MAX_VERTEX_NUM];boolhas=false;SqStackS;pathonea;pathtwob;ArcNode*p;FindInDegree(G,indegree);InitStack(&S);for(i=0;i<G.vexnum;++i){if(!indegree[i])Push(&S,i);}count=0;while(!StackEmpty(S)){Pop(&S,&i);a[i]=*G.vertices[i].data;//课程名;b[i]=*G.vertices2[i].data;//学分;printf("课程%s→学分%s",G.vertices[i].data,G.vertices2[i].data);++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;if(!(--indegree[k]))Push(&S,k);}}if(count<G.vexnum){printf("此有向图有回路\n");returnERROR;}else{printf("为一个拓扑序列。\n\n");has=true;}intpattern=2;FindInDegree(G,indegree);//对各顶点求入度indegree[0..vernum-1];ClearStack(&S);printf("=====================================================\n");printf("教学计划如下:\n");intxq=1;//学期数;intxfh;//学分和;intnow=0;inttop=G.vexnum/term_num;//平均每学期课程数;intpjxf=zxf(G)/term_num;//每学期平均学分;while(xq<=term_num+1){intresult[20];//某个学期的课程;intm=0;xfh=0;now=0;//当前学期课程数;for(i=0;i<G.vexnum;++i){if(0==indegree[i])Push(&S,i);}if(xq==term_num+1&&!StackEmpty(S)){printf("还有课程未安排!\n");}while(!StackEmpty(S)&&xq<=term_num){intxf;Pop(&S,&i);//弹出栈顶元素;xf=atoi(G.vertices2[i].data);//atoi:字符串转换成整型数,xf:学分;xfh=xfh+xf;now++;if(xfh>credit_lim){ClearStack(&S);break;}if(pattern==1){if(xq!=term_num/2&&now>top){ClearStack(&S);now=0;break;}}if(pattern==2){if(xq!=1&&xq!=term_num/2&&xq!=term_num/2-1&&now>top){ClearStack(&S);now=0;break;}}indegree[i]--;//减为-1,避免被再次计入;for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;indegree[k]--;if(indegree[k]==0)Push(&S,k);}result[m]=i;m++;}if(xq<=term_num){printf("第%d个学期的课程为:",xq);for(intj=0;j<m;j++){printf("课程%s",G.vertices[result[j]].data);}}printf("\n");xq++;ClearStack(&S);}printf("=====================================================\n");returnOK;}四、程序运行截图程序开始运行界面测试数据:学期一共为2个学期,每个学期上限10学分,总共教学计划安排5门课,分别为c1课2学分,c2课6学分,c3课4学分,c4课6学分,c5课2学分。必须先上c1课再上c2课,先上c3课再上c4课,根据总教学时间最少的要求排课,输出的排课结果为:第一学期c5、c3,第二学期c4、c1。还有c2没有安排,所以无法排课,排课失败。测试数据:学期一共为1个学期,每个学期上限10学分,总共教学计划安排3门课,分别为c1课2学分,c2课2学分,c3课2学分。必须先上c1课再上c3课,根据总教学时间最少的要求排课,输出的排课结果为:第一学期c2、c1、c3。排课成功。
五、调试总结由于对于指针的操作掌握的不是很熟练,导致越界访问现象频频发生,因此,今后自己应该加强对指针的掌握和使用,以便可以更加顺利的编程。各操作时空复杂性比较合理,时空复杂度均为O(n),O(1)。本程序作业采用数据结构抽象的程序设计方法,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重复性,确实得到了一次良好的程序设计训练。六、参考文献[1]严蔚敏、吴伟民编著.《数据结构题集》(C语言版).北京:清华大学出版社.1999[2]严蔚敏、吴伟民编著.《数据结构》(C语言版).北京:清华大学出版社.2007七、程序清单#include<string.h>#include<stdio.h>#include<stdlib.h>#include<iomanip>#include<math.h>//floor(),ceil(),abs()#include<iostream>usingnamespacestd;#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1typedefintStatus;//Status是函数的返回类型;typedefintBoolean;#defineMAX_NAME10//顶点字符串的最大长度;#defineMAX_CLASS_NUM100intZ=0;intX=0;intterm_num,credit_lim,q=1;typedefintInfoType;typedefcharVertexType[MAX_NAME];//字符串类型;#defineMAX_VERTEX_NUM100typedefenum{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;i<G.vexnum;++i)if(strcmp(u,G.vertices[i].data)==0)returni;return-1;}StatusCreateGraph(ALGraph&G){inti,j,k;VertexTypev1,v2;//顶点信息;ArcNode*p;//指向第一条依附某顶点的弧的指针;printf("请输入教学计划的课程数:");scanf("%d",&G.vexnum);printf("请输入课程先修关系数(弧的数目):");scanf("%d",&G.arcnum);printf("请输入%d个课程的代表值(如:c01):\n",G.vexnum);for(i=0;i<G.vexnum;++i){scanf("%s",G.vertices[i].data);G.vertices[i].firstarc=NULL;}printf("请输入%d个课程的学分值:\n",(G).vexnum);for(i=0;i<G.vexnum;++i){scanf("%s",G.vertices2[i].data);}printf("请顺序输入每条弧的弧尾和弧头(以空格作为间隔):\n");for(k=0;k<G.arcnum;++k){scanf("%s%s",v1,v2);i=LocateVex(G,v1);j=LocateVex(G,v2);p=(ArcNode*)malloc(sizeof(ArcNode));//新建一个节点;p->adjvex=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;i<G.vexnum;++i)printf("%s",G.vertices[i].data);printf("\n%d条弧:\n",G.arcnum);for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){printf("%s→%s",G.vertices[i].data,G.vertices[p->adjvex].data);p=p->nextarc;}printf("\n");}}voidFindInDegree(ALGraphG,intindegree[]){inti;ArcNode*p;for(i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}typedefintSElemType;#defineSTACK_INIT_SIZE10#defineSTACKINCREMENT2typedefstructSqStack{SElemType*base;SElemType*top;intstacksize;}SqStack;StatusInitStack(SqStack*S){(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);(*S).top=(*S).base;(*S).stacksize=STACK_INIT_SIZE;returnOK;}voidClearStack(SqStack*S){//清空栈的操作S->top=S->base;}StatusStackEmpty(SqStackS){if(S.top==S.base)returnTRUE;elsereturnFALSE;}StatusPush(SqStack*S,SElemTypee){if((*S).top-(*S).base>=(*S).stacksize){(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT;}*((*S).top)++=e;returnOK;}Statuszxf(ALGraphG){intz=0;for(inti=0;i<G.vexnum;i++){z+=atoi(G.vertices2[i].data);}returnz;}typedefintpathone[MAX_CLASS_NUM];typedefintpathtwo[MAX_CLASS_NUM];StatusTopologicalSort(ALGraphG){inti,k,count,indegree[MAX_VERTEX_NUM];boolhas=false;SqStackS;pathonea;pathtwob;ArcNode*p;FindInDegree(G,indegree);InitStack(&S);for(i=0;i<G.vexnum;++i){if(!indegree[i])Push(&S,i);}count=0;while(!StackEmpty(S)){Pop(&S,&i);a[i]=*G.vertices[i].data;//课程名;b[i]=*G.vertices2[i].data;//学分;printf("课程%s→学分%s",G.vertices[i].data,G.vertices2[i].data);++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;if(!(--indegree[k]))Push(&S,k);}}if(count<G.vexnum){printf("此有向图有回路\n");returnERROR;}else{printf("为一个拓扑序列。\n\n");has=true;}intpattern=2;FindInDegree(G,indegree);//对各顶点求入度indegree[0..vernum-1];ClearStack(&S);printf("=====================================================\n");printf("教学计划如下:\n");intxq=1;//学期数;intxfh;//学分和;intnow=0;inttop=G.vexnum/term_num;//平均每学期课程数;intpjxf=zxf(G)/term_num;//每学期平均学分;while(xq<=term_num+1){intresult[20];//某个学期的课程;intm=0;xfh=0;now=0;//当前学期课程数}if(xq==term_num+1&&!StackEmpty(S)){printf("还有课程未安排!\n");}while(!StackEmpty(S)&&xq<=term_num){intxf;Pop(&S,&i);//弹出栈顶元素;xf=atoi(G.vertices2[i].data);//atoi:字符串转换成整型数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年代理业务权益协议
- 2025年公益活动担保合同
- 2025年土地买卖中介合同
- 2025年商标保护义务协议
- 2025年健身房特选设备训练服务协议
- 2025年基层金融质押协议
- 2025年连带责任保证合同(借款)
- 中小企业2024年期限劳动合同3篇
- 正规2025年度艺人经纪合同3篇
- 二零二五年度足疗技师外出服务安全协议范本
- 江苏省南京市协同体七校2024-2025学年高三上学期期中联合考试英语试题答案
- 青岛版二年级下册三位数加减三位数竖式计算题200道及答案
- GB/T 12723-2024单位产品能源消耗限额编制通则
- GB/T 16288-2024塑料制品的标志
- 麻风病防治知识课件
- 干部职级晋升积分制管理办法
- TSG ZF003-2011《爆破片装置安全技术监察规程》
- 2024年代理记账工作总结6篇
- 电气工程预算实例:清单与计价样本
- VOC废气治理工程中电化学氧化技术的研究与应用
- 煤矿机电设备培训课件
评论
0/150
提交评论