joseph环.docx
- 文档编号:5426674
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:11
- 大小:108.13KB
joseph环.docx
《joseph环.docx》由会员分享,可在线阅读,更多相关《joseph环.docx(11页珍藏版)》请在冰豆网上搜索。
joseph环
数据结构课程设计报告
题目:
joseph环
班级:
软件092班
姓名:
陈世华
学号:
17号
指导教师:
董跃华、井福荣
成绩:
信息工程学院
2011年6月23日
摘要:
任务:
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。
设计一个程序来求出出列顺序。
要求:
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
目录
1.引言3
2.需求分析3
3.概要设计3
3.1.设计思路分析3
3.2.模块间关系4
3.3.模块流程图5
4.详细设计6
4.1.算法分析6
4.1.1.初始化单向链表算法6
4.4.2.joseph环算法7
5.测试结果7
6.调试分析9
7.设计体会9
8结束语10
参考文献:
10
附录:
10
1.引言
数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础。
数据结构是实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段。
要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
2.需求分析
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
首先创建一个空链表,初始化链表,构造出一个只有头结点的空链表,建立好一个约瑟夫环。
1.输入的形式和输入值的范围
本程序中,输入报数上限值m,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2.输出的形式
从屏幕显示出列顺序。
3.程序功能
提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。
3.概要设计
3.1.设计思路分析
要解决约瑟夫环问题,首先一点就是必须有一个环,所以第一步我们必须建立一个单循环链表。
必须有一个空的单循环链表,然后运用尾插法建立一个单
循环链表,至此,约瑟夫环就创建出来了,接下来就是处理约瑟夫环。
由于每一个结点有一个密码和一个序号,所以我们将结点结构体定义为
密码mima
序号
指针域next
每当结点计数到某一结点时,将他的前驱接到他的后继,然后将他的密码值M赋给计数变量,再将此结点删除。
如此下去,直到最后变为空的单循环链表为止。
3.2.模块间关系
程序在运行的过程中,用线性表来实现各种操作。
线性表的几种结构中我最终选择了链表。
因为链表的逻辑模型与约瑟夫问题中的实际结构非常相似,这样可以让程序设计起来变得简单、易行。
程序大致分为三个模块:
输入模块、游戏进行模块和数据的写入文件模块。
输入模块要解决用户的输入问题。
包括参加游戏的人数和每个人的密码,但是不包括初始的m值。
m值我设计在游戏模块输入,在游戏进行的模块开始运行之前输入。
关于模块之间的调用,我设计为零。
我把各个模块的功能分开运行。
模块之间相互传输的只有数据本身,不存在模块之间的调用。
这样的设计可以让整个程序的调试变得简单。
因为各模块之间是分开工作的,程序运行错误是只需找到出错的模块,而不是整个程序寻找错误。
3.3.模块流程图
4.详细设计
4.1.算法分析
4.1.1.初始化单向链表算法
nodeinit(nodep)
{
intn,i,j=1;
nodep1,p2,p3;
p3=p;
p1=p;
printf("输入人数:
\n");
scanf("%d",&n);
printf("选择输入密码:
\n");
for(j=1;j<=n;j++)/*信息录入函数主体(链表创建)*/
{
printf("输入第%d个人的密码(请输入正整数):
",j);
scanf("%d",&i);
if(i<=0)
printf("输入错误,请重新输入!
\n");
p2=(structlist*)malloc(sizeof(structlist));
p1->next=p2;
p2->mima=i;
p2->num=0;
p1=p2;
}
p2->next=p3;
printf("人数设定为%d,所有人密码设定完毕!
\n\n",n);
p3->mima=n;/*把人数存入头结点的mima域*/
p3->num=0;
returnp3;
}
4.4.2.joseph环算法
nodejoseph(nodep)
{
printf("请输入初始数字M:
");
intm,n,i=1,j=1;
scanf("%d",&m);
nodep1,p2;
p1=p;
p2=p;/*保存头结点,返回p2*/
p->num=m;/*把m值存入头结点的num域*/
n=p->mima;
for(;n>=1;)
{
for(i=1;i<=m;)
{
p1=p1->next;
if(p1->num==0)
i++;
}
printf("%4d",p1->mima);
m=p1->mima;
p1->num=j;
j++;
i=1;
n--;
}
printf("\n");
returnp2;
}
5.测试结果
5.1.菜单界面截图
5.2.设定人数和密码截图
5.3.游戏开始与结束截图
6.调试分析
这次的课程设计的代码很冗长,所以等有了解题思路后,把代码都写上后难免会有很多错误。
当第一次把整个程序写好后运行,出现了很多错误。
不过经过一点点的改正,错误也慢慢地变少。
这也说明做事要认真,尤其做计算机这方面工作的时候,因为计算机不容许不一点点的错误,有了一点小错误和有一个大错误在计算机看来都是一样的,都不会得不到结果。
有些小错误,比如说少了个分号,变量忘了定义,数据溢出等都是些小错误,但也不能松懈。
因为要注意的地方很多,经过多次尝试,问题也就自然而然的解决了,而且以后遇到这方面的问题都会觉得比较得心应手。
在调试的过程中,类的优势很明显,能很简单的把问题解决,而不需要使用的其他的一些比较复杂的方法。
7.设计体会
通过这次数据结构课程设计,我感受最深的就是对于循环链表的使用,可以说对循环链表有了比以前更进一步的认识,以前只是一知半解的,如果只给个题目自己根本不能把程序完整地编写出来,所以这次课程设计最大的收获就在于对循环链表有了一定的理解,包括其中的一系列操作,如建立一个循环链表,删除链表中的一个结点,增加一个结点等。
在这次课程设计过程中需要我们一边设计一边探索,这这个过程当中我发现自己在数据结构方面知识掌握不够深入,对一些基本概念不能很好的理解,对一些数据结构不能够熟练的进行上机实现,这是自己比较薄弱的。
学好基础知识是理论付诸实践的前提,这样理论和实践才能充分地结合起来。
在以后的学习中,我还要努力改正,充分利用上机实验的机会提高自己。
在程序的输入的时候,因为自己对键盘的不熟练,代码又很多很繁琐,常常会产生放弃的念头,从中我也感受到只有坚持到底,胜利才会出现。
在调试程序的时候我也有所体会,虽然约瑟夫环问题不是很难,但调试的时候还是会出现很多错误,因此我们不能认为容易就不认真对待。
在以后的学习中,要能不断发现问题,提出问题,解决问题,从不足之处出发,在不断学习中提高自己。
8结束语
通过学习和实践,使我明白在进行面向过程的程序设计时,一般首先考虑程序所要实现的功能,然后设计为实现这些功能所必须采取的步骤,这些步骤就是过程。
如果一个过程比较复杂而不能直接使用已有的抽象进行实现,则对这个过程进行分解,使分解之后的每一步(更低级的过程)能够直接对应着一条语句。
通过将分解之后的一系列过程封装在一个函数抽象中,程序员在特定的时刻只关心有限的细节,这个新的函数抽象比其较低级的抽象更接近问题求解的过程,因而,能够很好地映射问题求解中的过程。
如果这个过程出现在许多问题求解中,那么,这个函数抽象就可能被重复利用。
由于是第一次用“以数据结构为中心”的思想编程,所以并不是很习惯,在主函数中还是充斥着很多基本语句,以后仍要多多练习。
参考文献:
【1】严蔚敏,吴伟民数据结构(C语言版)清华大学出版社【2】谭浩强C程序设计(第三版)清华大学出版
附录:
#include
#include
typedefstructlist/*链表的每个结点的数据结构定义*/
{
intnum;//编号
intmima;//密码
structlist*next;
}list,*node;
/*********************菜单函数***********************/
voidmenu()
{
printf("\n\t\t*****************菜单*****************\n");
printf("\t\t\t1.设定人数和每个人的密码\n");
printf("\t\t\t2.游戏开始\n");
printf("\t\t\t3.游戏结束\n");
printf("\t\t****************************************\n\n");
}
/******************初始化函数(信息录入函数)********************/
nodeinit(nodep)
{
intn,i,j=1;
nodep1,p2,p3;
p3=p;
p1=p;
printf("输入人数:
\n");
scanf("%d",&n);
printf("选择输入密码:
\n");
for(j=1;j<=n;j++)/*信息录入函数主体(链表创建)*/
{
printf("输入第%d个人的密码(请输入正整数):
",j);
scanf("%d",&i);
if(i<=0)
printf("输入错误,请重新输入!
\n");
p2=(structlist*)malloc(sizeof(structlist));
p1->next=p2;
p2->mima=i;
p2->num=0;
p1=p2;
}
p2->next=p3;
printf("人数设定为%d,所有人密码设定完毕!
\n\n",n);
p3->mima=n;/*把人数存入头结点的mima域*/
p3->num=0;
returnp3;
}
nodejoseph(nodep)
{
printf("请输入初始数字M:
");
intm,n,i=1,j=1;
scanf("%d",&m);
nodep1,p2;
p1=p;
p2=p;/*保存头结点,返回p2*/
p->num=m;/*把m值存入头结点的num域*/
n=p->mima;
for(;n>=1;)
{
for(i=1;i<=m;)
{
p1=p1->next;
if(p1->num==0)
i++;
}
printf("%4d",p1->mima);
m=p1->mima;
p1->num=j;
j++;
i=1;
n--;
}
printf("\n");
returnp2;
}
intmain()
{
inta;
nodeh;
h=(structlist*)malloc(sizeof(structlist));
menu();/*使每个函数运行完,就可以重新现实菜单*/
printf("请输入数字选择要使用的功能:
\n");
while
(1){
scanf("%d",&a);
switch(a)
{
case1:
init(h);printf("\n请输入数字选择要使用的功能:
\n");break;
case2:
joseph(h);printf("\n请输入数字选择要使用的功能:
\n");break;
case3:
printf("谢谢使用!
\n");exit(0);
default:
printf("输入指令无效,请重新输入!
\n");
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- joseph