实验一约瑟夫问题实验报告
- 格式:doc
- 大小:143.00 KB
- 文档页数:6
C++实验报告
题目:菜单设计与出圈游戏
班级: 1602 学号: 161010113 姓名:龚国煌
一、实验目的与要求:
本课程设计的要求,就是设计这个问题的求解,要求使用不同的存储结构来解决此问题:
1.使用数组
2.使用向量
3.使用链表
并将通过菜单来选择运行相应的程序。
二、实验任务:
假设有人数为m个人的一个小组,他们按照顺时针方式围坐一圈。
一开始任选一个正整数n作为报数的上限,自从第一个人开始,或者从某一个人开始报数,按顺时针方向依次报数,报到n停止报数,报数为n 的人出列,然后从他所在的位置的下一个人,重新从一开始报数,报到n时停止报数,报数为n的人出列,如此下去,直到所有的人全部出来为止。
要求按他们出列的顺序输出他们原来的序号。
三、数据测试和运行结果:
数组
向量
链表
四、实验分析:
这次实验分别用了三种储存结构去实现约瑟夫环,并且添加了菜单选择储存结构。
比较这三种储存结构,各有优缺点,也有各自的特色。
链表的优点是可以随时添加新的元素,方便插入和修改,带所需的储存空间加大。
向量相当于一个动态数组,随机储存方便,但在数据超过默认分配空间后需要重新分配、拷贝释放,比较麻烦。
而数组这个平常用的比较多的储存结构,由于插入操作只需更改节点信息而不用更改地址,相比于链表查询效率要高一些,但其固定结构,不适合动态储存的缺点也是不可忽视的。
经过对这三种储存结构的代码实现和对比,我能更加熟练地运用它们,对这三种结构的操作更加清晰了,各种操作名词的记忆也更加牢固。
非线性电路中的混沌现象实验报告篇一:非线性电路混沌实验报告近代物理实验报告指导教师:得分:实验时间: XX 年 11 月 8 日,第十一周,周一,第 5-8 节实验者:班级材料0705学号 XX67025 姓名童凌炜同组者:班级材料0705学号 XX67007 姓名车宏龙实验地点:综合楼 404实验条件:室内温度℃,相对湿度 %,室内气压实验题目:非线性电路混沌实验仪器:(注明规格和型号) 1. 约结电子模拟器约结电子模拟器的主要电路包括:1.1, 一个压控震荡电路, 根据约瑟夫方程, 用以模拟理想的约结1.2, 一个加法电路器, 更具电路方程9-1-10, 用以模拟结电阻、结电容和理想的约结三者相并联的关系1.3, 100kHz正弦波振荡波作为参考信号2. 低频信号发生器用以输出正弦波信号,提供给约结作为交流信号 3. 数字示波器用以测量结电压、超流、混沌特性和参考信号等各个物理量的波形实验目的:1. 了解混沌的产生和特点2. 掌握吸引子。
倍周期和分岔等概念3. 观察非线性电路的混沌现象实验原理简述:混沌不是具有周期性和对称性的有序,也不是绝对的无序,而是可以用奇怪吸引子等来描述的复杂有序——混沌而呈现非周期性的有序。
混沌的最本质特征是对初始条件极为敏感。
1. 非线性线性和非线性,首先区别于对于函数y=f(x)与其自变量x的依赖关系。
除此之外,非线性关系还具有某些不同于线性关系的共性:1.1 线性关系是简单的比例关系,而非线性是对这种关系的偏移1.3 线性关系保持信号的频率成分不变,而非线性使得频率结构发生变化 1.4 非线性是引起行为突变的原因2. 倍周期,分岔,吸引子,混沌借用T.R.Malthas的人口和虫口理论,以说明非线性关系中的最基本概念。
虫口方程如下:xn?1???xn(1?xn)μ是与虫口增长率有关的控制参数,当1 1?,这个值就叫做周期或者不动点。
在通过迭代法解方程的过程中,最终会得到一个不随时间变化的固定值。
《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
一问题描述1 题目内容:约瑟夫(Joseph)问题的一种描述是:编号为1,2,..., n的n 个人按顺时针方向围坐一圈, 每人持有一个密码(正整数)。
一开始选任一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将它的密码作为新的m值。
试设计一个程序求出出列顺序。
2 基本要求:利用单项循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
3 测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4(正确的出列顺序应为6,1,4,7,2,3,5)。
二需求分析程序运行后,首先要求用户指定初始报数上限值,然后读取个人的密码。
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列三概要设计利用单项循环链表存储结构模拟此过程1 循环链表的抽象数据类型循环链表是单链表的一种变化形式,把单链表的最后一个节点的next指针指向第一个节点,整个链表就形成了一个环。
2 循环链表的基本操作(仅列出用在本程序的)creat(n)操作结果:构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针find(m,s)初始条件:循环链表存在操作结果:找到当前元素(即s)后面第m个元素print(&m,&n,&s)初始条件:循环链表存在操作结果:从s中删除约舍夫问题中下一个被删除的元素,并将此元素显示在屏幕上3 本程序包括4个模块:主程序模块;创建循环链表模块;找节点模块;删节点模块;各模块调用关系如下图所示:4 约舍夫问题的伪码算法void main( ){输入参与的人数;输入第一个密码;创建无头节点的循环链表;输出第一个出列元素;输出剩余出列元素;}四详细设计1 实现概要设计的数据类型typedef struct LNode{int data;int num;struct LNode *next;}LNode,*linklist; //无头节点的循环链表的节点类型2 每个子函数的算法linklist creat(int n){/*构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针*/linklist head,s; //head为头节点标记s为链表中节点int i;s=head=(linklist)malloc(sizeof(LNode)); //创建头节点for(i=1;i<n;i++) //建立循环链表{s->data=i;printf("num%d: ",i);scanf("%d",&(s->num));/*输入第i个人的密码*/while(s->num<=0){/*如果输入的s->num小于等于0,要求重新输入*/ printf("请重新输入\nnum%d: ",i);scanf("%d",&s->num);}s->next=(linklist)malloc(sizeof(LNode)); //开辟下一个节点s=s->next;}s->data=i;printf("num%d: ",i);scanf("%d",&(s->num));s->next=head;return(s);}linklist find(int m,linklist s) //找到当前元素后面第m个元素{int i;for(i=0;i<m-1;i++)s=s->next;return(s); //返回找到元素的指针}void print(into &mint &n,linklist &s){linklist p;s=find(m,s); //找到待删除的元素printf("%d ",s->next->data);/*输出找到的元素*/m=s->next->num;/*将此元素从链表中删除,并释放此节点*/ p=s->next;s->next=s->next->next;free(p);--n; //约舍夫环中节点数少一}3 主程序算法void main( ){/*解决约舍夫问题的主函数*/int n,m; //n为约舍夫环内初始人数m为初始密码printf("type in n :");scanf("%d",&n);/*输入n*/while(n<=0){/*如果输入的n小于等于0,要求重新输入*/printf("please type n in again \ntype in n :");scanf("%d",&n);}printf("type in m :");scanf("%d",&m);/*输入m*/while(m<0){/*如果输入的m小于0,要求重新输入*/printf("please type m in again \ntype in m :");scanf("%d",&m);}linklist s;s=creat(n);/*创建无头节点的循环链表,返回指向最后一个元素的指针*/printf("the sequence is ");print(m,n,s);//输出第一个出列的元素while(n){print(m,n,s);//输出剩余出列的元素}printf("\n");}4 函数调用关系图五调试分析调试过程中出现过如下问题:1 开始编程序时没考虑输入错误的问题,导致输入错误后程序出错2 编程序时删除节点子程序结束条件出错3 对开辟的节点用完后没有释放六使用说明程序运行后按提示输入n和m的值,在输入约舍夫环中每个人的密码,运行即可得到出列顺序七测试结果进入程序后要求输入n的值然后输入m的值再输入每个人的密码最后得到出列顺序八附录(源程序)这里附上两种源程序,本质上相同,只是第一个程序按老师要求写为很多子函数形式,第二个是我已开始编的,一个大函数。
约瑟夫效应的原理与应用简介约瑟夫效应(Josephus problem)是一个著名的数学问题和游戏,也被称为约瑟夫斯问题。
问题描述如下:假设有n个人围成一圈,从某个人开始报数,报到m的人出列,接着从出列的下一个人开始重新报数,直到最后只剩下一个人为止。
问题的关键是确定最后剩下的这个人在最初的位置。
约瑟夫问题的解法有很多,包括数学推导和编程算法等。
原理解析约瑟夫效应的原理可以用数学计算来解释。
假设有n个人围成一圈,从第一个人开始报数,每报到m的人出列。
假设第一个出列的人的位置是k,我们可以推导出第二个出列的人的位置是(k+m-1)%n,第三个出列的人的位置是(k+m-1+m-1)%n,以此类推。
最后剩下的那个人的位置就是从1开始数的序号。
应用场景虽然约瑟夫问题看似只是个数学问题或游戏,但实际上它在很多实际场景中都有应用。
下面列举几个常见的应用场景:1.编程算法约瑟夫问题可以用于编程算法的设计与困难的解决。
例如,给定一个数组,要求按照某种规则删除元素,直到最后只剩下一个元素。
这个问题可以通过约瑟夫问题的解决思路来解决。
2.网络协议在一些分布式系统中,节点之间需要按照某种规则进行通信。
约瑟夫问题的解决思路可以用于设计节点间的通信协议,确保每个节点都能按照规则顺序接收到消息。
3.人员调度在一些团队或组织中,需要对人员进行轮换、调度或排班工作。
约瑟夫问题的解决思路可以用于确定轮换、调度或排班的规则,确保公平公正。
编程实现约瑟夫问题的解决方法有很多,其中一种常见的实现方式是使用循环链表。
具体的算法如下:```python def josephus(n, m): # 创建循环链表 circle = [i for i in range(1, n+1)]idx = 0while len(circle) > 1:# 找到要删除的位置idx = (idx + m - 1) % len(circle)# 删除该位置上的元素del circle[idx]return circle[0]测试n = 10 m = 3 result = josephus(n, m) print(。
2009级数据结构实验报告实验名称:实验线性表实现约瑟夫问题求解学生姓名:桂柯易班级:2009211120班内序号:07学号:09210580日期:2010年10月31日1.实验要求【实验目的】1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法;2.学习指针、模板类、异常处理的使用;3.掌握线性表的操作实现方法;4.培养使用线性表解决实际问题的能力。
【实验内容】利用循环链表实现约瑟夫问题的求解。
约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。
从序号为1的人开始报数,顺时针数到m的那个人出列。
他的下一个人又从1开始报数,数到m 的那个人又出列。
依此规则重复下去,直到所有人全部出列。
请问最后一个出列的人的编号。
2.程序分析2.1 存储结构存储结构:循环链表2.2 关键算法分析【设计思想】首先,设计实现约瑟夫环问题的存储结构。
由于约瑟夫环本身具有循环性质,考虑采用循环链表,为了统一对表中任意节点的操作,循环链表不带头结点。
循环链表的结点定义为如下结构类型:struct Node{int number;Node *next;};其次,建立一个不带头结点的循环链表并由头指针first指示。
最后,设计约瑟夫环问题的算法。
【伪代码】1、工作指针first,r,s,p,q初始化2、输入人数(n)和报数(m)3、循环n次,用尾插法创建链表Node *q;for(int i=1;i<=n;i++){Node *p;p=new Node;p->number=i;p->next=NULL;if(i==1) L=q=p;else{q->next=p;q=q->next;}}q->next=L;if(L!=NULL){return(L);}4、输入报数的起始人号数k;5、Node *q = new Node;计数器初始化i=1;6、循环n次删除结点并报出位置(其中第一个人后移k个)当i<n时移动指针m-2次p=p->next;删除p结点的后一结点qq=p->next;p->next=q->next;*L = p->next;报出位置后Delete q;计数器i++;【复杂度】for(int i=1;i<=n;i++){Node *p;p=new Node;p->number=i;p->next=NULL;if(i==1) L=q=p;else{q->next=p;q=q->next;}时间复杂度:O(n)if(i==1) i+=LengthList(*L);Node *p;p=*L;int j=0;while(j<i-2) {p=p->next;j++;}q = p->next;p->next=p->next->next;*L = p->next;return(q);时间复杂度:O(n2)算法的空间复杂度:O(n2)2.3 其他程序源代码:#include<iostream>using namespace std;struct Node//循环节点的定义{int number;//编号Node *next;};Node *CreateList(Node *L,int &n,int &m);//建立约瑟夫环函数void Joseph(Node *L,int n,int m);//输出每次出列号数函数Node *DeleteList(Node **L,int i,Node *q);//寻找每次出列人的号数int LengthList(Node *L);//计算环上所有人数函数void main()//主函数{Node *L;L=NULL;//初始化尾指针int n, m;cout<<"请输入人数N:";cin>>n;//环的长度if(n<1){cout<<"请输入正整数!";}//人数异常处理else{cout<<"请输入所报数M:";cin>>m;if(m<1){cout<<"请输入正整数!";}//号数异常处理else{L=CreateList(L,n,m);//重新给尾指针赋值Joseph(L,n,m);}}system("pause");}Node *CreateList(Node *L,int &n,int &m)//建立一个约瑟夫环(尾插法){Node *q;for(int i=1;i<=n;i++){Node *p;p=new Node;p->number=i;p->next=NULL;if(i==1) L=q=p;//工作指针的初始化else{q->next=p;q=q->next;}}q->next=L;if(L!=NULL){return(L);}//返回尾指针else cout<<"尾指针异常!"<<endl;//尾指针异常处理}void Joseph(Node *L,int n,int m)//输出每次出列的人{int k;cout<<"请输入第一个报数人:";cin>>k;if(k<1||k>n){cout<<"请输入1-"<<n<<"之间的数"<<endl;} else{cout<<"\n出列顺序:\n";for(int i=1;i<n;i++){Node *q = new Node;if(i==1) q=DeleteList(&L,k+m-1,q);//第一个出列人的号数else q=DeleteList(&L,m,q);cout<<"号数:"<<q->number<<endl;delete q;//释放出列人的存储空间}cout<<"最后一个出列号数是:"<<L->number<<endl;;//输出最后出列人的号数}}Node *DeleteList(Node **L,int i,Node *q) //寻找每次出列的人{if(i==1) i+=LengthList(*L);//顺序依次出列情况的处理方式Node *p;p=*L;int j=0;while(j<i-2) {p=p->next;j++;}q = p->next;p->next=p->next->next;*L = p->next;return(q);}int LengthList(Node *L)//计算环上的人数{if(L){cout<<"尾指针错误!"<<endl;}//异常处理else{int i=1;Node *p=L->next;while(p!=L){i++;p=p->next;}return(i);}}3.程序运行结果1.测试主函数流程:2.测试条件:如上图所示,人数为20人,所报数为6,第一个报数的人是1号。
超导现象是指某些材料在低于一定温度时,其电阻突然降至零的现象。
自从1911年荷兰物理学家海克·卡末林·昂内斯发现超导现象以来,超导机理一直是物理学领域的重要研究方向。
近年来,随着材料科学和实验技术的不断发展,超导机理研究取得了显著进展。
本文将对超导机理的最新实验进展进行综述。
二、超导机理研究进展1.高温超导机理高温超导材料的发现打破了传统超导材料临界温度的限制,引起了广泛关注。
目前,高温超导机理的研究主要集中在以下几个方面:(1)铜氧化物高温超导材料铜氧化物高温超导材料是目前研究最为广泛的超导材料。
我国科学家在高温超导机理研究中取得了重要突破,如:- 清华大学物理系张定/薛其坤研究团队利用范德瓦尔斯堆垛技术制备出原子级平整、角度精确可控的转角铜氧化物约瑟夫森结,开展了直接判定超导配对波函数相位部分的实验。
- 复旦大学物理学系团队成功合成了高质量的三层镍氧化物La4Ni3O10单晶样品,并证实了其在高压下具有体超导电性,超导体积分数达到了86%。
(2)铁基高温超导材料铁基高温超导材料是另一种重要的高温超导材料。
近年来,我国科学家在铁基高温超导机理研究中取得了以下进展:- 我国科学家在铁基高温超导材料中发现了马约纳拉零能模,为理解高温超导机理提供了新视角。
2.非常规超导机理非常规超导材料是指除了铜氧化物和铁基高温超导材料之外的其他超导材料。
近年来,我国科学家在非常规超导机理研究中取得了以下进展:- 浙江大学研究团队成功合成了新型铬基笼目晶格反铁磁体CsCr3Sb5,该材料在压力调控下显示出超导电性,为探索非常规超导机理提供了新方向。
超导机理实验研究主要采用以下方法:1. 约瑟夫森结实验:通过制备超导约瑟夫森结,研究超导配对波函数的性质。
2. 比热容测量:通过测量超导材料的比热容,研究超导材料的临界温度和超导态性质。
3. 磁化率测量:通过测量超导材料的磁化率,研究超导材料的磁性质。
实验一线性表的顺序存储一、实验说明实验项目名称:线性表的顺序存储实验类型:基础实验课时:2实验所用主要仪器:微型计算机1台,安装中文版Windows 2000/XP 操作系统、VC++6.0集成编程环境。
二、实验目的:1. 掌握线性表的顺序存储结构。
2. 利用顺序存储结构实现线性表的基本操作。
3. 了解线性表的应用。
三、实验内容1. 运行顺序表的演示程序,掌握顺序表的存储结构的实现,进一步了解顺序表的初始化、查找、插入、删除、销毁等算法的编程实现。
(请运行源程序,写出创建线性表以及线性表的插入、删除、查找等一组测试结果)2. 按课本P43题2.6的要求,在演示程序中增加顺序表逆置功能。
本题要求:(1) 写出顺序表逆置算法加入到程序中并上机验证通过。
(2) 设计一组测试数据,并测试程序各个功能,记录输出结果。
(请查看源码中的reverse(L)函数)3. 约瑟夫圈问题:假设有n个人按1、2、3、…、n的顺序围成一圈。
现在,从第s个人开始按1、2、3、…、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程,直到所有人出圈为止。
求出所有人的出圈顺序。
本题解法1:用顺序表为数据结构来解决这个问题。
算法如下:可以将n个人的编号存入一个一维数组中,表的长度就是人数n,因此,就可以用一维数组来代替顺序表。
算法的思想是:先求出出圈人的编号,用一个临时单元保存它,然后从出圈人的后一个开始,直到最后一个,都按顺序向前移动一个位置,再将临时单元的出圈人编号存入最后。
当这个重复步骤完成后,数组中存放的是出圈人的逆序列。
本题中,围圈的人数n、出圈的报数号m、开始报数的位置s,在程序中预先给定为10、3、2。
当然,用户也可以从键盘临时输入。
本题提供源程序。
(请查看源码中的joes(int n,int s,int m)、joes1(SqList &a,int n,int s,int m)、joes2(SqList a,int n,int s,int m)函数,对比两种方法解决约瑟夫问题的优劣性)本题要求:要求在main函数中修改joes、Joes1函数,设计出至少三组不同的测试数据(对应三个变量人数n、报数号m、开始位置s),记录输出结果。
材料表面与界面趣味实验课实验报告2014年5月18日1. 研究肥皂泡的稳定性的影响因素1,利用表面活性剂溶液(洗洁净)和水按配置不同浓度的泡泡溶液(起始体积浓度参考值1:10,5组)我们利用相同大小{直径为5厘米}的泡沫能保持不破裂的时间来反映泡沫的稳定性,讨论了水比表面活性剂体积比为1:14至1:1共七组,下面是我们做出的实验数据汇总:结果表明水与表面活性剂体积比为1:12吹出来的泡沫稳定性最好2,选取最高泡沫稳定性的溶液加入一定体积的甘油(起始参考浓度1:5,3组)后,研究其时间稳定性,并配制获得能够形成稳定泡沫的表面活性剂溶液;在我们得到的溶液中加入体积比分别为1:8、1:7、1:3的甘油,按照1中的方法,比较其得到的泡沫的稳定性,数据汇总如下:结果表明加入甘油体积比为1:8得到的泡沫稳定性最好。
3,将获得最佳溶液取少量加入食盐、白糖后,观察泡沫的稳定性加入食盐,结果有时吹不出泡泡,解释食盐为表面惰性剂,发生负吸附,增加肥皂水的表面张力,表面张力的趋势是使其收缩,所以不容易吹出泡泡。
加入白糖,结果仍然相当稳定,解释而白糖是多羟基醛,是表面活性剂,发生正吸附,降低肥皂水的表面张力,使其收缩的趋势减小,所以依然能吹出泡泡。
2. 普拉托法则的验证:1,研究两个泡泡相遇的情况,观察边界和夹角;观察到的实验现象:泡沫表面光滑,交界线由两个泡沫的表面和它们的接触面相交形成,成180度,泡沫有明显的干涉现象,反映了其内部液体的流动情况,这种结构可以较长时间存在。
观察到的现象:泡沫表面光滑,三个内接触面直接互相之间成120度角,在泡沫中间我们可以看到四条边界线相交于一点,两两之间的夹角同正四面体的中心与四个顶点连接的连线两两之间所构成的交角一样,在泡沫的边缘(两个泡沫接触的位置),面面间的形成相同的夹角,为120度,这种结构能够稳定存在。
观察到的现象:四个泡沫互相接触时,它的四个内接触面互相之间成90度角,我们同样可以看到四条边界线相交于一点,两两之间的夹角同正四面体的中心与四个顶点连接的连线两两之间所构成的交角一样,在泡沫的边缘(两个泡沫接触的位置),面面间的形成相同的夹角,为120度。
法布尔昆虫记实验报告法布尔昆虫记实验报告1. 引言法布尔昆虫记是一种经典的昆虫学实验,以卓越的观察力和精确的记录而闻名。
该实验通过观察昆虫的行为、生态和适应性等方面,为我们揭示了昆虫的奥秘和进化策略。
本文将详细介绍法布尔昆虫记实验的背景和方法,并探讨实验的重要性和价值。
2. 法布尔昆虫记实验的背景法布尔昆虫记实验得名于法国昆虫学家约瑟夫·保尔·吕尼亚(Jean-Henri Fabre),他是19世纪后期最杰出的昆虫学家之一。
吕尼亚通过观察昆虫的行为和生活习性,以及他对昆虫的情感和深入的记录,创造了这一系统性的实验方法。
3. 实验方法法布尔昆虫记实验的成功源于其精确而周密的实验设计。
以下是实验方法的主要步骤:3.1. 选择研究对象在进行法布尔昆虫记实验之前,我们需要选择目标昆虫进行观察和记录。
常见的研究对象包括蚂蚁、蜘蛛、蝉等,因为它们在行为和生态方面具有丰富的特点。
3.2. 构建观察场所为了进行准确的观察,我们需要建立一个能够再现昆虫的自然环境的观察场所。
这包括提供适当的食物和栖息地,并在适当的环境条件下控制温度、湿度等参数。
3.3. 进行观察通过仔细地观察目标昆虫的行为和生活习性,记录它们在不同环境条件下的反应和适应策略。
我们可以使用显微镜和摄像设备来捕捉昆虫的微观行为。
3.4. 记录数据在观察过程中,我们需要准确记录昆虫的行为、习性和适应性的数据。
这包括时间、地点、温度、湿度等参数,以及昆虫的移动路径、食物摄入情况等。
4. 实验的重要性和价值法布尔昆虫记实验对昆虫学和生态学研究具有重要的意义和价值。
通过深入观察和记录昆虫的行为,我们可以了解昆虫的生活习性和行为模式,揭示它们与环境的相互作用和适应策略。
这有助于我们更好地理解生物进化和生态系统的运作。
法布尔昆虫记实验为昆虫学家提供了一个独特的机会,可以更好地了解昆虫的科学知识,推动昆虫学研究的发展。
通过精确的观察和记录,我们可以对昆虫的生态学、行为学和进化学等方面有更深入的了解。
北京邮电大学信息与通信工程学院
第1页
数据结构实验报告
实验名称: 实验一 ——约瑟夫问题
学生姓名: ***
班 级: 20132111**
班内序号: **
学 号: 201321****
日 期: 2014年1月4日
1. 实验要求
实验题目:
利用循环链表实现约瑟夫问题的求解。
约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编
号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又
从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部
出列。请问最后一个出列的人的编号。
实验目的:
熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法
学习指针、模板类、异常处理的使用
掌握线性表的操作的实现方法
学习使用线性表解决实际问题的能力
2. 程序分析
2.1 存储结构
采用单循环链表实现约瑟夫问题的求解
单循环链表示意图
2.2关键算法分析
1、关键算法
首先通过尾插法建立单循环链表,若只有一个人,即只删除该人即可,若多于一人,
北京邮电大学信息与通信工程学院
第2页
则每查到m个人时删除该节点,并将循环链表连接好,共循环n-1次,每次删除
均返回被删数值。
2、代码详细分析:
1).指针结构、类的声明
struct Node //创立节点
{
int number;
Node *next;
};
class Joseph //建立Joseph类
{
private:
int n;
int m;
Node *front ; //front头指针
public:
Joseph(int nn, int mm); //构造函数
~Joseph(); //析构函数
void Delete(); //删除函数
};
2).单循环链表的建立
Joseph::Joseph(int nn, int mm) //构造函数,建立循环链表
{
n=nn;
m=mm;
Node *p,*rear; //建立两个指针.尾插法,p2始终指向为节点
for(int i=1; i<=n; i++)
{
p=new Node;
p->number=i;
if(i==1) //建立空链表
{
front=p;
rear=p;
}
else
{
rear->next=p;
rear=p;
}
}
rear->next=front; //尾指向头,循环完成
}
算法:
北京邮电大学信息与通信工程学院
第3页
① 设两个指针p,rear, rear为尾节点,p为新增加的节点
② 若是空链表,则front=p; rear=p;
③ 否则用尾插法,即p 在rear的后面,将p给rear;
rear->next=p; rear=p;
④ 头结点赋给rear的指针域,完成循环
循环次数为n, 时间复杂度为O(n)
3). 输入值异常的情况
cout<<"请输入环内总人数n:";
cin>>n;
if (n<1) //考虑n输入错误的情况
{
cout<<"n值输入错误"<
cout<<"请输入m值:";
cin>>m;
if (m<1) //考虑m输入异常的情况
{
cout<<"m值输入错误"<
4).寻找一定间隔的人,并将其删除
void Joseph::Delete() //删除人员的函数
{
Node *p1,*p2,*p;
int count; //用来计数
p1=front; //头结点给p1
if(m==1)
cout<<"最后一个人的编号为"<
{cout<<"每次被删除的人为"<
{
count=1;
while(count
p2=p1; //p2始终为编号为1的那个人
p1=p1->next; //p1向后移
count++;
}
cout<
p=p1;
p2->next=p1->next;
p1=p1->next; //p1后移,防止删除后指针悬挂
delete p;
北京邮电大学信息与通信工程学院
第4页
}
cout<
} }
x
……
p……q
①②③④⑤
图1 删除结点示意图
算法
⑤ 设p1、p2均指向第一个节点;
⑥ 查找第m个节点,p1=p1—>next; p2始终指向第一个节点
⑦ 摘链,将p指向待删除的p1,即将p1元素从链表中摘除:
⑧ 输出p1的数值
⑨ 释放p元素:delete p;
循环次数为m(n-1), 时间复杂度为O(n)
5)析构函数
Joseph::~Joseph() //析构函数
{
delete front;
front=NULL;
}
6)主函数
void main()
{
int n,m;
cout<<"请输入总人数n=";
cin>>n;
cout<<"请输入间隔m=";
cin>>m;
Joseph joseph(n,m);
joseph.Delete();
}
3. 程序运行结果
测试主函数流程:
北京邮电大学信息与通信工程学院
第5页
是
是
流程图示意图
1、 测试条件:n数量级无限制
2、 测试结论
开始
等待用户输入
输入值是否有效
查找删除节点
循环次数是否大于n-1次
输出最后一个数值
结束
北京邮电大学信息与通信工程学院
第6页
4. 总结
由于是第一次做数据结构的实验,而上学期的C++也因长时间没有碰过而稍显手生,在
码程序的过程中遇到了很多问题,但通过翻看教材已基本解决。约瑟夫虽然构思起来比较简
单,但实际执行时经常出现各种意想不到的问题,如输出次数不对等等,通过将近两天的调
试才终于完成,很有成就感。
接下来如果有时间可以在原程序中加入其实位置编号,使得起始位置也可由用户自定。