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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

教学计划编制数据结构课程设计报告Word文档下载推荐.docx

1、14六 附录16七 参考文献23一、需求分析1、设计任务问题描述大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。实现提示输入参数应包括:学期总数,一学期的学分上限,每门课的课程号(可以是固定占3位的字母数字串)、学分和直接先修课的课程号。应允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中

2、在前几个学期中。若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式可以自己设计。可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。2、功能模块图CreateGraph():构造图 InitStack():构造一个空栈 StackEmpty():判断是否为空栈 Push():入栈Pop():出栈 FindInDegree():求顶点的入度TopologicalSort():输出G顶点的拓扑排序结果3、流程图(具体流程图见详细设计伪码流程)主程序构造图GreateGraph ( )拓扑排序To

3、pologicalSort开始结束4、目标测试正确测试:错误测试:二、详细设计1、运行环境:(1)WINDOWS 7系统(2)C-Free 5.02、开发工具: C语言3、涉及知识点:(1)栈。用到有关栈的操作有初始化栈、判断栈是否为空、入栈和出栈。其中栈主要用来存放入度为零的顶点,即当前无先修关系可以编排的课程。(2)图。用到有关图的操作有创建图、统计图中各顶点的入度。利用邻接表作为有向图的存储结构,且在头结点中增加一个存放顶点入度的数组(indegree)。入度为零的顶点即为没有前驱的顶点,删除顶点及以它为尾的弧的操作,则可换以弧头顶点入度减一来实现。(3)拓扑排序。 (a)在有向图中选一

4、个没有前驱的顶点且输出之。 (b)从图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止,后一种情况则说明有向图中存在环。4、数据结构定义及基本操作A.所用存储结构及宏定义:#define MAX_VERTEX_NUM 100 /最大课程总数#define STACK_INIT_SIZE 100 /存储空间的初始分配量#define STACKINCREMENT 10 /存储空间的分配增量/图的邻接表存储表示typedef struct ArcNode int adjvex;/该弧所指向顶点的位置 struct ArcNode *nextar

5、c;/指向下一条弧的指针ArcNode;typedef struct VNode char name24;/课程名 int classid; /课程号 int credit;/课程的学分 int indegree;/该结点的入度 int state;/该节点的状态,1代表已学,0代表未学 ArcNode *firstarc; /指向第一条依附该顶点的弧的指针VNode,AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices;/顶点向量 int vexnum,arcnum;/图的当前顶点数和弧数ALGraph;typedef int ElemT

6、ype;/栈的顺序存储表示typedef struct /栈 ElemType *base; ElemType *top; int stacksize;SqStack;B.程序中各函数的简要说明:(1)void CreatGraph(ALGraph &G)构建图。先输入各顶点(课程)的信息,包括课程名、课程号、课程学分。再输入弧信息(先修关系),将弧中顶点赋为弧尾,相应入度加1.最后输出构建好的邻接表。(2)void InitStack(SqStack &S)构造空栈int StackEmpty(SqStack &S)判断是否为空栈void Push(SqStack &S,int e)入栈 i

7、nt Pop(SqStack &S, int *e)出栈(3)void FindInDegree(ALGraph G, int indegree)求图中各节点的入度。从每个节点的第一条依附于该节点的弧出发,将该节点对应的入度加1,接着指向下一条弧执行同样的操作,直至指针为空。(3)void TopologicalSort_1(ALGraph G,int numterm,int uplcredit)按课程尽可能集中到前几个学期进行编排。当每个学期的学分总数不超过学分上限时,在有向图中选一个没有前驱的顶点(课程)且输出之。从图中删除该顶点(课程)和所有以它为尾的弧。当某学期的学分已满时,进入下一学

8、期的编排。重复上述几步,直至全部顶点(课程)均已输出,或者当前图中不存在无前驱的顶点(课程)为止,后一种情况则说明有向图中存在环。(4)void TopologicalSort_2(ALGraph G,int numterm,int uplcredit)按课程尽量均匀分布编排。当每个学期的学分总数不超过学分上限且课程数不超过课程数上限时,在有向图中选一个没有前驱的顶点(课程)且输出之。当某学期的学分已满或课程数已满时,进入下一学期的编排。(5)int main()主函数。在主函数中输出交互界面,要求用户输入各项信息。调用CreateGraph函数创建图,之后根据用户选择调用Topologica

9、lSort_1或者TopologicalSort_2函数进行拓扑排序并输出编排结果,写入文件中。5、函数调用关系图Main函数GreateGraph ( )TopologicalSort_1或TopologicalSort _2FILE *fpFindInDegree ( )InitStack ( )Push ( )Pop ( )StackEmpty ( )6、伪码流程G) (2)void FindInDegree(ALGraph G, int 构造图 indegree)求图中各节点的入度(4)void TopologicalSort_1 (5)void TopologicalSort_2 (

10、ALGraph G,int numterm, (ALGraph G,int numterm, int uplcredit) int uplcredit)有向图G采用邻接表存储结构 有向图G采用邻接表存储结构(6)Main主函数三、调试分析1、调试过程中遇到的问题与解决方法我在实验过程中遇到的最大难题是两个课程排序算法的编写。刚开始的时候没有任何的思路,书上、网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。经过三天的修改,终于写出了符合要求的排序算法。在设计过程中,我的程序有不少漏洞,例如在选择一次

