数据结构实验约瑟夫问题实验报告.docx

上传人:b****6 文档编号:6160226 上传时间:2023-01-04 格式:DOCX 页数:10 大小:66.08KB
下载 相关 举报
数据结构实验约瑟夫问题实验报告.docx_第1页
第1页 / 共10页
数据结构实验约瑟夫问题实验报告.docx_第2页
第2页 / 共10页
数据结构实验约瑟夫问题实验报告.docx_第3页
第3页 / 共10页
数据结构实验约瑟夫问题实验报告.docx_第4页
第4页 / 共10页
数据结构实验约瑟夫问题实验报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据结构实验约瑟夫问题实验报告.docx

《数据结构实验约瑟夫问题实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验约瑟夫问题实验报告.docx(10页珍藏版)》请在冰豆网上搜索。

数据结构实验约瑟夫问题实验报告.docx

数据结构实验约瑟夫问题实验报告

 

数据结构实验报告

 

课程名称数据结构

实验名称数据结构试验

专业班级

姓名

学号

实验日期第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

实验成绩:

批阅日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1