沈阳工程学院-数据结构课设报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳工程学院
课程设计
设计题目:约瑟夫环、安排教学计划
系别信息学院班级
学生姓学号
指导教师姜柳、吕海华职称副教授、讲师起止日期:年月日起——至年月日止
沈阳工程学院
课程设计任务书
课程设计题目:约瑟夫环
系别信息学院班级
学生姓名学号
指导教师姜柳、吕海华职称副教授、讲师课程设计进行地点:实训F座
任务下达时间:年月日
起止日期:年月日起——至年月日止
教研室主任张欣年月日批准
一、课程设计的原始资料及依据
约瑟夫(Joeph)问题的一种描述是:编号为1、2、…n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序及最后一个出列的人。
二、课程设计主要内容及要求
1.约瑟夫环
①. 认真阅读资料,掌握程序设计模块化的思想。
②. 要求在设计的过程中,建立清晰的层次结构。
③. 画出主要的功能结构图和主要模块的流程图。
④. 建立一个具有n个结点,无头结点的循环链表。
⑤. 确定参与人数及初始报数上限值m。
⑥. 不断地从链表中删除链结点,直到链表为空。
三、对课程设计说明书撰写内容、格式、字数的要求
1.课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、设计小组评语、参考文献等。
一般不应少于3000字。
2.在适当位置配合相应的实验原理图、数据通路图、微程序流程图、实验接线图、微指令代码表等图表进行说明。
应做到文理通顺,内容正确完整,书写工整,装订整齐。
3.设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。
设计小组评语处注明设计组编号、设计组组长、设计组成员,并由设计组组长给出评语。
4.课程设计说明书手写或打印均可。
手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18磅。
文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。
5.课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。
四、设计完成后应提交成果的种类、数量、质量等方面的要求
1.完成“任务书”中指定的操作功能,运行稳定。
2.课程设计说明书。
五、时间进度安排
六、主要参考资料(文献)
[1]郭翠英.C语言课程设计案例精编.北京:中国水利水电出版社.2004.3
[2]谭浩强.C语言程序设计.北京:清华大学出版社.1999.12
[3]张翔.C语言函数大全.北京:清华大学出版社.2002.4
[4]浦滨.C游戏编程从入门到精通.北京: 北京希望电子出版社.2002.5
[5]陈天洲.C语言高级程序设计. 北京:人民邮电出版社.2002
[6]杨旭.C语言程序设计案例教程.北京: 人民邮电出版社.2005
[7] 王为青.C语言高级编程及实例剖析.北京:人民邮电出版社.2008.02
[8]徐慧.《C语言实例解析精粹》.北京:人民邮电出版社.2006.04
[9] 姚大鹏栾好利张翼英等编著.C语言程序设计教程习题与上机实训指导.中国水利水电出版社.2005
[10] 王为青.C语言实例解析.北京:人民邮电出版社.2008.02
沈阳工程学院
课程设计任务书
课程设计题目:安排教学计划
系别信息学院班级
学生姓名学号
指导教师姜柳、吕海华职称副教授、讲师课程设计进行地点:实训F座
任务下达时间:年月日
起止日期:年月日起——至年月日止
教研室主任张欣年月日批准
一、课程设计的原始资料及依据
学校每个学期开设的课程是又先后顺序的,如计算机专业:开设《数据结构》课程之前,必须先开设《C语言程序设计》和《离散数学》课程,这种课程开设的先后顺序关系称为先行,后继课程关系。
现在需要根据给定的课程信息及课程之间的先行、后继关系,合理安排出开设各门课程的先后顺序。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计学习编写一个安排教学计划系统。
通过本设计可以加深理解利用程序设计思想开发一个系统的整个流程,提高分析问题、解决问题和实际动手的能力。
二、课程设计主要内容及要求
1对输入的课程先行、后继关系如果存在回路关系时应提示现错误;
2根据读入的课程信息及其先行、后继关系,计算出安排教学计划的序列。
3输出教学计划的安排顺序或给出错误提示信息。
三、对课程设计说明书撰写内容、格式、字数的要求
1.课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、设计小组评语、参考文献等。
一般不应少于3000字。
2.在适当位置配合相应的实验原理图、数据通路图、微程序流程图、实验接线图、微指令代码表等图表进行说明。
应做到文理通顺,内容正确完整,书写工整,装订整齐。
3.设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。
设计小组评语处注明设计组编号、设计组组长、设计组成员,并由设计组组长给出评语。
4.课程设计说明书手写或打印均可。
手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18磅。
文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。
5.课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。
四、设计完成后应提交成果的种类、数量、质量等方面的要求
1.完成“任务书”中指定的操作功能,运行稳定。
2.课程设计说明书。
五、时间进度安排
六、主要参考资料(文献)
[1]严蔚敏吴伟民.数据结构(C语言版). 北京:清华大学出版社.2007
[2]谭浩强.C程序设计.北京:清华大学出版社.1999.12
[3]滕国文.数据结构课程设计.北京:清华大学出版社.2010.09
[4]苏仕华等编著. 数据结构课程设计. 北京:机械工业出版社.2005.05
[5]李春葆.数据结构(C语言版)习题与解析.北京:清华大学出版社.2002..04
数据结构课程设计成绩评定表系(部):信息学院班级:学生姓名:
数据结构课程设计成绩评定表系(部):信息学院班级:学生姓名:
数据结构课程设计成绩评定表系(部):信息学院班级:学生姓名:
摘要
随着科学技术的发展,计算机技术在世界的每个角落得以运用与推广,其强大的功能已为人们深刻认识,利用计算机进行日常工作的管理也成为国家机关信息化的标志。
同时,人们对计算机技术需求的增加,也促进了计算机新技术的发展。
时代在进步,科技在发展,这改变了整个世界和人类的生活方式。
同时,这也要求我们新世纪的大学生掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求,跟上时代的脚步。
新世纪需要具有丰富的现代科学知识,能够独立解决面临的任务,充满活力,又有创新意识的新型人才。
随着各个领域的突飞猛进,计算机也有它卓越的进步。
数据结构不仅为计算机专业工作者所使用,而且为广大计算机应用人员所喜爱和使用。
数据结构是国际上广泛流行的计算机高级语言。
它适合作为系统描述语言,既可以用来编写系统软件,也可以用来编写应用软件。
许多高等学校,不仅在计算机专业开设数据结构课程,而且在非计算机专业也开设了数据结构课程。
学习数据结构已经成为广大计算机应用人员和广大青年学生的迫切要求。
约瑟夫生死游戏是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
对于前者要求建立起数据一致性和完整性强、数据安全性好的库。
而对于后者则要求应用程序功能完备,易使用等特点。
现如今,无论是小学、中学还是大学每学期都要面临教学计划安排的问题。
然而学校的课程繁多,每所学校的课程也大不相同。
给学生们安排课程成了老师的一项繁重而又难免的工作。
虽然有软件可以实现课程的安排,但是大都需要购买,而且过程繁琐不好掌握。
其实这项工作并没有想象中的那么难做,我们完全可以运用我们所学的有关图的知识利用邻接表和拓扑排序让计算机来帮我们完成这项工作,体验计算机技术给我带来的高效、和快速。
课程安排普遍的要求是:根据课程之间的依赖关系,在满足各学期课程数大致相同的条件下制定出课程安排计划。
在为期两周的数据结构课程设计学习中,先要学习数据结构课程的目的掌握数据结构存储的方法,学习会用计算机语言编写程序,以实现所需要处理的任务。
要正确处理算法与语法的关系,算法结构存储是程序的核心、是灵魂,语法是外壳、是工具。
不应把学习重点放在语法规则上,语法是重要的,不掌握语法规则就无法编写出正确的程序。
一定要把重点放在解题的思路上和运用何种存储的方法,通过思考和大量的阅读,来构造一个完整的程序。
数据结构存储的设计直接关系到程序的好坏。
最后,感谢老师在我们程序设计的过程中辛勤的指导和不倦的教诲。
关键词线性表,图,邻接表,拓扑排序,依赖关系,算法结构存储
目录
摘要 (I)
第一章问题分析 (1)
1.1引言 (1)
1.2背景 ............................................................................................................ 错误!未定义书签。
1.2.1约瑟夫生死游戏背景.......................................................................... 错误!未定义书签。
1.2.2安排教学计划背景.............................................................................. 错误!未定义书签。
1.3分析 ............................................................................................................ 错误!未定义书签。
1.3.1约瑟夫生死游戏分析 (4)
1.3.2安排教学计划分析.............................................................................. 错误!未定义书签。
第二章原理与运行环境 .................................................................................... 错误!未定义书签。
2.1数据结构理论 (5)
2.1.1线性表 (5)
2.1.2邻接表和图 (5)
2.2运行环境 (7)
第三章系统分析与设计 (9)
3.1约瑟夫生死游戏 (9)
3.1.1系统的功能 (9)
3.1.2模块分析及流程图 (10)
3.2安排教学计划 (12)
3.2.1系统的功能 (12)
3.2.2模块分析及流程图.............................................................................. 错误!未定义书签。
第四章系统功能实现 ........................................................................................ 错误!未定义书签。
4.1约瑟夫生死游戏 ........................................................................................ 错误!未定义书签。
4.1.1头文件、宏、数据结构体定义.......................................................... 错误!未定义书签。
4.1.2主函数和菜单函数.............................................................................. 错误!未定义书签。
4.1.3创建约瑟夫环函数.............................................................................. 错误!未定义书签。
4.1.4输出出队顺序函数.............................................................................. 错误!未定义书签。
4.2安排教学计划 ............................................................................................ 错误!未定义书签。
4.2.1头文件、宏、数据结构体定义 (19)
4.2.2初始化栈、压栈、弹栈、判断栈空函数.......................................... 错误!未定义书签。
4.2.3邻接表建立函数.................................................................................. 错误!未定义书签。
4.2.4求图的入度函数.................................................................................. 错误!未定义书签。
4.2.5拓扑排序函数...................................................................................... 错误!未定义书签。
4.2.6主函数和菜单函数.............................................................................. 错误!未定义书签。
总结..................................................................................................................... 错误!未定义书签。
致谢................................................................................................................... 错误!未定义书签。
参考文献............................................................................................................... 错误!未定义书签。
第一章问题分析
1.1 引言
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非常重要的。
选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
数据结构是指同一数据元素类中各数据元素之间存在的关系。
数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。
数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。
逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
数据元素相互之间的关系称为结构。
有四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。
树形结构和图形结构全称为非线性结构。
集合结构中的数据元素除了同属于一种类型外,别无其它关系。
线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。
在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。
数据结构它既是理论性较强的基础课,又是实践性很强的专业课,在计算机科学领域的主干课程中具有承上启下的作用。
它的先行课程有计算机基础、程序设计语言、离散数学和数学等;后继课程有操作系统、数据库原理、编译原理和软件开发技术等。
综上所述我们应该,在实践中理解它学好它。
数据结构学习的技巧:学习数据结构的概念后对于抽象数据类型的设计参考C++ STL标准库中容器的设计。
这样对于无论是数据结构的学习还有程序设计接口能力上都会有很大的提高。
对于数据结构课程中很多时候都不太重视的顺序(数组)做存储的数据结构,希望大家还是要多留意这快的知识.对于有些场合需要考虑时间换空间的情况下需要考虑顺序存储结构。
数据结构学习一定要自己独立完成代码实现,虽然有时候你理解内容了,但是实现上面还是会愈要很多困难的,解决这些困难会帮助你提高程序设计的能力的。
1.2 背景
1.2.1约瑟夫生死游戏背景
Josephus(约瑟夫斯): 约37--100 ,犹太历史学家和军人·原名约瑟夫·本·马赛厄斯·生于耶路撒冷·西元66年在反对罗马的犹太起义中他指挥一支加利利军队·在向罗马人投降时他施展手段获取优待,得以前往罗马,在那里写出几部关于犹太历史和宗教的著作,包括《犹太战争史》(History of the Jewish War,西元75--79年问世)和《犹太古事记》(Antiquities of the Jews,西元93年问世)卒于罗马。
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从。
首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。
接着,再越过k-1个人,并杀掉第k个人。
这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。
当任意给定n和m后,设计算法求n个人出圈的次序。
根据此问题用单链表构成的约瑟夫生死游戏系统。
约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
1.2.2安排教学计划背景
随着科学技术的发展,计算机技术在世界的每个角落得以运用与推广,其强大的功能已为人们深刻认识,利用计算机进行日常工作的管理也成为国家机关信息化的标志。
同时,人们对计算机技术需求的增加,也促进了计算机新技术的发展。
近代以来,特别是在实行学科课程的条件下,教学计划主要是学科的计划,或只是学科表。
随着社会经济和科学技术的新发展,教育结构不断发生变革,现代教育和教学理论主张对教学计划的结构实行改革。
除了教学以外,生产劳动、科技活动、发展体力和增进健康的活动、艺术活动和社会活动等也应列入教学计划。
在工具课和一般科学知识课、自然学科和社会学科、普通教育课和职业教育课之间应相互渗透。
在新知识不断涌现的形势下,只有必修课而无选修课的单一结构不能适应学生个性才能的发展和知识多样性的要求,适当增设选修课,已成为发展的趋势。
一些选修课在一定条件下,可能成为必修课。
根据一定的教育目的和培养目标制定的教学和教育工作的指导文件。
教学计划决定着教学内容总的方向和总的结构,并对有关学校的教学、教育活动,生产劳动和课外活动校外活动等各方面作出全面安排,具体规定一定学校的学科设置、各门学科的教学顺序、教学时数以及各种活动等。
教学计划、教学大纲和教科书互相联系,共同反映教学内容。
然而学校的课程繁多,每所学校的课程也大不相同。
给学生们安排课程成了老师的一项繁重而又难免的工作。
虽然有软件可以实现课程的安排,但是大都需要购买,而且过程繁琐不好掌握。
其实这项工作并没有想象中的那么难做,我们完全可以运用我们所学的知识让计算机来帮我们完成这项工作,体验计算机技术给我带来的高效、和快速。
课程安排普遍的要求是:根据课程之间的依赖关系,在满足各学期课程数大致相同的条件下制定出课程安排计划。
针对各大院校课程繁多课程安排难的问题,并且避免以往程序的繁琐和不易上手,我们从实际出发,充分运用我们所学的知识,根据不同学校的情况设计出《教学计划安排检验程序》。
安排教学计划系统可以根据用户输入的课程数、课程编号、课程间的先后关系数目以及课程间两两间的先后关系,给出学生每学期应学的课程。
该教学计划安排程序具有操作简单,功能完善,实用性强等特点,能很好的完成教学计划的拓扑排序即课程安排的先后顺序。
课程安排的先后顺序,与拓扑结构相同。
可利用拓扑排序来实现。
从而让计算机代替人工安排课程。
1.3分析
1.3.1约瑟夫生死游戏分析
为了解决约瑟夫问题,并为了解决由此而衍生的类似的游戏原理理解问题。
在制作的过程中要解决问题分析,编码,制作等相关问题,本课程设计的目标是运用循环链表来解决Josephus环问题,其中运用了许多链表中的基本操作使该程序能够解决多个Josephus 的简单链表,Josephus函数则是用C++程序编写的程序,实现队列的建立、插入和删除等基本功能,在程序设计成功的基础上,进一步深化理解队列的作用和实现原理。
主要分析:
1.输入的形式和输入值的范围:本程序中,输入人数上限,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2.输出的形式:从屏幕显示出列顺序。
3.程序功能:提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。
1.3.1安排教学计划分析
总体思想是利用拓扑排序的思想和堆栈思想编写相应函数。
首先根据课程的先后关系画出AOV网,网中的结点代表课程,有向边表示各学科之间的次序关系。
可以采用邻接表作AOV网的存储结构,且在头结点中增加一个存放顶点入度的数组。
为了避免重复检测入度为零的顶点,可另设一栈暂存所有入度为零的顶点。
然后根据拓扑排序依次输出应学的课程。
编写的程序根据用户输入的课程数,课程编号,课程间的先后关系数目以及课程间两两间的先后关系,实现输出课程安排的先后顺序的功能。
拓扑排序时有向图的一种重要运算。
在课表排序中,每门课都有多种关系:
(一)先后关系,即必须在一门课学完后,才能开始学习另一门课;
(二)在一类课之间没有次序要求,即两门课可以同时学习,互不影响。
将AOV 网络中的各个顶点排列成一个线性有序序列,使得所有的要求的前趋、后趋关系都能得到满足。
在AOV网络进行拓扑排序的方法:
1.选择一个没有前趋的顶点,并把它输出;
2.从网络中删去该顶点和从该顶点出发的所有有向边;
3.重复执行上述两步,直到网中所有的顶点都被输出。