学生成绩管理系统开发设计—大学毕业论文毕业设计范文模板参考资料_第1页
学生成绩管理系统开发设计—大学毕业论文毕业设计范文模板参考资料_第2页
学生成绩管理系统开发设计—大学毕业论文毕业设计范文模板参考资料_第3页
学生成绩管理系统开发设计—大学毕业论文毕业设计范文模板参考资料_第4页
学生成绩管理系统开发设计—大学毕业论文毕业设计范文模板参考资料_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录摘要3学生成绩管理系统4第一章概述41.1 开发前的准备41.2 开发设计的意义41.3 需求分析4第二章学生成绩管理系统概要设计52.1 开发方案52.2系统流程图52.3 系统功能图6第三章详细设计83.1 删除学生信息功能的实现83.2 修改学生信息功能的实现9第四章调试分析114.1系统运行主界面114.2 增加学生信息功能的实现114.3 删除学生信息功能的实现124.4 查询学生信息功能的实现134.5 修改学生信息功能的实现134.6 排序功能的实现14第五章程序设计结语155.1 系统存在的问题155.2 系统改进的方向155.3 此次课程设计的体会15猴子选大王16第一章

2、概述161.1 开发的目的161.2 开发设计的意义161.3 需求分析16第二章猴子选大王系统概要设计172.1系统流程图17第三章详细设计183.1系统的实现18第四章调试分析204.1系统运行主界面204.2系统运行结果21第五章程序设计结语225.1 此次课程设计的总结22迷宫求解23第一章概述231.1 开发的目的和意义231.2 需求分析23第二章迷宫求解系统概要设计242.1系统设计概要24第三章详细设计253.1系统的实现25第四章调试分析294.1系统运行界面29第五章程序设计结语305.1 此次课程设计的总结30图的遍历及拓扑排序31第一章概述311.1 开发设计的目的和意

3、义311.2 需求分析31第二章图的遍历及拓扑排序系统概要设计322.1系统流程图322.2功能模块图33第三章详细设计343.1 系统功能的实现34第四章调试分析384.1系统运行主界面384.2 系统运行结果38第五章程序设计结语405.1 此次课程设计的总结40参考文献42摘要随着社会的发展,人民生活水平的提高,人们对教育的重视程度也随之增加,越来越多的人走入高等学府,由此,各所学校的学生数量也日益增加。这使得学校对学生的管理难度逐渐增大。而管理好学生成绩是维护社会安定、提高教学质量、保证教学进度有条不紊进行的有力保障。由此可见,学生成绩管理是一项极其重要的工作;同时,学生成绩管理又是一

4、项极其庞大的工作。那么,如何管理学生成绩呢?由于计算机技术的迅速发展和普及,如果用计算机来管理学生成绩,则会使学生成绩的管理工作变得更轻松。介于这种需求,学生成绩管理系统便应运而生了。此次课程设计便是运用我们所学的知识试着设计一个学生成绩管理系统,使其实现一些简单的基本过程。经过分析,本系统以VC+6.0为开发工具,主要运用C语言进行编程。本系统实现了增添学生、删除学生、查找学生、修改学生信息以及排序、保存信息、读取信息、退出系统等功能。其操作简单易学、界面清晰明了易于理解;操作人员不需要有很高的专业知识,容易普及推广;运行比较稳定,比较适合现在大学校园对学生成绩的管理,能够有效提高成绩处理的

5、速度和准确度。另外还有猴子选大王系统可以解决日常生活中出现的选举问题;迷宫求解系统,可以供人们娱乐以及智力开发;图的遍历和拓扑排序系统,用来解决排序问题。关键词:成绩管理,VC+6.0,C语言,编程学生成绩管理系统第一章 概述1.1 开发前的准备在进行程序设计之前要熟练掌握数据结构以及C语言中的相关基础知识。根据我们日常生活中的经验,结合自己平时所接触到的本校学生成绩管理系统,做好需求分析,明确程序设计的具体要求。掌握VC+6.0的使用方法,准备计算机、VC+6.0等基本设备。为下一步具体开发设计做好充分的准备。1.2 开发设计的意义学生成绩管理系统可以提高学校管理部门工作人员的工作效率,减少

