兰州大学数据结构实验 约瑟夫问题实验报告数组.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-Core9CUPE6500@2.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;iscanf("%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;kprintf("%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;iscanf("%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;kprintf("%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
实验成绩:
批阅日期: