实验六 图的创建及应用(I)

合集下载

实验六 图的基本操作

实验六 图的基本操作

南京信息工程大学实验(实习)报告图的基本操作一、实验目的1、熟悉图的存储结构2、掌握图的基本操作二、实验准备1、奔腾2计算机或以上机型2、Microsoft Visual C++ 6.0三、实验内容1、建立一张图2、实现深度优先搜索、广度优先搜索遍历四、实验代码#include<stdio.h>#include<conio.h>#include<stdlib.h>typedef struct ArcNode{int adjVex;struct ArcNode *nextArc;}ArcNode;typedef struct VNode{int data;ArcNode *firstArc;}VNode;//创建一张图void CreatGraphic();//深度优先搜索遍历void DFSTraverse(int searchNode);//广度优先搜索遍历void BFSTraverse(int searchNode);//访问标志置零void ClearVisited();void Bound(char ch, int num);//邻接表VNode *adjList;//访问标记数组short *visited;//循环队列, 用于广度优先搜索遍历函数中int *queue;//图的结点数int graphicNode;//用于判断是否创建了图bool creatGraphic;int main(void){char choice;int searchNode;creatGraphic = false;while (true){if (!creatGraphic){system("CLS");printf(" 图的操作\n");Bound('-', 15);printf(" 1. 创建一张图\n");printf(" 0. 退出程序\n");Bound('-', 15);printf(" 请选择: ");fflush(stdin);choice = getchar();switch (choice){case '1':CreatGraphic();break;case '0':printf("\n");system("PAUSE");return 0;default:printf("\n 输入错误, 按任意键后重新输入!");getch();break;}}else{system("CLS");printf(" 图的操作\n");Bound('-', 20);printf(" 1. 深度优先搜索遍历\n");printf(" 2. 广度优先搜索遍历\n");printf(" 0. 退出程序\n");Bound('-', 20);printf(" 请选择: ");fflush(stdin);choice = getchar();switch (choice){case '1':ClearVisited();Lable1:printf("\n 请输入起始搜索的结点序号: ");fflush(stdin);scanf("%d", &searchNode);if (searchNode>=1 && searchNode <=graphicNode){printf(" 深度优先搜索遍历为: ");DFSTraverse(searchNode);}else{printf(" 序号输入错误, 按任意键后重新输入! \n");getch();goto Lable1;}printf("\n\n");system("PAUSE");break;case '2':ClearVisited();Lable2:printf("\n 请输入起始搜索的结点序号: ");scanf("%d", &searchNode);if (searchNode>=1 && searchNode <=graphicNode){printf(" 广度优先搜索遍历为: ");BFSTraverse(searchNode);}else{printf(" 序号输入错误, 按任意键后重新输入! \n");getch();goto Lable2;}printf("\n\n");system("PAUSE");break;case '0':printf("\n");system("PAUSE");return 0;default:printf("\n 输入错误, 按任意键后重新输入!");getch();break;}}}}void CreatGraphic(){int number;int localNode, linkNode;ArcNode *tempNode;Flag:printf("\n 请输入图的顶点数: ");fflush(stdin);scanf("%d", &graphicNode);if (graphicNode <= 0){printf(" 输入错误, 按任意键后重新输入!\n");getch();goto Flag;}if ((adjList=(VNode *)malloc(sizeof(VNode)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建图!\n");system("PAUSE");exit(0);}if ((visited=(short *)malloc(sizeof(short)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建访问记录表!\n");system("PAUSE");exit(0);}if ((queue=(int *)malloc(sizeof(int)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建队列!\n");system("PAUSE");exit(0);}for (number=0; number<graphicNode; ++number){adjList[number].data = number + 1;adjList[number].firstArc = NULL;}printf("\n 请输入所要创建的图中所有相关联的顶点, 格式( 图中一顶点与此顶点相关联的顶点)\n");do{printf(" 请输入( 注意: 输入0 0 结束输入): ");fflush(stdin);scanf("%d %d", &localNode, &linkNode);if (localNode>=1 && localNode<=graphicNode && linkNode>=1 && linkNode<=graphicNode){if ((tempNode = (ArcNode *)malloc(sizeof(ArcNode))) == NULL){printf(" 内存不足, 无法创建图!\n");exit(0);}tempNode->adjVex = linkNode;tempNode->nextArc = adjList[localNode - 1].firstArc;adjList[localNode - 1].firstArc = tempNode;}else{creatGraphic = true;return;}}while(true);}void DFSTraverse(int searchNode){ArcNode *tempNode;visited[searchNode - 1] = 1;printf("%d ", searchNode);tempNode = adjList[searchNode - 1].firstArc;while (tempNode != NULL){if (visited[tempNode->adjVex - 1] == 0){DFSTraverse(tempNode->adjVex);}tempNode = tempNode->nextArc;}}void BFSTraverse(int searchNode){ArcNode *tempNode;int nodeNum;int front = 0, rear = 0;printf("%d ", searchNode);visited[searchNode - 1] = 1;rear = (rear + 1) % graphicNode;queue[rear] = searchNode;while (front != rear){front = (front + 1) % graphicNode;nodeNum = queue[front];tempNode = adjList[nodeNum - 1].firstArc;while (tempNode != NULL){if (visited[tempNode->adjVex - 1] == 0){visited[tempNode->adjVex - 1] = 1;printf("%d ", tempNode->adjVex);rear = (rear + 1) % graphicNode;queue[rear] = tempNode->adjVex;}tempNode = tempNode->nextArc;}}}void ClearVisited(){int cnt;for (cnt=0; cnt<graphicNode; ++cnt){visited[cnt] = 0;}}void Bound(char ch, int num){while (num--){putchar(ch);}putchar('\n');}(本次实验中所用图示意图)(图1:按格式创建图)1876 5 4 3 2(图2:深度优先搜索遍历)(图3:广度优先搜索遍历)五、实验总结…。

