数据结构实验约瑟夫问题实验报告.docx
- 文档编号:6160226
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:10
- 大小:66.08KB
数据结构实验约瑟夫问题实验报告.docx
《数据结构实验约瑟夫问题实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验约瑟夫问题实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构实验约瑟夫问题实验报告
数据结构实验报告
课程名称数据结构
实验名称数据结构试验
专业班级
姓名
学号
实验日期第11周星期日节
2012—2013学年度第一学期
一、实验目的
1、用数组来实现约瑟夫问题
二、实验容
1、试分别用线性表的向量存储结构和数组存储结构来实现约瑟夫(Josephu)问题。
约瑟夫问题如下:
设有n个人围坐圆桌周围。
从某个位置上的人开始从1报数,数到m的人便出列,下一个人(第m+1个)又从1报数开始,数到m的人便是第2个出列的人,依次类推,直到最后一个人出列为止,这样就可以得到一个人员排列的新次序。
例如,n=8,m=4,从第1个人数起,得到的新次序为48521376.
三、实验环境
1、硬件配置:
Pentium(R)Dual-Core9CUPE65002.93GHz,1.96的存
2、软件环境:
MicrosoftWindowsXPProfessionalServicePack3,MicrosoftVisualC++6.0
四、需求分析
1、输入的形式和输入值的围:
根据题目要求与提示输入数据的总数,间隔数和开始计数的位置
2、输出的形式:
输出每个挑选的数据
3、程序所能达到的功能:
从开始计数的位置起,每隔间隔数,就把该位置的数字输出,同时此数被释放掉,然后从继续此操作,若到数据结束位置,则重新开始进行。
程序结束的条件是所有的数据输出,释放掉。
4、测试数据:
输入一个链表,首先输入数据总数,然后输入间隔数,再输入起始位置,若起始位置大于数据总数,会提示错误,要求重新输入起始位置,直至起始位置不大于总数。
然后开始输入数据,数据以空格隔开,最后输出结构。
如:
输入数据总数8,间隔数4,起始位置1,输入数据12345678
输出的链表为:
48521376
五、概要设计
为了实现上述操作,应以数组结构。
1、本程序包含二个模块:
(1)主程序模块;
3、流程图
输入数据的总数num
间隔数count
起始位置start
当Start>num
输入总数num
输入起始位置start
当I 按输入顺序将输入的数字存进a数组中 设定这个循环是死循环 I++ I==num 是 否 I=i%num A[i]! =0 是 否 I++ J==count 是 否 B[k++]=a[i] A[i]=0 J=0 K==num 是 否 跳出循环 当K 输出数组B 六、详细设计 主函数详解 #include"stdio.h" voidmain() { inta[10],b[10],i,j,k,count,num,start; printf("请输入总数: "); scanf("%d",&num); printf("请输入间隔数: "); scanf("%d",&count); printf("请输入起始位置: "); scanf("%d",&start); printf("\n"); while(start>num) { printf("请重新输入: \n"); printf("请输入总数: "); scanf("%d",&num); printf("请输入起始位置: "); scanf("%d",&start); } printf("请输入数据: \n"); for(i=0;i scanf("%d",&a[i]); printf("\n"); i=start-1;//为了保持起始条件匹配 k=0; for(j=1;;)//为死循环 { i++; if(i==num)//为了实现每次i的循环遍历A数组 i=i%num; if(a[i]! =0)//只有a[i]不为零时,才能j++ j++; if(j==count)//达到间隔数 { b[k++]=a[i];//将a数组的值赋给b数组 a[i]=0; j=0;//使记录间隔的重新开始计数 } if(k==num)//当b数组有了a数据全部数据时,结束循环 break; } printf("标准顺序为: \n"); for(k=0;k printf("%d",b[k]); printf("\n"); } 3、完整的程序: #include"stdio.h" voidmain() { inta[10],b[10],i,j,k,count,num,start; printf("请输入总数: "); scanf("%d",&num); printf("请输入间隔数: "); scanf("%d",&count); printf("请输入起始位置: "); scanf("%d",&start); printf("\n"); while(start>num) { printf("请重新输入: \n"); printf("请输入总数: "); scanf("%d",&num); printf("请输入起始位置: "); scanf("%d",&start); } printf("请输入数据: \n"); for(i=0;i scanf("%d",&a[i]); printf("\n"); i=start-1; k=0; for(j=1;;) { i++; if(i==num) i=i%num; if(a[i]! =0) j++; if(j==count) { b[k++]=a[i]; a[i]=0; j=0; } if(k==num) break; } printf("标准顺序为: \n"); for(k=0;k printf("%d",b[k]); printf("\n"); } 七、程序使用说明及测试结果 1、程序使用说明 (1)本程序的运行环境为VC6.0。 (2)进入演示程序后即显示提示信息: 输入一个链表,首先输入数据总数,然后输入间隔数,再输入起始位置,若起始位置大于数据总数,会提示错误,要求重新输入起始位置,直至起始位置不大于总数。 然后开始输入数据,数据以空格隔开,最后输出结构。 2.数据输入如: 输入数据总数8,间隔数4,起始位置1,输入数据12345678 输出的链表为: 48521376 3、调试中的错误及解决办法。 开始遇到很多问题,但是重新改善一下编程的思路,通过逐步的调试可以看到正确的结果。 数据输入的流程如下…… 运行界面 先输入8后,回车: 再输入间隔数4后回车: 输入起始位置 输入数据12345678,回车: 筛选后的结果就如屏幕所示 若中途输入的起始位置为9,回车,会提示如下 八、实验小结: 你在编程过程中花时多少? 总共用来将近2小时 多少时间在纸上设计? 大约有半个小时在纸上设计 多少时间上机输入和调试? 45分钟左右 多少时间在思考问题? 剩下的所有时间在思考这些问题 遇到了哪些难题? 如何实现循环的跳出,还有在轮到输出的数据释放后,该如何调整指针来正常继续运行成程序 你是怎么克服的? 我是通过画过几个数组,然后从手工图中得到了思路 你的收获有哪些? 通过这次试验让我对循环结构有了另外的感悟,还有数组的操作逻辑的看法有了很大改变 签名: 日期: 2012-11-10 实验成绩: 批阅日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 约瑟夫 问题 报告