实验六 堆的基本操作
- 格式:doc
- 大小:91.00 KB
- 文档页数:7
教育研究方法:教育实验的基本类型教育实验的基本类型为了在教育研究中正确运用实验研究法并促进实验法的发展,必须对教育实验作出科学合理的分类。
掌握不同的分类标准,确定教育实验类型、特点、操作程序、适用范围和条件是搞好教育实验的一个重要前提。
(一)实验室实验与自然实验根据实验进行的场所,可分为实验室实验和自然实验。
1.实验室研究实验室实验指研究者根据研究的需要于经过专门设计的、人工高度控制的环境中进行的实验。
这类实验的优点是能把实验中的各种变量严格分离出来,并给予确切的操作与控制,提高研究结论的准确性和可靠性。
2.自然实验自然实验也叫现场实验,是在实际的教育情境中进行的实验。
(二)确认性实验、探索性实验与验证性实验1.确认性实验这类实验的目标主要在于借助实验搜集事实材料,确认所研究的对象是否具有研究假说内容的基本特征,并推动教育实践的发展,也叫试探性实验。
研究问题来自实际,所以具有直接的实践意义。
实验强调的是研究的应用价值,在事实基础上概况经验性规律,追求最大限度的有效性。
这类实验在现场情境下进行,在研究方法上带有很大的试探性,操作程序不太规范。
因此,内在、外在效度均不高。
2.探索性实验这类实验包括有预测作用的超前实验。
它是以认识某种教育现象或受教育者个性发展规律为目标,通过揭示与研究对象有关的因果关系及问题的解决,来尝试创建某种理论体系,所以具有较强的创新性。
探索性实验主要研究教育理论体系中的根本性问题,有重要的理论意义和实践指导意义。
此类实验以专门研究人员为主进行。
3.验证性实验它是以验证已取得的实验成果为目标,对已经取得的认识成果用再实践的经验来检验、修正和完善。
这类实验具有明显的重复性,是在不同环境条件下反复进行的,不仅对实验条件有明确分析,而且实验方案具有可操作性,关注实验结果应用的普遍性,追求实验较高的外在效度。
(三)单因素实验与多因素实验根据同一实验中自变量因素的多少,可分为单因素实验和多因素实验。
实验六熔点的测定和温度计刻度的校正一、实验目的:1、了解熔点测定的意义,掌握测定熔点的操作。
2、了解温度计较正的意义,学习温度计较正的方法。
二、实验原理熔点:通常晶体物质加热到一定温度时,即可从固态变为液态,此时的温度就是该化合物的熔点。
纯化合物从开始熔化(始熔)至完全熔化(全熔)的温度范围叫做熔点距(熔程),也叫熔点范围。
每种纯有机化合物都有自己独特的晶形结构和分子间的力,要熔化它,是需要一定热能的,所以,每种晶体物质都有自己的熔点。
同时,当达溶点时,纯化合物晶体几乎同时崩溃,因此熔点距很小,一般为0.5~1℃,但是,不纯品即当有少量杂质存在时,其熔点一般会下降,熔点距增大。
因此,从测定固体物质的熔点便可鉴定其纯度。
如测定熔点的样品为两种不同的有机物的混合物,例如,肉桂酸及尿素,尽管它们各自的熔点均为133℃,但把它们等量混合,再测其熔点时,则比133℃低得很多,而且熔点距大。
这种现象叫做混合熔点下降,这种试验叫做混合熔点试验,是用来检验两种熔点相同或相近的有机物是否为同一种物质的最简便的物理方法。
三、实验仪器和药品请学生自已整理罗列四、实验装置图五、实验步骤1、准备熔点管通常是用直径1~1.5毫米,长约60~70毫米一端封闭的毛细管作为熔点管2、样品的填装取0.1~0.2 克样品,研成粉未,聚成小堆。
将毛细管开口一端倒插入粉末堆中,样品便被挤入管中,再把开口一端向上,轻轻在桌面上敲击,使粉未落入管底。
也可将装有样品的毛细管,反复通过一根长约40厘米直立于玻板上的玻璃管,均匀地落下,重复操作,以免样品受潮。
样品中如有空隙,不易传热。
样品:分析纯萘,苯甲酸,乙酰苯胺(实验五的产品)样品一定要研得很细,装样要结实。
(每种样品装3根毛细管)3、仪器的安装将熔点测定管夹在铁座架上,装入液体石蜡于熔点测定管中至高出上侧管约1厘米为度,熔点测定管中配一缺口单孔软木塞,温度计插入孔中,刻度应向软木塞缺口。
毛细管附着在温度计旁,样品正好位于水银球的中间部分。
数据结构实验课教案一、实验目的与要求1. 实验目的(1) 掌握数据结构的基本概念和算法。
(2) 培养实际操作能力,巩固课堂所学知识。
(3) 提高编程技能,为实际项目开发打下基础。
2. 实验要求(1) 严格按照实验指导书进行实验。
(2) 实验前认真预习,充分理解实验内容。
(3) 实验过程中积极思考,遇到问题及时解决。
(4) 按时完成实验,积极参与讨论与交流。
二、实验环境与工具1. 实验环境(1) 操作系统:Windows 7/8/10或Linux。
(2) 编程语言:C/C++、Java或Python。
(3) 开发工具:Visual Studio、Eclipse、IntelliJ IDEA或PyCharm。
2. 实验工具(1) 文本编辑器或集成开发环境(IDE)。
(2) 版本控制系统(如Git)。
(3) 在线编程平台(如LeetCode、牛客网)。
三、实验内容与安排1. 实验一:线性表的基本操作(1) 实现线性表的顺序存储结构。
(2) 实现线性表的插入、删除、查找等基本操作。
(3) 分析线性表的时间复杂度。
2. 实验二:栈与队列的基本操作(1) 实现栈的顺序存储结构。
(2) 实现队列的顺序存储结构。
(3) 实现栈与队列的进栈、出栈、入队、出队等基本操作。
(4) 分析栈与队列的时间复杂度。
3. 实验三:线性表的链式存储结构(1) 实现单链表的结构。
(2) 实现单链表的插入、删除、查找等基本操作。
(3) 分析单链表的时间复杂度。
4. 实验四:树与二叉树的基本操作(1) 实现二叉树的结构。
(2) 实现二叉树的遍历(前序、中序、后序)。
(3) 实现二叉搜索树的基本操作。
(4) 分析树与二叉树的时间复杂度。
5. 实验五:图的基本操作(1) 实现图的邻接矩阵存储结构。
(2) 实现图的邻接表存储结构。
(3) 实现图的深度优先搜索(DFS)和广度优先搜索(BFS)。
(4) 分析图的时间复杂度。
四、实验评价与成绩评定1. 实验评价(1) 代码质量:代码规范、注释清晰、易于维护。
实验六时间片轮转调度一、实验目的·调试EOS 的线程调度程序,熟悉基于优先级的抢先式调度。
·为EOS 添加时间片轮转调度,了解其它常用的调度算法。
二、实验内容1、执行了实验指导书3.2的步骤,学习了“rr”命令是如何测试时间片轮转调度的。
算法实现原理是,按进程到达顺序(FCFS 原则)将进程依次加入就绪队列当中,然后将CPU 分配给位于队首的进程,确定一个时间片,让该进程执行一个时间片。
当该进程执行时间到时,该进程可能已经执行完毕(可能在时间片未到时就以及执行完毕),或者未执行完毕,如果是前者只需将进程弹出队列即可,如果是后者则将该进程加入队尾,并将CPU 分配给新的队首进程,如此循环。
在没有时间片轮转调度时的执行结果如下图所示。
2、执行了实验指导书3.3的步骤,对EOS 的线程调度程序PspSelectNextThread 函数进行调试,学习了就绪队列、就绪位图以及线程的优先级是如何在线程调度程序中协同工作的。
调试当前线程不被抢先的情况:基于优先级的抢先式调度算法,新建的第0 个线程会一直运行,而不会被其它同优先级的新建线程或者低优先级的线程抢先。
通过调试可以观察到“rr”命令新建的第0 个线程始终处于运行状态,而不会被其它具有相同优先级的线程抢先。
对在EOS 内核中实现这种调度算法进行调试,刷新“就绪线程队列”窗口,观察到如下图结果。
在“监视”窗口中添加表达式“/t PspReadyBitmap”,以二进制格式查看就绪位图变量的值,此时就绪位图的值为100000001,表示优先级为8 和0 的两个就绪队列中存在就绪线程。
在“快速监视”对话框的“表达式”中输入表达式“*PspCurrentThread”,查看当前正在运行的线程(即被中断的线程)的线程控制块中各个域的值。
通过以上调试线程调度函数PspSelectNextThread 的执行过程,“rr”命令新建的第0个线程在执行线程调度时没有被抢先的原因可以归纳为两点:(1) 第0个线程仍然处于“运行”状态;(2) 没有比其优先级更高的处于就绪状态的线程。
化学实验的基本操作一、实验室安全在进行化学实验之前,首先需要了解实验室的安全规定,并严格遵守。
实验室内应穿戴实验服和防护眼镜,避免直接接触实验物品或化学品。
二、实验仪器准备在进行化学实验之前,需要准备实验所需的仪器。
常见的实验仪器包括试管、烧杯、移液管、热板等。
根据实验需求,选取合适的仪器,并进行清洗和消毒,确保仪器表面干净无杂质。
三、试剂的准备和使用试剂是化学实验中必不可少的物质,需要根据实验要求准备好所需的试剂。
在准备试剂时,应注意使用准确的容量瓶或量筒进行测量,以确保试剂用量的准确性。
在使用试剂时,应注意避免直接接触皮肤和眼睛,如有意外溅到身上,应立即用大量清水冲洗。
四、实验前的预备工作在进行化学实验之前,需要进行一些预备工作,例如校准仪器、调节实验条件等。
在进行校准时,需要使用标准物质进行比对,确保实验结果的准确性。
调节实验条件时,需要根据实验要求调整温度、pH值等参数,以确保实验的顺利进行。
五、注意实验操作细节在进行化学实验时,需要注意实验操作的细节。
例如,在进行试剂混合时,应注意按照实验步骤的顺序进行,并轻轻摇动容器,避免剧烈搅拌产生气泡。
在加热试剂时,应注意控制火力,避免溢出或剧烈反应造成危险。
六、实验数据记录和处理在进行化学实验时,需要及时记录实验数据,并进行处理和分析。
记录实验数据时,应注意记录实验过程中的关键步骤和观察结果。
在处理数据时,需要进行统计和计算,以得出实验结果并进行分析和讨论。
七、实验后的清洗和整理在完成化学实验后,需要对实验仪器和实验台面进行清洗和整理。
将使用过的试剂和仪器进行分类,清洗试剂瓶和仪器表面的残留物,并进行妥善存放。
清洗时可以使用适量的清洁剂和清水,彻底清洗干净,以免影响下次实验的进行。
八、实验结果的总结和展示在完成化学实验后,需要对实验结果进行总结和展示。
总结时可以对实验目的、实验步骤、实验数据和实验结果进行归纳和概述,以展现实验的整体思路和结论。
实验六指针与引用一、目的和要求1.掌握指针、指针变量、指针常量的基本概念;2.掌握指针与数组、指针与函数的关系及应用。
3.初步掌握引用的概念及简单应用。
二、实验设备及分组1.Windows XP操作系统;2.Visual C++6.0语言环境;3.每人一台PC机。
三、内容和步骤(一)验证实验程序1.指针变量的自加、自减、加n和减n运算。
假设数组a的首地址为1000。
解:# include <iostream.h>void main( ){int a[5]={0,1,2,3,4};int *p;p=&a[0]; //p指向a[0],p=1000p++ ; //p指向下一个元素a[1],p=1004cout<< *p<<'\t'; //输出a[1]的内容1。
p=p+3; //p指向下3个元素a[4],p=1016cout<< *p<<'\t'; //输出a[4]的内容4。
p――; //p指向上一个元素a[3],p=1012cout<< *p<<'\t'; //输出a[3]的内容3。
p=p―3; //p指向上3个元素a[0],p=1000cout<< *p<<'\t'; //输出a[0]的内容0。
}运行结果:1 4 3 02.指出下列程序的错误。
#include <iostream.h>void exchange(int,int);void main(){int a,b;cin>>a>>b;cout<<"Before Exchange:a="<<a<<",b="<<b<<endl;exchange(a,b);cout<<"After Exchange:a="<<a<<",b="<<b<<endl;}void exchange(int x,int y){int t;t=x;x=y;y=t;}分析:本例的目的是在子函数中交换的两个变量的值,在主函数中使用。
浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验六堆的基本操作学生姓名专业班级学号实验成绩指导老师(签名)日期一.实验目的和要求1.掌握堆的基本概念。
2.掌握堆基本操作的实现。
二. 实验内容1.实现大根堆用顺序存储结构存储时基本操作的实现。
要求编写头文件Heap.h,包括堆的存储结构定义与基本操作实现函数;编写主函数文件test8_2.cpp,验证头文件中各个操作。
堆的顺序存储结构定义如下:typedef struct {ElemType *heap; //指向动态申请空间的基地址int len; //堆的长度,即实际存储结点个数int MaxSize; //动态申请空间的长度} Heap;大根堆的基本操作如下:①void InitHeap(Heap &HBT);//初始化堆②void ClearHeap(Heap &HBT);//清除堆③bool EmptyHeap(Heap HBT);//检查一个堆是否为空④void InsertHeap(Heap &HBT, ElemType item);//向堆插入一个元素⑤ElemType DeleteHeap(Heap &HBT);//从堆中删除一个元素2.选做:编写一个函数,判断一棵顺序结构存储的完全二叉树是否是大根堆。
函数原型为bool IsHeap(Heap BT),将该函数添加到头文件Heap.h中,并在主函数文件test8_2.cpp中添加相应语句进行测试。
3.填写实验报告,实验报告文件取名为report6.doc。
4.上传实验报告文件report6.doc与源程序文件Heap.h及test8_2.cpp 到Ftp服务器上你自己的文件夹下。
三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路ADT HEAP isData:具有HeapType类型的一个堆HBTOerations:void InitHeap(Heap &HBT); //初始化堆void ClearHeap(Heap &HBT); //清除堆bool EmptyHeap(Heap HBT); //检查一个堆是否为空void InsertHeap(Heap &HBT, ElemType item); //向堆插入一个元素ElemType DeleteHeap(Heap &HBT);//从堆中删除一个元素bool IsHeap(Heap BT, ElemType i);//判断一棵树是否为大根堆。
end HEAPvoid InsertHeap(Heap &HBT, ElemType item)思路:先把新元素加到堆尾,满足完全二叉树形状;然后从下往上调整堆元素,使符合堆的特性。
具体操作为:保证堆的大小足够,插入的元素默认放在堆的最后,依次比较它和其双亲结点(若有)的值的大小,由于题目要求生成大根堆,所以调整位置时若当前结点比其双亲结点大时,将双亲结点的值赋给当前结点。
最后,将插入的值赋给找到的结点,并将堆的长度加1ElemType DeleteHeap(Heap &HBT)思路:即删除堆顶元素。
堆顶位置由堆尾元素来填补,使满足完全二叉树形状;然后需从上往下调整堆元素,使符合堆的特性。
具体操作为:若新调整的元素值小于左右孩子值,则把左右孩子值中较大的一个往上移(即与新元素交换),否则调整过程结束。
bool IsHeap(Heap BT,int i)思路:采用从上往下的方式使用递归。
i代表当前比较的结点,分三种情况:①当前比较的结点为叶结点,没有左右孩子,返回true;②当前结点有左右孩子,则若其比其中一个孩子小,返回false;否则递归调用函数,返回左右孩子是否为大根堆的情况;③当前结点只有左孩子,则若其比左孩子小,返回false,否则返回true。
四. 实验结果与分析包括运行结果截图等根据书中例子分别测试了所有函数的功能,并测试了附加功能。
五. 心得体会记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
【附录----源程序】test8_2.cpp#include<iostream.h>#include<stdlib.h>#include<stdio.h>typedef int ElemType;#include"Heap.h"void main(){Heap a,b;int i,x,n;cout<<"请输入堆中元素的个数: ";cin>>n;cout<<"请输入堆中元素: ";for(i=0;i<n;i++){cin>>x;InsertHeap(a,x);}cout<<"生成的堆为: ";PrintHeap(a);cout<<endl;cout<<"请输入一个需要插入的堆元素: ";cin>>x;InsertHeap(a,x);cout<<"插入后的堆为: ";PrintHeap(a);cout<<endl;i=1;while(!EmptyHeap(a)){x=DeleteHeap(a);cout<<"第"<<i<<"次删除元素为: "<<x<<endl;cout<<"删除后的堆为: ";PrintHeap(a);i++;}cout<<endl;ClearHeap(a);cout<<"*******************选作部分***********************"<<endl; InitHeap(b);cout<<"请输入堆中元素的个数: ";cin>>n;cout<<"请输入堆中元素: ";for(i=0;i<n;i++){cin>>x;InsertHeap(b,x);}cout<<"生成的堆为: ";PrintHeap(b);cout<<"是一个大根堆"<<endl;elsecout<<"不是大根堆"<<endl;}Heap.htypedef struct {ElemType *heap; //指向动态申请空间的基地址int len; //堆的长度,即实际存储结点个数int MaxSize; //动态申请空间的长度} Heap;void InitHeap(Heap &HBT){//初始化堆HBT.MaxSize=10;HBT.heap=new ElemType[HBT.MaxSize];if (!HBT.heap) {cout<<"空间用完!"<<endl;exit(1);}HBT.len=0;}void ClearHeap(Heap &HBT){//清除堆if (HBT.heap!=NULL) {delete [ ] HBT.heap;HBT.heap=NULL;HBT.len=0;HBT.MaxSize=0;}}bool EmptyHeap(Heap HBT){//检查一个堆是否为空return HBT.len==0;}void PrintHeap(Heap &HBT){if(EmptyHeap(HBT)){cout<<"堆为空"<<endl;return;}for(int i=0;i<HBT.len;i++){cout<<HBT.heap[i]<<",";}cout<<endl;}void InsertHeap(Heap &HBT, ElemType item){//向堆插入一个元素int i, j;if (HBT.len==HBT.MaxSize) { //堆满时,重新分配空间HBT.heap=(ElemType *)realloc(HBT.heap, 2* HBT.MaxSize*sizeof(ElemType) );if (!HBT.heap) {cout<<"空间用完!"<<endl;exit(1);}HBT.MaxSize=2*HBT.MaxSize;}i=HBT.len;while (i!=0) { //从下往上,找插入位置j=(i-1)/2;if (item<=HBT.heap[j]) break;HBT.heap[i]=HBT.heap[j];i=j;}HBT.heap[i]=item; //插入HBT.len++;}ElemType DeleteHeap(Heap &HBT){//从堆中删除一个元素int i, j;ElemType temp, x;if (HBT.len==0) { //堆空时,出错退出cerr<<"堆为空!"<<endl;exit(1);}temp=HBT.heap[0]; //暂存堆顶元素,使堆顶位置空出HBT.len--;if (HBT.len==0)return temp;x=HBT.heap[HBT.len]; //暂存堆的待调整的最后一个元素//使i指向待调整元素的位置(空位置),j指向i的左孩子位置i=0; j=1;while ( j<=HBT.len-1 ) { //从上往下调整,把元素上移if (j<HBT.len-1 && HBT.heap[j]<HBT.heap[j+1])j++; //使j指向左右孩子中值较小的一个if (x>=HBT.heap[j])break;HBT.heap[i]= HBT.heap[j];i=j; j=2*i+1;}HBT.heap[i]=x; //插入待调整元素return temp;}bool IsHeap(Heap BT,int i){//没有左右孩子,返回trueif (i*2+1>=BT.len)return true;//有左右孩子if(i*2+2<BT.len){if(BT.heap[i*2+1]>BT.heap[i]||BT.heap[i*2+2]>BT.heap[i])//当前结点比其中一个孩子小,返回falsereturn false;else//递归调用函数,返回左右孩子是否为大根堆的情况return IsHeap(BT,i*2+1)&&IsHeap(BT,i*2+2);}//只有左孩子??else{???//当前结点比左孩子小,返回false;否则返回true if(BT.heap[i*2+1]>BT.heap[i])return false;elsereturn true;}。