数据结构实验六 图的应用及其实现

数据结构实验六   图的应用及其实现

实验六图的应用及其实现一、实验目的1.进一步功固图常用的存储结构。

2.熟练掌握在图的邻接表实现图的基本操作。

3.理解掌握AOE网在邻接表上的实现及解决简单的应用问题。

二、实验内容[题目]:从键盘上输入AOE网的顶点和有向边的信息,建立其邻接表存储结构,输出其关键路径和关键路径长度。

试设计程序实现上述AOE网类型定义和基本操作,完成上述功能。

三、实验步骤(一)、数据结构与核心算法的设计描述本实验题目是基于图的基本操作以及邻接表的存储结构之上,着重拓扑排序算法的应用,做好本实验的关键在于理解拓扑排序算法的实质及其代码的实现。

(二)、函数调用及主函数设计以下是头文件中数据结构的设计和相关函数的声明:typedef struct ArcNode // 弧结点{int adjvex;struct ArcNode *nextarc;InfoType info;}ArcNode;typedef struct VNode //表头结点{VertexType vexdata;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct //图的定义{AdjList vertices;int vexnum,arcnum;int kind;}MGraph;typedef struct SqStack //栈的定义{SElemType *base;SElemType *top;int stacksize;}SqStack;int CreateGraph(MGraph &G);//AOE网的创建int CriticalPath(MGraph &G);//输出关键路径(三)、程序调试及运行结果分析(四)、实验总结在做本实验的过程中,拓扑排具体代码的实现起着很重要的作用,反复的调试和测试占据着实验大量的时间,每次对错误的修改都加深了对实验和具体算法的理解,自己的查错能力以及其他各方面的能力也都得到了很好的提高。

物理实验技术中的实验结果图表绘制与呈现

物理实验技术中的实验结果图表绘制与呈现

物理实验技术中的实验结果图表绘制与呈现在物理实验中,实验结果图表的绘制与呈现是十分重要的一步。

通过图表的直观展示,可以更清晰地表达实验结果,提高研究者对实验数据的分析和理解能力。

而如何进行有效的图表绘制与呈现,则成为了物理实验技术中的一门重要课题。

为了通过实验结果图表进行有效的数据呈现,我们首先需要选择合适的图表类型。

常见的图表类型有折线图、柱状图、饼状图等。

折线图适合展示随时间变化的数据趋势,柱状图适合比较不同组数据之间的差异,饼状图适合显示不同部分所占比例等。

在选择图表类型时,我们需要根据实验数据的特点和目的进行合理选择,以达到最好的呈现效果。

接下来,我们需要进行数据的整理和处理。

对于实验数据的处理,常用的方法有平均值、标准差、标准误差等。

平均值可以反映数据的集中趋势,标准差可以衡量数据的离散程度,标准误差则可以反映平均值的准确度。

通过进行数据的整理和处理,我们可以对实验结果进行更加准确和全面的描述。

在绘制实验结果图表时,我们需要考虑图表的设计和美观。

首先,我们需要选择合适的坐标轴刻度和标记。

坐标轴刻度应选取合适的数值范围,以充分展示实验数据的变化趋势。

标记的选择应准确明了,以方便读者快速理解图表所表达的含义。

其次,我们需要选择合适的图形和颜色。

图形的选择应符合常规习惯,颜色的搭配应清晰明亮,以便于读者对不同数据进行区分和识别。

除了图表的绘制,我们还需要合理地呈现实验结果。

首先,我们需要给出必要的实验条件和参数。

实验条件包括实验环境、设备、样品等,实验参数包括测量方法、测量精度等。

这些信息的提供可以使读者更好地理解实验所处的背景和条件。

其次,我们需要对实验结果进行分析和讨论。

分析和讨论的内容可以包括实验结果的规律性、异常点的原因和合理性等。

通过深入的分析和讨论,我们可以对实验结果进行更具说服力的解释。

此外,我们还需要注意实验结果图表的描述和标注。

图表的描述应简明扼要,言简意赅。

标注要准确明了,包括图表的标题、坐标轴标记、单位等。

实验六 视图的创建和使用

实验六 视图的创建和使用

实验六视图的创建和使用开课实验室:指导老师:学院:专业(班级):姓名:学号:一、实验目的与要求1)理解视图的概念2)掌握利用企业管理器和CREATE VIEW命令创建视图方法。

3)熟悉修改视图、查看视图和删除视图的方法。

4)掌握通过视图修改数据表的方法二、实验过程设计及实验步骤创建视图是数据库应用中的常见需求,可以使用企业管理器创建、管理视图,也可以用T-SQL语句创建、管理视图。

1)在企业管理器中创建如下视图:在XSGL数据库中使用表STUDENT和SCORE 创建视图VIEW_STUDENTSCROE,来查询每个学生的姓名和选课情况。

2)在查询分析器中创建视图:将上题用CREATE VIEW 来创建,视图名为VIEW2 程序代码:3)查看视图信息:使用系统存储过程SP_HELP、SP_HELPTEXT、SP_DEPENDS4)删除视图:将视图VIEW2删除.三、SQL调试及结果创建视图是数据库应用中的常见需求,可以使用企业管理器创建、管理视图,也可以用T-SQL语句创建、管理视图。