6、不必要的人力、物力和财力的支出;方便学校管理部门的工作人员全面地掌握学生成绩情况。使得学生成绩实现标准化和规范化的管理。此外,通过对“学生成绩管理系统”的学习和动手实践编写,可以使我们对数据结构的基础知识的理解更透彻;促进我们对C语言的理解与使用;提高我们对综合知识的运用能力,为今后从事项目开发积累经验。该课程设计还能够培养我们的实践动手能力,提高我们的学习兴趣,拓展我们的思维,加强我们查阅资料以及解决问题的能力,提高我们将老的思想运用到新事物上的能力。通过对此课题的开发,无论是理论知识还是动手能力,我们都会有不同程度上的提高。1.3 需求分析本次课程设计所编写的学生成绩管理系统,要实现增加学

7、生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出系统等功能。第二章 学生成绩管理系统概要设计2.1 开发方案在主函数中根据用户的选择运用switch结构来分别调用不同的自定义函数,从而实现特定的功能,电话薄中联系人的姓名和号码等信息则存放在结构体变量中,通过指针联系起来,形成链表结构。各自定义函数与主函数之间也通过头指针进行连接。当然,还要通过文件对学生成绩管理系统的数据进行保存。先写主函数,然后再依次编写各自定义函数,最后进行程序测试,写报告总结。2.2系统流程图n根据输入值调用各功能模块函数开始显示系统主界面各功能选项结束此学生成绩管理系统的总体设计思想流

8、程图如图2-1所示。运行程序,首先出现的是系统的主界面,显示系统的各项功能,增加学生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出。用户输入相应的选择,然后程序进入对应的功能模块。判断输入选择是否是18? y图2-1 系统简单流程图2.3 系统功能图根据要求,此学生成绩管理系统应该实现增加学生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出系统等功能。此学生成绩管理系统包括增加学生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出八个模块。其系统功能图如图2-2所示。其中的查询模块中实现按学号查询、

9、按姓名查询和退出功能,其功能图如图2-3所示。排序模块中实现按学号排序、按数据结构成绩排序、按语文成绩排序、按英语成绩排序、按总分排序和返回功能,其功能模块图如图2-4所示。学生成绩管理系统退出读取保存排序修改学生查询学生删除学生增加学生图2-2 学生成绩管理系统功能模块图查询学生信息按学号查询按姓名查询返回图2-3 查询学生信息功能图排序按总分排序按英语成绩排序返回按语文成绩排序按数据结构成绩排序按学号排序图2-4 排序模块功能图第三章 详细设计3.1 删除学生信息功能的实现(4)删除学生信息调用函数void Sub3Menu( ),调用该函数时先输出一个子菜单,若用户选择删除,则要求用户输

