- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HUNAN UNIVERSITY
课程实习报告
题 目 约瑟夫环问题
一、需求分析
要求设编号为1-n的n(n0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。
输入的形式和输入值的范围:输入形式是定义为int的整形变量,范围是1~n。
输出的形式:定义为int的整形变量
程序所能达到的功能:要求能按照题目要求输出正确结果。
测试数据:
输入:10,3
输出:3 6 9 2 7 1 8 5 10 4
当输入是非整形变量时提示输入错误,并要求输入正确值。
概要设计
(1)抽象数据类型的定义:
为实现上述程序的功能,可以用整数存储用户的输入。并将用户输入的值存储于线性表中。线性表ADT定义如下:
数据对象:整形
数据关系:线性关系,即ai,ai+1(0≤a<n)。
基本操作:
bool remove(int elem)//移除一个元素,被移除的元素赋给elem 如果操作成功,返//回true,否则返回false
bool isEmpty()//判断数组的元素是否清空,空返回true,否则返回false
bool setPos(int place)//设置当前元素的位置,设置成功返回true,否则返回false
int getLength()//获取数组的实际长度
(2)算法的基本思想:
约瑟夫环问题中的数据是人所站的位次,这种数据是,所有元素都有前驱和后继,符合线性表的特点。模拟约瑟夫环的出列问题,因为没有入列等操作,所以采用顺序表来实现线性表比较合适。
核心算法主要分为两步:
1、确定需要输出并删除的位置,2、输出并删除该位置。
已知报数间隔m,我们可以把当前位置加上m获得需要删除的位置,如果获得的位置超过顺序表中实际元素的总长度,则可以通过减去数组的实际长度来修正。然后把顺序表中的当前指向位置设置为该位置,继而删掉该位置。反复进行上述确定位置和删除位置的操作,直到顺序表为空。
如果报数间隔m总人数n,则通过m除以n取余的方法计算实际出列时的间隔。
(3)主程序的流程:
程序由三个模块组成:
(1)输入模块:提示输入总人数n和报数间隔m,中间用逗号隔开。
(2)处理模块:将元素储存于顺序表中。在主函数中根据报数间隔确定需要删除的元素的位置,在顺序表中设置该位置并删除该位置,同时输出该位置的值。反复设置并删除直到顺序表为空。
(3)输出模块:分别在DOS界面,按移除元素的顺序依次输出显示。
(4)各程序模块之间的层次(调用)关系:
主函数会按设计的方法调用顺序表中“获取实际长度”、“设置需要输出和删除的元素的位置”、“移除并输出该位置元素”和“判断是否为空表”四个模块,使元素依次出列,并正确结束程序。
详细设计
(1)实现概要设计中定义的所有数据类型(构建ADT并实现基本操作):
用整形存储用户输入的整数。
2、用顺序表实现线性表:
class AList
{
private:
int *listArray;//指向数组的指针
int realSize; //数组中含有元素的实际长度
int fence; //指向当前元素下标
public:
//构造函数,初始化数组
AList(int s)
{
listArray=new int[s];
for(int i=0;is;i++)
listArray[i]=i+1;//数组值等于数组下标+1
realSize=s;
fence=0;//指向首元素
}
//移除一个元素,并将要输出元素给elem
bool remove(int elem)
{
if(isEmpty())
return false;//如果数组为空返回false
elem = listArray[fence];
for(int i=fence;irealSize-1;i++)//从当前位置开始循环向前赋值
{
您可能关注的文档
最近下载
- 网络传销案件查办实务.pdf VIP
- 2025年宪法知识竞赛题库附答案.docx
- 浙江明士达股份有限公司招股说明书.pdf
- 公路工程资料全套范本(全套表格模板).docx VIP
- A公司企业文化建设研究.doc VIP
- LEC作业条件危险性分析法专题培训.ppt VIP
- 成都高新区西园街道公办幼儿园编外聘用人员招聘(27人)笔试备考试题及答案解析.docx VIP
- GB50724-2011 大宗气体纯化及输送系统工程技术规范.docx VIP
- 《GB∕T 19000-2016质量管理体系 基础和术语》理解与应用指导材料(2024A0-雷泽佳编写).doc VIP
- 2025年公路水运公共基础考试真题.doc VIP
文档评论(0)