1)在企业管理器中创建如下视图:在XSGL数据库中使用表STUDENT和SCORE 创建视图VIEW_STUDENTSCROE,来查询每个学生的姓名和选课情况。

2)在查询分析器中创建视图:将上题用CREATE VIEW 来创建,视图名为VIEW2 程序代码:CREATE VIEW VIEW2ASSELECT STUDENT.SNAME,OFROM STUDENT,SCORE3)查看视图信息:使用系统存储过程SP_HELP、SP_HELPTEXT、SP_DEPENDS 执行代码;SP_HELPTEXT VIEW2执行代码:SP_HELP VIEW2执行代码:SP_DEPENDS VIEW24)删除视图:将视图VIEW2删除. 执行语句:USE XSGLDROP VIEW VIEW2四、实验体会通过此次学习我理解视图的概念,掌握利用企业管理器和CREATE VIEW命令创建视图方法。

数据结构实验六 图

数据结构实验六 图

实验六图一、实验目的1、掌握图的基本存储方法和相关术语2、掌握图的两种搜索路径的遍历方法3、理解最小生成树的有关概念及普里姆(Prim)和克鲁斯卡尔算法4、掌握图的有关应用二、实验要求1、认真阅读程序。

2、上机调试,并运行程序。

3、保存和截图程序的运行结果,并结合程序进行分析。

三、实验内容和基本原理1、实验6.1 建立无向图的邻接矩阵存并输出给出一个无向图,求它的邻接矩阵(见参考程序1):2、实验6.2 建立图的邻接存储并在此基础上实现图的深度优先遍历和广度优先遍历#include<stdio.h>#include<stdlib.h>#define MAX 20typedef int VexType;typedef VexType Mgraph[MAX][MAX];void creat_mg(Mgraph G);void output_mg(Mgraph G);Mgraph G1;int n,e,v0;void main(){creat_mg(G1);output_mg(G1);}void creat_mg(Mgraph G){int i,j,k;printf("\n 请输入无向图的顶点数和边数,如: 6,5:");scanf("%d,%d",&n,&e);for(i=1;i<=n;i++)for(j=1;j<=n;j++)G[i][j]=0;for(k=1;k<=e;k++){printf("\n请输入每条边的两个顶点编号,如:2,5 :");scanf("%d,%d",&i,&j);G[i][j]=1;G[j][i]=1;}}void output_mg(Mgraph G){int i,j;for(i=1;i<n;i++){printf("\n");for(j=1;j<=n;j++)printf("%5d",G[i][j]);}printf("\n");}#include<stdio.h>#include<stdlib.h>#define MAX 20typedef int VexType;typedef struct Vnode{VexType data;struct Vnode *next;}Vnode;typedef Vnode Lgraph[MAX];typedef struct{int V[MAX];int front;int rear;}Queue;void creat_L(Lgraph G);void output_L(Lgraph G);void dfsL(Lgraph G,int v);Lgraph Ga;int n,e,visited[MAX];void main(){int v1,i;for(i=0;i<MAX;i++)visited[i]=0;creat_L(Ga);output_L(Ga);printf("\n请输入深度优先遍历的出发点:");scanf("%d",&v1);printf("\n深度优先遍历的结果为:");dfsL(Ga,v1);for(i=0;i<MAX;i++)visited[i]=0;printf("\n请输入广度优先遍历的出发点:");scanf("%d",&v1);printf("\n广度优先遍历的结果为:");dfsL(Ga,v1);}void creat_L(Lgraph G){Vnode *p,*q;int i,j,k;printf("\n请输入图的顶点数和边数:");scanf("%d,%d",&n,&e);for(i=1;i<=n;i++){G[i].data=i;G[i].next=NULL;}for(k=1;k<=e;k++){printf("请输入每条边的关联顶点编号:");scanf("%d,%d",&i,&j);p=(Vnode *)malloc(sizeof(Vnode));p->data=i;p->next=G[j].next;G[j].next=p;q=(Vnode *)malloc(sizeof(Vnode));q->data=j;q->next=G[i].next;G[i].next=q;}}void output_L(Lgraph G){int i;Vnode *p;for(i=1;i<=n;i++){printf("\n与[%d]关联的顶点有:",i);p=G[i].next;while(p!=NULL){printf("%5d",p->data);p=p->next;}}}void initqueue(Queue *q){q->front=-1;q->rear=-1;}int quempty(Queue *q){if(q->front==q->rear){return 1;}else{return 0;}}void enqueue(Queue *q,int e){if((q->rear+1)%MAX==q->front)printf("队列满!\n");else{q->rear=(q->rear+1)%MAX;q->V[q->rear]=e;}}int dequeue(Queue *q){int t;if(q->front==q->rear){printf("队列空!\n");return 0;}else{q->front=(q->front+1)%MAX;t=q->V[q->front];return t;}}void dfsL(Lgraph G,int v){Vnode *p;printf("%d->",G[v].data);visited[v]=1;p=G[v].next;while(p){v=p->data;if(visited[v]==0)dfsL(G,v);p=p->next;}}void bfsL(Lgraph g,int v){int x;Vnode *p;Queue *q=(Queue *)malloc(sizeof(Queue));initqueue(q);printf("\n %d->",g[v].data);visited[v]=1;enqueue(q,v);while(!quempty(q)){x=dequeue(q);p=g[x].next;while(p){v=p->data;if(visited[v]==0){printf("%d->",g[v].data);visited[v]=1;enqueue(q,v);}p=p->next;}}printf("\n");}四、实验验证与练习1、在N条边的无向图的邻接表存储中,边表中结点的总数为()。

