数据结构上机实验8
数据结构实验报告八-快速排序

实验8 快速排序1.需求分析(1)输入的形式和输入值的范围:第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
中间用空格或者回车隔开。
不对非法输入做处理,及假设用户输入都是合法的。
(2)输出的形式:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
(3)程序所能达到的功能:在操作系统中,当有n 件任务同时来临时,每件任务需要用时ni,输出所有任务等待的时间和最小的任务处理顺序。
(4)测试数据:输入请输入任务个数:9请输入任务用时:5 3 4 2 6 1 5 7 3输出任务执行的顺序:1 2 3 3 4 5 5 6 72.概要设计(1)抽象数据类型的定义:为实现上述程序的功能,应以整数存储用户的第一个输入。
并将随后输入的一组数据储存在整数数组中。
(2)算法的基本思想:如果将任务按完成时间从小到大排序,则在完成前一项任务时后面任务等待的时间总和最小,即得到最小的任务处理顺序。
采取对输入的任务时间进行快速排序的方法可以在相对较小的时间复杂度下得到从小到大的顺序序列。
3.详细设计(1)实现概要设计中定义的所有数据类型:第一次输入的正整数要求大于零,为了能够存储,采用int型定义变量。
接下来输入的一组整数,数据范围大于零,为了排序需要,采用线性结构存储,即int类型的数组。
(2)实现程序的具体步骤:一.程序主要采取快速排序的方法处理无序数列:1.在序列中根据随机数确定轴值,根据轴值将序列划分为比轴值小和比轴值大的两个子序列。
2.对每个子序列采取从左右两边向中间搜索的方式,不断将值与轴值比较,如果左边的值大于轴值而右边的小于轴值则将二者交换,直到左右交叉。
3.分别对处理完毕的两个子序列递归地采取1,2步的操作,直到子序列中只有一个元素。
二.程序各模块的伪代码:1、主函数int main(){int n;cout<<"请输入任务个数:";cin>>n;int a[n];cout<<"请输入任务用时:";for(int i=0;i<n;i++) cin>>a[i];qsort(a,0,n-1); //调用“快排函数”cout<<"任务执行的顺序:";for(int i=0;i<n;i++) cout<<a[i]<<" "; //输出排序结果}2、快速排序算法:void qsort(int a[],int i,int j){if(j<=i)return; //只有一个元素int pivotindex=findpivot(a,i,j); //调用“轴值寻找函数”确定轴值swap(a,pivotindex,j); //调用“交换函数”将轴值置末int k=partition(a,i-1,j,a[j]); //调用“分割函数”根据轴值分割序列swap(a,k,j);qsort(a,i,k-1); //递归调用,实现子序列的调序qsort(a,k+1,j);}3、轴值寻找算法://为了保证轴值的“随机性”,采用时间初始化种子。
qdr数据结构上机实验报告8-

数据结构上机实验报告8—AAXXX课程名称:数据结构年级:09实验日期:姓名:学号:04班级:实验名称:图实验序号:实验八成员人数:1一、实验目的及要求1.了解C语言程序的特点2.掌握简单的C语言程序结构3.熟练掌握运行C程序的步骤和方法4. 掌握图的存储表示方法、图的遍历二、实验环境三、实验内容1)使用邻接表表示图,并对图进行深度优先遍历和广度优先遍历。
四、算法描述及实验步骤用算法表示方法,流程图等形式表达算法设计思想与算法实现步骤五、调试过程及实验结果六、总结熟悉图结构,了解图的存储和遍历七、附录(源程序清单)#include<stdlib.h>#include<stdio.h>int visited[10];typedef struct ArcNode{int adjvex;struct ArcNode *next;}Edge;typedef struct VNode{char vertex;Edge *first;}Vertex;typedef Vertex AdjList[10];typedef struct{AdjList adj;int n,e;}Algraph;void creatALG(Algraph *g){int i,j,k;Edge *s=NULL;printf("please input vertex:");scanf("%d",&(g->n));printf("please input edges:");scanf("%d",&(g->e));getchar();for(i=0;i<g->n;i++){g->adj[i].vertex=i+48;g->adj[i].first=NULL;}for(k=0;k<g->e;k++){printf("please the %d edge:",k+1); scanf("%d %d",&i,&j);getchar();s=(Edge *)malloc(sizeof(Edge));s->adjvex=j;s->next=g->adj[i].first;g->adj[i].first=s;}}void DFSG(Algraph *g,int i){Edge *p;printf("%c ",g->adj[i].vertex);visited[i]=1;p=g->adj[i].first;while(p){if(!visited[p->adjvex])DFSG(g,p->adjvex);p=p->next;}}void Depth_First(Algraph *g){int i;for(i=0;i<g->n;i++)visited[i]=0;for(i=0;i<g->n;i++)if(!visited[i])DFSG(g,i);}void Breadth_First(Algraph *g,int i){Edge *p;int q[10],f=0,r=0;int j,v;for(j=0;j<g->n;j++)visited[j]=0;visited[i]=1;printf("%c ",g->adj[i].vertex);q[r++]=i;while(r!=f){v=q[f++];p=g->adj[v].first;while(p){if(!visited[p->adjvex]){visited[p->adjvex]=1;printf("%c ",g->adj[p->adjvex].vertex);q[r++]=p->adjvex;}p=p->next;}}}void main(){Algraph G;creatALG(&G);printf("\nDepth_First Search:");Depth_First(&G);printf("\nBreadth_First Search:");Breadth_First(&G,0);}。
数据结构实验8 查找与排序

