完整word版约瑟夫环Java课程设计大作业.docx
- 文档编号:1823996
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:14
- 大小:93.53KB
完整word版约瑟夫环Java课程设计大作业.docx
《完整word版约瑟夫环Java课程设计大作业.docx》由会员分享,可在线阅读,更多相关《完整word版约瑟夫环Java课程设计大作业.docx(14页珍藏版)》请在冰豆网上搜索。
完整word版约瑟夫环Java课程设计大作业
上海电力学院
数据结构Java课程设计
题 目:
约瑟夫环
学生姓名:
学号:
院 系:
计算机与信息工程学院
专业年级:
软件工程 级
2012年 1 月 13日
1、需求分析
【问题描述】
约瑟夫(Joseph)问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
【基本要求】
利用单向循环链表存储结构或顺序存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】
m的初值为20;n=7,7个人的密码依次为:
3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
1、运行环境(软、硬件环境)
开发工具:
JDK1.6eclipse6.0
运行环境:
WindowsXP及其以上系统
2、输入的形式和输入值的范围
本个实验所输入的值都强制转化为Int数据类型,因为人数一定是个正整数,而每个人所持的密码将会作为下一次循环的步数,所以也一定是一个整数;初始密码也是步数,所以也是一个正整数。
在输入值的取值范围上,每人的密码是一个大于零的整数,初始密码也是一个大于零的整数,人数同样也是一个正整数。
3、输出的形式描述
1.可以在以下环境中运行本次实验
①在DOS环境中编译“约瑟夫环.Java”文件
②在Eclipse6.0及其以上编译环境下运行
2.根据文字要求依次输入人数、每人密码、初始密码等一些数据(见图1.3.2)
(图)1.3.2
4、功能描述
约瑟夫环代码约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。
约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。
在那里,这些叛乱者表决说“要投降毋宁死”。
于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。
约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。
本次试验的不同点在于有一个初始密码M、每人又有个密码,在他死后(出局)之后将作为下一个循环的步数,这样以此类推得出最后一个幸存者。
这个实验主要是模仿约瑟夫环的意思模拟约瑟夫环。
差别在与每人的密码将作为下一个循环步数继续开始另一个约瑟夫环的循环处理。
最后得到一个出此链表的数字下标代号。
5、测试数据
①初始密码M=20
②人数为7
③7个人的密码依次为:
3,1,7,2,4,8,4
最后得到一个出此链表顺序,用每个链表中元素的下标输出数据。
二、概要设计
1、抽象数据类型定义描述
(对各类的成员及成员函数进行抽象描述)
创建Node和LinkList这两个类,在Node类中定义一些函数,为主程序中调用这些函数所服务;LinkList类Head指针调用SetLink函数,然后遍历结点,一次删除结点,使得指针后移。
在主函数中运用一个For循环作为足要算法,一次实现约瑟夫环的功能。
2、功能模块设计(如主程序模块设计)
先创建了一个linklist对象,然后分别申明inCount和resultIncount这两个私有成员变量。
然后通过inCount=Integer.parseInt(input.readLine());把输入的内容转化成INT类型,赋值给inCount。
通过一个For循环语句作为其主要算法实现。
Nodep=link.head,q=link.last;
inti=0;//每个人的密码
intj=0;//人数
for(;;){i++;
if(i==m){
i=0;
m=p.getData();
System.out.print(p.getCount()+"");
link.removeNode(q);//删除Q节点
p=p.getLink();//Q结点后移
j++;
if(j==inCount)
break;//如果等于总人数就跳出FOR循环
continue;//继续进行下一个循环
}
q=q.getLink();//Q的指针往后移
p=q.getLink();//P等于Q的下一个指针
}
3、模块层次调用关系图
三、详细设计
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
classNode{
privateintdata[]=newint[2];
privateNodelink;
privatestaticintcount=-1;
publicNode(intdata){
this.data[0]=data;
this.data[1]=++count;
link=null;
}
publicvoidsetData(intdata){
this.data[0]=data;
}
publicintgetData(){
returndata[0];
}
publicintgetCount(){
returndata[1];
}
publicvoidsetLink(Nodelink){
this.link=link;
}
publicNodegetLink(){
returnlink;
}
}
在这个结点NODE类中定义了诸如setData、getData、getData、getCount、setLink、getLink等一些函数,为主函数调用这些函数做好准备。
这也是前期工作的准备。
classLinkList{
publicNodehead;
publicNodelast;
publicLinkList(intdata){
head=newNode(data);//Head调用NODE的构造函数,初始化Head
head.setLink(head);//Head调用SetLink的函数
last=head;
}
publicStringvistAllNode(){//遍历节点
Nodenext=head;
Strings=newString();
do{
s=s+next.getData()+"";
//把指针next指向的对象添加到字符串S中
next=next.getLink();//把指针后移,获取下一个指针
}while(next!
=head);
returns;
}
publicbooleanremoveNode(Nodenode){//去掉node的下一个结点
if(node==last){
head=head.getLink();//把头指针指向下一个节点
last.setLink(head);//尾指针=头指针
}elseif(node.getLink()==last){
last=node;
last.setLink(head);//Last指向头指针
}else{
NodetempN=node.getLink();
//申明一个临时的指针TEMPN指向NODE的下一个节点
tempN=tempN.getLink();//把tempN向后移一个
node.setLink(tempN);//node指向tempN
}
returntrue;//操作成功返回true
}
publicbooleanremoveAll(){//此函数的作用是删除所有的节点
head.setLink(head);//Head=Head
last=head;//Last=Head
head.setData(0);//head的数据设置为0
returntrue;
}
publicvoidappend(intdata){//此函数的作用是加一个节点
Nodetemp=newNode(data);//申明TEMP节点
last.setLink(temp);//尾指针指向TEMP指针
last=temp;//尾指针指向TEMP指针
last.setLink(head);//尾指针指向头指针
}
}
在LinkList类中申明头尾指针head和last,head和last分别调用Node和setLink函数,在进行结点的遍历和,当删除一个结点之后便产生了指针后移的问题,直到头尾指针相同。
publicclass约瑟夫环{
privatestaticLinkListlink=newLinkList(0);
//申明一个LinkList的对象
privatestaticintinCount;
privatestaticintresultInCount;//申明两个变量
publicstaticvoidmain(String[]args)throwsIOException{
//主函数抛出异常
intenter;
StringinputString=newString();
BufferedReaderinput=newBufferedReader(newInputStreamReader(
System.in));//定义一个缓冲流对象
System.out.print("这个程序是解决约瑟夫环的问题。
\n请输入人数(正整数):
");
inCount=Integer.parseInt(input.readLine());
//把输入的内容转化成INT类型,赋值给INCOUNT
System.out.print("请输入初始密码:
");
intm=Integer.parseInt(input.readLine());
System.out.println("请输入每个人的密码:
");
for(resultInCount=0;resultInCount inputString=input.readLine(); enter=Integer.parseInt(inputString); link.append(enter); }//循环输入的内容放到链表中 link.removeNode(link.last);//去掉
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 约瑟夫 Java 课程设计 作业