实验六 Excel应用

实验六 Excel应用

实验六 Excel应用实验目的与要求:1.掌握图表的功能;2.掌握排序、筛选、分类汇总、数据透视表等常用数据管理的功能;3.综合应用电子表格软件,完成一个Excel作品,要有明确的主题,要有数据表、图表。

实验内容:【第一题】图表的创建与编辑表4-4 98年产量统计表要求:在当前工作表中建立数据点折线图,横坐标为月份,纵坐标为产量;将图形移到表格的下方;分别设置图例格式、折线图的标题、坐标格式;清除图中的网格线、背景颜色和边框;设置产量曲线的线型和颜色,其中一车间曲线用蓝色,数据标记用方块,前景用白色,背景用蓝色,大小为4磅;二车间的曲线用绿色,数据标记用三角形,前景用白色,背景用绿色,大小为4磅。

【第二题】要求:分别在相应单元格中填写计算总分和平均分的公式,要求出各学生的总分和平均分;按平均分进行由高到低进行排序;筛选出姓王、并且“性别”为女的同学;筛选出:“课程一”〉75并且“课程二”〉80的同学;筛选出满足“课程一”〉90 或“课程二”〉90的同学;按“性别”对“平均分”进行分类汇总;按“性别”对“课程一”进行分类汇总;按“性别”对“课程一”进行分类汇总并理解其含义。

【第三题】打开“排序”文件,筛选出姓“刘”的和名字中有“静”字的员工;打开“图表样例”文件,完成80分以上学生的柱状图,要求:值轴起始值为60,终止值为100;可以参照文件中的“85分以上平均分”的图。

打开“单变量求解”文件,求解“单变量求解”表中的问题;参考课件中的“模拟运算表举例”完成此例的操作;打开“数据透视表”文件,练习数据透视表;参照课件,练习“数据有效性”及文件保护;打开“冻结窗格”文件,练习冻结窗格。

实验六 图及其应用

实验六图及其应用数据结构实验六图及其应用1、实验目的? 熟练掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法 ? 掌握图的基本运算及应用? 加深对图的理解,逐步培养解决实际问题的编程能力2、实验内容:采用邻接表或邻接矩阵方式存储图,实现图的深度遍历和广度遍历;用广度优先搜索方法找出从一顶点到另一顶点边数最少的路径。

1.问题描述:利用邻接表存储结构,设计一种图(有向或无向),并能够对其进行如下操作:1) 创建一个可以随机确定结点数和弧(有向或无向)数的图; 2) 根据图结点的序号,得到该结点的值;3) 根据图结点的位置的第一个邻接顶点的序号,以及下一个邻接顶点的序号;4) 实现从第v 个顶点出发对图进行深度优先递归遍历; 5) 实现对图作深度优先遍历;6) 实现对图进行广度优先非递归遍历; 编写主程序,实现对各不同的算法调用。

2.实现要求:(以邻接表存储形式为例)编写图的基本操作函数::对图的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。

1)“建立图的邻接表算法”:CreateGraph(ALGraph *G) 操作结果:采用邻接表存储结构,构造没有相关信息的图G2)“邻接表表示的图的递归深度优先遍历算法”:DFSTraverse(ALGraphG,void(*Visit)(char*)) 初始条件:图G 已经存在;操作结果:返回图的按深度遍历的结果。

3)“邻接表表示的图的广度优先遍历算法”: BFSTraverse(ALGraphG,void(*Visit)(char*)) 初始条件:图G 已经存在;操作结果:返回图的按广度遍历的结果。

4)“邻接表从某个结点开始的广度优先遍历算法”:BFS(ALGraph G, int v)初始条件:图G 已经存在;操作结果:返回图从某个结点开始的按广度遍历的结果。

分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

实验六 Word表格制作与图片处理

实验六 Word表格制作和图片处理一、实验目的1.掌握表格的创建、编辑和格式化。

2.掌握单元格的计算、表格排序、表格生成图表。

3.掌握插入图片、编辑图片、图片格式化、绘制图形。

4.掌握艺术字体的使用。

5.掌握公式编辑器的使用。

6.掌握文本框的使用。

7.掌握图、文混排、页面排版。

二、预备知识1.创建表格(1)快速创建简单表格。

方法1:单击“常用”工具栏的“插入表格”按钮,按住鼠标左键并拖曳到所需表格的行、列格数,如图6.1所示,即可创建一个规则表格。

方法2:单击菜单栏的“表格”→“插入”→“表格”命令,弹出“插入表格”对话框,如图6.2所示。

选择所需的行数和列数,单击“确定”按钮。

图6.1快速创建表格图6.2“插入表格”对话框(2)创建复杂表格。

方法1:单击菜单栏的“表格”→“绘制表格”命令。

方法2:单击“常用”工具栏的“表格和边框”按钮。

都将弹出“表格和边框”工具栏,如图6.3所示。

此时,自动选中“绘制表格”按钮,光标呈一铅笔状,可用于在表格中画水平、垂直及斜线;单击“擦除”按钮,光标呈橡皮擦状,沿表格线拖曳或单击可删除该表格线;表格绘制完成后再单击“绘制表格”按钮,取消选定状态。