11、编排后,按任意键就会退出,不可以继续选择编排策略,经过一系列的修改,成功地将程序添加选择是否继续的功能。2、算法的时空分析对有n个顶点和e条弧的有向图而言,将建立求各顶点的入度的时间复杂度为O(e);建立入度定点栈的时间复杂度为O(n),在拓扑排序过程中,若有向图无环,则每个顶点进一次栈,出一次栈,入度减1的操作在while语句中总共执行e次,所以,总的时间复杂度为O(n+e)。3、改进思想A.程序界面有很大的改进空间,可设计更简洁美观的界面。B.输入数据比较繁琐,分步太多,可编写程序进行改善,如一步输入课程名、课程号、学分。C.课程号为01,02等形式,也可改为C1、C2的形式。4、经验体会

12、在这次课设中,我进行了大量的资料查阅,包括上网查询和求助老师同学,对所学知识进行复习。通过这些努力,我对数据结构这门课程有了新的认识,对编程的步骤,有了具体的体会。更重要的是,这个课题完全脱离于只限于书本上的问题,多用在实际生活当中,让我对计算机行业,充满了信心和自豪。以往我们学的计算机知识一般停留在理论上,这让我们不太理解计算机的应用和前景,而较少注重我们对算法的实践锻炼。而这一次的实习既需要我们去联系理论,又需要我们去实践方法,很多东西看上去都学过,但是和实际联系才知道变通的艰难。书上得来的并不是一切,大多还是需要在其它方面去吸收的,这是我这次课设的最大收获。这次的实验让我们知道该如何跨过

13、实际和理论之间的鸿沟。四、用户手册1、 按照提示输入各个数据(如下图):包括:学期总数,一学期的学分上限,编排课程总数,每门课的课程名、课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。课程名课程号学分先修关系程序设计基础01无离散数学023数据结构0301,02汇编语言04语言的设计和分析0503,04计算机原理06编译原理0705,03操作系统0803,06高等数学097线性代数10普通物理数值分析1209,10,01先修顺序有向图:0112、屏幕上会显示您输入的数据,确认无误后选择方案(如下图):3、选择方案后会进行计算并输出,之后可根据需要选择是否继续(如下图):五、测试结果

14、1、输入2、输出策略1:bianpai1.txt策略2:bianpai2.txt六、附录源程序清单及其说明如下:#include stdio.hmalloc.h#define STACKINCREMENT 10 /存储空间的分配增量void CreateGraph(ALGraph &G)/构建图 int i, m, n; ArcNode *p; printf(请输入需要编排课程总数:); scanf(%d,&G.vexnum); for( i=1;i=G.vexnum;i+) printf(n请输入课程名: scanf(%sG.verticesi.name);n请输入课程号:G.vertice

15、si.classid);n请输入该课程的学分:G.verticesi.credit); G.verticesi.indegree=0; G.vertices i.state=0;/NOTSTUDY G.verticesi.firstarc=NULL; 请输入课程先修关系总数:G.arcnum);请顺序输入每个课程先修关系(先修课程在前并以逗号作为间隔):n for (i = 1; i = G.arcnum; i+)n请输入存在先修关系的两个课程的序号:%d,%dn,&m); while (nG.vexnum|mG.vexnum) printf(输入的顶点序号不正确请重新输入: scanf( p

16、 = (ArcNode*)malloc(sizeof(ArcNode); if (p = NULL)memory allocation failed,goodbey return; p-adjvex = m;nextarc=G.verticesn.firstarc; G.verticesn.firstarc = p;n建立的邻接表为:/输出建立好的邻接表 for(i=1;%d:-,G.verticesi.classid); for(p=G.verticesi.firstarc;p!=NULL;p=p-nextarc)%d-,p-adjvex);NULLvoid InitStack(SqStac

17、k &S) S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int); if (!S.base) ERROR return; S.top=S.base; S.stacksize=STACK_INIT_SIZE; if(S.top=S.base) return 1; else return 0;S,int e) if(S.top-S.base=S.stacksize) S.base=(int*)realloc(S.base,(S.stacksize+10)*sizeof(int); if(! S.top=S.base+S.stacksize; S.stac

18、ksize+=10; *S.top+=e;int Pop(SqStack &S, int *e) *e=*-S.top; return 0;void FindInDegree(ALGraph G, int indegree)/求图中各节点的入度 int i;= G.vexnum; indegreei = 0; while (G.verticesi.firstarc) indegreeG.verticesi.firstarc-adjvex+; G.verticesi.firstarc = G.verticesi.firstarc-nextarc;void TopologicalSort_1(AL

19、Graph G,int numterm,int uplcredit) FILE *fp; fp=fopen(bianpai1.txt,w struct ArcNode *p; SqStack S; int indegreeMAX_VERTEX_NUM;/存放各节点的入度 int i,j,k; int count; /课程编括排数目计数器 int sumcredit;/每个学期的课程学分累加器 FindInDegree(G,indegree); G.verticesi.indegree=indegreei; InitStack(S); count=0; k=0; while(count!=G.vexnum & k=numterm) sumcredit=0; for(i=1;i+) if(G.verticesi.indegree=0)&(G.verticesi.state=0)/入度为零的节点入栈,即无先修的课程入栈 Push(S,i); G.verticesi.state =1;/避免入度为零节点重复入栈 if(!StackEmpty(S)&(sumcredit=uplcredit) k= k+1; printf(第%d个学期学得课程有:,k);

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

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