10、入要删除的学生的学号,并显示该学生的所有信息,删除数据后对未删除的数据进行一些调整。其功能实现流程图如图3-1所示。代码如下:void deleterecord(student stu,int i) /*删除信息*/ int j; while(i>=0) for(j=i;j<numstus;j+) stuj=stuj+1; numstus-; printf("删除成功!n"); void count(student stud) int i,j; for(i=0;i<numstus;i+) studi.index=1; for(j=0;j<numstu

11、s;j+) if(studj.score>studi.score) studi.index+; 结束是否删除开始输入要删除的学生学号查找到相应的学生信息 否 是将对应学生的信息删除图3-1删除学生信息功能的实现流程图3.2 修改学生信息功能的实现修改学生信息功能调用函数void Sub2Menu( ),调用该函数时先输出一个子菜单,要求用户选择,若用户选择修改,则要求用户输入要修改的学生的学号,并显示该学生的所有信息;,等用户修改后,显示出该学生新的信息。程序代码如下:oid xiugai() if(fp=fopen("s_score.txt","rb+&q

12、uot;)=NULL|(fp1=fopen("temp.txt","wb+")=NULL) /*检查是否出错*/ printf("Cannot open this file.n"); exit(0); printf("nPLease shuru xiugai xuehao:"); scanf("%d",&i); getchar(); while(fread(&data,sizeof(data),1,fp)=1) j=atoi(data.xuehao); if(j=i) print

13、f("xuehao:%snmingzi:%snnianling:%sn",data.xuehao,data.mingzi,data.nianling); printf("Please shuru mingzi:"); gets(data.mingzi); printf("Please shuru shuxue score:"); gets(temp);data.score0=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score

14、1=atof(temp); printf("Please input wuli score:"); gets(temp);data.score2=atof(temp); data.score3=data.score0+data.score1+data.score2; fwrite(&data,sizeof(data),1,fp1); fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/fseek(fp1,0L,0); while(fread(&data,sizeof(data),1,fp1)=1) fwrite(&data,siz

15、eof(data),1,fp); fclose(fp); fclose(fp1); 第四章 调试分析4.1系统运行主界面启动此学生成绩管理系统后,首先出现的是主窗口,如图4-1所示。显示系统的各项功能,用户可以根据需要输入相应的选择。 图4-1 主窗口运行界面4.2 增加学生信息功能的实现用户输入完学生的相应信息后,点击回车键,则会提示:输入成功,其运行界面如图4-2所示。成绩录入后将显示在主界面上。图4-2 增加学生信息运行界面4.3 删除学生信息功能的实现删除学生信息功能为用户提供了按学号删除,输入要删除的学号后,会提示用户是否删除该学生信息,输入y,才会删除学生信息,删除成功后都会有相应

16、的“删除成功”提示,删除学生信息的运行界面如图4-3所示。图4-3删除学生信息的运行界面4.4 查询学生信息功能的实现在查询学生信息功能中,系统为用户提供了两种查询方式,分别为按学号查询和按姓名查询。查询学生信息的运行界面如图4-4所示。图4-4查询学生信息的运行界面4.5 修改学生信息功能的实现用户输入要修改的学生的学号,然后输入修改后的学生的成绩,点击回车键后,则会提示“修改成功”,其运行界面如图4-5所示。图4-5 修改学生信息功能的运行界面4.6排序功能的实现在排序功能中,系统为用户提供了5种排序方式,分别为按学号排序、按数据结构成绩排序、按语文成绩排序、按英语成绩排序和按总分排序。其

17、运行界面如图4-6所示。图4-6排序功能运行的界面第五章 程序设计结语5.1 系统存在的问题由于本人经验不足,对VC+6.0软件的使用不精通,对C语言知识的学习不够透彻,所以,此次课程设计存在较多的不足之处。具体问题如下:(1)学生的个人信息不完善,如:缺少学生的个人课表、所在系、成绩、身高、体重、健康情况、祖籍等信息;(2)系统运行后,没有实现对不同的用户登录拥有不同的权限功能。 5.2 系统改进的方向介于上一节所述的种种不足,我认为系统改进的总体方向就是拟补以上的种种不足,然后在此基础上对系统进行优化。首先,完善学生的个人成绩;不同的用户登录也要有一定的权限限制;实现对已有学生成绩的定位;

18、把尚未完成的功能模块完成。最后,可以将该学生成绩管理系统做成网页版,供学生、学校管理人员以及访客以相应的身份登录该系统进行一系列的操作,进而可以将此系统推向各高等学府,辅助学校管理人员更好的管理在校学生。5.3 此次课程设计的体会此次课程设计主要运用了VC+6.0软件,编程所运用的语言是C语言。经过一周的编程实习,并在后一段的报告总结,我对数据结构这门科有新的认识,本人实在是获益不浅!要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。这次设计,让我重新掌握了数据结构,而且还得到了用数据结构解决实际问题的宝贵经验。通

19、过此次编程我也发现了自己在学习中的错误和不足,复习了以前学过的知识。同时也学到了一些没学过的知识,让我从中收益非浅,也为期末考试准备了一下!更重要的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法。猴子选大王第一章 概述1.1 开发的目的猴子选大王的问题,在现实社会中频频出现,此次系统开发的目的就是为了解决生活中出现的猴子选大王的问题。有时候,很多选举需要随机性,如何能够实现公平公正的选举?这就需要借助一个好的猴子选大王系统来实现。由此,猴子选大王系统就应运而生了。1.2 开发设计的意义现实社会中,需要选举的地方很多,然而选举中的人为操作使得选举失去了应有的意义。猴子选

20、大王系统的开发,可以帮助一些社会群体实现公平选举,避开暗箱操作。,通过对“猴子选大王”的学习和动手实践编写,可以使我们对数据结构的基础知识的理解更透彻;促进我们对C语言的理解与使用;提高我们对综合知识的运用能力,为今后从事项目开发积累经验。1.3 需求分析此猴子选大王系统只需实现对于不同数量的群体按照一定的规则进行逐个淘汰,最终获得选举结果,可以将参加选举者排好队,能够从不同的序号开始淘汰,从而达到随机选举的目的。第二章 猴子选大王系统概要设计2.1系统流程图此猴子选大王系统的总体设计思想流程图如图2-1所示。运行程序后,首先出现系统的主界面,提示用户输入猴子的总数,按回车键,然后提示用户输入

21、从第几个猴子开始淘汰,按回车键执行程序,然后得到猴子的大王是第几号。开始输入猴子的总数输入从第几个猴子开始得到猴子大王结束 图2-1 系统简单流程图第三章 详细设计3.1系统的实现由于此系统数据元素不可须知,同时对于报完一次之后对于下一次的报数,由于已经排除了一部分猴子,猴子的顺序被打乱,所以需要使用链表。链表是动态的,可以在需要的时候增长和减少其长度,而静态数据结构数组是在编译时分派内存的,其大小是不可改变的,而且会出现内存浪费的情况。我认为单循环链表能很好的解决这个问题,在建立单循环链表时,因为链表的大小由输入决定,因为与匹配的节点数也是变化的,所以要进行动态内存分配。假设猴子的个数是N,

22、M是要淘汰的编号,那么建立一个N长的链表,链表最后一个元素的nextPtr指针指向第一个元素,这样就形成一个循环链表,而链表的数据域存储的就是猴子的编号。程序代码如下:#include<stdio.h>#include<malloc.h>struct Nodeint data;struct Node *next;/建立一个节点结构体int main()struct Node *head, *s, *q, *t;int n, m, count=0, i;printf("*猴子选大王*n");printf("n*请输入猴子的总数: "

23、);scanf("%d",&m);printf("n*请输入从第几个猴子开始: ");scanf("%d",&n);for(i=0; i<m; i+) s=(struct Node *)malloc(sizeof(struct Node);s->data=i+1;s->next=NULL; if(i=0) head=s; q=head; else q->next=s; q=q->next; /建立一个不带头结点的单链表q->next=head;/这里,将单链表组成环状,形成循环单链表

24、printf("before:");q=head; while(q->next!=head)printf("%d ",q->data); q=q->next; /依次输出节点的值printf("%d ",q->data);q=head; printf(" "); do count+;/计数器开始计数 if(count=n-1) t=q->next;q->next=t->next;/到n前面那个节点stop,然后删除第n个节点count=0;/计数器复位printf(&quo

25、t;%d ", t->data);/输出被淘汰的猴子的号码 free(t);/释放内存,防止内存泄露 q=q->next; while(q->next!=q);/这句是关键,就是循环到只剩下一个节点了,如果说有难度的话应该是理解的难点了printf("n*猴子的大王是第 %d 号*n",q->data);/输出king的号码大王是输入猴子的数目 输入数字第四章 调试分析4.1系统运行主界面启动此猴子选大王系统后,首先出现的是主窗口,如图4-1所示。提示用户输入猴子的总数。图4-1 主窗口运行界面4.2系统运行结果当用户输入相应的猴子总数,并

26、输入从第几个猴子开始后,按下回车键,系统则的到运行的结果,即选择出猴子的大王。程序运行结果如图4-2所示。图4-2系统运行结果图第五章 程序设计结语5.1 此次课程设计的总结猴子选大王是一个数据结构很古老很经典的问题,融知识性和娱乐性为一体,能让人产生较大兴趣,因此编写程序实现之是一件很有意义的事。在课程设计中,首先要看清问题,将问题要求理解透彻,在构思要如何实现,要用到哪些函数,要用什么算法,在课程构思中选算法是一个很重要的概念,只有确定用这么算法后才能接下来的工作,将流程图画在纸上,再依次编写代码,在程序设计中,编写代码只是一个方面,调试才是关键。它是一个相当繁琐的过程,有许多新的问题需要

27、被解决,但同时它也是一个比较重要的过程,因为在程序调试过程中,你会学到很多新的东西,从而增加你编程的经验。 在设计一元多项式算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算。迷宫求解第一章 概述1.1 开发的目的和意义迷宫问题要求寻找一条从入口到出口的路径。即从入口出发,顺

28、着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路,通常用的是“穷举求解”的方法。为了保证在任何位置上都能原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求解迷宫通路的算法中要应用“栈”的思想。对于栈的内容在整个学期的学习中我也有了一定的了解。1.2需求分析本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路

29、退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中要应用“栈”的思想假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序 。第二章 迷宫求解系统概要设计2.1系统设计概要从入口出发,按某一方向向前探索,若能走通并且未走过,即某处可以到达,则到达新点,否则试探下一个方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到找到一条通路,或无路可走又返回入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确

30、返回前一点以便继续从下一个方向向前试探,则需要用一个栈(递归不需要)保存所能够到达的每一点的下标及从该点前进的方向。设迷宫为m行n列,利用mazemn来表示一个迷宫,mazeij=0或1;其中:0表示通路,1表示不通,当从某点向下试探时,中间点有四个方向可以试探,而四个角点有两个方向,其他边缘点有三个方向,为使问题简单化,用mazem+2n+2来表示迷宫,而迷宫的四周的值全部为1,这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个。迷宫栈的实现函数mazepath()迷宫递归的实现函数path()为了防止重复达到某点,以避免发生死循环,每次达到了某点(i,j)后,改

31、变mazeij的值,迷宫栈的实现直接置-1,算法结束前恢复原迷宫;而迷宫递归是将当前值置为已走的步骤,这样输出时对走过的路更显而易见。栈的函数设计:栈的初始化函数 Init_SeqStack()判栈空 Empty_SeqStack()入栈函数 Push_SeqStack()出栈函数 Pop_SeqStack()取栈顶函数 GetTop_SeqStack()销毁栈 Destroy_SeqStack()第三章 详细设计3.1系统的实现在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x,y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到。因为出口在(m,n),因此试探顺序规定

32、为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便求出新点的坐标,将从正东开始沿顺时针进行的4个方向的坐标增量放在一个结构数组move4中,在move数组中,每个元素有两个域组成,x为横坐标增量,y为纵坐标增量。这样对move设计会很方便地求出从某点(x,y)按某一方向v(0<=v<=3)到达的新点(i,j)的坐标:i=x+movev.x;j=y+movev.y;当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向。栈中元素是一个由行、列、方向组成。具体结构定义如

33、下:#include <stdio.h> #include <stdlib.h> #define MaxSize 100 #define StackIncrement 10 struct Seat /定义坐标结构体 int x; int y; ; typedef struct /定义入栈信息元素类型 int ord; Seat seat; int di; SElemType; struct Stack /定义栈元素类型 SElemType *base; SElemType *top; int StackLength; ; Stack S; bool Map1010=0,

34、0,1,1,0,1,1,1,0,1,0, 0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,0,0,0,1,1,1,1,0, 0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,1,0, 0,0,1,1,1,1,1,1,1,0,0; bool is_through1010=0; bool InitStack(Stack &S) /构建一个栈 S.base=S.top=(SElemType*)malloc(MaxSize*sizeof(SElemType); if(!S.base) retu

35、rn false; S.StackLength=MaxSize; return true; bool Push(Stack &S,SElemType e) / 将信息e入栈 if(S.top-S.base)/sizeof(SElemType)=S.StackLength) S.base=(SElemType*)realloc(S.base,(S.StackLength+StackIncrement)*sizeof(SElemType); S.top=S.base+S.StackLength; S.StackLength += StackIncrement; S.top->di=e

36、.di; S.top->ord=e.ord; S.top->seat.x=e.seat.x; S.top->seat.y=e.seat.y; S.top+; return true; bool Pop(Stack &S,SElemType &e) /将栈顶元素取出,赋值给e if(S.base=S.top) return false; S.top-; e.di=S.top->di; e.ord=S.top->ord; e.seat.x=S.top->seat.x; e.seat.y=S.top->seat.y; return true;

37、 bool StackEmpty(Stack s) /判断栈是否为空 return !(s.top-s.base); bool Pass(Seat s) /判断当前位置是否通 return Maps.xs.y; bool FootPrint(Seat s) / 在此位置留下标记,表示已经经过 is_throughs.xs.y=true; return true; Seat NextPos(Seat s,int i) / 将当前位置指向逻辑上的下个位置,指向的方向由i确定 Seat ss; if(i=1) ss.x=s.x+1; ss.y=s.y; else if(i=2) ss.x=s.x;

38、ss.y=s.y+1; else if(i=3) ss.x=s.x-1; ss.y=s.y; else ss.x=s.x; ss.y=s.y+1; return ss; bool MazePath(Seat start,Seat end) InitStack(S); /创建栈并且初始化 Seat curpos; curpos.x=start.x; curpos.y=start.y; /设定当前位置为入口地址 int curstep=1; / 探索第一步 do if(Pass(curpos)&&!is_throughcurpos.xcurpos.y) /当前位置通且没有来过 Fo

39、otPrint(curpos); / 留下痕迹 SElemType e; / 构建入栈信息 e.di=1; e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y; Push(S,e); / 加入路径 if(curpos.x=end.x)&&(curpos.y=end.y) / 到达终点 return true; curpos=NextPos(curpos,1); / 探索下一步 curstep+; else / 当前位置不通,将前面一个位置取出,改由其他方向在判断 SElemType e; if(!StackEmpty(S) P

40、op(S,e); while(e.di=4&&!StackEmpty(S) FootPrint(e.seat); Pop(S,e); / 如果这个位置的其他四个方向都不满足,表示这个位置不可取,取出栈并且留下标识 if(e.di<4) / 如果其他方向还没有探索完,继续探索下一个方向 e.di+; Push(S,e); curpos=NextPos(e.seat,e.di); while(!StackEmpty(S); return false; int main() int i,j; Seat sta,end; sta.x=1; sta.y=1; end.x=8; en

41、d.y=8; MazePath(sta,end); SElemType *b=S.base; printf("迷宫地图为(1表示通,0表示不通):n"); for(i=0;i<10;i+) for(j=0;j<10;j+) printf("%d ",Mapij); printf("n"); printf("迷宫路径为:"); while(b!=S.top) printf("(%d,%d) -> ",b->seat.x,b->seat.y); +b; printf(&

42、quot;出口n"); scanf("%d",i);return 0; 第四章 调试分析4.1系统运行界面系统运行后,其运行界面如图4-1所示。图4-1迷宫求解系统运行图第五章 程序设计结语5.1 此次课程设计的总结本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。 首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,通过这次数据结构课程设计,让我学到了好多东西。在实际操作过程中犯了一些错误却让我有了意外的收获,所学数据结构理论知识得到了巩固。通过实际操作,学会数据结构程序编程的基本步骤、基本方法,开发了自己的逻辑思维

43、能力,培养了分析问题、解决问题的能力。现在终于挨到了写收获与体会的时候了,的确令人兴奋,看看自己的劳动成果,好开心。上网查资料、去图书馆查,查相关的函数,经过两三天的努力,我把框架弄出来了,可是还有计算难题摆在我的面前,真的是个难题,自从把框架弄好了以后就没有进展了,眼看一个星期快过去了,我那个急啊,可是急也没有用。我坚持,终于工夫不负有心人,我参照类似程序,改改和添添,终于大功告成,我们欢呼我们雀跃,终于相信我们自己是足够的伟大。图的遍历及拓扑排序第一章 概述1.1 开发设计的目的和意义本课设题目要求编写算法能够建立有向无环图,有向无环图,能够求解该有向无环图的拓扑排序并输出来,输出除拓扑排

44、序数据外,还要输出邻接表数据。为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。拓扑排序可以应用于教学计划的安排,根据课程之间的依赖关系,制定课程安排计划。按照用户输入的课程数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出符合拓扑排序的课程安排计划。1.2需求分析该系统的功能应能够实现图的遍历以及拓扑排序,具体分析如下:1.将图以合适的方式存储起来。图有多种存储方式,其中最常用的存储方式有图的邻接矩阵和邻接表。本人在构思时使用邻接表来建立有向无环图,将其存储起来。2.求解该有向无环图的拓扑排序,并将其输出出来。若通过构造,建立了一个有向无

45、环图,那么一定可以求出其拓扑排序,其原理比较简单。即统计每个节点的入度,将入度为0的结点提取出来,然后再统计剩下的结点的入度,再次将入度为零的结点提取出来,以此类推,这样就形成了一个序列,这样的序列就是该图的拓扑排序序列。3.拓扑排序算法应能够处理出现环的情况。个人在写程序时,考虑到构造图时,会有构造成有向有环图的情况,应该在运行程序时,提醒出来,然后重新输入有向无环图,知道输入正确为止。这样就有多次构造邻接表的问题,每一次构造邻接表时,都应该将原来错误的(不是无环图的)邻接表空间释放掉,否则,会变得混乱。4.输出除拓扑排序外,还要求输出邻接表数据。由于图是用邻接表存储的,所以很容易将其邻接表

46、输出来。第二章 图的遍历及拓扑排序系统概要设计2.1系统流程图根据程序的总的步骤,拟将整个流程分为三个模块。三个模块既相互独立又相互联系。具体分析如下:1. 图像输入,根据题目要求,要能够建立一个有向无环图,这就要我们在程序中去建立。考虑到输入方式要尽量方便全面,采用输入弧的方式,输入每条弧的链接的两个结点,当输入-1时结束输入。这样再输入的时候,与相邻的两个结点的邻接矩阵对应的位置也做相应改变。2. 判断图是不是有向无环图。当图为有向无环图时,则挑选完毕后,队列应该是满的,进行后续步骤。对于结点入队列的顺序,需要借助于visited数组。选取入度为零的结点,入队列,调整visited数组,循

47、环进行。若队列不满,则输入的图不符合要求,应该重新输入。在程序中应做适当提醒,然后自动转模块1.,进行图的重新编辑。3. 拓扑排序。此时,所输入的弧应该是有向无环图了,下面进行拓扑排序。在判断它是否为无环图的过程中已经形成了一个满队列。接下来所要做的事情就是循环出队列,按照队列固有的顺序进行输出即可,排序完成。系统的流程图如图2-1所示。开始图形输入构造邻接表并输出 否无环图入度为零入队列调整visited 是满队列 否循环出队列 是结束图2-1系统流程图2.2功能模块图系统的功能模块图如图2-2所示.包括图的遍历和拓扑排序两部分,图的遍历中若是有环图则遍历全部,若是无环图则无法遍历;拓扑排序

48、模块则实现拓扑排序功能。系统拓扑排序图的遍历有环图遍历全部无环图无法遍历入度为零入队输出队列图2-2系统功能图第三章 详细设计3.1 系统功能的实现本程序的拓扑排序,必须在图的邻接表已知的情况下。它还有另外一个功能:判断一个图是不是无环图。确切的说,不能单纯的叫拓扑排序,但考虑它主要的作用,在不引起误解的情况下就叫拓扑排序算法。判断一个图是否为有向无环图并进行拓扑排序,判定方法有很多种,检查一个有向图是否存在环要比无向图复杂。对于无向图来说,若深度优先遍历过程中遇到回边(即指向已访问过的顶点的边),则必存在环;而对于有向图来说,这条回边有可能指向深度优先森林中另一棵生成树上顶点的弧。但是,如果

49、从有向图上某个顶点出发的遍历,在dfs(v)结束之前出现一条从顶点u到顶点v的回边,由于在生成树上是的子孙,则有向图中必定存在包含顶点v和u的环。另一种判断是否有环的方法则显得简单的多,尤其是对于本题目来说,由于本题要求是对有向无环图进行拓扑排序,其主要方法是将入度为零的结点依次输出来,知道图的所有定点全部输出为止。那么若图为有环图,在环上的结点在其他结点都选择出来后,入度都不为零,即无法被输出出来。那么就可以认为按照拓扑排序的方法输出结点后,若不是将节点全部输出出来的,则此图为有环图。判断好图是否为有向图后,考虑到题目要求,要能够处理出现环的情况,若构造的图为有环图,则折回开始重新输入图的数

50、据,重新构造图,直到该图为无环图为止。若图已经是无环图,则进行拓扑排序,排序方法前面已经讲过,在此主要诉说用到的辅助存储。数组visited存储各结点的入度,对入度为零的结点,依次入队列queue,调整visited数组,结点全部入队列后,然后依次出队列,拓扑排序完成。实现功能的程序代码如下:#include<iostream.h>typedef int elemtype;const MAX=100; bool visitedMAX;class link public:elemtype data; link *next; class node public:link aMAX;vo

51、id creatlink3(node &g ,int n,int e);void bfs2(node g,int i); void dfs1(node g,int i); void topsort (node &g,int n ); ;void node:creatlink3( node &g,int n,int e) /建立带入度的邻接表 int i,j,k ; link *s ;for(i=1; i<=n;i+) /建立邻接表头结点 g.ai.data=0; /入度值为0 g.ai.next=NULL; for(k=1; k<=e;k+) cout<<"请输入一条弧:" cin>>i>>j ; /输入一条弧 <i,j> cout<<endl;s=new link; /申请一个动态存储单元s->data=j ;s->next=g.ai.next ;g.ai.next=s ;g.aj.data+; /入度加1void node:topsort (node &g,int n ) /拓扑排序int top=0,m=0;for (int i=1;i<=n;i+) /入度为0的顶点进栈if (g.ai.data=0) g.ai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论