




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 系统改进的方向
2、155.3 此次课程设计的体会 15猴子选大王 16第一章 概述 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.
3、1 系统运行界面 29第五章 程序设计结语 305.1 此次课程设计的总结 30图的遍历及拓扑排序 31第一章 概述 311.1 开发设计的目的和意义 311.2 需求分析 31第二章 图的遍历及拓扑排序系统概要设计 322.1 系统流程图 322.2 功能模块图 33第三章 详细设计 343.1 系统功能的实现 34第四章 调试分析 384.1 系统运行主界面 384.2 系统运行结果 38第五章 程序设计结语 405.1 此次课程设计的总结 40参考文献 4141摘要随着社会的发展,人民生活水平的提高,人们对教育的重视程度也随之增加,越来 越多的人走入高等学府,由此,各所学校的学生数量也日
4、益增加。这使得学校对学生的 管理难度逐渐增大。而管理好学生成绩是维护社会安定、提高教学质量、保证教学进度 有条不紊进行的有力保障。由此可见,学生成绩管理是一项极其重要的工作;同时,学 生成绩管理又是一项极其庞大的工作。那么,如何管理学生成绩呢?由于计算机技术的迅速发展和普及,如果用计算机来管理学生成绩,则会使学生成 绩的管理工作变得更轻松。介于这种需求,学生成绩管理系统便应运而生了。此次课程 设计便是运用我们所学的知识试着设计一个学生成绩管理系统, 使其实现一些简单的基 本过程。经过分析,本系统以VC+6.0为开发工具,主要运用C语言进行编程。本系统实现了增添学生、删除学生、查找学生、修改学生
5、信息以及排序、保存信息、读取信息、退 出系统等功能。其操作简单易学、界面清晰明了易于理解;操作人员不需要有很高的专 业知识,容易普及推广;运行比较稳定,比较适合现在大学校园对学生成绩的管理,能 够有效提高成绩处理的速度和准确度。另外还有猴子选大王系统可以解决日常生活中出现的选举问题;迷宫求解系统,可 以供人们娱乐以及智力开发;图的遍历和拓扑排序系统,用来解决排序问题。关键词:成绩管理,VC+6.0, C语言,编程学生成绩管理系统第一章 概述1.1 开发前的准备在进行程序设计之前要熟练掌握数据结构以及 C 语言中的相关基础知识。 根据我们日常生活中的经验,结合自己平时所接触到的本校学生成绩管理系
6、统,做好需 求分析,明确程序设计的具体要求。掌握 VC+6.0 的使用方法,准备计算机、 VC+6.0 等基本设备。为下一步具体开发设计做好充分的准备。1.2 开发设计的意义学生成绩管理系统可以提高学校管理部门工作人员的工作效率,减少不必要的 人力、物力和财力的支出;方便学校管理部门的工作人员全面地掌握学生成绩情况。使 得学生成绩实现标准化和规范化的管理。此外,通过对“学生成绩管理系统”的学习和 动手实践编写,可以使我们对数据结构的基础知识的理解更透彻;促进我们对C语言的理解与使用;提高我们对综合知识的运用能力,为今后从事项目开发积累经验。该课程设计还能够培养我们的实践动手能力,提高我们的学习
7、兴趣,拓展我们的思 维,加强我们查阅资料以及解决问题的能力,提高我们将老的思想运用到新事物上的能 力。通过对此课题的开发,无论是理论知识还是动手能力,我们都会有不同程度上的提1.3 需求分析本次课程设计所编写的学生成绩管理系统,要实现增加学生信息、删除学生信息、 查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出系统 等功能。第二章学生成绩管理系统概要设计2.1开发方案在主函数中根据用户的选择运用 switch结构来分别调用不同的自定义函数,从而 实现特定的功能,电话薄中联系人的姓名和号码等信息则存放在结构体变量中,通过指 针联系起来,形成链表结构。各自定义函数与主函数之间也通过头指
8、针进行连接。当然,还要通过文件对学生成绩管理系统的数据进行保存。先写主函数,然后再依次编写各自 定义函数,最后进行程序测试,写报告总结。2.2系统流程图此学生成绩管理系统的总体设计思想流程图如图2-1所示。运行程序,首先出现的是系统的主界面,显示系统的各项功能,增加学生信息、删除学生信息、查询学生信 息、修改学生信息以及排序、保存信息、读取信息、退出。用户输入相应的选择,然后 程序进入对应的功能模块。图2-1系统简单流程图2.3系统功能图根据要求,此学生成绩管理系统应该实现增加学生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出系统等功能。此学生成绩管理系统包括
9、增加学生信息、删除学生信息、查询学生信息、修改学生信息以及排序、保存信息、读取信息、退出八个模块。其系统功能图如图2-2所示。其中的查询模块中实现按学号查询、按姓名查询和退出功能,其功能图如图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 nu mstus;j+)stuj=stuj+1;nu mstus-;printf(” 删除成功!n); void coun t(stude nt stud) int i,j;for(i=0;i nu mstus;i+)studi.i ndex=1;for(j=0;jstudi.score)studi.i ndex+; 输入要删除的学生学号查找到相应
11、的学生信息将对应学生的信息删除结束 :图3-1删除学生信息功能的实现流程图3.2修改学生信息功能的实现修改学生信息功能调用函数void Sub2Menu(),调用该函数时先输出一个子菜单,要求 用户选择,若用户选择修改,则要求用户输入要修改的学生的学号,并显示该学生的所 有信息;,等用户修改后,显示出该学生新的信息。程序代码如下:oid xiugai()if(fp=fopen(s_score.txt,rb+)=NULL|(fp 1=fopen(temp.txt,wb+)=NULL) /*检查是否出错 */prin tf(Ca nnot ope n this file. n);exit(0);p
12、rin tf(nPLease shuru xiugai xuehao:);scan f(%d,&i); getchar();while(fread(&data,sizeof(data),1,fp)=1)j=atoi(data.xuehao);if(j=i)printf(xuehao:%snmingzi:%snnianling:%sn,data.xuehao,data.mingzi,data.nianling); printf(Please shuru mingzi:);gets(data.mingzi);printf(Please shuru shuxue score:); gets(temp
13、);data.score0=atof(temp);printf(Please input yingyu score:);gets(temp);data.score1=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)
14、;while(fread(&data,sizeof(data),1,fp1)=1)fwrite(&data,sizeof(data),1,fp);fclose(fp);fclose(fp1);第四章调试分析4.1系统运行主界面启动此学生成绩管理系统后,首先出现的是主窗口,如图4-1所示。显示系统的各项功能,用户可以根据需要输入相应的选择图4-1主窗口运行界面4.2增加学生信息功能的实现用户输入完学生的相应信息后,点击回车键,则会提示:输入成功,其运行界面如 图4-2所示。成绩录入后将显示在主界面上。图4-2增加学生信息运行界面4.3删除学生信息功能的实现删除学生信息功能为用户提供了按学号删除,
15、输入要删除的学号后,会提示用户是 否删除该学生信息,输入y,才会删除学生信息,删除成功后都会有相应的“删除成功” 提示,删除学生信息的运行界面如图 4-3所示。匕Q Ci DocuMiif and Se :貝貝贺餐SMMEMEX宾用貝黛且貝貝貝貝图4-3删除学生信息的运行界面4.4查询学生信息功能的实现在查询学生信息功能中,系统为用户提供了两种查询方式,分别为按学号查询和按 姓名查询。查询学生信息的运行界面如图4-4所示。c* C: Docuent s and Sett ingsAdinist r at or 臬面、学生SCDebug学生官理-|NNHJCNNHJCmtHJCmtKW:白 I
16、学主信息、XNmtKNmtKHmtKHJCNK请徹入查询方式:X1 一唆学号杳荷*2遥姓名査询*3羽回*j也:牟 1 3KXKKKXKKKXKKJCXKKJC要査询的学号KJCKKKJCKKKXKKK 号 JE_3 8 的 牛的信 目 XXJCKKXJCKKXJCKKKJC性名咐想性别:阴8出生日期:1990K族:汉 数据结构:站 语文:站 奂语:站、SMiMiMiMiMiMiMiMiM 询亓 MiiWiMiWiMK 覽 if 屛梵 !M !M % % KM 昇事止夢坤成旬 管甲 玮2: 1HS3、慘敌于土4、查询J 土信息7. 趴自 嘗昭育童ABC半:图4-4查询学生信息的运行界面4.5修改
17、学生信息功能的实现用户输入要修改的学生的学号,然后输入修改后的学生的成绩,点击回车键后,则 会提示“修改成功”,其运行界面如图4-5所示。图4-5修改学生信息功能的运行界面4.6排序功能的实现在排序功能中,系统为用户提供了 5种排序方式,分别为按学号排序、按数据结构成绩排序、按语文成绩排序、按英语成绩排序和按总分排序。其运行界面如图4-6所示戍绩排序小 U: Docuent s and SettinfsAdinistrator桌面、学主菅理希学主菅理-| | |* K比Si培子 ?旬息焙刃曲门予* 3吟适袁座握诽底* A返回*11+条件弓|白小具孝銖 爭号是M学生的性别女学生两出生日期辺90学
18、生氏族汉数据结构沔语文,卿 ti H 293曲勺爭弓忌5学生的性别女学生的出生日期辺学生代族汉,数据结构叽,话文嘶卜爲诒=9总分=騎丄符渔学生的嘗号是豳学生的性别豳学生的出生日期丄990学生民族汉,数据结构沔9”语文,99” 按槁:鹑-总、分認屮/ 生成绩管理系统1. 瑁加予生2. 删除年生【信息3. 修改半牛 理、查询学土A:協息 J谏取信息图4-6排序功能运行的界面第五章 程序设计结语5.1 系统存在的问题由于本人经验不足,对VC+6.0软件的使用不精通,对C语言知识的学习不够透彻,所以,此次课程设计存在较多的不足之处。 具体问题如下:(1)学生的个人信息不完善, 如:缺少学生的个人课表、
19、所在系、成绩、身高、体重、健康情况、祖籍等信息; (2) 系统运行后,没有实现对不同的用户登录拥有不同的权限功能。5.2 系统改进的方向介于上一节所述的种种不足, 我认为系统改进的总体方向就是拟补以上的种种不足, 然后在此基础上对系统进行优化。首先,完善学生的个人成绩;不同的用户登录也要有 一定的权限限制;实现对已有学生成绩的定位;把尚未完成的功能模块完成。最后,可 以将该学生成绩管理系统做成网页版,供学生、学校管理人员以及访客以相应的身份登 录该系统进行一系列的操作,进而可以将此系统推向各高等学府,辅助学校管理人员更 好的管理在校学生。5.3 此次课程设计的体会此次课程设计主要运用了 VC+
20、6.0软件,编程所运用的语言是 C语言。经过一周的编程实习,并在后一段的报告总结,我对数据结构这门科有新的认识,本人实在是获益 不浅!要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要 掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。这次设计 , 让我重 新掌握了数据结构 , 而且还得到了用数据结构解决实际问题的宝贵经验。通过此次编程我也发现了自己在学习中的错误和不足,复习了以前学过的知识。同 时也学到了一些没学过的知识,让我从中收益非浅,也为期末考试准备了一下!更重要 的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法。猴子选大王第一章
21、 概述1.1 开发的目的猴子选大王的问题,在现实社会中频频出现,此次系统开发的目的就是为了解决生 活中出现的猴子选大王的问题。有时候,很多选举需要随机性,如何能够实现公平公正 的选举?这就需要借助一个好的猴子选大王系统来实现。由此,猴子选大王系统就应运 而生了。1.2 开发设计的意义现实社会中,需要选举的地方很多,然而选举中的人为操作使得选举失去了应有的 意义。猴子选大王系统的开发,可以帮助一些社会群体实现公平选举,避开暗箱操作。 通过对“猴子选大王”的学习和动手实践编写,可以使我们对数据结构的基础知识 的理解更透彻;促进我们对 C 语言的理解与使用;提高我们对综合知识的运用能力,为 今后从事
22、项目开发积累经验。1.3 需求分析此猴子选大王系统只需实现对于不同数量的群体按照一定的规则进行逐个淘汰, 终获得选举结果,可以将参加选举者排好队,能够从不同的序号开始淘汰,从而达到随 机选举的目的。第二章猴子选大王系统概要设计2.1系统流程图此猴子选大王系统的总体设计思想流程图如图2-1所示。运行程序后,首先出现系统的主界面,提示用户输入猴子的总数,按回车键,然后提示用户输入从第几个猴子开 始淘汰,按回车键执行程序,然后得到猴子的大王是第几号。图2-1系统简单流程图第三章 详细设计3.1 系统的实现由于此系统数据元素不可须知,同时对于报完一次之后对于下一次的报数,由于已 经排除了一部分猴子,猴
23、子的顺序被打乱,所以需要使用链表。链表是动态的,可以在 需要的时候增长和减少其长度,而静态数据结构数组是在编译时分派内存的,其大小是不可改变的,而且会出现内存浪费的情况。我认为单循环链表能很好的解决这个问题, 在建立单循环链表时,因为链表的大小由输入决定,因为与匹配的节点数也是变化的, 所以要进行动态内存分配。假设猴子的个数是N, M是要淘汰的编号,那么建立一个 N长的链表,链表最后一个元素的 nextPtr 指针指向第一个元素,这样就形成一个循环链 表,而链表的数据域存储的就是猴子的编号。程序代码如下:#include#includestruct Node int data;struct N
24、ode *next;/ 建立一个节点结构体int main() struct Node *head, *s, *q, *t;int n, m, count=0, i;printf(*n);printf(n*scanf(%d,&m);printf(n*猴子选大王请输入猴子的总数 : );请输入从第几个猴子开始 : );scanf(%d,&n);for(i=0; idata=i+1;s-next=NULL;if(i=0) head=s; q=head; else q-next=s;q=q-next; / 建立一个不带头结点的单链表q-next=head;/ 这里,将单链表组成环状,形成循环单链表p
25、rintf(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(%d , t-data);/输出被淘汰的猴子的号码free(t);/ 释放内存,防止内存泄露 q=q-next; while(q-next!=q);/
26、 这句是关键,就是循环到只剩下一个节点了,如果说有难 度的话应该是理解的难点了printf(n* 猴子的大王是第 %d 号 *n,q-data);/输出 king 的号码大王是输入猴子的数目输入数字 第四章调试分析4.1系统运行主界面启动此猴子选大王系统后,首先出现的是主窗口,如图4-1所示。提示用户输入猴子的总数。图4-1主窗口运行界面4.2系统运行结果当用户输入相应的猴子总数,并输入从第几个猴子开始后,按下回车键,系统则的 到运行的结果,即选择出猴子的大王。程序运行结果如图4-2所示。FD:宝曲:得立件夹甘匚 +氐0宝鏗.Mitreoft Visual StudioMzProjectqDe
27、bugq.exeM:轉 it MT需子选 /T 干 KHJTM4W MMHJOHWMMMM4W MMMM: X Jt Jt X M! J0(1(00)1)11(”请输 从第 几个*矣子开女台: 12eforc;l 2 3 4 5 6 ? 8 9 10 11 12 13 14 15 16 17 IB 19 20 21 22 23 24 25 26 27 22V 3kJ 31 32 33 34 3S 36 J7 38 39 4M 41 42 43 44 4b 46 47 4H 49 bM bl 52 S3 S45 56 57 5呂 59 60 61 &264 5 GG 67 GS 69 70 71
28、 ?2 73 74 75 7G 7? 78 79 80 81S2 33 84 E5 36 87 8S 12 24 36 18 60 72 84 B 21 34 47 61 74 87 13 27 41 55 69 801737t4707977457S76714LJ3694344486 19 6 82 9 ? 81 59猴子的大琨第31i*ess any key to continue图4-2系统运行结果图第五章 程序设计结语5.1 此次课程设计的总结猴子选大王是一个数据结构很古老很经典的问题,融知识性和娱乐性为一体,能让 人产生较大兴趣,因此编写程序实现之是一件很有意义的事。在课程设计中,首先
29、要看 清问题,将问题要求理解透彻,在构思要如何实现,要用到哪些函数,要用什么算法, 在课程构思中选算法是一个很重要的概念,只有确定用这么算法后才能接下来的工作, 将流程图画在纸上,再依次编写代码,在程序设计中,编写代码只是一个方面,调试才 是关键。它是一个相当繁琐的过程,有许多新的问题需要被解决,但同时它也是一个比 较重要的过程,因为在程序调试过程中,你会学到很多新的东西,从而增加你编程的经 验。在设计一元多项式算法时,出现了一些问题,例如在建立链表时头指针的设立导致 了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺 省值,不能实现算法。实现加法时该链表并没有向通常那
30、样通过建立第三个链表来存放 运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。为了使输入数 据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再 进行之后加减运算。迷宫求解第一章 概述1.1 开发的目的和意义迷宫问题要求寻找一条从入口到出口的路径。即从入口出发,顺着某一个方向进行 探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口 位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫 没有通路,通常用的是“穷举求解”的方法。为了保证在任何位置上都能原路退回,显 然需要用一个后进先出的结构来保存从入口到当前位
31、置的路径。因此,在求解迷宫通路 的算法中要应用 “栈”的思想。对于栈的内容在整个学期的学习中我也有了一定的了解1.2 需求分析本课程设计是解决迷宫求解的问题, 从入口出发, 顺某一方向向前探索, 若能走通, 则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索 到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保 存从入口到当前位置的路径。 因此,在求迷宫通路的算法中要应用 “栈”的思想假设 “当 前位置”指的是 “在搜索过程中的某一时刻所在图中某个方块位置” ,以0和 1所组成 的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入
32、错误结束程 序。第二章 迷宫求解系统概要设计2.1 系统设计概要从入口出发,按某一方向向前探索,若能走通并且未走过,即某处可以到达,则到 达新点,否则试探下一个方向;若所有的方向均没有通路,则沿原路返回前一点,换下 一个方向再继续试探,直到找到一条通路,或无路可走又返回入口点。在求解过程中, 为了保证在到达某一点后不能向前继续行走(无路)时,能正确返 回前一点以便继续从下一个方向向前试探,则需要用一个栈(递归不需要)保存所能够 到达的每一点的下标及从该点前进的方向。设迷宫为m行n列,利用mazemn来表示一个迷宫, mazeij=0或 1;其中: 0表示通路, 1表示不通,当从某点向下试探时,
33、中间点有四个方向可以试探,而四个角点有两个方向,其他边缘点有三个方向,为使问 题简单化,用 mazem+2n+2 来表示迷宫,而迷宫的四周的值全部为 1,这样做使问题 简单了,每个点的试探方向全部为 4,不用再判断当前点的试探方向有几个。迷宫栈的实现函数 mazepath()迷宫递归的实现函数 path() 为了防止重复达到某点,以避免发生死循环,每次达到了某点(i,j) 后,改变mazeij 的值,迷宫栈的实现直接置 -1 ,算法结束前恢复原迷宫;而迷宫递归是将当 前值置为已走的步骤,这样输出时对走过的路更显而易见。栈的函数设计:栈的初始化函数 Init_SeqStack()判栈空Empty
34、_SeqStack()入栈函数Push_SeqStack()出栈函数Pop_SeqStack()取栈顶函数 GetTop_SeqStack() 销毁栈 Destroy_SeqStack()第三章 详细设计3.1 系统的实现在上述表示迷宫的情况下,每个点有 4 个方向去试探,如当前点的坐标( x,y), 与其相邻的4个点的坐标都可根据与该点的相邻方位而得到。因为出口在( m n),因 此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化 问题,方便求出新点的坐标,将从正东开始沿顺时针进行的 4个方向的坐标增量放在一 个结构数组move4中,在move数组中,每个元素有两个
35、域组成,x为横坐标增量,y 为纵坐标增量。这样对move设计会很方便地求出从某点(x, y)按某一方向v(0=v=3) 到达的新点( i ,j )的坐标: i=x+movev.x;j=y+movev.y;当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试 探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的 方向。栈中元素是一个由行、列、方向组成。具体结构定义如下:#include #include #define MaxSize 100#define StackIncrement 10struct Seat / 定义坐标结构体int x;int y
36、; ;typedef struct / 定义入栈信息元素类型int ord;Seat seat;int di;SElemType;struct Stack / 定义栈元素类型SElemType *base;SElemType *top;int StackLength; ;Stack S;bool Map1010=0,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,
37、 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)return false;S.StackLength=MaxSize;return true;bool Push(Stack &S,SElemType e) / 将信息 e 入栈 if(S.top-S.base)/sizeof(SElemType)=S.StackLength) S.base=(SEle
38、mType*)realloc(S.base,(S.StackLength+StackIncrement)*sizeof( SElemType);S.top=S.base+S.StackLength;S.StackLength += StackIncrement; S.top-di=e.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) /将栈顶元素取出,赋值给 eif(S.base=S.top)return fa
39、lse;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; 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,
40、int i) /将当前位置指向逻辑上的下个位置,指向的方向由 i 确定Seat ss;if(i=1)ss.x=s.x+1; ss.y=s.y;elseif(i=2)ss.x=s.x; ss.y=s.y+1;else if(i=3) ss.x=s.x-1; ss.y=s.y; elsess.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 c
41、urstep=1; /探索第一步doif(Pass(curpos)&!is_throughcurpos.xcurpos.y) / 当前位置通且没有 来过FootPrint(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
42、/ 当前位置不通,将前面一个位置取出,改由其他方向在判断 SElemType e;if(!StackEmpty(S) Pop(S,e);while(e.di=4&!StackEmpty(S)FootPrint(e.seat); Pop(S,e); / 如果这个位置的其他四个方向都不满足, 表示这个位置不可取,取出栈并且留下标识 if(e.di4) / 如果其他方向还没有探索完,继续探索下一个方向 e.di+; Push(S,e);curpos=NextPos(e.seat,e.di); while(!StackEmpty(S); return false; int main()int i,j;
43、Seat sta,end;sta.x=1; sta.y=1; end.x=8; end.y=8; MazePath(sta,end); SElemType *b=S.base;printf( 迷宫地图为 (1 表示通, 0表示不通 ):n); for(i=0;i10;i+) for(j=0;j ,b-seat.x,b-seat.y);+b; printf( 出口 n); scanf(%d,i); return 0; 第四章调试分析4.1系统运行界面系统运行后,其运行界面如图4-1所示图4-1迷宫求解系统运行图第五章 程序设计结语5.1 此次课程设计的总结本程序是利用非递归的方法求出一条走出迷宫
44、的路径,并将路径输出。 首先由用 户输入一组二维数组来组成迷宫, 确认后程序自动运行, 当迷宫有完整路径可以通过时, 通过这次数据结构课程设计,让我学到了好多东西。在实际操作过程中犯了一些错误却 让我有了意外的收获,所学数据结构理论知识得到了巩固。通过实际操作,学会数据结 构程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解 决问题的能力。现在终于挨到了写收获与体会的时候了,的确令人兴奋,看看自己的劳 动成果,好开心。上网查资料、去图书馆查,查相关的函数,经过两三天的努力,我把 框架弄出来了,可是还有计算难题摆在我的面前,真的是个难题,自从把框架弄好了以 后就没有进展了
45、,眼看一个星期快过去了,我那个急啊,可是急也没有用。我坚持,终 于工夫不负有心人, 我参照类似程序, 改改和添添,终于大功告成, 我们欢呼我们雀跃, 终于相信我们自己是足够的伟大。图的遍历及拓扑排序第一章 概述1.1 开发设计的目的和意义本课设题目要求编写算法能够建立有向无环图,有向无环图,能够求解该有向无环 图的拓扑排序并输出来,输出除拓扑排序数据外,还要输出邻接表数据。为了更好地完 成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。拓 扑排序可以应用于教学计划的安排,根据课程之间的依赖关系,制定课程安排计划。按 照用户输入的课程数,课程间的先后关系数目以及课程间两两
46、间的先后关系,程序执行 后会给出符合拓扑排序的课程安排计划。1.2 需求分析该系统的功能应能够实现图的遍历以及拓扑排序,具体分析如下:1. 将图以合适的方式存储起来。图有多种存储方式,其中最常用的存储方式有图的 邻接矩阵和邻接表。本人在构思时使用邻接表来建立有向无环图,将其存储起来。2. 求解该有向无环图的拓扑排序,并将其输出出来。若通过构造,建立了一个有向 无环图,那么一定可以求出其拓扑排序,其原理比较简单。即统计每个节点的入度,将 入度为 0 的结点提取出来,然后再统计剩下的结点的入度,再次将入度为零的结点提取 出来,以此类推,这样就形成了一个序列,这样的序列就是该图的拓扑排序序列。3.
47、拓扑排序算法应能够处理出现环的情况。个人在写程序时,考虑到构造图时,会 有构造成有向有环图的情况, 应该在运行程序时, 提醒出来, 然后重新输入有向无环图, 知道输入正确为止。这样就有多次构造邻接表的问题,每一次构造邻接表时,都应该将 原来错误的(不是无环图的)邻接表空间释放掉,否则,会变得混乱。4. 输出除拓扑排序外,还要求输出邻接表数据。由于图是用邻接表存储的,所以很 容易将其邻接表输出来。第二章 图的遍历及拓扑排序系统概要设计2.1 系统流程图根据程序的总的步骤,拟将整个流程分为三个模块。三个模块既相互独立又相互联 系。具体分析如下:1. 图像输入,根据题目要求,要能够建立一个有向无环图
48、,这就要我们在程序中 去建立。考虑到输入方式要尽量方便全面,采用输入弧的方式,输入每条弧的链接的两 个结点,当输入 -1 时结束输入。 这样再输入的时候, 与相邻的两个结点的邻接矩阵对应 的位置也做相应改变。2. 判断图是不是有向无环图。当图为有向无环图时,则挑选完毕后,队列应该是 满的,进行后续步骤。对于结点入队列的顺序,需要借助于 visited 数组。选取入度为 零的结点,入队列,调整 visited 数组,循环进行。若队列不满,则输入的图不符合要 求,应该重新输入。在程序中应做适当提醒,然后自动转模块 1. ,进行图的重新编辑。3. 拓扑排序。此时,所输入的弧应该是有向无环图了,下面进
49、行拓扑排序。在判 断它是否为无环图的过程中已经形成了一个满队列。 接下来所要做的事情就是循环出队 列,按照队列固有的顺序进行输出即可,排序完成。系统的流程图如图 2-1 所示。图2-1系统流程图2.2功能模块图系统的功能模块图如图2-2所示.包括图的遍历和拓扑排序两部分,图的遍历中若 是有环图则遍历全部,若是无环图则无法遍历;拓扑排序模块则实现拓扑排序功能。图2-2系统功能图第三章 详细设计3.1 系统功能的实现本程序的拓扑排序,必须在图的邻接表已知的情况下。它还有另外一个功能:判断 一个图是不是无环图。确切的说,不能单纯的叫拓扑排序,但考虑它主要的作用,在不 引起误解的情况下就叫拓扑排序算法
50、。判断一个图是否为有向无环图并进行拓扑排序,判定方法有很多种,检查一个有向 图是否存在环要比无向图复杂。对于无向图来说,若深度优先遍历过程中遇到回边(即 指向已访问过的顶点的边) ,则必存在环;而对于有向图来说,这条回边有可能指向深 度优先森林中另一棵生成树上顶点的弧。 但是,如果从有向图上某个顶点 v 出发的遍历, 在dfs(v)结束之前出现一条从顶点u到顶点V的回边,由于u在生成树上是V的子孙, 则有向图中必定存在包含顶点 v 和 u 的环。另一种判断是否有环的方法则显得简单的多,尤其是对于本题目来说,由于本题要 求是对有向无环图进行拓扑排序,其主要方法是将入度为零的结点依次输出来,知道图 的所有定点全部输出为止。 那么若图为有环图, 在环上的结点在其他结点都选择出来后, 入度都不为零,即无法被输出出来。那么就可以认为按照拓扑排序的方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CTRA 07-2024橡胶粉改性沥青碳减排核算
- T/CHES 118-2023城市河湖污染底泥处理效果评估技术导则
- T/CECS 10404-2024绿色建材评价耐碱网格布
- T/CACE 0130-2024竹浆短纤维
- 上海市建筑安全知识a试题及答案
- 上海安全员c3考试题库及答案
- 上海安全b证模拟考试题库及答案
- 2025年房屋简易租赁合同4篇
- T/CEPPEA 5039-2023配电站工程竣工验收规范
- 讲卫生不得病教案
- 国开经济学(本)1-14章练习试题及答案
- 《企业销售费用控制研究(论文)8600字》
- 二0二三年度六年级上册Module1《多维阅读》第八级DifferentPlants教学设计
- 公司网银盾交接单
- JT∕T 784-2022 组合结构桥梁用波形钢腹板
- 汽车客运有限公司成本费用管理规定
- 缓刑期满个人总结
- 私教工作表格健康问卷
- 市政道路中线测量内容及计算方法
- 南瓜种植PPT演示课件(PPT 46页)
- 第三章磁功能玻璃
评论
0/150
提交评论