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

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

《数据结构与算法设计》约瑟夫环实验报告

——实验一

专业:物联网工程

班级:物联网1班

学号:

姓名:刘沛航

一、实验目的

1、熟悉VC环境,学习使用C语言利用链表的存储结构解决实际的问题。

2、在编程、上机调试的过程中,加深对线性链表这种数据结构的基本概念理解。

3、锻炼较强的思维和动手能力和更加了解编程思想和编程技

巧。

二、实验内容

1、采用单向环表实现约瑟夫环。

请按以下要求编程实现:

①从键盘输入整数m,通过create函数生成一个具有m个结点的

单向环表。环表中的结点编号依次为1,2,……,m。

②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始

计数为1,当计数到第n个结点时,输出该第n结点对应的编

号,将该结点从环表中消除,从输出结点的下一个结点开始重

新计数到n,这样,不断进行计数,不断进行输出,直到输出

了这个环表的全部结点为止。

例如,m=10,s=3,n=4。则输出序列为:6,10,4,9,5,2,1,3,8,7。

三、程序设计

1、概要设计

为了解决约瑟夫环的问题,我们可以建立单向环表来存储每

个人的信息(该人的编号以及其下一个人的编号),及结点,人后通过查找每个结点,完成相应的操作来解决约瑟夫问题。

(1) 抽象数据类型定义 ADT Joh{ 数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥K 数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈=K 基本操作: create(&J, n)

操作结果:构造一个有n 个结点的单向环表J 。

show(J) 初始条件:单向环表J 已存在。

操作结果:按顺序在屏幕上输出J 的数据元素。

calculate( J,s,n)

初始条件:单向环表J 已存在,s>0,n>0,s<环表

结点数。

操作结果:返回约瑟夫环的计算结果。

}ADT Joh (2)宏定义

#define NULL 0 #define OK 1 #define ERROR -1

(3)主程序流程

(4)

程序分为下述模块:

1)主函数模块——执行输入调用其他的功能函数 2)创建环表模块——创建单向环表

3)计算处理模块——计算出要出列的标号并输出 4)显示模块——输出建立好的环表 调用关系如下:

2、详细设计

(1)数据类型设计

typedef int ElemType; //元素类型

typedef struct {

ElemType data;

struct Joh *next;

}Joh, *LinkList,*p; //结点类型,指针类型(2)操作算法

Status create(LinkList &J,int n){

//创建一个有n个结点的单向环表

if(n<=0)

return ERROR; //n<0错误

J=(LinkList)malloc(sizeof(J));

J->data=1;

J->next=J;//建立第一个结点

for(int i=n;i>1;--i){

p=(LinkList)malloc(sizeof(J));

p->data=i;

p->next=J->next;J->next=p;//插入到表头

}

return OK;

}//create

void show(LinkList J){//主要的操作函数//顺序输出环表J的结点

p=J;

printf("%d ",p->data);

p=p->next;

while(p!=J){ //循环终止条件

printf("%d ",p->data);

p=p->next;

}

}//show

void calculate(LinkList J,int s,int n){

p=J;

Joh *head=p; //声明结点

while(p->data!=s){

p=p->next;

head=p;

}//寻找起始结点

while(p->next!=p){ //终止条件

for(int i=0;i

head=p; //保存前置节点

p=p->next;

}

printf("%d ",p->data);

head->next=p->next; //删除已输出结点

p=head->next;

}

if(n!=1)

printf("%d\n",p->data);

else

printf("\n");

}//calculate

(3)主函数代码

int main(){//主函数

Joh *J;int m,s,n;

printf("The num of node is:");

scanf("%d",&m);

create(J,m); //创建单向环表J

show(J); //输出J的数据

printf("\n");

printf("The first node which you want is:");

scanf("%d",&s);

printf("The internal which you want is:");

scanf("%d",&n);

calculate(J,s,n); //计算并输出结果

return 0;

}//main

四、程序调试分析

1、细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。在写主要操作函数caculate()时,在终止条件的书写处不是很清楚,导致我浪费了很多时间。

2、还有一点很大的感触就是,在自己绞尽脑汁都解决不了遇到的问题时,一个很好的手段就是询问同学,寻求其帮助,就比如我在想函数终止条件时,同学一句简单的话语就让我如梦初醒。这不是什么丢脸的事情,相反的,在快速解决问题的同时,还会收获友谊,不是一举两得吗。我想,这也是合作学习的真谛吧。

五、用户使用说明

1、本程序的运行环境为Windows操作系统下的Microsoft Visual C++ 6.0。

2、在VC环境下打开程序后,按要求键入要求的数字,以等号或空格断开,敲击“回车符”,即可以显示要求的结果。

3、按下任意键以继续。

等厚干涉--牛顿环实验报告