也可使用表格的“拆分与合并”功能完成不规则表格的绘制。

图6.3“表格和边框”工具栏(3)绘制带斜线的表头。

①将光标定位于表头(表的第1行第1列)。

②单击菜单栏的“表格”→“绘制斜线表头”命令,弹出“插入斜线表头”对话框,如图6.4所示。

③选择表头样式,并在相应文本框中输入标题内容,单击“确定”按钮。

(4)在表格中输入文字。

表格中的每一个单元格都可以看做独立的文档来录入文本,回车将在单元格中另起一行。

若要设置文字的对齐方式,选取单元格,单击鼠标右键,选择快捷菜单中的“单元格对齐方式”命令,弹出“对齐方式”按钮供选择,如图6.5所示。

单击所需要的“对齐方式”按钮即可。

图6.4“插入斜线表头”对话框图6.5“单元格对齐方式”按钮2. 编辑表格(1)在表格中添加行或列。

数据结构实验六图结构及其应用

实验七图结构及其应用一、实验目的1.掌握图类的邻接矩阵存储结构的实现;2.掌握图的基本操作,包括图的建立、广度优先遍历和深度优先遍历算法;3.掌握求最短路径的Dijkastra算法。

二、实验要求1.复习课本中第7章关于图的相关知识内容;2.用C+叫言完成算法和程序设计并且调试通过;三、实验题目与要求1.图的遍历详细描述:利用以提供的源程序素材,实现对不多于30个结点的图的建立以及广度优先和深度优先遍历算法。

具体功能要求:从键盘中输入网中顶点的个数,以及顶点的数据值,并以顶点的输入次序作为顶点的编号输入顶点与顶点之间的邻接边的权值(注:若为无向图,则每条边可由两条方向相反的有向边构成);若无边相连则已设定的权值最大值MaxWeight=100O弋替。

利用顶点与边的信息建立网的邻接矩阵,并第一个输入的顶点为原点对网进行深度优先和广度优先遍历,并输入遍历的顶点序列。

例:如下图7-1图所示,则输入为:6ABCDEF18A B 34A E 12B A 34B C 46B F 19C B 46C D 17C F 25D C 17D E 38D F 25E A 12E D 38E F 26F B 19F D 25F C 25F E 26在提供的程序模板中,完成以下函数,实现上述功能;(1)DFSTraverse (MGraph G)功能描述:对网进行深度优先遍历,网可以非连通(2)BFSTraverse (MGraph G)功能描述:对网进行广度优先遍历,网可以非连通2.最短路径求解详细描述:在第一题的基础上,Dijkastra算法求解从第A个顶点到其余各个顶点的最短路径的所经过的顶点以及路径的长度。

例:如图7-1所示,则该求出顶点A0其余个顶点的最短路径所经过的顶点,以及路径的长度;输出如下所示:A->B: A B 34A->C: A E F C 63A->D: A E D 50A->E: A E 12A->F: A E F 38在提供的程序模板中,完成以下函数,实现上述功能;void dijkstra(MGraph G, int vs )3.验证练习先对下图7-2和7-3进行深度和广度优先遍历,并求出以A作为源点求最短路径的结果。

物理实验技术中的实验结果图表绘制与结果解释技巧与实例展示

物理实验技术中的实验结果图表绘制与结果解释技巧与实例展示一、引言物理实验是科学研究中的重要手段之一,通过实验可以得到有关物理规律、性质以及相应的数值等信息。

在进行物理实验时,实验结果的图表绘制和结果解释是至关重要的环节,它们既是对实验数据进行整理和展示的方式,也是对实验现象进行分析和解释的基础。

本文将探讨物理实验中的实验结果图表绘制技巧以及结果解释的方法,并通过具体实例展示。

二、实验结果图表绘制技巧1. 选择合适的图表类型在实验结果图表绘制时,选择合适的图表类型可以更好地传达实验数据。

常见的图表类型包括曲线图、柱状图、散点图等。

曲线图适合展示连续变量之间的关系,柱状图适合展示不同类别之间的比较,散点图适合展示两个变量之间的相关性。

根据实验数据的特点选择最合适的图表类型,可以使结果更加清晰明了。

2. 调整坐标轴刻度和标签坐标轴是图表中的重要组成部分,刻度和标签的选择和调整可以影响到观察者对图表的解读。

刻度的选择要尽量简洁易懂,避免过于拥挤。

标签要准确明确,能够清晰描述变量或数量。

在对数坐标轴的使用时要注意标明对数底,并使用适当的刻度。

3. 添加图例和标题图例和标题可以帮助读者更好地理解图表的含义。

图例应清晰明了地标明每条曲线或柱状图代表的含义,标题要简洁地概括图表的主要内容。

同时,图表的单位也应一并标注,以避免造成误解。

三、结果解释方法1. 基本数据描述首先,对实验结果的基本数据进行描述。

包括对比较特殊的数据进行分析和解释,如最大值、最小值、平均值、标准差等。

这些统计量可以帮助读者更好地了解实验数据的分布情况和变化趋势。

2. 建立数学模型对于一些复杂的实验结果,通过建立数学模型来解释现象是常见的方法之一。

模型可以表达实验数据之间的关系,解释其背后的物理规律。

通过模型的使用,可以对实验数据进行预测和拟合,从而进一步了解实验结果。

