C语言课程设计报告约瑟夫环胡存夫.docx
- 文档编号:3049251
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:19
- 大小:457.46KB
C语言课程设计报告约瑟夫环胡存夫.docx
《C语言课程设计报告约瑟夫环胡存夫.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告约瑟夫环胡存夫.docx(19页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告约瑟夫环胡存夫
C语言课程设计报告(约瑟夫环)胡存夫
LT
1课程设计介绍
1.1课程设计内容及要求
设计程序,实现算术表达式求值,系统主要功能如下:
1.问题描述
约瑟夫环问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
2.分析约瑟夫问题:
n个人围成圈,每人各持一个密码,任选一个正整数作为报数上限值m,从第一个人开始,数到第m个人,删除并以出列者密码作为新的m值,从下一个人开始进行第二轮操作,直到所有人都出列。
设计
1.2系统需求
1.需求
此程序最终目的是要求出所有人的出列顺序
2.功能描述
2课程设计原理
2.1课设题目粗略分析
根据课设题目要求,拟将整体程序分为四大模块。
此四个模块相互独立,没有嵌套调用的情况,以下是五个模块:
(1)创建链表模块
voidcreateList(LNode*ppHead,intn)
(2)出队处理模块
voidjose(LNode*ppHead,intm_pwd)
(3)约瑟夫环说明输出模块
voidinstruction()
(4)菜单模块
voidmenu()
(5)主函数模块
intmain()
原理图介绍
2.2.1功能模块图
2.2.2流程图分析
1.
2.
3.voidinstruction()
{
printf("****************************************************************\n");
printf("约瑟夫环:
\n");
printf("编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");
printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");
printf("按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n");
printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");
printf("直到所有人全部出列为止.编程打印出列顺序.\n");
printf("******************************************************\n");
return0;
}
4菜单模块
voidmenu(){
printf("**************************约瑟夫环*****************************\n");
printf("\n");
printf("[1]约瑟夫环问题的阐述\n");
printf("[2]按要求求解约瑟夫环\n");
printf("[0]退出\n");
printf("**************************欢迎使用!
****************************\n");
}
5.
3调试与分析
3.1调试过程
在调试程序是主要遇到一下几类问题:
这是一个使用循环链表的经典问题。
本程序开始运行界面如下:
选择1进入约瑟夫环问题阐述。
①选择2,输入下列数据测试:
请输入总人数n:
7
请输入开始上限数m:
20;
请依次输入每个人的密码:
3172484
出队顺序:
6147235
②继续选择2,输入下列数据测试:
请输入总人数n:
5
请输入开始上限数m:
30
请依次输入每个人的密码:
34567
出队顺序:
53124
③继续选择2,输入下列数据测试:
请输入总人数n:
8
请输入开始上限数m:
14
请依次输入每个人的密码:
345678910
出队顺序:
67283514
测试完成,选择0退出。
.
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,2005..
[4]严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.
[5]《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).
附录(关键部分程序清单)
程序代码
{
#include
#include
//
typedefstructLNode//定义单循环链表中节点的结构
{
intnum;//编号
intpwd;//password
structLNode*next;//指向下一结点的指针
}LNode;
/*构造结点*/
LNode*createNode(intm_num,intm_pwd)
{
LNode*p;
p=(LNode*)malloc(sizeof(LNode));//生成一个结点
p->num=m_num;//把实参赋给相应的数据域
p->pwd=m_pwd;
p->next=NULL;//指针域为空
returnp;
}
/**创建循环链表**/
voidcreateList(LNode**ppHead,intn)
{/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若
建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指
向的数据元素为p,后续为"空"的节点,再把P插入循环链表ppHead中*/
inti,m_pwd;
LNode*p,*cur;//cur:
浮标指针
for(i=1;i<=n;i++)
{
printf("输入第%d个人的密码:
",i);
scanf("%d",&m_pwd);//输入持有密码
p=createNode(i,m_pwd);//调用构造结点函数
if(*ppHead==NULL)//如果头结点为空
{
*ppHead=cur=p;//生成头结点,让cur指向他
cur->next=*ppHead;//cur的指针域指向自身
}
else//如果不为空,则插入结点
{
p->next=cur->next;
cur->next=p;
cur=p;//cur指向新插入结点
}
}
printf("完成创建!
\n");//提示链表创建完成
}
/*出队处理*/
voidjose(LNode*ppHead,intm_pwd)
{/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释
放ppHead,如此循环,直至把所有节点都打印和删除为止!
*/
inti,j;
LNode*p,*p_del;//定义指针变量
for(i=1;p!
=ppHead;i++){
for(j=1;j p=ppHead;//p赋值为ppHead,p指向要删除结点的前一个结点 ppHead=ppHead->next;//ppHead指向下一个元素 } p->next=ppHead->next;//p结点与头结点链接 i=ppHead->pwd;//i赋值为ppHead->pwd j=ppHead->num;//j赋值为ppHead->num,j为要删除的密码值 printf("第%d个人出列,密码: %d\n",j,i); m_pwd=ppHead->pwd;//m_pwd赋值为ppHead->pwd free(ppHead);//释放头结点 ppHead=p->next;//ppHead重新赋值给p->next,即释放前的ppHead->pwd指针//删除报数结点 } i=ppHead->pwd;//i赋值为ppHead->pwd j=ppHead->num;//j赋值为ppHead->num printf("最后一个出列是%d号,密码是: %d\n",j,i); free(ppHead);//释放头结点 } voidinstruction() { printf("****************************************************************\n"); printf("约瑟夫环: \n"); printf("编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n"); printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n"); printf("按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n"); printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n"); printf("直到所有人全部出列为止.编程打印出列顺序.\n"); printf("******************************************************\n"); return0; } voidmenu(){ printf("**************************约瑟夫环*****************************\n"); printf("\n"); printf("[1]约瑟夫环问题的阐述\n"); printf("[2]按要求求解约瑟夫环\n"); printf("[0]退出\n"); printf("**************************欢迎使用! ****************************\n"); } /*主函数模块*/ intmain(){ intn,m,x; LNode*ppHead=NULL; menu(); { printf("\n请选择要执行的操作: "); scanf("%d",&x); system("cls"); switch(x){ case1: printf("****************************************************************\n"); printf("约瑟夫环: \n"); printf("编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n"); printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n"); printf("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告 约瑟夫 环胡存夫
![提示](https://static.bdocx.com/images/bang_tan.gif)