C语言课程设计报告约瑟夫环胡存夫

合集下载

C实验报告约瑟夫斯环问题

C实验报告约瑟夫斯环问题

约瑟夫斯(Josephus)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。

试设计一个程序,按出列顺序印出各人编号。

2.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。

3.测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4。

m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。

4.简述每一部分的对象、目的和要求:(1)主函数部分:对象:链表;目的:创建新链表;要求:将该链表初始化。

(2)被调函数部分:对象:结构体;目的:创建循环链表并且模拟约瑟夫斯问题;要求:让链表首尾相接,并且释放原来单链表的头结点空间。

通过该函数的调用,依次输出各结点的编号,并且符合规则。

二.需求分析1.程序所能达到的基本可能:该程序用循环链表来模拟n个人顺时针围坐一圈,用链表中的每一个结点代表一个人,结点结构体中设置两个变量,分别存放其编号以及密码。

在输入初始密码后,对该链表进行遍历,直到遍历到第m个结点,释放其空间,使其出列。

然后用被释放空间结点的密码值作为新的密码值,重复上述过程,直至所有结点被释放空间出列,链表成为空链表。

2.输入输出形式及输入值范围:程序运行后显示提示信息:"Please input a data:",提示用户输入密码信息,在输入达预定次数后自动跳出该循环,同时循环链表创建成功,在主函数中有相应的输出给予检验。

然后程序显示提示信息:"Please input the number m:",提示用户输入初始密码,程序执行结束后会输出相应的出列结点的顺序,亦即其编号。

c课程设计约瑟夫环

c课程设计约瑟夫环

c 课程设计约瑟夫环一、教学目标本课程的目标是让学生理解和掌握约瑟夫环的原理及其在计算机科学中的应用。

知识目标包括:了解约瑟夫环的概念、算法实现和数学原理;技能目标涵盖:能够使用至少一种编程语言实现约瑟夫环算法,并进行简单的性能分析;情感态度价值观目标强调:培养学生的逻辑思维能力,激发他们对计算机科学和算法研究的兴趣。

二、教学内容教学内容围绕约瑟夫环的理论基础和实际应用展开。

首先介绍约瑟夫环的基本概念,然后通过编程实践让学生深入理解算法的工作原理。

具体包括:1.约瑟夫环的定义及其在计算机科学中的应用。

2.约瑟夫环算法的不同变体及其实现方法。

3.循环队列的概念及其在约瑟夫环算法中的作用。

4.通过编程练习,掌握至少两种不同的编程语言实现约瑟夫环算法。

三、教学方法为了提高学生的理解能力和实践技能,将采用多种教学方法相结合的方式:1.讲授法:用于解释约瑟夫环的基本概念和数学原理。

2.案例分析法:通过分析具体的约瑟夫环应用实例,加深学生对知识点的理解。

3.实验法:安排实验室实践环节,让学生亲自编写代码实现算法。

4.分组讨论法:鼓励学生在小组内交流想法,共同解决问题,培养团队协作能力。

四、教学资源为了支持课程的顺利进行,将准备以下教学资源:1.教材:《计算机科学基础》相关章节。

2.参考书籍:提供关于算法和数据结构的进阶阅读材料。

3.多媒体资料:制作PPT和视频教程,辅助学生理解复杂概念。

4.编程环境:为学生提供合适的编程环境和在线编程平台。

5.实验设备:确保实验室中每名学生都有足够的机器进行编程实践。

五、教学评估教学评估是衡量学生学习成果的重要手段。

本课程的评估方式包括:平时表现(30%)、作业(20%)、小测验(20%)、实验报告(20%)和期末考试(10%)。

平时表现评估将基于学生的课堂参与、提问和小组讨论;作业将主要是编程练习,旨在巩固课堂所学;小测验将定期进行,以检查学生的理解程度;实验报告将评价学生对实验操作的理解和分析能力;期末考试将涵盖所有课程内容,测试学生的综合理解能力。

约瑟夫环程序设计报告书

约瑟夫环程序设计报告书