3. 比较实验结果将实验结果与其他实验数据、理论预测或已知结果进行比较,可以有助于验证实验的准确性和可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名学号cout << endl << ">请选择功能:";cin >> ch1;switch (ch1){case'1': //创建有向图{system("cls");CreateGraph(MG);cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'2': //显示图信息{system("cls");DisplayGraph(MG);cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'3': //返回上一界面{break;}default:{system("cls");cout << "输入错误,请重新输入!" << endl;continue;}}system("cls");break;}break;}case'2':{system("cls");while (1){minor_menu2();char ch1;//二层菜单输入选择cout << endl << ">请选择功能:";cin >> ch1;switch (ch1){case'1'://创建图信息{system("cls");CreateGraph(ALG);cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'2'://显示图信息{system("cls");DisplayGraph(ALG);cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'3': //返回上一界面{break;}default:{system("cls");cout << "输入错误,请重新输入!" << endl;continue;}}system("cls");break;}break;}case'3':{system("cls");while (1){minor_menu3();ALGraph R_ALG;int i, j; //待搜索的顶点的位置char ch1; //二层菜单输入选择cout << endl << ">请选择功能:";cin >> ch1;switch (ch1){case'1'://使用已创建的邻接表表示的图进行搜索{system("cls");cout << "请输入待搜索的顶点v(i) 顶点v(j)(以空格分隔):";cin >> i>> j;int flag = exist_path_DFS(G, i, j);if (flag)cout << "搜索成功!存在顶点v(i):" << G.vertices[i].data << "顶点v(j):" << G.vertices[j].data << "的路径" << endl;elsecout << "搜索失败!不存在顶点v(i):" << G.vertices[i].data << "到顶点v(j):" << G.vertices[j].data << "的路径" << endl;cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'2': //创建新图进行搜索{system("cls");CreateGraph(R_ALG);cout << "请输入待搜索的顶点v(i) 顶点v(j)(以空格分隔):";cin >> i >> j;int flag = exist_path_DFS(R_ALG, i, j);if (flag)cout << "搜索成功!存在顶点v(i):" << R_ALG.vertices[i].data << "到顶点v(j):" << R_ALG.vertices[j].data << "的路径" << endl;elsecout << "搜索失败!不存在顶点v(i):" << R_ALG.vertices[i].data << "到顶点v(j):" << R_ALG.vertices[j].data << "的路径" << endl;cout << "操作完毕!" << endl;system("pause");system("cls");continue;}case'3': //返回上一界面{break;}default:{system("cls");cout << "输入错误,请重新输入!" << endl;continue;}}system("cls");break;}break;}case'4':{return 0;}default:{system("cls");cout << "功能选择错误,请重新输入!" << endl;break;}}}return 0;}void main_menu(void){cout << endl;cout << "==========================================================================" << endl;cout << " 图的创建及应用 " << endl;cout << "<<=========================功能选择========================>>" << endl;cout << " 【1】邻接矩阵表示法 " << endl;cout << " 【2】邻接表表示法 " << endl;cout << " 【3】基于深度优先搜索判断是否存在指定位置的路径 " << endl;cout << " 【4】退出程序 " << endl;cout << "==========================================================================" << endl <<endl;}void minor_menu1(void){cout << "<<=====邻接矩阵表示法=====>>" << endl;cout << ">1.创建有向图" << endl;cout << ">2.显示图信息" << endl;cout << ">3.返回上一界面" << endl;}void minor_menu2(void){cout << "<<=====邻接表表示法=====>>" << endl;cout << ">1.创建有向图" << endl;cout << ">2.显示图信息" << endl;cout << ">3.返回上一界面" << endl;}void minor_menu3(void){cout << "<<=====基于深度优先搜索判断是否存在指定路径=====>>" << endl;cout << ">1.使用已创建的邻接表表示的图进行搜索判断" << endl;cout << ">2.创建新的图进行搜索判断" << endl;cout << ">3.返回上一界面" << endl;}2.头文件”ADT.h”的部分程序如下:#ifndef ADT_H_#define ADT_H_/************************ 图 *************************//* ------图的数组(邻接矩阵)存储表示------ */#define INFINITY INT_MAX//用整型最大值代替∞#define MAX_VERTEX_NUM 20 //最大顶点数#define MAX_NAME 5 //顶点字符串的最大长度+1#define MAX_INFO 20 //相关信息字符串的最大长度+1#define MAXSIZE 100typedef enum { MDG, MDN, UDG, UDN } MGraphKind; //有向图,有向网,无向图,无向网typedef int VRType; //顶点关系类型,对无权图,用1或0typedef char InfoType; //弧信息类型typedef char VertexType[MAX_NAME]; //顶点类型typedef struct ArcCell{VRType adj; //表示相邻否;对带权图,则为权值类型InfoType *info; //弧相关信息的指针}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs; //邻接矩阵int vexnum, arcnum; //图的当前顶点数和弧数MGraphKind kind; //图种类标志}MGraph;/* ------图的邻接表存储表示------ */typedef enum{ ADG, ADN, AUDG, AUDN }ALGraphKind; // {有向图,有向网,无向图,无向网}typedef struct ArcNode{int adjvex; //该弧所指向的顶点的位置struct ArcNode * nextarc; //指向下一条弧的指针InfoType * info; //该弧相关信息指针}ArcNode; //边表结点结构描述typedef struct VNode{VertexType data; //顶点信息ArcNode * firstarc; //指向第一条一幅该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM]; //顶点向量结点结构描述typedef struct{AdjList vertices; //邻接表int vexnum,arcnum; //图的当前顶点数和弧数ALGraphKind kind; //图的种类标志}ALGraph; //邻接表结构描述int visited[MAX_VERTEX_NUM]; //访问标志数组(全局量)Status(*VisitFunc)(VertexType); //函数变量#endif/* ADT_H_ */3.头文件"DataStructure_Graph.h"中部分函数定义如下:#include<stdio.h>#include<malloc.h>#include"ADT.h"#include"DataStructure_StackQueue.h" //数据结构第三章栈和队列相关函数的定义及声明/************************************************************* 功能函数声明区************************************************************/int LocateVex(MGraph G, VertexType u); //若G中存在顶点u,则返回该顶点在图中的位置,否则返回1 Status CreateGraph(MGraph &G); //采用数组(邻接矩阵)表示法,构造图GStatus CreateDG(MGraph &G); //采用数组(邻接矩阵)表示法,构造有向图GStatus CreateDN(MGraph &G); //采用数组(邻接矩阵)表示法,构造有向网GStatus CreateUDN(MGraph &G); //采用数组(邻接矩阵)表示法,构造无向图GStatus CreateUDG(MGraph &G); //采用数组(邻接矩阵)表示法,构造无向网GStatus DestroyGraph(MGraph &G); //销毁图GStatus DisplayGraph(MGraph G); //输出邻接矩阵表示图Gvoid DFSTraverse(MGraph G, Status(*Visit)(int v)); //深度优先搜索邻接矩形表示的图Gint LocateVex(ALGraph G, VertexType u); //若G中存在顶点u,则返回该顶点在图中的位置,否则返回1 Status CreateGraph(ALGraph &G); //采用邻接表存储结构,构造没有相关信息的4种图G Status DestroyGraph(ALGraph &G); //销毁图GVertexType* GetVex(ALGraph G, int v); //返回顶点v的值int FirstAdjVex(ALGraph G, VertexType v); //返回v的第一个邻接顶点的序号.若没有邻接顶点,返回-1 Status DisplayGraph(ALGraph G); //输出邻接表表示图Gvoid DFSTraverse(ALGraph G, Status(*Visit)(int v));//深度优先搜索邻接表表示的图Gint exist_path_DFS(ALGraph G, int i, int j); //判断邻接表方式存储的有向图G是否存在顶点i到j路径/************************************************************* 功能函数定义区************************************************************//********************邻接矩阵表示********************//** 函数原型:int LocateVex(MGraph &G, VertexType u)* 函数功能:若G中存在顶点u,则返回该顶点在图中的位置,否则返回1* 入口参数:已存在的图G,与G中顶点类型相同的顶点u* 出口参数:顶点在图中的位置,否则返回-1*/int LocateVex(MGraph G, VertexType u){int i = 0;for (int i = 0; i < G.vexnum; ++i)if (strcmp(u, G.vexs[i]) == 0)return i;return -1;} //LocateVex/** 函数原型:Status CreateGraph( MGraph &G )* 函数功能:采用数组(邻接矩阵)表示法,构造图G* 入口参数:图G* 出口参数:返回函数结果状态*/Status CreateGraph(MGraph &G){cout << "请输入图G的类型(有向图:0,有向网:1,无向图:2,无向网:3):";//cin >> kind;scanf_s("%d", &G.kind); // 自定义输入函数,读入一个随机值switch (G.kind){case MDG: return CreateDG(G); // 构造有向图Gcase MDN: return CreateDN(G); // 构造有向网Gcase UDG: return CreateUDG(G); // 构造无向图Gcase UDN: return CreateUDN(G); // 构造无向网Gdefault : return ERROR;}return OK;} // CreateGraph/** 函数原型:Status CreateDG(MGraph &G)* 函数功能:采用数组(邻接矩阵)表示法,构造有向图G* 入口参数:图G* 出口参数:返回函数结果状态*/Status CreateDG(MGraph &G){int IncInfo;char s[MAX_INFO], *info;VertexType va, vb; //顶点类型cout << "请输入有向图G的顶点数,弧数,弧是否含其他信息(是:1,否:0 以空格作为间隔):";cin >> G.vexnum >> G.arcnum >> IncInfo;cout << "请输入" << G.vexnum << "个顶点的值(少于" << MAX_NAME << "个字符):" << endl;for (int i = 0; i < G.vexnum; ++i) //构造顶点向量cin >> G.vexs[i];for (int i = 0; i < G.vexnum; ++i) //初始化邻接矩阵{for (int j = 0; j < G.vexnum; ++j){G.arcs[i][j].adj = 0;G.arcs[i][j].info = NULL;}}cout << "请输入" << G.arcnum << "条弧的弧尾弧头(以空格作为间隔):" << endl;for (int i = 0; i < G.arcnum; ++i){cin >> va >> vb;int m = LocateVex(G, va);if (m < 0)cout << "在图G中未找到" << va << endl;int n = LocateVex(G, vb);if (n < 0)cout << "在图G中未找到" << vb << endl;G.arcs[m][n].adj = 1; //有向图if (IncInfo){cout << "请输入该弧的相关信息(少于" << MAX_INFO << "个字符):";cin >> s;int length = strlen(s);if (length){info = new char[length + 1];strcpy_s(info,length + 1,s);G.arcs[m][n].info = info; //有向}}}G.kind = MDG;return OK;} // CreateDG/** 函数原型:Status DisplayGraph(MGraph G)* 函数功能:输出邻接矩阵表示图G* 入口参数:图G* 出口参数:返回函数结果状态*/Status DisplayGraph(MGraph G){const int MAX_STR_G = 8;const int MAX_STR_ARC = 5;char s[MAX_STR_G], s1[MAX_STR_ARC];switch (G.kind){case MDG: strcpy_s(s, MAX_STR_G, "有向图\0");strcpy_s(s1, MAX_STR_ARC, "弧\0");break;case MDN: strcpy_s(s, MAX_STR_G, "有向网\0");strcpy_s(s1, MAX_STR_ARC, "弧\0");break;case UDG: strcpy_s(s, MAX_STR_G, "无向图\0");strcpy_s(s1, MAX_STR_ARC, "边\0");break;case UDN: strcpy_s(s, MAX_STR_G, "无向网\0");strcpy_s(s1, MAX_STR_ARC, "边\0");}printf(" %sG的信息:%d个顶点 %d条%s\n", s,G.vexnum, G.arcnum, s1);for (int i = 0; i < G.vexnum; ++i) //输出G.vexsprintf("G.vexs[%d]=%s\n", i, G.vexs[i]);printf("G.arcs.adj:\n"); // 输出G.arcs.adjfor (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++)printf("%6d", G.arcs[i][j].adj);printf("\n");}printf(":\n"); //输出printf("顶点1(弧尾) 顶点2(弧头) 该%s信息:\n", s1);if (G.kind < 2) //有向{for (int i = 0; i < G.vexnum; i++)for (int j = 0; j < G.vexnum; j++){if (G.arcs[i][j].adj){printf("%5s --->%5s ", G.vexs[i], G.vexs[j]);if (G.arcs[i][j].info)printf("%7s\n", G.arcs[i][j].info);elseprintf(" null\n");}}}else//无向{for (int i = 0; i<G.vexnum; i++)for (int j = i + 1; j < G.vexnum; j++){if (G.arcs[i][j].adj){printf("%5s --->%5s ", G.vexs[i], G.vexs[j]);if (G.arcs[i][j].info)printf("%7s\n", G.arcs[i][j].info);elseprintf(" null\n");}}}return OK;} //DisplayGraph/**************************图的邻接表存储**************************//** 函数原型:int LocateVex(ALGraph G, VertexType u)* 函数功能:若G中存在顶点u,则返回该顶点在图中的位置,否则返回1* 入口参数:已存在的图G,与G中顶点类型相同的顶点u* 出口参数:顶点在图中的位置,否则返回-1*/int LocateVex(ALGraph G, VertexType u){int i;for (i = 0; i<G.vexnum; ++i)if (strcmp(u, G.vertices[i].data) == 0)return i;return -1;} //LocateVex/** 函数原型:CreateGraph(ALGraph &G)* 函数功能:采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4种图)* 入口参数:图G* 出口参数:返回函数结果状态*/Status CreateGraph(ALGraph &G){int w; //权值VertexType va, vb;ArcNode *p;printf("请输入图的类型(有向图:0,有向网:1,无向图:2,无向网:3): ");scanf_s("%d", &G.kind);printf("请输入图的顶点数边数(以空格分隔): ");cin >> G.vexnum >> G.arcnum;printf("请输入%d个顶点的值(少于%d个字符):\n", G.vexnum, MAX_NAME);for (int i = 0; i<G.vexnum; ++i) //构造顶点向量{cin >> G.vertices[i].data;G.vertices[i].firstarc = NULL;}if (G.kind == 1 || G.kind == 3) //网printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n");else//图printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");for (int k = 0; k<G.arcnum; ++k) //构造表结点链表{if (G.kind == 1 || G.kind == 3) //网cin >> w >> va >> vb;else//图cin >> va >> vb;int m = LocateVex(G, va); //弧尾int n = LocateVex(G, vb); //弧头p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = n;if (G.kind == 1 || G.kind == 3) //网{p->info = (char *)malloc(sizeof(char));*(p->info) = w;}elsep->info = NULL; //图p->nextarc = G.vertices[m].firstarc; //插在表头G.vertices[m].firstarc = p;if (G.kind >= 2) //无向图或网,产生第二个表结点{p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = m;if (G.kind == 3) //无向网{p->info = (char*)malloc(sizeof(char));*(p->info) = w;}elsep->info = NULL; //无向图p->nextarc = G.vertices[n].firstarc; //插在表头G.vertices[n].firstarc = p;}}return OK;} //CreateGraph/** 函数原型:int exist_path_DFS(ALGraph G, int i, int j)* 函数功能:判断邻接表方式存储的有向图G是否存在顶点i到j路径* 入口参数:图G存在,v是G中某个顶点* 出口参数:返回v的第一个邻接顶点的序号*/int exist_path_DFS(ALGraph G, int i, int j){ArcNode *p;if (i == j)return 1; //找到了一条路径,且长度符合要求else{visited[i] = 1;for (p = G.vertices[i].firstarc; p; p = p->nextarc){int index = p->adjvex;if (!visited[index] && exist_path_DFS(G, index, j))return 1; //剩余路径长度减一}visited[i] = 0; //允许曾经被访问过的结点出现在另一条路径中}return 0; //没找到}//exist_path_DFS运行结果邻接矩阵结构表示的图GAC EBFD邻接表结构表示的图G从上图看出从顶点A到顶点D有路径相连从上图看出从顶点C到顶点E没有路径相连实验总结1、此次实验完成了对图的邻接矩阵和邻接表这两种结构的存储、显示,以及邻接表存储结构下对图进行深度优先搜索判断是否存在指定位置的路径。

相关文档
最新文档