注意事项:在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。
实验八查找和排序一、实验目的掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
二、实验要求1.掌握本实验的算法。
2.上机将本算法实现。
三、实验内容为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:建立数据文件,数据结构采用线性表,存储方式任选(建议用顺序存储结构),数据元素是结构类型(学号,姓名,性别,房号),元素的值可从键盘上输入,可以在程序中直接初始化。
数据文件按关键字(学号、姓名、房号)进行排序(排序方法任选一种),打印排序结果。
(注意字符串的比较应该用strcmp(str1,str2)函数)查询菜单: (查找方法任选一种)1. 按学号查询2. 按姓名查询3. 按房号查询打印任一查询结果(可以连续操作)。
参考:typedef struct {char sno[10];char sname[2];int sex; //以0表示女,1表示男int roomno;}ElemType;struct SqList{ElemType *elem;int length;};void init(SqList &L){L.elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));L.length=0;}void printlist(SqList L){ int i;cout<<" sno name sex roomno\n";for(i=0;i<L.length;i++)cout<<setw(7)<<L.elem[i].sno<<setw(10)<<L.elem[i].sname<<setw(3)<<L.elem[i].sex<<setw(6) <<L.elem[i].roomno<<endl;}。
数据结构上机操作实验报告

实验一单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。
2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。
3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。
二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。
2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。
三、实验步骤1.定义一个链表结构体。
2.利用插入功能插入一个结点。
3.利用删除功能删除一个结点。
四、程序运行测试1.利用插入功能插入一个结点。
2.利用删除功能删除一个结点。
五、实验报告要求1.绘制链表操作实现的流程图。
2.详细给出程序运行测试结果(包括测试数据和测试结果)。
3.选试验步骤2-3中的任意一个,给出程序的详细注释。
4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。
数据结构《数据结构》上机实验

上机实验
主讲教师:袁凌
数据结构
实验目的
1.加深对数据结构和算法的理解,进一步 提高学生编程能力; 2.培养和提高学生分析问题与解决问题的 综合能力; 3.整理资料,撰写规范的实验报告。
华中科技大学计算机学院
2
数据结构
实验要求
1. 独立完成,完全雷同者记0分;
2. 撰写实验报告,每个实验报告如下内容: 一、问题描述 二、算法和数据结构设计 三、C语言程序实现 四、程序测试 五、复杂度分析
华中科技大学计算机学院 8
实验题目
第二次上机试验
实验(三) 基于二叉链表,实现二叉树的下列运算。 ① 二叉树生成; ② 前序、中序和后序遍历; ③ 计算叶子数目; ④ 按层次遍历; ⑤ 求二叉树高度; 提示: ⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定 ⑶ ②、③和⑤运算分别采用递归和非递归算法实现
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
6
数据结构
实验题目
第一次上机试验
实验(二) 基于链式存储结构,实现线性表的基本的、常见 的运算。
提示:
⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
7Байду номын сангаас
数据结构
3. 《实验报告》和《源程序》,以班为单位提交光盘。
华中科技大学计算机学院
3
数据结构
报告格式
华中科技大学计算机学院
4
数据结构
报告格式
华中科技大学计算机学院
5
数据结构
实验题目
数据结构上机实验答案

《数据结构实验指导书》答案实验一:1、请编写函数int fun(int *a, int *b),函数的功能是判断两个指针a和b所指存储单元的值的符号是否相同;若相同函数返回1,否则返回0。
这两个存储单元中的值都不为0。
在主函数中输入2个整数、调用函数fun、输出结果。
#include <stdio.h>int fun(int *a, int *b){if (*a*(*b)>0) return(1);else return(0);}main(){int x,y;scanf("%d%d",&x,&y);if (fun(&x,&y)) printf("yes\n");else printf("no");}2、计算1+2+3+……+100,要求用指针进行设计。
即设计函数int fun(int *n)实现求1+2+3+……+*n,在主函数中输入、调用、输出结果。
#include <stdio.h>int fun(int *n){int i,sum=0;for (i=1;i<=*n;i++)sum+=i;return(sum);}main(){int x,sum;scanf("%d",&x);printf("the sum is %d\n",fun(&x));}3、函数的功能是求数组a中最大数的位置(位序号)。
在主函数中输入10个整数、调用函数fun、输出结果。
#define N 10#include <stdio.h>void input(int *a,int n){int i;for (i=0;i<n;i++)scanf("%d",a+i); /*scanf("%d",&a[i]);*/}int fun(int *a,int n){int i,*max;max=a;for (i=1;i<n;i++)if (a[i]>*max) max=a+i;return(max-a);}main(){int a[N],maxi;input(a,N);maxi=fun(a,N);printf("\n the max position is %d\n",maxi);}4、请编写函数fun(int *a,int n, int *odd, int *even),函数的功能是分别求出数组a中所有奇数之和和所有偶数之和。
华南农业大学数据结构上机实验指导书及标准答案

目录实验一线性表ﻩ错误!未定义书签。
(一)实验目的............................................................................................................... 错误!未定义书签。
(二) 实验内容ﻩ错误!未定义书签。
(三)实验报告ﻩ错误!未定义书签。
实验二堆栈ﻩ错误!未定义书签。
(一)实验目的 .............................................................................................................. 错误!未定义书签。
(二)实验内容 .............................................................................................................. 错误!未定义书签。
(三) 实验报告................................................................................................................. 错误!未定义书签。
实验三队列..................................................................................................................... 错误!未定义书签。
(一) 实验目的ﻩ错误!未定义书签。
(二) 实验内容................................................................................................................. 错误!未定义书签。
数据结构上机实验

数据结构上机实验本课程实验中已知的预定义常量和类型如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;实验一顺序表(一)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。
二、 实验内容已知:线性表的动态分配顺序存储结构为#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int *elem;int length;int listsize;}SqList;在主程序中调用如下函数实现构造线性表,在线性表中插入数值,最后输出线性表。
1. 编写函数,Status InitList(SqList *L) 实现构造一个空的线性表,若构造成功则返回OK,否则返回ERROR。
2. 编写函数,Status ListInsert(SqList *L , int i , int e) 实现在线性表L中第i个位置之前插入新的数据元素e,L的长度加1。
若插入成功返回OK,否则返回ERROR。
(提示:i的合法值为:i>=1&&i<=L—>length+1)3. 编写函数,void ListPrint(SqList *L)实现将线性表中的元素依次输出到屏幕上。
4.编写函数,int Menu(),输出菜单项请选择你要进行的操作(请输入1-4中的任一个数字):输入1:InitList2:ListInsert3:ListPrint4:Exit实验二顺序表(二)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。
二、 实验内容在实验一的基础上,继续完成如下实验内容。
1.编写函数,Status ListDelete(Splist *L ,int i ,int *e),实现删除L的第i个数据元素,并用e返回其值,L的长度减1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验(八)图班级:学号:姓名:上机时间:地点:一、实验目的1.掌握图的各种存储结构,包括邻接矩阵和邻接表等。
2.掌握图的基本运算,包括创建图、输出图、深度优先遍历、广度优先遍历算法等。
二、实验内容1.实现图的相关运算,并在此基础上设计一个主程序完成如下功能:(以P234图8.26所示的有向图G为例)(1)建立如图8.26所示的有向图G的邻接矩阵并输出;(2)由有向图G的邻接矩阵产生邻接表并输出;(3)再由(2)的邻接表产生对应的邻接矩阵并输出。
2.实现图的遍历运算,并在此基础上设计一个主程序完成如下功能:(以P234图8.26所示的有向图G为例)(1)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);(2)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);(3)输出如图8.26所示的有向图G从顶点0开始的广度优先遍历序列。
三、实验过程1.了解常用函数所在的头文件stdlib.hstdlib 头文件里包含了C语言的一些函数该文件包含了的C语言标准库函数的定义stdlib.h里面定义了五种类型、一些宏和通用工具函数。
类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。
conio.hconio.h不是C标准库中的头文件。
conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
&表示引用传递。
在函数参数表中,出现带&这个的形参,表示引用传递。
2.程序实现(以下代码仅起参考作用)(1)图的相关运算#include <stdio.h>#include <malloc.h>#include "graph.h"#define INF 32767 //INF表示∞void MatToList(MGraph g,ALGraph *&G)//将邻接矩阵g转换成邻接表G{int i,j,n=g.vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0;i<n;i++) //给邻接表中所有头结点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素for (j=n-1;j>=0;j--)if (g.edges[i][j]!=0) //邻接矩阵的当前元素不为0{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc; //将*p链到链表后G->adjlist[i].firstarc=p;}G->n=n;G->e=g.arcnum;}void ListToMat(ALGraph *G,MGraph &g)//将邻接表G转换成邻接矩阵g{int i,j,n=G->n;ArcNode *p;for (i=0;i<n;i++) //g.edges[i][j]赋初值0for (j=0;j<n;j++)g.edges[i][j]=0;for (i=0;i<n;i++){p=G->adjlist[i].firstarc;while (p!=NULL){g.edges[i][p->adjvex]=p->info;p=p->nextarc;}}g.vexnum=n;g.arcnum=G->e;}void DispMat(MGraph g)//输出邻接矩阵g{int i,j;for (i=0;i<g.vexnum;i++){for (j=0;j<g.vexnum;j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");}}void DispAdj(ALGraph *G)//输出邻接表G{int i;ArcNode *p;for (i=0;i<G->n;i++){p=G->adjlist[i].firstarc;if (p!=NULL) printf("%3d: ",i);while (p!=NULL){printf("%3d",p->adjvex);p=p->nextarc;}printf("\n");}}void main(){int i,j;MGraph g,g1;ALGraph *G;int A[MAXV][6]={{0,5,0,7,0,0},{0,0,4,0,0,0},{8,0,0,0,0,9},{0,0,5,0,0,6},{0,0,0,5,0,0},{3,0,0,0,1,0}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++)for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];printf("\n");printf(" 有向图G的邻接矩阵:\n");DispMat(g);G=(ALGraph *)malloc(sizeof(ALGraph));printf(" 图G的邻接矩阵转换成邻接表:\n");MatToList(g,G);DispAdj(G);printf(" 图G的邻接表转换成邻接邻阵:\n");ListToMat(G,g1);DispMat(g1);printf("\n");}(2)图的遍历运算#include <stdio.h>#include <malloc.h>#include "graph.h"int visited[MAXV]; //全局数组#define INF 32767 //INF表示∞void MatToList(MGraph g,ALGraph *&G)//将邻接矩阵g转换成邻接表G{int i,j,n=g.vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0;i<n;i++) //给邻接表中所有头结点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素for (j=n-1;j>=0;j--)if (g.edges[i][j]!=0) //邻接矩阵的当前元素不为0{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc; //将*p链到链表后G->adjlist[i].firstarc=p;}G->n=n;G->e=g.arcnum;}void DispAdj(ALGraph *G)//输出邻接表G{int i;ArcNode *p;for (i=0;i<G->n;i++){p=G->adjlist[i].firstarc;if (p!=NULL) printf("%3d: ",i);while (p!=NULL){printf("%3d",p->adjvex);p=p->nextarc;}printf("\n");}}void DFS(ALGraph *G,int v){ArcNode *p;visited[v]=1; //置已访问标记printf("%3d",v); //输出被访问顶点的编号p=G->adjlist[v].firstarc; //p指向顶点v的第一条弧的弧头结点while (p!=NULL){if (visited[p->adjvex]==0) //若p->adjvex顶点未访问,递归访问它DFS(G,p->adjvex);p=p->nextarc; //p指向顶点v的下一条弧的弧头结点}}void DFS1(ALGraph *G,int v) //非递归深度优先算法{ArcNode *p;ArcNode *St[MAXV];int top=-1,w,i;for (i=0;i<G->n;i++)visited[i]=0; //顶点访问标志均置成0printf("%3d",v); //访问顶点vvisited[v]=1;top++; //将顶点v的第一个相邻顶点进栈St[top]=G->adjlist[v].firstarc;while (top>-1) //栈不空循环{p=St[top]; top--; //出栈一个顶点作为当前顶点while (p!=NULL) //查找当前顶点的第一个未访问的顶点{w=p->adjvex;if (visited[w]==0){printf("%3d",w); //访问wvisited[w]=1;top++; //将顶点w的第一个顶点进栈St[top]=G->adjlist[w].firstarc;break; //退出循环}p=p->nextarc; //找下一个相邻顶点}}printf("\n");}void BFS(ALGraph *G,int v){ArcNode *p;int queue[MAXV],front=0,rear=0; //定义循环队列并初始化int visited[MAXV]; //定义存放结点的访问标志的数组int w,i;for (i=0;i<G->n;i++) visited[i]=0; //访问标志数组初始化printf("%3d",v); //输出被访问顶点的编号visited[v]=1; //置已访问标记rear=(rear+1)%MAXV;queue[rear]=v; //v进队while (front!=rear) //若队列不空时循环{front=(front+1)%MAXV;w=queue[front]; //出队并赋给wp=G->adjlist[w].firstarc; //找与顶点w邻接的第一个顶点while (p!=NULL){if (visited[p->adjvex]==0) //若当前邻接顶点未被访问{printf("%3d",p->adjvex); //访问相邻顶点visited[p->adjvex]=1; //置该顶点已被访问的标志rear=(rear+1)%MAXV; //该顶点进队queue[rear]=p->adjvex;}p=p->nextarc; //找下一个邻接顶点}}printf("\n");}void main(){int i,j;MGraph g;ALGraph *G;int A[MAXV][6]={{0,5,0,7,0,0},{0,0,4,0,0,0},{8,0,0,0,0,9},{0,0,5,0,0,6},{0,0,0,5,0,0},{3,0,0,0,1,0}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++)for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];G=(ALGraph *)malloc(sizeof(ALGraph));MatToList(g,G); //图G的邻接矩阵转换成邻接表printf("图G的邻接表:\n");DispAdj(G);printf("从顶点0开始的DFS(递归算法):\n");DFS(G,0);printf("\n");printf("从顶点0开始的DFS(非递归算法):\n");DFS1(G,0);printf("从顶点0开始的BFS(递归算法):\n");BFS(G,0);printf("\n");}3.运行结果(包括程序如何使用,输入数据和输出结果)及分析四、实验体会。