4:课程设计报告书附件《数据结构》课程设计报告环Joseph)约瑟夫(第七组别组组长成组员成绩教师指导计算机科学与技术系日11月6年2014.摘要约瑟夫环问题是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。

对于前者要求建立起数据一致性和完整性强、数据安全性好的库。

而对于后者则要求应用程序功能完备,易使用等特点。

经过分析,我们使用MICROSOFT公司的Microsoft Visual C++6.0开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操作数据库的智能化对象,首先在短时间内建立系统原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。

关键词:单循环链表;c 语言;约瑟夫环;序言数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。

该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要内容。

本次课程设计的内容是用单循环链表模拟约瑟夫环问题,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的链接方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。

通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。

通过该课程设计,能运用所学知识,能上机解决一些实际问题,了解并初步掌握设计、实现较大程序的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

章节安排1........................... 摘要、序言....一、问题描述1、课程设计目的.................. (4)2、课程设计任务.................. (4)二、设计过程1、设计思想(数据结构).................. . (4)2、设计表示(函数说明).................. . (5)3、详细设计(主要算法).................. . (6)4、用户手册(使用说明).................. . (6)三、测试报告1、测试用例.................. .... . (6)2、测试结果.................. .... . (6)3、分析探讨.................. .... . (7)四、总结................ .... . (10)五、附录(源程序)...... ...... ... ......... ..10六、参考文献......... .... ......... ... . (16)章节安排:一、问题描述1、课程设计目的1.掌握单向循环链表的建立。

C语言课程设计报告(约瑟夫环)胡存夫

C语言课程设计报告(约瑟夫环)胡存夫

C语言课程设计报告(约瑟夫环)胡存夫沈阳航空航天大学课程设计报告课程设计名称:C语言课程设计课程设计题目:约瑟夫环院:计算机学院专业:计算机科学与技术班级:3410301学号:2013040103023姓名:胡存夫指导教师:丁一军沈阳航空航天大学课程设计报告目录 1 课程设计介绍............................................................... ............................................. 1 课程设计内容及要求............................................................... ............................. 1 系统需求............................................................... ................................................. 1 2 课程设计原理............................................................... ............................................. 3 课设题目粗略分析............................................................... ................................. 3 功能模块图............................................................... ...................................... 5 流程图分析............................................................... ...................................... 5 3 调试与分析............................................................... ............................................... 10 调试过程............................................................... .. (10)沈阳航空航天大学课程设计报告原理图介绍第三步:第二次,1号出列 1 3 1 2 约瑟夫环原理演示图 3 4 5 6 7 7 2 4 8 4 第一步:给第一个人赋初始密码为:20则从它开始向下走20次,到6第四步:第三次,4号出列最后排序后的密码序列:第二部:第一次停下的位置,此时6号出列,并将他的值作为新的m值,即:新的m=8;从7好开始继续向下走8次,到18 6 3 1 2 4 4 7 1 2 7 3 4 5 图约瑟夫环原理演示图 4 沈阳航空航天大学课程设计报告功能模块图Case 1:一个简单的输出函数,用于说明约瑟夫环;void instruction() Case 2:建立的约瑟夫环,并输出已建立的约瑟夫环:createList(LNode **ppHead,int n) 输出该约瑟夫环的每个人的出列顺序: jose(LNode *ppHead,int Case 0:default : 输入0,退出exit(0);主函数调用函数;main() 菜单函数;void menu() 图约瑟夫环函数调用关系图流程图分析 5 沈阳航空航天大学课程设计报告1. Main()函createList; 创建储存玩家密码的循环单链表的方法从主函数中获取玩家信息n 如果n>0 是否退出创建循环单链表,储存各个玩家密码创建链表完成返回主函数main() 图创建链表函数的数据流程图 2.6 沈阳航空航天大学课程设计报告Main()函jose();出队函数出队处理的方法从循环链表中按初始密码依次扫描,找出对应的玩家序列输出其持有的密码i=ppHead->pwd; j=ppHead->num; 移动浮标指针m_pwd=ppHead->pwd; 输出密码后,删除相应的结点,并释放所占的储存空间free(ppHead); ppHead=p->next; 图出队函数的数据流程图 3. void instruction() {printf(\\\n\ printf(\约瑟夫环:\\n\ printf(\ 编号为1,2,3,4?,n的n个人按顺时针方向围坐一圈,每人持有一个密\\n\ 执行完后返回主函数7 沈阳航空航天大学课程设计报告printf(\码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\\n\ printf(\按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\\n\ printf(\作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\\n\ printf(\直到所有人全部出列为止.编程打印出列顺序.\\n\ printf(\ return 0; } 4菜单模块void menu(){ printf(\约瑟夫环*****************************\\n\ printf(\\\n\ printf(\[1]约瑟夫环问题的阐述\\n\ printf(\[2]按要求求解约瑟夫环\\n\ printf(\ [0]退出\\n\ printf(\欢迎使用!****************************\\n\} 8沈阳航空航天大学课程设计报告 5. 9 沈阳航空航天大学课程设计报告Main()开Menu()功能菜单选择要执行的操作功能1:约瑟夫环说明功能2:按要求求解约瑟夫环输入总人数n 输入开始上线数:功能3:退出系统输入每个玩家的密码调用:createList(&ppHead,n); jose(ppHead,m);函数求解所需的密码序列图主函数数据流程图程序运行完,自动返回到功能菜单 3 调试与分析调试过程在调试程序是主要遇到一下几类问题:这是一个使用循环链表的经典问题。

约瑟夫环问题课程设计报告

约瑟夫环问题课程设计报告

数据结构课程设计报告设计课题:约瑟夫问题院系:计算机科学与技术学院专业班级:计算机网络技术1102班学生姓名:张利学号: 1 1 0 8 0 4 0 2 1 1 指导教师:王昱哲目录1.需求分析 (3)1.1问题描述 (3)1.2功能分析 (4)2.概要设计 (5)3.详细设计 (6)4.调试与操作说明........... 1错误!未定义书签。

总结. (16)一.需求分析1.1问题描述约瑟夫环问题描述的是:设编号为1,2,…,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。

开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。

如此下去,直到所有人都出圈为止。

令n最大值为100。

要求设计一个程序模拟此过程,求出出圈的编号序列。

如下图分析:1.2功能分析约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。

此问题仅使用单循环链表就可以解决此问题。

而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。

在建立双向循环链表时,因为约瑟夫环的大小由输入决定。

为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。

进行操作时,用一个指针current 指向当前的结点,指针front 始终指向头结点。

然后建立双向循环链表,因为每个人的密码是通过rand()函数随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。

图2 约瑟夫环原理演示图二、概要设计1、循环链表抽象数据类型定义typedef struct LNode//定义单循环链表中节点的结构{int num;//编号int pwd;//passwordstruct LNode *next;//指向下一结点的指针}LNode;2、本程序包含一下几个模块(1)构造结点模块LNode *createNode(int m_num,int m_pwd){LNode *p;p=(LNode *)malloc(sizeof(LNode));//生成一个结点p->num=m_num;//把实参赋给相应的数据域p->pwd=m_pwd;p->next=NULL;//指针域为空return p;}(2)创建链表模块void createList(LNode *ppHead,int n)(3)出队处理模块void jose(LNode *ppHead,int m_pwd)(4)约瑟夫环说明输出模块void instruction()(5)菜单模块void menu()(6)主函数模块int main()函数的调用关系图如下:三、详细设计1.主函数图4 主函数数据流程图根据流程图,主函数程序如下:int main(){int n,m,x;LNode *ppHead=NULL;menu();for(;;){printf("\n请选择要执行的操作:");scanf("%d",&x);system("cls");switch(x){case 1:printf("************************************************************ ****\n");printf("约瑟夫环:\n");printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");printf("按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n");printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");printf("直到所有人全部出列为止.编程打印出列顺序.\n");printf("************************************************************ ****\n");main();break;case 2:printf("\n请输入总人数n:");scanf("%d",&n);printf("请输入开始上限数m:");scanf("%d",&m);createList(&ppHead,n);printf("\n");printf("出队顺序:\n");jose(ppHead,m);printf("\n约瑟夫环游戏结束!\n");main();break;case 0:exit(0);default:system("cls");printf("\n您选择的操作有误,请重新选择...\n\n\n");main();}}return 0;}2.链表的创建图5 创建链表函数的数据流程图/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指向的数据元素为p,后续为"空"的节点,再把P插入循环链表ppHead中*/根据流程图,创建链表函数程序如下:void createList(LNode **ppHead,int n){int i,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"); //提示链表创建完成}3.出队处理图6 出队函数的数据流程图/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释放ppHead,如此循环,直至把所有节点都打印和删除为止!*/根据流程图,出队函数程序如下:void jose(LNode *ppHead,int m_pwd){int i,j;LNode *p,*p_del;//定义指针变量for(i=1;p!=ppHead;i++){for(j=1;j<m_pwd;++j){p=ppHead;//p赋值为ppHead,p指向要删除结点的前一个结点ppHead=ppHead->next;//ppHead指向下一个元素}p->next = ppHead->next;//p结点与头结点链接i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->num,j为要删除的密码值printf("第%d个人出列,密码:%d\n",j,i);m_pwd=ppHead->pwd;//m_pwd赋值为ppHead->pwdfree(ppHead);//释放头结点ppHead=p->next;//ppHead重新赋值给p->next,即释放前的ppHead->pwd指针//删除报数结点}i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->numprintf("最后一个出列是%d号,密码是:%d\n",j,i);free(ppHead);//释放头结点}4. 约瑟夫环说明模块void instruction(){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");return 0;}5. 菜单模块void menu(){printf("**************************约瑟夫环*****************************\n");printf(" \n");printf(" [1]约瑟夫环问题的阐述\n");printf(" [2]按要求求解约瑟夫环\n");printf(" [0]退出\n");printf("************************** 欢迎使用!****************************\n");}四、程序调试与测试1. 调用模块时,结点结构的调用与其他模块产生冲突,导致每一行都出现两次错误,加入子函数的声明后错误消失。

约瑟夫环C 代码及实验报告

约瑟夫环C  代码及实验报告

{
outArray[k]=listArray[j];// 将 该 元 素 放 置 到 出 列 数 组
里,并输出
cout<<outArray[k]<<" ";
k++;
listArray[j]=0; //将出列元素置 0
i=1; //下一个元素从 1 开始重新报数
}
else
i++; //报数编号与出列编号不同时,继续报数
if(a[i]==1) {
j=j+a[i]; if(j==m) {
j=0; a[i]=0; k++; cout<<i<<" "; }
} if(i==n)
i=0; }
}
七、实验心得 李孟琪:该实验利用数组实现线性表,算法简便,但产生很多不必要的消耗,下 一步可以尝试采用单链表,双链表实现该问题。 李春阳:通过利用链表编写约瑟夫环,进一步掌握了约瑟夫环的原理,加深了对 链表使用的理解 雷鹤:这次实验遇到的最大问题是拘泥于基本要求中的利用数组来实现线性表, 并用线性表来实现约瑟夫环问题,在尝试用链表实现后问题变得简单了些;在插 入元素这一步费不少时间,头尾节点的移动关系也需要理解
四、详细设计
程序代码:
#include <iostream>
using namespace std;
main()
{
int n,m,k,j;
//n 为总人数,m 为出列编号
cin>>n>>m;
int *listArray=new int[n]; //将 n 个人放在大小为 n 的数组中

(完整word版)C语言约瑟夫环问题

(完整word版)C语言约瑟夫环问题

实验一:约瑟夫环问题一.实验目的:要求设计一个程序模拟约瑟夫环问题过程,求出出列编号序列。

二.实验内容:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码.开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。

如此下去,直到所有人全部出列为止。

令n最大值取30。

要求设计一个程序模拟此过程,求出出列编号序列。

三.实验过程:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,把被删除结点的密码作为新的m值,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。

#include〈stdio.h>#include<stdlib。

h〉#define MAX_NODE_NUM 30#define TRUE 1#define FALSE 0typedef struct NodeType{ int number;int password;struct NodeType *next;}NodeType;/*创建单向循环链表*/static void CreaList(NodeType **,const int);/*运行”约瑟夫环"问题*/static void StatGame(NodeType **, int);/* 打印循环链表*/static void PrntList(const NodeType *);/*得到一个结点*/static NodeType *GetNode(const int, const int);/*测试链表是否为空,空为TRUE,非空为FALSE */ static unsigned EmptyList(const NodeType *);int main(void){ int n,m;NodeType *pHead=NULL;while(1){printf("输入总的人数n(〈=%d):”,MAX_NODE_NUM);scanf("%d",&n);printf(”初始循环的密码为:”);scanf(”%d”,&m);if(n>MAX_NODE_NUM){printf("数字太大,请重新输入!\n");continue;}elsebreak;}CreaList(&pHead,n);printf("\n打印出原始每个结点的序列号和密码\n"); PrntList(pHead);printf(”\n最终每个结点退出的序列号和密码\n");StatGame(&pHead,m);return 0;}static void CreaList(NodeType **ppHead, const int n) {int i,iCipher;NodeType *pNew, *pCur;for(i=1;i〈=n;i++){printf("第%d个人的密码为:",i);scanf(”%d",&iCipher);pNew=GetNode(i,iCipher);if(*ppHead==NULL){*ppHead=pCur=pNew;pCur->next=*ppHead;}else{pNew-〉next=pCur—〉next;pCur-〉next=pNew;pCur=pNew;}}printf(”已完成结点初始化!\n”);}static void StatGame(NodeType **ppHead, int iCipher){int iCounter,iFlag=1,i=1;NodeType *pPrv, *pCur,*pDel;pPrv=pCur=*ppHead;while(pPrv—〉next!=*ppHead)pPrv=pPrv->next;while(iFlag){for(iCounter=1;iCounter〈iCipher;iCounter++){pPrv=pCur;pCur=pCur->next;}if(pPrv==pCur)iFlag=0;pDel=pCur;pPrv-〉next=pCur-〉next;pCur=pCur-〉next;iCipher=pDel—〉password;printf("第%d个退出的是序列号为%d的人,其密码为:%d\n",i, pDel—>number,pDel-〉password);free(pDel);++i;}*ppHead=NULL;}static void PrntList(const NodeType *pHead){const NodeType *pCur=pHead;if (EmptyList(pHead))return;do{printf("第%d 个人,密码:%d\n”,pCur->number,pCur->password);pCur=pCur—〉next;} while (pCur!=pHead);}static NodeType *GetNode(const int iId,const int iCipher){NodeType *pNew;pNew=(NodeType *)malloc(sizeof(NodeType));if(!pNew){printf("错误,内存不足!\n”);exit(—1);}pNew—>number=iId;pNew-〉password=iCipher;pNew—>next=NULL;return pNew;}static unsigned EmptyList(const NodeType *pHead){if(!pHead){printf(”列表为空!\n”);return TRUE;}return FALSE;}。

(完整word版)约瑟夫环课程设计实验报告

(完整word版)约瑟夫环课程设计实验报告

《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:joseph环姓名:院系:计算机学院专业:年级:学号:指导教师:2011年12月18日目录1 课程设计的目的 (2)2 需求分析 (2)3 课程设计报告内容 (3)1、概要设计 (3)2、详细设计 (3)3、调试分析 (x)4、用户手册 (x)5、测试结果 (6)6、程序清单 (7)4 小结 (10)1、课程设计的目的(1)熟练使用C++编写程序,解决实际问题;(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;2、需求分析1、问题描述:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

设计一个程序来求出出列顺序。

2、要求:利用不带表头结点的单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

3、测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?输出形式:建立一个输出函数,将正确的输出序列3、课程设计报告内容概要设计:在理解了题目后,我先想到的是我们所学的单链表,利用单链表先建立循环链表进行存贮,建立完循环链表后,我将所要编写的函数分为了两块,一块是经过学过的单链表改编的循环链表的基本操作函数,还有一块是运行约瑟夫环的函数。

详细设计:我先建立一个结构体,与单链表一样,只是多了一个存密码的code域struct LinkNode{int data; //顺序int code; //密码LinkNode *next;};建立一个类LinkList ,包含的函数:LinkList(); //构造函数void Creat(const int ); //创建循环链表int Delete(LinkNode* ); //删除报到数的结点int Joseph(int ); // 约瑟夫环私有成员是LinkNode* head; //指向第一个结点的指针LinkNode* elem; // 同上int len; //长度我定义了一个elem指针是为了约瑟夫环里运行方便,elem只在约瑟夫环这个函数里用到,其他函数没有特别大的用处。

数据结构 约瑟夫环课程设计报告

数据结构 约瑟夫环课程设计报告

课程设计报告一、需求分析1、本演示程序中,利用单向循环链表存储结构模拟约瑟夫问题的进行。

程序运行后,首先要求用户指定初始报数上限值,然后读取个人的密码。

可设n≤30。

此题所用的循环链表中不需要“头结点”,因此在程序设计中应注意空表和非空表的界限。

2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令:相应的输入数据和运算结果显示在其后。

3、程序执行的命令包括:1)构造约瑟夫环;2)执行约瑟夫环,并输出出列人的序号以及相应的密码;3)结束。

4、测试数据1)m的初始值为20;2)n=7,7个人的密码依次为:3、1、7、2、4、8、4。

3)首先m值为6,正确的出列顺序应为6、1、4、7、2、3、5。

二、概要设计为实现上述程序功能,应以单向循环链表表示约瑟夫环。

为此,需要两个抽象数据类型:单向循环链表和约瑟夫环。

1)、单向循环链表的抽象数据类型定义为:ADT List{数据对象:D={ai|ai∈Elemset,i=1,2,…,n,n≥0}数据关系:R1={<a(i-1),ai>|a(i-1),ai∈D,i=2,…n}基本操作:InitList(&L)操作结果:构造一个空的链表L。

DestroyList(&L)初始条件:线性表L已存在。

操作结果:销毁线性表L。

ListLength(L)初始条件:线性表L已存在。

操作结果:返回L中数据元素个数。

GetElem(L,i,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。

操作结果:用e返回L中第i个数据元素的值。

ListInsert(&L,I,e)初始条件:线性表L已存在,1≤i≤ListLength(L)+1。

操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。

ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。

C语言约瑟夫环课程设计

C语言约瑟夫环课程设计

C语言约瑟夫环课程设计一、教学目标本节课的教学目标是使学生掌握约瑟夫环的原理及其在C语言中的实现。

知识目标包括:理解约瑟夫环的概念、熟悉C语言的基本数据结构和算法。

技能目标则要求学生能够运用C语言实现约瑟夫环问题,并具备一定的调试能力。

情感态度价值观目标则是培养学生的逻辑思维能力,提高他们解决实际问题的兴趣和信心。

二、教学内容本节课的教学内容主要包括两个部分:首先是约瑟夫环的理论基础,包括其概念、原理和应用;其次是C语言的编程实践,包括算法设计、代码编写和调试。

教材选用《C程序设计》一书,具体涉及第7章“循环结构”的内容。

三、教学方法为了达到本节课的教学目标,将采用多种教学方法相结合的方式。

首先是讲授法,用于讲解约瑟夫环的理论基础;其次是讨论法,鼓励学生针对实际问题进行思考和交流;再次是案例分析法,通过分析具体案例,使学生掌握算法设计和代码编写技巧;最后是实验法,让学生在实际操作中提高编程能力。

四、教学资源为了支持教学内容和教学方法的实施,将准备以下教学资源:教材《C程序设计》、参考书《C语言程序设计教程》、多媒体教学课件、在线编程平台和调试工具。

此外,还将利用网络资源,如教学视频、博客和论坛,为学生提供更多的学习资料和实践机会。

五、教学评估本节课的评估方式将采用多元化评价体系,全面反映学生的学习成果。

评估方式包括:平时表现、作业、考试和课堂讨论。

平时表现主要考察学生的出勤、纪律和参与度;作业则主要考察学生的编程能力和理解程度;考试则是对学生整体掌握情况的考察;课堂讨论则主要评估学生的思考能力和团队合作精神。

评估方式将尽量客观、公正,确保全面反映学生的学习成果。

六、教学安排本节课的教学安排将紧凑、合理,确保在有限的时间内完成教学任务。

教学进度将按照教材的章节进行,每个章节安排2-3节课的时间。

教学时间将安排在正常上课时间内,地点则选择计算机实验室,以便学生进行实践操作。

同时,教学安排还将考虑学生的实际情况和需要,如学生的作息时间、兴趣爱好等,尽量让学生在舒适的环境中学习。

约瑟夫环 C语言数据结构实验报告

约瑟夫环 C语言数据结构实验报告

约瑟夫环问题一、实验目的约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。

试设计一个程序求出出列顺序。

基本要求利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。

二、实验内容利用带头结点的单循环链表设计一个程序,以人机交互方式执行,用户制定约瑟夫环游戏的总人数n和初始报数上线m,然后输入每个人所持有的密码password。

模拟约瑟夫环,从头开始报数,直到所有人都出列,系统按照出列顺序给出编号。

三、实验平台Microsoft Visual C++四、设计流程利用单循环链表求解本问题,先创建一个有n+1个结点(包括一个头结点)组成的单循环链表,依次录入n个密码值password。

然后从第一个结点出发,连续略过m-1个结点,将第m个结点从链表中删除,并将第m个结点的密码值作为新的m值,接着再次从下一个结点出发,重复以上过程,直至链表为空。

五、源代码清单#include<stdio.h>#include<malloc.h>typedef struct list{int num;int passward;struct list *next;}node;node *creatlist(int n){node *p,*q,*head;int i=1;head=(node *)malloc(sizeof(node));head->num=i;printf("请输入第1个人的密码:");scanf("%d",&head->passward);p=head;for(i=2;i<=n;i++){q=(node *)malloc(sizeof(node));if(q==0)return 0;printf("请输入第%d个人的密码:",i);scanf("%d",&q->passward);q->num=i;p->next=q;p=q;}p->next=head;return head;}void josephus(node *l,int k){int i;node *p=l,*q,*s;printf("\n-----------按照出列顺序输出每个人的编号-----------\n");while(p->next!=p){for(i=1;i<k;i++){q=p;p=p->next;}printf("第%d个人出列,所持密码是%d\n",p->num,p->passward);k=p->passward;s=p;q->next=p->next;p=p->next;free(s);}printf("第%d个人出列,所持密码是%d\n",p->num,p->passward);printf("\n");}void main(){node *l;int n,k;printf("请输入实验人数n:");scanf("%d",&n);printf("请输入初始报数上限m:");scanf("%d",&k);printf("\n");l=creatlist(n);josephus(l,k);}六、调试与测试结果。

C语言程序设计漫谈之从“约瑟夫问题”谈起

C语言程序设计漫谈之从“约瑟夫问题”谈起

从“约瑟夫问题”谈起约瑟夫问题是一个出现在计算机科学和数学中的问题。

在计算机编程的算法中,类似问题又称为约瑟夫环。

据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

然而Josephus 和他的朋友并不想自杀。

为避免与其他39个决定自杀的犹太人发生冲突,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行,直到仅余15个人为止。

问怎样的排法,才能使每次投入大海的都是非教徒。

【例1】约瑟夫问题。

N个人围成一圈,从某个人开始,按顺时针方向从1开始依次编号。

从编号为1的人开始顺时针“1,2,…M”报数,报到M的人退出圈子。

这样不断循环下去,圈子里的人将不断减少。

由于人的个数是有限的,因此最终会剩下一个人,该人就是优胜者。

输入N和M,输出出圈顺序。

例如,N=6、M=5,出圈的顺序是:5,4,6,2,3,1。

(1)编程思路。

为输出出圈顺序,采用一个数组来进行模拟。

定义int circle[N+1],并按circle[i]=i+1的方式赋予各元素初值。

该值代表两个含义:1)值为0,代表编号i+1的人不再圈中;2)值非0,代表圈中第i个位置的人编号为i+1。

定义变量i代表报数位置的流动,i的初值为0,代表编号为1的人的位置,i的变化方式为:i=(i+1)%(n),即0-->1-->2……->n-1 ->0-->1……。

c语言课程设计-约瑟夫问题

c语言课程设计-约瑟夫问题
char c=0,c1,c2;/*字符型字符变量*/
char User[100];/*字符型数组,用于保存输入的下海人号码*/
4、各模块的划分
下面是总体流程(简化图):
5、各程序模块功能
1.注册信息密码模块:用于输入用户自己的名称(字符型),保存到(mima.dat)中。2.输入密码,进入游戏模块:输入密码,程序判断,若在文件(mima.dat属于密文,在输入到文件中的信息经过了程序加密)有记录即可进入游戏(3.中介绍游戏模块)。3.约瑟夫游戏模块:用户先确定写入的文件;输入人数及号码;若进行自测,用户自行输入下海人的号码,程序会判断对错。若不自测就直接程序算出结果。4.在屏幕上显示结果模块:先确定文件;再把此文件中的结果输出到屏幕上。5.删除文件(默认文件outfile.txt)中的全部内容。
p->state=1;/*则就是不再包含已经丢下海的人*/
}
}
getch();
fputs("\n",fp1);
scanf("%d",&k);
while(k>=100||k<=0)
{
printf("WRONG! OVER the (0~100),input again:\n");
scanf("%d",&k);
}
fprintf(fp1,"Please input the number (zi ce shu ju de ge shu ):%d\n",k);
do
{
clrscr();/*清除屏幕*/
h=creat();/*用于返回一个结构体型的指针赋给h*/
printf("Open outfile.txt (1)OR zi jian wen jian:(2):\nchoose:");

c课程设计约瑟夫环

c课程设计约瑟夫环

c 课程设计约瑟夫环一、教学目标本节课的教学目标是让学生掌握约瑟夫环的原理和实现方法。

知识目标要求学生理解约瑟夫环的概念、算法原理及其在计算机科学中的应用;技能目标要求学生能够运用约瑟夫环算法解决实际问题;情感态度价值观目标要求学生培养团队合作意识,提高动手实践能力。

二、教学内容本节课的教学内容主要包括约瑟夫环的原理、算法实现及其应用。

首先,介绍约瑟夫环的基本概念,让学生了解其背景和应用场景;其次,讲解约瑟夫环算法的原理,引导学生理解算法的基本思路;最后,通过编程实践,让学生动手实现约瑟夫环算法,并探讨其在计算机科学中的应用。

三、教学方法为了达到本节课的教学目标,采用多种教学方法相结合的方式进行教学。

首先,运用讲授法,清晰地讲解约瑟夫环的原理和算法;其次,采用讨论法,引导学生探讨约瑟夫环算法的优缺点及改进方向;接着,运用案例分析法,分析约瑟夫环在实际问题中的应用;最后,通过实验法,让学生动手实践,巩固所学知识。

四、教学资源为了支持本节课的教学内容和教学方法的实施,准备以下教学资源:教材《计算机科学导论》、参考书《算法导论》、多媒体资料(包括约瑟夫环的动画演示和编程实例)、实验设备(计算机和网络设备)。

这些资源将有助于丰富学生的学习体验,提高教学效果。

五、教学评估本节课的评估方式包括平时表现、作业和考试三个部分。

平时表现主要评估学生在课堂上的参与程度、提问和回答问题的积极性等;作业主要评估学生对课堂所学知识的掌握程度;考试则全面测试学生对约瑟夫环原理和算法实现的掌握情况。

评估方式客观、公正,能够全面反映学生的学习成果。

六、教学安排本节课的教学安排如下:共4课时,每课时45分钟。

第一课时介绍约瑟夫环的概念和原理;第二课时讲解约瑟夫环算法的实现;第三课时进行编程实践,让学生动手实现约瑟夫环算法;第四课时进行课堂讨论和总结。

教学安排合理、紧凑,确保在有限的时间内完成教学任务。

七、差异化教学根据学生的不同学习风格、兴趣和能力水平,设计差异化的教学活动和评估方式。

约瑟夫环程序设计报告书

约瑟夫环程序设计报告书

附件4:课程设计报告书《数据结构》课程设计报告约瑟夫(Joseph)环组别第七组组长组成员成绩指导教师计算机科学与技术系2014年6月11日摘要约瑟夫环问题是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。

对于前者要求建立起数据一致性和完整性强、数据安全性好的库。

而对于后者则要求应用程序功能完备,易使用等特点。

经过分析,我们使用MICROSOFT公司的Microsoft Visual C++6.0开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操作数据库的智能化对象,首先在短时间内建立系统原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。

关键词:单循环链表;c语言;约瑟夫环;序言数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。

该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要内容。

本次课程设计的内容是用单循环链表模拟约瑟夫环问题,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的链接方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。

通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。

通过该课程设计,能运用所学知识,能上机解决一些实际问题,了解并初步掌握设计、实现较大程序的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

章节安排摘要、序言 (1)一、问题描述1、课程设计目的.................. (4)2、课程设计任务.................. (4)二、设计过程1、设计思想(数据结构).................. . (4)2、设计表示(函数说明).................. . (5)3、详细设计(主要算法).................. . (6)4、用户手册(使用说明).................. . (6)三、测试报告1、测试用例.................. .... . (6)2、测试结果.................. .... . (6)3、分析探讨.................. .... . (7)四、总结................ .... . (10)五、附录(源程序)...... ...... ... ......... ..10六、参考文献......... .... ......... ... . (16)章节安排:一、问题描述1、课程设计目的1.掌握单向循环链表的建立。

约瑟夫环实验报告

约瑟夫环实验报告

程序设计课程设计报告项目名称:约瑟夫环学生姓名:学号:班级:计科1111班指导老师:日期:2013年1月3号1、项目描述约瑟夫问题主要是n个人围坐成一个圈,然后分别给每个参与者编一个号,再定义一个循环数,由玩家自定义起始报数者,当游戏开始时,报数为循环数的人被踢出,其他人继续。

此设计就是通过一位数组、一维结构体数组与循环链表来实现这些功能的。

2、项目的需求分析在软件工程中,需求分析指的是在建立一个新的或改变一个现存的系统或产品时,确定新系统的目的、范围、定义和功能时所要做的所有工作。

需求分析是软件工程中的一个关键过程。

在这个过程中,系统分析员和软件工程师确定顾客的需要。

只有在确定了这些需要后他们才能够分析和寻求新系统的解决方法。

需求按层次分为用户需求和系统需求:用户需求是用自然语言加图的形式给出的、关于系统需要提供哪些服务以及系统操作受到哪些约束的声明;系统需求详细地给出系统将要提供的服务以及系统所受到的约束,系统需求文档有时也称为功能描述,应该是精确的,它可能成为系统买方和软件开发者之间合同的重要内容。

软件系统需求常常分为功能需求和非功能需求:功能需求包括对系统应该提供的服务、如何对特殊输入做出反应,以及系统在特定条件下的行为的描述,在某些情况下,功能需求可能还需声明系统不应该做什么;非功能需求是对系统提供的服务或功能的约束,包括时间约束、开发过程的约束和所受到的标准的约束,非功能需求经常适用于整个系统而不是个别的系统功能或服务,例如性能,可靠性,安全性和可用性等。

非功能需求通常会比个别的功能需求更加关键,它会影响整个系统的体系结构,而不是个别的组件。

例如,为了保证系统的性能需求,就必须合理组织系统使得组件之间的通信量达到最小。

图 1 需求获取和分析的产品2.1、界面需求Microsoft Visual C++ 6.0软件里面实现代码操作,Microsoft Office Word 20032.2、输入输出要求才用C++中的输入输出函数,即cin与cout,而在C中用printf即可。

约瑟夫环设计实验报告

约瑟夫环设计实验报告

一、实验目的1. 理解并掌握约瑟夫环问题的基本原理和解决方法。

2. 熟悉循环链表在数据结构中的应用,并能够运用其解决实际问题。

3. 提高编程能力和算法设计能力,培养逻辑思维和问题解决能力。

二、实验内容1. 实验背景约瑟夫环问题是一个经典的数学问题,描述了N个人围成一圈,按照一定的规则进行报数,最终确定出列顺序的过程。

该问题在计算机科学、通信等领域有广泛的应用。

2. 实验原理本实验采用循环链表作为数据结构来模拟约瑟夫环问题。

循环链表是一种线性表,其特点是最后一个节点的指针指向第一个节点,形成一个环。

在本实验中,我们将每个节点表示为一个人,节点的数据域存储该人的编号。

3. 实验步骤1. 初始化循环链表:首先创建一个循环链表,包含N个节点,节点编号依次为1, 2, ..., N。

2. 设置报数上限:从键盘输入一个正整数M,作为报数上限。

3. 模拟报数过程:a. 从链表头节点开始,按照顺时针方向进行报数。

b. 当报数达到M时,将当前节点出列,并将M的值设置为该节点的数据域。

c. 将指针指向下一个节点,继续进行报数。

d. 重复步骤b和c,直到链表中只剩下一个节点。

4. 输出出列顺序:按照出列的顺序,将每个节点的编号打印出来。

4. 实验代码```c#include <stdio.h>#include <stdlib.h>typedef struct Node {int number;struct Node next;} Node;// 创建循环链表Node createList(int n) {Node head = NULL, tail = NULL, temp = NULL; for (int i = 1; i <= n; i++) {temp = (Node)malloc(sizeof(Node));temp->number = i;temp->next = NULL;if (head == NULL) {head = temp;tail = temp;} else {tail->next = temp;tail = temp;}}tail->next = head; // 形成循环链表return head;}// 打印出列顺序void printOrder(Node head) {Node temp = head;while (temp->next != temp) {printf("%d ", temp->number); temp = temp->next;}printf("%d\n", temp->number);}int main() {int n, m;printf("请输入人数: ");scanf("%d", &n);printf("请输入报数上限: ");scanf("%d", &m);Node head = createList(n);printOrder(head);// 释放内存Node temp;while (head->next != head) {temp = head;head = head->next;free(temp);}free(head);return 0;}```5. 实验结果与分析通过运行实验代码,可以得到约瑟夫环问题的出列顺序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言课程设计报告约瑟夫环胡存夫
沈阳航空航天大学
课程设计报告
课程设计名称:C语言课程设计课程设计题目:约瑟夫环
院(系):计算机学院
专业:计算机科学与技术班级:3410301
学号:
姓名:胡存夫
指导教师:丁一军
目录
1 课程设计介绍 ......................................................... 错误!未定义书签。

1.1课程设计内容及要求 ........................................... 错误!未定义书签。

1.2系统需求............................................................... 错误!未定义书签。

2 课程设计原理 ......................................................... 错误!未定义书签。

2.1课设题目粗略分析 ............................................... 错误!未定义书签。

2.2.1 功能模块图..................................................... 错误!未定义书签。

2.2.2 流程图分析..................................................... 错误!未定义书签。

3 调试与分析............................................................. 错误!未定义书签。

3.1调试过程............................................................... 错误!未定义书签。

参考文献 .................................................................... 错误!未定义书签。

附录(关键部分程序清单) ................................... 错误!未定义书签。

1 课程设计介绍
1.1 课程设计内容及要求
设计程序,实现算术表示式求值,系统主要功能如下:
1.问题描述
约瑟夫环问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将她的密码作为新的m值,从她在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。

试设计一个程序求出出列顺序。

2.分析约瑟夫问题:
n个人围成圈,每人各持一个密码,任选一个正整数作为报数上限值m,从第一个人开始,数到第m个人,删除并以出列者密码作为新的m值,从下一个人开始进行第二轮操作,直到所有人都出列。

设计
1.2 系统需求
1.需求
此程序最终目的是要求出所有人的出列顺序2.功能描述。

相关文档
最新文档