ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:231.53KB ,
资源ID:6221117      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6221117.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(教学计划编排问题.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

教学计划编排问题.docx

1、教学计划编排问题姓名 蒲 茜 学号1705990111 班级 计算机1701 年级 2017级 指导教师 杨新安 西安财经学院信息学院 数据结构 课程设计报告课程设计名称 教学计划编排问题 实验室 完成日期 2018.12.1 一、需求分析【问题描述】大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。【基本要求】(1)输入参数包括:学期总

2、数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。(2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。(3)若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。计划的表格格式自行设计。【测试数据】学期总数:8;学分上限:10;该专业共开设课数:16课程号:C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11C12 C13 C14 C15 C16学分顺序:2 3 4 3 2 3 4 4 4 5 4 4 2 3 2 3先修关系如

3、下表:C01C02 C04 C03 C12C02C03C03C05 C07 C08C04C05C05C07C06C08C07无C08无C09C10 C11 C12C10C12C11C06C12无C13C11C14C13C15C13 C11C16C15【实现提示】可设学期总数不超过10,课程总数不超过60。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。应建立内部课程号与课程号之间的对应关系。二、概要设计抽象数据类型描述:typedef struct ArcNodeArcNode;表节点(弧结构);typedef structVNode, AdjListMAX_VERTEX_NU

4、M;头结点;typedef structALGraph;图结构;int LocateVex(ALGraph G,VertexType u)操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1;Status CreateGraph(ALGraph &G)采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图);void Display(ALGraph G)输出图的邻接矩阵G;void FindInDegree(ALGraph G,int indegree)求顶点的入度;typedef struct SqStackSqStack;顺序栈;Status InitStack(SqS

5、tack *S)构造一个空栈S;void ClearStack(SqStack *S)清空栈的操作;Status StackEmpty(SqStack S)若栈S为空栈,则返回TRUE,否则返回FALSE;Status Pop(SqStack *S,SElemType *e)若栈不空,则删除S的栈顶元素,用e返回其值,并返回O:否则返回ERROR;Status Push(SqStack *S,SElemType e)插入元素e为新的栈顶元素;Status zxf(ALGraph G)求大学所有课程总学分;Status TopologicalSort(ALGraph G)程序的核心函数:有向图G

6、采用邻接表存储结构,若G无回路,则按用户选择的方案输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR;int main()主函数;功能模块图:三、详细设计存储结构及宏定义:#define MAX_VERTEX_NUM 100#define STACK_INIT_SIZE 10#define STACKINCREMENT 2图的邻接表存储:typedef struct ArcNode /弧结构; int adjvex; /该弧所指向的顶点的位置; struct ArcNode * nextarc; /指向下一条弧的指针;ArcNode; /表结点;typedef struct AdjLis

7、t vertices,vertices2; /分别存课程名和学分; int vexnum,arcnum; int kind;ALGraph;栈的顺序存储:typedef struct SqStack SElemType *base; SElemType *top; int stacksize;SqStack;算法设计:/对各顶点求入度indegreevoid FindInDegree(ALGraph G,int indegree) int i; ArcNode *p; for(i=0;iG.vexnum;i+) indegreei=0; for(i=0;iadjvex+; p=p-nextar

8、c; /出栈Status Pop(SqStack *S,SElemType *e) if(*S).top=(*S).base) return ERROR; *e=*-(*S).top; return OK;/入栈Status Push(SqStack *S,SElemType e) if(*S).top-(*S).base=(*S).stacksize) (*S).base=(SElemType *)realloc(*S).base,(*S).stacksize+STACKINCREMENT)*sizeof(SElemType); if(!(*S).base) exit(OVERFLOW);