等厚干涉——牛顿环 等厚干涉是薄膜干涉的一种。薄膜层的上下表面有一很小的倾角是,从光源发出的光经上下表面反射后在上表面附近相遇时产生干涉,并且厚度相同的地方形成同一干涉条纹,这种干涉就叫等厚干涉。其中牛顿环是等厚干涉的一个最典型的例子,最早为牛顿所发现,但由于他主张微粒子学说而并未能对他做出正确的解释。光的等厚干涉原理在生产实践中育有广泛的应用,它可用于检测透镜的曲率,测量光波波长,精确地测量微笑长度、厚度和角度,检验物体表面的光洁度、平整度等。 一. 实验目的 (1)用牛顿环观察和分析等厚干涉现象; (2)学习利用干涉现象测量透镜的曲率半径; 二. 实验仪器 读数显微镜钠光灯牛顿环仪

三. 实验原理 牛顿环装置是由一块曲率半径较大的平凸面放在一块光学玻璃平板(平镜)上构成的,如图。平凸透镜的凸面与玻璃平板之间的空气层厚度从中心到边缘逐渐增加,若以平行单光垂直照射到牛顿环上,则经空气层上、下表面反射的两光束存在光程差,他们在平凸透镜的凸面相遇后,将发生干涉。从透镜上看到的干涉花样是以玻璃接触点为中心的一系列明暗相间的圆环,称为牛顿环。同一干涉环上各处的空气层厚度是相同的,因此他属于等厚干涉。 图2 图3 由图2可见,若设透镜的曲率半径为R ,与接触点O 相距为r 处空气层的厚度为d ,其几何关系式为 2222222)(r d Rd R r d R R ++-=+-= 由于r R >>,可以略去d 2得

R r d 22 = (1) 光线应是垂直入射的,计算光程差时还要考虑光波在平玻璃上反射会有半波损失,,从而带来2λ的附加程差,所以总光程差为 2 2λ + =?d (2) 所以暗环的条件是 2 ) 12(λ +=?k (3) 其中 3,2,1,0=k 为干涉暗条纹的级数。综合(1)(2)(3)式可得第可k 级暗环的半径为 λkR r k =2 (4) 由式(4)可知,如果单色光源的波长λ已知,测出第m 级的暗环半径r m,,即可得出平图透镜的曲率半径R ;反之,如果R 已知,测出r m 后,就可计算出入射单色光波的波长λ。但是用此测量关系式往往误差很大,原因在于凸面和平面不可能是理想的点接触;接触压力会引起局部形变,使接触处成为一个圆形平面,干涉环中心为一暗斑。或者空气间隙层有了灰尘,附加了光程差,干涉环中心为一亮(或暗)斑,均无法确定环的几何中心。实际测量时,我们可以通过测量距中心较远的两个暗环半径r m 和r n 的平方差来计算曲率半径R 。因为 λMR r m =2 λnR r n =2 两式相减可得 λ)(22n m R r r n m -=-

数据结构实验报告(约瑟夫环)

基础成绩:82分《数据结构》课程实验 实验报告 题目:Joseph问题求解算法的设计与实现 专业:网络工程 班级:网络102 姓名:张晨曦 学号: 102534 完成日期:2012/6/20 一、试验内容

- 约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 二、试验目的 掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构。 三、流程图 struct list {

- int num,code; struct list *next; }; void main() { printf("Joseph问题求解算法的设计与实现\n \n"); int i,j,m=1; int key; // 密码. int n; //人数. list *p,*s,*head; head=(list *)malloc(sizeof(list)); //为头结点分配空间. p=head; //使指针指向头节点 printf("输入人的总个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("第%d个人的密码:\n",i); scanf("%d",&key); s=p; p=(list *)malloc(sizeof(list)); //创建新的结点. s->next=p; p->num=i; p->code=key; } p->next=head->next; p=head; head=head->next; free(p); //释放头结点. p=head; printf("\n\n输入初始值:\n"); scanf("%d",&key); printf("\n出列顺序为:\n"); do { j=1; p=head; while(jnext;//使P指向下一结点 j++; } //报数过程. i=p->num; key=p->code; printf("%d\n",i); s->next=p->next;

约瑟夫环实验报告

一.需求分析 1.约瑟夫环(Joseph)问题的一种描述是:编号为1,2……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,有用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在其后。 3.程序执行的命令包括: 1)输入初始密码和人数2)输入所有人的密码3)显示输入的所有人的编号及相应的密码4)输出出列密码及编号5)结束 4.测试数据 (1)m=20, n=7, 7个人的密码依次为3,1,7,2,4,8,4 (2)m=20,n=1 (3)m=20,n=0 前面一组为常规数据,后面两组为边缘数据 二、概要设计 为实现上述功能,应以有序单向循环链表表示约瑟夫环。为此,需要有一个抽象数据类型。该抽象数据类型的定义为: ADT LinkList { 数据对象:D={ ai | ai ∈termset,i=1,2,……n,n>=0}, termset中每个元素包含编号,密码,和一个指向下一节点的指针数据关系:R1={ | ai-1, ai ∈D , i=2,……n} 基本操作: LinkList EvaluList(int n);//对单向循环链表进行尾插入赋值 int size(LinkList L);//求链表的节点个数 Status ScanList(LinkList L);//遍历单向循环链表 Status Joseph(LinkList &L,int m);//约瑟夫环的实现 } 此抽象数据类型中的一些常量如下:#define TRUE 1 #define FALSE 0 #define OK 1

牛顿环测量曲率半径实验报告

实验名称:牛顿环测量曲率半径实验 1.实验目的: 1 观察等厚干涉现象,理解等厚干涉的原理和特点 2 学习用牛顿环测定透镜曲率半径 3 正确使用读数显微镜,学习用逐差法处理数据 2.实验仪器: 读数显微镜,钠光灯,牛顿环,入射光调节架 3.实验原理 图1 如图所示,在平板玻璃面DCF上放一个曲率半径很大的平凸透镜ACB,C点为接触点,这样在ACB和DCF之间,形成一层厚度不均匀的空气薄膜,单色光从上方垂直入射到透镜上,透过透镜,近似垂直地入射于空气膜。分别从膜的上下表面反射的两条光线来自同一条入射光线,它们满足相干条件并在膜的上表面相遇而产生干涉,干涉后的强度由相遇的两条光线的光程差决定,由图可见,二者的光 程差等于膜厚度e的两倍,即

此外,当光在空气膜的上表面反射时,是从光密媒质射向光疏媒质,反射光不发生相位突变,而在下表面反射时,则会发生相位突变,即在反射点处,反射光的相位与入射光的相位之间相差π,与之对应的光程差为λ/2 ,所以相干的两条光线还具有λ/2的附加光程差,总的光程差为 (1) 当?满足条件 (2) 时,发生相长干涉,出现第K级亮纹,而当 (3) 时,发生相消干涉,出现第k级暗纹。因为同一级条纹对应着相同的膜厚,所以干涉条纹是一组等厚度线。可以想见,干涉条纹是一组以C点为中心的同心圆,这就是所谓的牛顿环。 如图所示,设第k级条纹的半径为,对应的膜厚度为,则 (4) 在实验中,R的大小为几米到十几米,而的数量级为毫米,所以R >> e k, e k 2相对于2Re k 是一个小量,可以忽略,所以上式可以简化为 (5) 如果r k是第k级暗条纹的半径,由式(1)和(3)可得 (6)代入式(5)得透镜曲率半径的计算公式

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

信息学院 数据结构实验报告 学号:姓名:班级 课程名称:数据结构实验名称:约瑟夫环 实验性质:①综合性实验√②设计性实验③验证性实验实验时间:2017.10 试验地点: 本实验所用设备:PC及VS2010 【数据结构】: typedef struct _RingNode { int pos; // 位置 struct _RingNode *next; }RingNode, *RingNodePtr; 【算法思想】: 以单链表实现约瑟夫环 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。(约瑟夫环问题Josephus)。以环状链表实现 【算法描述】: void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0) { pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 }

void PrintRing(RingNodePtr pHead) { RingNodePtr pCurr; printf("%d", pHead->pos); pCurr = pHead->next; while(pCurr != NULL) { if(pCurr->pos == 1) break; printf("\n%d", pCurr->pos); pCurr = pCurr->next; } } void KickFromRing(RingNodePtr pHead, int m) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == m) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr; pCurr = pCurr->next; if (pPrev == pCurr) { // 最后一个 printf("\n%d", pCurr->pos); // 显示出圈循序 free(pCurr); break; } i++; } } int main()

牛顿环实验报告

北京师范大学珠海分校大学物理实验报告 实验名称:牛顿环实验测量 学院工程技术学院 专业测控技术与仪器 学号 1218060075 姓名钟建洲 同组实验者 1218060067余浪威 1218010100杨孟雄 2013 年 1 月 17日

实验名称 牛顿环实验测量 一、实验目的 1.观察牛顿环干涉现象条纹特征; 2.学习用光的干涉做微小长度的测量; 3.利用牛顿环干涉测量平凸透镜的曲率半径; 4.通过实验掌握移测显微镜的使用方法 二、实验原理 在一块平面玻璃上安放上一焦距很大的平凸透镜,使其凸面与平面相接触,在接触点 o 附近就形成一层空 气膜。当用一平行的准单色光垂直照射时,在空气膜上表面反射的光束和下表面反射的光束在膜上表面相遇相干,形成以 o 为圆心的明暗相间的环状干涉图样,称为牛顿环。如果已知入射光波长,并测得第 k 级 暗环的半径 r k ,则可求得透镜的曲率半径 R 。但 实际测量时,由于透镜和平面玻璃接触时,接触点有压力产生形变或有微尘产生附加光程差,使得干涉条纹的圆心和环级确定困难。第m 环与第n 环 用直径 D m 、 D n 。 () λ n m n D m D R +-= 42 2此为计算 R 用的公式,它与附加厚度、

圆心位置、绝对级次无关,克服了由这些因素带来的系统误差,并且D m 、 D n 可以是弦长。 三、实验内容与步骤 用牛顿环测量透镜曲率半径 (1).按图布置好实验器材,使用单色扩展光源,将牛顿环装置放在读数显微镜工作台毛玻璃中央,并使显微镜筒正对牛顿环装置中心。 (2).调节读数显微镜。 1.调节目镜,使分划板上的十字刻度线清晰可见,并转动目镜,使十字刻度线的横线与显微镜筒的移动方向平行。 2.调节45度反射镜,使显微镜视觉中亮度最大,这时基本上满足入射光垂直于待测量透镜的要求。 1.转动手轮A,使显微镜平移到标尺中部,并调节调焦手轮B,使物镜接近牛顿环装置表面。 2.对显微镜调焦。缓慢地转动调焦手轮B,使显微镜筒由下而上移动进行调焦,直到从目镜中清楚地看到牛顿环干涉条纹且无视差为止;然后移动牛顿环装置,使目镜中十字刻度线交点与牛顿环中心重合 (1).观察条纹的特征。 观察各级条纹的粗细是否一致,其间距有无差异,并做出解释。观察牛顿环中心是亮斑还是暗斑? (2).测量暗环的直径 转动读数显微镜的读数鼓轮,同时在目镜中观察,使十字刻度线由牛顿环中心缓慢地向一侧移动到43环;然后再回到第42环。自42环起,单方向移动十字刻度,每移3环读数一——直到测量完成另一侧的第42环。并将所测量的第42环到第15环各直径的左右两边的读数记录在表格内。 四、数据处理与结果 1.求透镜的曲率半径。 测出第15环到第42环暗环的直径,取m-n=15,用逐差法求出暗环的直径平方 差的平均值,按算出透镜的曲率半径的平均值R。 R1=(d422-d272)/[4(42-27]λ= 895.85 mm R2=(d392-d242)/[4(39-24]λ= 896.97 mm R3=(d362-d212)/(4(36-21)λ= 887.94mm R4=(d332-d182)/(4(33-18)λ= 893.30mm

约瑟夫环课程设计实验报告

《数据结构》 课程设计报告 课程名称:《数据结构》课程设计课程设计题目: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; /删除的是尾结点时(不知道为什么我写程序里总是编译出现错误){ q->next=head; //重新链接 delete a; len--; return out; } else { q->next=a->next; delete a; len--; return out; } } } } 5、测试结果:

实验报告:牛顿环与劈尖干涉

实验八牛顿环与劈尖干涉 实验时间:实验人: 实验概述 【实验目的及要求】 1.掌握用牛顿环测定透镜曲率半径的方法; 2.掌握用劈尖干涉测定细丝直径(或薄片厚度)的方法; 3.通过实验加深对等厚干涉原理的理解. 【仪器及用具】 钠灯、移测显微镜、玻璃片(连支架)、牛顿环仪、光学平玻璃板(两块)和细丝(或薄片)等. 【实验原理】 牛顿环仪是由待测平凸透镜L和磨光的平玻璃板P叠合安装在金属框架F中构成的(图1).框架边上有三个螺旋H,用以调节L和P之间的接触,以改变干涉环纹的形状和位置.调节H时,不可旋得过紧,以免接触压力过大引起透镜弹性形变,甚至损坏透镜. 当一曲率半径很大的平凸透镜的凸面与一平玻璃板相接触时,在透镜的凸面与平玻璃板之间形成一空气薄膜.薄膜中心处的厚度为零,愈向边缘愈厚,离接触点等距离的地方,空气膜的厚度相同,如图2所示,若以波长为λ的单色平行光投射到这种装置上,则由空气膜上下表面反射的光波将在空气膜附近互相干涉,两束光的光程差将随空气膜厚度的变化而变化,空气膜厚度相同处反射的两束光具有相同的光程差,形成的干涉条纹为膜的等厚各点的轨迹,这种干涉是一种等厚干涉。

在反射方向观察时,将看到一组以接触点为中心的亮暗相间的圆环形干涉条纹,而且中心是一暗斑[图3(a)];如果在透射方向观察,则看到的干涉环纹与反射光的干涉环纹的光强分布恰成互补,中心是亮斑,原来的亮环处变为暗环,暗环处变为亮环[图3(b) ],这种干涉现象最早为牛顿所发现,故称为牛顿环。 在图2中,R 为透镜的曲率半径,形成的第m 级干涉暗条纹的半径为r m ,第m ’级干涉暗条纹的半径为r m ’。 不难证明: λmR r m = (1) ()2 12λ ?-= 'R m m (2) 以上两式表明,当A 已知时,只要测出第m 级暗环(或亮环)的半径,即可算出透镜的曲率半径R ;相反,当R 已知时,即可算出 .但是,由于两接触面之间难免附着尘埃以及在接触时难免发生弹性形变,因而接触处不可能是一个几何点,而是一个圆斑,所以近圆心处环纹粗且模糊,以致难以确切判定环纹的干涉级数,即于涉环纹的级数和序数不一定一致. 因而利用式(1)或式(2)来测量R 实际上也就成为不可能,为了避免这一困难并减少误差,必须测量距中心较远的、比较清晰的两个环纹韵半径,例如测出第m 1个和第m 2个暗环(或亮环)的半径(这里m 1 、 m 2

数据结构实验报告(约瑟夫环)

《数据结构》课程实验 实验报告 题目:Joseph问题求解算法的设计与实现专业:计算机科学与技术 班级: 姓名: 学号: 完成日期:

一、试验内容 约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 二、试验目的 掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构。 三、流程图 输入总人数n 创建并初始化 n个结点 输入第一个报 的数key n==0 报数过程 输出出列者 的编号及密 码 结束 n--

四、源程序代码 //Joseph问题求解算法的设计与实现 #include #include struct list { int num,code; struct list *next; }; void main() { printf("Joseph问题求解算法的设计与实现\n \n"); int i,j,m=1; int key; // 密码. int n; //人数 . list *p,*s,*head; head=(list *)malloc(sizeof(list)); //为头结点分配空间. p=head; printf("输入人的总个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { key=rand() % 100; printf("第%d个人的密码:%d\n",i,key); s=p; p=(list *)malloc(sizeof(list)); //创建新的结点. s->next=p; p->num=i; p->code=key; } p->next=head->next; p=head; head=head->next; free(p); //释放头结点. p=head; do{ printf("\n第%d号成员的密码为:%d",p->num,p->code); //输出链表. p=p->next; }while(p!=head); printf("\n\n输入第一个报的数:\n"); scanf("%d",&key); printf("\n出列顺序为:\n"); do

牛顿环实验报告

等厚干涉——牛顿环 【实验目的】 (1)用牛顿环观察和分析等厚干涉现象; (2)学习利用干涉现象测量透镜的曲率半径; (3)学会使用读数显微镜测距。 【实验原理】 在一块平面玻璃上安放上一焦距很大的平凸透镜,使其凸面与平面相接触,在接触点附近就形成一层空气膜。当用一平行的准单色光垂直照射时,在空气膜上表面反射的光束和 下表面反射的光束在膜上表面相遇相干,形成以接触点为圆心的明暗相间的环状干涉图样,称为牛顿环,其光路示意图如图。 如果已知入射光波长,并测得第k 级暗环的半径 k r ,则可求得透镜 的曲率半径R 。但实际测量时,由于透镜和平面玻璃接触时,接触点有压力产生形变或有微尘产生附加光程差,使得干涉条纹的圆心和环级确定困难。用直径 m D 、n D ,有 λ)(42 2n m D D R n m --= 此为计算R 用的公式,它与附加厚光程差、圆心位置、绝对级次无关,克服了由这些因素带来的系统误差,并且 m D 、n D 可以是弦长。 【实验仪器】 JCD3型读数显微镜,牛顿环,钠光灯,凸透镜(包括三爪式透镜夹和固定滑座)。 【实验内容】 1、调整测量装置 按光学实验常用仪器的读数显微镜使用说明进行调整。调整时注意: (1)调节450玻片,使显微镜视场中亮度最大,这时,基本上满足入射光垂直于透镜的要求(下部反光镜不要让反射光到上面去)。 (2)因反射光干涉条纹产生在空气薄膜的上表面,显微镜应对上表面调焦才能找到清

晰的干涉图像。 (3)调焦时,显微镜筒应自下而上缓慢地上升,直到看清楚干涉条纹时为止,往下移动显微镜筒时,眼睛一定要离开目镜侧视,防止镜筒压坏牛顿环。 (4)牛顿环三个压紧螺丝不能压得很紧,两个表面要用擦镜纸擦拭干净。 2、观察牛顿环的干涉图样 (1)调整牛顿环仪的三个调节螺丝,在自然光照射下能观察到牛顿环的干涉图样,并将干涉条纹的中心移到牛顿环仪的中心附近。调节螺丝不能太紧,以免中心暗斑太大,甚至损坏牛顿环仪。 (2)把牛顿环仪置于显微镜的正下方,使单色光源与读数显微镜上45角的反射透明玻璃片等高,旋转反射透明玻璃,直至从目镜中能看到明亮均匀的光照。 (3)调节读数显微镜的目镜,使十字叉丝清晰;自下而上调节物镜直至观察到清晰的干涉图样。移动牛顿环仪,使中心暗斑(或亮斑)位于视域中心,调节目镜系统,使叉丝横丝与读数显微镜的标尺平行,消除视差。平移读数显微镜,观察待测的各环左右是否都在读数显微镜的读数范围之内。 3、测量牛顿环的直径 (1)选取要测量的m和n(各5环),如取m为55,50,45,40,35,n为30,25,20,15,10。 (2)转动鼓轮。先使镜筒向左移动,顺序数到55环,再向右转到50 环,使叉丝尽量对准干涉条纹的中心,记录读数。然后继续转动测微鼓轮,使叉丝依次与45,40,35,30,25,20,15,10,环对准,顺次记下读数;再继续转动测微鼓轮,使叉丝依次与圆心右10,15,20,25,30,35,40,45,50,55环对准,也顺次记下各环的读数。注意在一次测量过程中,测微鼓轮应沿一个方向旋转,中途不得反转,以免引起回程差。 4、算出各级牛顿环直径的平方值后,用逐差法处理所得数据,求出 直径平方差的平均值代入公式求出透镜的曲率半径,并算出误差。.注意: (1)近中心的圆环的宽度变化很大,不易测准,故从K=lO左右开始比较好; (2)m-n应取大一些,如取m-n=25左右,每间隔5条读一个数。 (3)应从O数到最大一圈,再多数5圈后退回5圈,开始读第一个数据。 (4)因为暗纹容易对准,所以对准暗纹较合适。,

等厚干涉牛顿环实验报告

等厚干涉牛顿环实验报告 This manuscript was revised on November 28, 2020

等厚干涉——牛顿环 等厚干涉是薄膜干涉的一种。薄膜层的上下表面有一很小的倾角是,从光源发出的光经上下表面反射后在上表面附近相遇时产生干涉,并且厚度相同的地方形成同一干涉条纹,这种干涉就叫等厚干涉。其中牛顿环是等厚干涉的一个最典型的例子,最早为牛顿所发现,但由于他主张微粒子学说而并未能对他做出正确的解释。光的等厚干涉原理在生产实践中育有广泛的应用,它可用于检测透镜的曲率,测量光波波长,精确地测量微笑长度、厚度和角度,检验物体表面的光洁度、平整度等。 一. 实验目的 (1)用牛顿环观察和分析等厚干涉现象; (2)学习利用干涉现象测量透镜的曲率半径; 二. 实验仪器 读数显微镜钠光灯牛顿环仪 三. 实验原理 牛顿环装置是由一块曲率半径较大的平凸面放在一块光 学玻璃平板(平镜)上构成的,如图。平凸透镜的凸面与玻 璃平板之间的空气层厚度从中心到边缘逐渐增加,若以平行单光垂直照射到牛顿环上,则经空气层上、下表面反射的两光束存在光程差,他们在平凸透镜的凸面相遇后,将发生干涉。从透镜上看到的干涉花样是以玻璃接触点为中心的

一系列明暗相间的圆环,称为牛顿环。同一干涉环上各处的空气层厚度是相同的,因此他属于等厚干涉。 图2 图3 由图2可见,若设透镜的曲率半径为R ,与接触点O 相距为r 处空气层的厚度为d ,其几何关系式为 由于r R >>,可以略去d 2得 R r d 22 = (1) 光线应是垂直入射的,计算光程差时还要考虑光波在平玻璃上反射会有半波损失,,从而带来λ的附加程差,所以总光程差为 2 2λ + =?d (2) 所以暗环的条件是 2 ) 12(λ +=?k (3) 其中 3,2,1, 0=k 为干涉暗条纹的级数。综合(1)(2)(3)式可得第可k 级暗环的半径为 λkR r k =2 (4) 由式(4)可知,如果单色光源的波长λ已知,测出第m 级的暗环半径r m,,即可得出平图透镜的曲率半径R ;反之,如果R 已知,测出r m 后,就可计算出入射单色光波的波长λ。但是用此测量关系式往往误差很大,原因在于凸面和平面不可能是理想的点接触;接触压力会引起局部形变,使接触处成为一个圆形平面,干涉环中心为一暗斑。或者空气间隙层有了灰尘,附加了光程差,干涉环中心为一亮(或暗)斑,均无法确定环

数据结构课程设计——约瑟夫环报告(含代码)

#include #include typedef struct LNode { //数据域 int cipher; //密码 int number; //编号 struct LNode *next; //指针域 }LNode,*LinkList; void InitList(LinkList &L) //创建一个只有头结点链表{ L = (LinkList)malloc(sizeof(LNode)); if(!L) { exit(1); printf("/n/nError!/n/n"); } L->next = L; } void CreateList(int n,LinkList &L) //初始化循环单链表 { LinkList p,q; q = L; printf("分别输入每个人的密码:"); for(int i = 1;i <= n;i++) { int k; scanf("%d",&k); if(k <= 0) { printf("\n\n密码有误!\n\n"); exit(1); } p = (LinkList)malloc(sizeof(LNode)); if(!p) { exit(1); printf("/n/nError!/n/n"); } p->cipher = k; p->number = i;

L->next = p; L = p; } L->next = q->next; free(q); } void PrintList(int x,int n,LinkList L) //输出出列顺序 { LinkList p,q; p = L; for(int i = 1;i <= n;i++) { for(int j = 1;j < x;j++) p = p->next; q = p->next; x = q->cipher; printf("%d ",q->number); p->next = q->next; free(q); } } int main() { printf("=============约瑟夫环==============\n\n\n"); int n,x; LinkList L; L = NULL; InitList(L); //构造空链表 printf("输入初始密码:"); scanf("%d",&x); //初始密码为x printf("\n"); printf("输入参与总人数:"); scanf("%d",&n); //总共的人数n printf("\n"); CreateList(n,L); //建立好一个约瑟夫环printf("\n\n\n===================================\n\n"); printf("出列编号为:"); PrintList(x,n,L); //输出出列顺序 printf("\n\n"); return 0; }

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

《计算机软件技术基础》实验报告 I —数据结构 实验一、约瑟夫斯问题求解 一、问题描述 1.实验题目:编号 1,2,....,n的n个人顺时针围坐一圈,每人持有一个密码(正整数)。 开始选择一个正整数作为报数上限m,从第一个人开始顺时针自 1 报数,报到m的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从 1 报数,直至所有人全部出列。 2. 基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号。 3. 测试数据: n=7,7 个人的密码依次为:3,1,7,2,4,8, 4.m初值为6(正确的出列顺序 应为 6,1,4,77,2,3)。 二、需求分析 1. 本程序所能达到的基本可能: 该程序基于循环链表来解决约瑟夫问题。用循环链表来模拟n 个人围坐一圈,用链表 中的每一个结点代表一个人和他所代表的密码。在输入初始密码后m,对该链表进行遍历,直到第 m个结点,令该结点的密码值作为新的密码值,后删除该结点。重复上述过程,直至所有的结点被释放空间出列。 2. 输入输出形式及输入值范围: 程序运行后提示用户输入总人数。输入人数 n 后,程序显示提示信息,提示用户输入第 i个人的密码,在输入达到预定次数后自动跳出该循环。程序显示提示信息,提示用户输入 初始密码,密码须为正整数且不大于总人数。 3.输出形式 提示用户输入初始密码,程序执行结束后会输出相应的出列结点的顺序,亦即其编号。 用户输入完毕后,程序自动运行输出运行结果。 4.测试数据要求: 测试数据 n=7,7 个人的密码依次为:3, 1, 7, 2, 4, 8, 4。 m初值为 6(正确的出列 顺序应为6, 1, 4,7, 2, 3, 5)。 三、概要设计 为了实现上述功能,应用循环链表来模拟该过程,用结构体来存放其相应的编号和密码

数据结构实验报告(实验二 约瑟夫环)

韶关学院 学生实验报告册 实验课程名称:数据结构与算法 实验项目名称:实验二线性表及其应用 约瑟夫环 实验类型(打√):(基础、综合、设计√) 院系:信息工程学院计算机系专业:***** 姓名:*** 学号:***** 指导老师:陈正铭 韶关学院教务处编制

一、实验预习报告内容

二、实验原始(数据)记录 实验时间:2007 年 4 月 4 日(星期三第7,8 节)实验同组人:

三、实验报告内容 2007年4 月5 日 注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。 2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。

【源程序】 #include "stdio.h" #include "conio.h" #include "stdlib.h" /* 设立无头结点的单循环链表*/ typedef struct LNode{ int id; /* 编号*/ int pw; /* 密码*/ struct LNode *next; }LNode,*LinkList; void main() { int m,n,pw,i=1,j=0; /* m为初始报数值,n 为参与人数,pw为密码临时保存变量,i、j 为循环变量*/ LinkList L,p,q; /* L为链表头指针,p、q为临时指针*/ printf("输入人数n(n>0):"); scanf("%d",&n); printf("输入第1 人密码:"); scanf("%d",&pw); L=(LinkList)malloc(sizeof(struct LNode)); L->id=i; L->pw=pw; L->next=L; /* 创建首结点*/ q=L; /* q指向尾结点*/ p=L; /* p指向待删除结点前驱*/ for(i=2;i<=n;i++) /* 依次输入第2……第n个参与者密码*/ { printf("输入第%d 人密码:",i); scanf("%d",&pw); p=(LinkList)malloc(sizeof(struct LNode)); p->id=i; p->pw=pw; /* 创建第i个参与者结点p */ q->next=p; /* 在尾结点q后插入新结点p */ q=p; /* 更新q指向新的尾结点p */ p->next=L; /* 新结点p的后继指针指向首结点*/ } printf("输入约瑟夫环的初始报数值m:"); scanf("%d",&m); printf("出列顺序为:"); for(i=1;i<=n;i++) /* n个参与者依次按规则出列*/ { for(j=1;jnext; /* p 指向待删除结点前驱*/ q=p->next; /* q指向待删除结点*/ p->next=q->next; /* 删除结点q */ printf("%d\t",q->id); /* 输出被删结点编号*/ m=q->pw; /* m更新为被删结点的密码值*/ free(q); /* 释放被删结点q */ } getch(); }

等厚干涉牛顿环实验报告

等厚干涉——牛顿环等厚干涉是薄膜干涉的一种。薄膜层的上下表面有一很小的倾角是,从光源发出的光经上下表面反射后在上表面附近相遇时产生干涉,并且厚度相同的地方形成同一干涉条纹,这种干涉就叫等厚干涉。其中牛顿环是等厚干涉的一个最典型的例子,最早为牛顿所发现,但由于他主张微粒子学说而并未能对他做出正确的解释。光的等厚干涉原理在生产实践中育有广泛的应用,它可用于检测透镜的曲率,测量光波波长,精确地测量微笑长度、厚度和角度,检验物体表面的光洁度、平整度等。 一. 实验目的 (1)用牛顿环观察和分析等厚干涉现象; (2)学习利用干涉现象测量透镜的曲率半径; 二. 实验仪器 读数显微镜钠光灯牛顿环仪 三. 实验原理 牛顿环装置是由一块曲率半径较大的平凸面放在 一块光学玻璃平板(平镜)上构成的,如图。平凸透 镜的凸面与玻璃平板之间的空气层厚度从中心到边缘逐渐增加,若以平行单光垂直照射到牛顿环上,则经空气层上、下表面反射的两光

束存在光程差,他们在平凸透镜的凸面相遇后,将发生干涉。从透镜上看到的干涉花样是以玻璃接触点为中心的一系列明暗相间的圆环,称为牛顿环。同一干涉环上各处的空气层厚度是相同的,因此他属于等厚干涉。 图2图3 由图2可见,若设透镜的曲率半径为R ,与接触点O 相距为r 处空气层的厚度为d ,其几何关系式为 由于r R >>,可以略去d 2得 R r d 22 =(1) 光线应是垂直入射的,计算光程差时还要考虑光波在平玻璃上反射会有半波损失,,从而带来2λ的附加程差,所以总光程差为 2 2λ + =?d (2) 所以暗环的条件是 2 ) 12(λ +=?k (3) 其中K 3,2,1, 0=k 为干涉暗条纹的级数。综合(1)(2)(3)式可得第可k 级暗环的半径为 λkR r k =2(4) 由式(4)可知,如果单色光源的波长λ已知,测出第m 级的暗环半径r m,,即可得出平图透镜的曲率半径R ;反之,如果R 已知,测出r m 后,就可计算出入射单色光波的波长λ。但是用此测量关系式往往误差很大,原因在于凸面和平面不可能是理想的点接触;接触压力会引起局部形变,使接触处成为一个圆形平面,干涉环中心为一暗斑。或者空气间隙层有了灰尘,附加了光程差,干涉环中心为一亮(或

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

《数据结构与算法设计》约瑟夫环实验报告 ——实验一 专业:物联网工程 班级:物联网1班 学号: 姓名:刘沛航

一、实验目的 1、熟悉VC环境,学习使用C语言利用链表的存储结构解决实际的问题。 2、在编程、上机调试的过程中,加深对线性链表这种数据结构的基本概念理解。 3、锻炼较强的思维与动手能力与更加了解编程思想与编程技巧。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的 单向环表。环表中的结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)与n,从环表的第s个结点开始计 数为1,当计数到第n个结点时,输出该第n结点对应的编号, 将该结点从环表中消除,从输出结点的下一个结点开始重新计 数到n,这样,不断进行计数,不断进行输出,直到输出了这个环 表的全部结点为止。 例如,m=10,s=3,n=4。则输出序列为:6,10,4,9,5,2,1,3,8,7。 三、程序设计 1、概要设计 为了解决约瑟夫环的问题,我们可以建立单向环表来存储每个人的信息(该人的编号以及其下一个人的编号),及结点,人后通

过查找每个结点,完成相应的操作来解决约瑟夫问题。 (1) 抽象数据类型定义 ADT Joh{ 数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥ 数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作: create(&J, n) 操作结果:构造一个有n 个结点的单向环表J 。 show(J) 初始条件:单向环表J 已存在。 操作结果:按顺序在屏幕上输出J 的数据元素。 calculate( J,s,n) 初始条件:单向环表J 已存在,s>0,n>0,s<环表结点 数。 操作结果:返回约瑟夫环的计算结果。 }ADT Joh (2)宏定义 #define NULL 0 #define OK 1 #define ERROR -1 (3)主程序流程

数据结构:约瑟夫环实验报告

数据结构实验报告 题目:约瑟夫环 姓名: 学号: 专业班级: 指导教师: 课题工作时间:

一.需求分析 1.约瑟夫环(Joseph)问题的一种描述是:设有编号1,2,3。。。n(n>0)的N个人围成一个圈,每个人持有一个密码(正整数)。开始时从第k(1<=k<=n)个人按顺时针方向自1开始顺序报数,报到m(m为第K个人的密码)的人出圈,再以这个人顺时针方向上的下一个人的密码为m,并开始重新从1报数。如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,有用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在其后。 3.测试数据 (1)m=20, n=7, 结果依次为为3,1,7,2,4,8,4 (2)m=20,n=1 (3)m=20,n=0 前面一组为常规数据,后面两组为边缘数据 二、概要设计 本程序是多文件程序,构成的函数有 int main() 主函数,输出出队序列 int initsuiji() 随机数产生初始化 int suiji(int x,int y) 随机数产生函数 int InitList(SqList &L) 初始化顺序表 int ListInsert(SqList &L,int i,ElemType e) 在顺序表中插入元素 int ListDelete(SqList &L,int i,ElemType &e) 删除顺序表中的元素 int shunxu(int number) 顺序存储算法 JosephuNode *Creat_Node(int numbers) 创建单循环链表 void Josephu(JosephuNode *head,int Password) 添加元素信息 int lianbiao(int number) 链表算法 其中,void main()是最主要的函数,分别执行两种算法,并在执行的同时按照出列顺序输出元素信息(编号,密码),并在结尾输出两种算法执行所用的时间长短。 三、详细设计 头文件 #include #include #include

相关文档
最新文档