9、(*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; *(*S).top)+=e; return OK;/构造图GStatus CreateGraph(ALGraph &G) int i,j,k; VertexType v1,v2; /顶点信息; ArcNode * p; /指向第一条依附某顶点的弧的指针; printf(请输入教学计划的课程数: ); scanf(%d,& G.vexnum); printf(请输入课程先修关系数(弧的数目): ); scanf(%d,& G.arcnum); printf(请输入

10、%d个课程的代表值(如:c01):n,G.vexnum); for(i=0;iG.vexnum;+i) scanf(%s,G.verticesi.data); G.verticesi.firstarc=NULL; printf(请输入%d个课程的学分值:n,(G).vexnum); for(i=0;iG.vexnum;+i ) scanf(%s,G.vertices2i.data); printf(请顺序输入每条弧的弧尾和弧头(以空格作为间隔):n); for(k=0;kadjvex = j; p-info = NULL; p-nextarc = G.verticesi.firstarc; G

11、.verticesi.firstarc = p; return OK;函数调用关系图:四、调试分析遇到的最大困难应该是算法的设计,因为平时学的比较死板,遇到这种设计作业就摸不着头脑。刚开始会就不停的复习栈,图,拓扑排序。但还是没有思路,翻阅了一些书籍,并在网上搜索了有关拓扑排序的算的大体思路,经过好几天的不断修改和调试,才完成了这个算法。设计的过程中还是存在很多问题。有时候程序运行到一半就自动闪退了,可能的是存储空间的问题,改了存储位置之后就好了。测试结果及分析:主界面设计输入需要输入的数据还算较多的,包括学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的

12、课程号。弧尾和弧头指的是先修关系。输入完所有的数据之后就会显示输出:因为有两种编排策略,程序运行一半后就会让用户选择策略,一是各个学期的学习负担平均,二是课程集中在前几个学期中。用户选择后,就会有相应的输出,之后可选择是否继续。结束程序:五、设计总结这次设计相对于我来说有点困难,需要查询很多资料,询问同学,巩固学过的知识,直到设计完成对数据结构也有了新的理解,虽然在这个设计上投入了很多,但也只能完成课题的基本要求,对于选做要求,我可能还要累计更多的知识和实践来完成。我觉得实践比理论要重要的多,在你学习到基本的知识后你不去试着编程,就像是纸上谈兵一样,没多大作用。我会尽量做好每个设计,减少程序中

13、常见的语法错误,逻辑错误,减少调试分析的次数,解决问题更加细心认真些。这个程序还是有不足的,界面看上去不太美观,可以设计的更简洁一些。要输入很多数据,而且分的步数也多输入的时候容易出错,我就是输入了好几遍才完成整个程序的运行,还是要求用户细心些六、源程序清单#include#include#include#include #include using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; typedef int

14、Boolean;#define MAX_NAME 10#define MAX_CLASS_NUM 100int Z=0;int X=0;int term_num,credit_lim,q=1;typedef int InfoType;typedef char VertexTypeMAX_NAME; #define MAX_VERTEX_NUM 100typedef enumDGGraphKind;typedef struct ArcNodeint adjvex;struct ArcNode * nextarc;InfoType * info;ArcNode;typedef structVert

15、exType data; ArcNode *firstarc; VNode, AdjListMAX_VERTEX_NUM;typedef structAdjList vertices,vertices2; int vexnum,arcnum;int kind;ALGraph;int LocateVex(ALGraph G,VertexType u)int i;for(i=0;iG.vexnum;+i)if(strcmp(u, G.verticesi.data)=0)return i;return -1;Status CreateGraph(ALGraph &G)int i,j,k;Vertex

16、Type v1,v2; ArcNode * p; printf(请输入教学计划的课程数: );scanf(%d,& G.vexnum);printf(请输入课程先修关系数(弧的数目): );scanf(%d,& G.arcnum);printf(请输入%d个课程的代表值(如:c01):n,G.vexnum);for(i=0;iG.vexnum;+i) scanf(%s,G.verticesi.data);G.verticesi.firstarc=NULL;printf(请输入%d个课程的学分值:n,(G).vexnum);for(i=0;iG.vexnum;+i) scanf(%s,G.ver

17、tices2i.data);printf(请顺序输入每条弧的弧尾和弧头(以空格作为间隔):n);for(k=0;kadjvex = j;p-info = NULL;p-nextarc = G.verticesi.firstarc;G.verticesi.firstarc = p;return OK;void Display(ALGraph G)int i;ArcNode * p;switch(G.kind)case DG: printf(有向图n);printf(%d个顶点:n,G.vexnum);for(i=0;iG.vexnum;+i)printf(%s ,G.verticesi.data

18、);printf(n%d条弧:n,G.arcnum);for(i=0;iadjvex.data);p=p-nextarc;printf(n);void FindInDegree(ALGraph G,int indegree)int i;ArcNode *p;for(i=0;iG.vexnum;i+)indegreei=0;for(i=0;iadjvex+;p=p-nextarc;typedef int SElemType;#define STACK_INIT_SIZE 10#define STACKINCREMENT 2typedef struct SqStackSElemType *base

19、;SElemType *top;int stacksize;SqStack;Status InitStack(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;return OK;void ClearStack(SqStack *S) S-top=S-base;Status StackEmpty(SqStack S)if(S.top=S.b

20、ase)return TRUE;elsereturn FALSE;Status Pop(SqStack *S,SElemType *e)if(*S).top=(*S).base)return ERROR;*e=*-(*S).top;return OK;Status Push(SqStack *S,SElemType e)if(*S).top-(*S).base=(*S).stacksize)(*S).base=(SElemType *)realloc(*S).base,(*S).stacksize+STACKINCREMENT)*sizeof(SElemType);if(!(*S).base)

21、exit(OVERFLOW);(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT;*(*S).top)+=e;return OK;Status zxf(ALGraph G) int z=0;for(int i=0; i G.vexnum; i+)z += atoi(G.vertices2i.data);return z;typedef int pathoneMAX_CLASS_NUM;typedef int pathtwoMAX_CLASS_NUM;Status TopologicalSort(ALGraph G)i

22、nt i,k,count,indegreeMAX_VERTEX_NUM;bool has = false;SqStack S;pathone a;pathtwo b;ArcNode * p;FindInDegree(G,indegree);InitStack(&S);for(i=0;inextarc)k=p-adjvex;if(!(-indegreek)Push(&S,k);if(countG.vexnum)printf(此有向图有回路n);return ERROR;elseprintf(为一个拓扑序列。nn);has=true;printf(请问您想使学生在各学期中的学习负担尽量均匀(输入1

23、)n);printf(还是想使课程尽可能地集中在前几个学期中(输入2)?n);int pattern;printf(请选择(1 or 2):);scanf(%d,&pattern);FindInDegree(G,indegree); ClearStack(&S);printf(=n);printf(教学计划如下:n);int xq = 1; int xfh; int now=0;int top = G.vexnum / term_num ; int pjxf = zxf(G) / term_num ; while(xq = term_num + 1)int result20; int m =

24、0;xfh = 0;now=0; for(i=0;iG.vexnum;+i)if(0 = indegreei)Push(&S,i);if(xq = term_num+1 & !StackEmpty(S)printf(还有课程未安排!n);while(!StackEmpty(S) & xq credit_lim)ClearStack(&S);break;if(pattern = 1)if(xq!=term_num/2&nowtop)ClearStack(&S); now = 0;break;if(pattern = 2)一(块)稻田 一(面)队旗 一(场)球赛 一(把)铜号if(xq!=1&xq

25、!=term_num/2&xq!=term_num/2-1&nowtop)母亲 着急 认真. 得意 主意 同意 因为 阳光 办法 亲情 爱情ClearStack(&S);(5)小荷才露尖尖角,早有蜻蜓(立上头)。now = 0;6、量词填空。break;10、用两个字组新字:(如课本133页)重轻 圆扁 东西 生死 胖瘦 头尾 宽窄 美丑 进出 臭香indegreei-; for(p=G.verticesi.firstarc; p; p=p-nextarc)k=p-adjvex;indegreek-;女字旁:奶、妈、姑、妹if(indegreek=0)足 足字旁(跳 跑) 亻单人旁(休 体 何)Push(&S,k);resultm=i;m+;if(xq = term_num)如:爱(爱人)(亲爱)(爱情)(可爱)(热爱)(友爱)printf(第%d个学期的课程为:,xq);(8)、( )像( )。for(int j=0; jm; j+)printf(课程%s ,G.verticesresultj.data);printf(n);xq+;ClearStack(&S);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1