当前位置:文档之家› 中南大学数据结构实验报告(五)

中南大学数据结构实验报告(五)

中南大学数据结构实验报告(五)
中南大学数据结构实验报告(五)

实验

1.需求分析

的任意结点之间的两个数据元素都可以相关。本实验希望读者理解图的数据结构,掌握图的邻接表存储结构,建立邻接表的算法,以及如何应用图解决具体问题(即原理与应用的结合)等。

1.从键盘输入的数据建立图,并进行深度优先搜索和广度优先搜索(验证性实验)

问题描述

很多涉及图上操作的算法都是以图的遍历操作为基础的。试编写一个程序,演示无向图的遍历

操作。

在主程序中提供下列菜单:

(1)“1”代表图的建立;

(2)“2”代表深度优先遍历图;

(3)“3”代表广度优先遍历图;

(4)“0”代表结束。

基本要求

以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,

分别输出每种遍历下的结点访问序列和相应生成树的边集。

测试数据

由读者依据软件工程的测试技术自己确定。注意测试边界数据,如单个结点。

实现提示

设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别

为1, 2, …, n)。通过输入图的所有边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。

2.利用最小生成树算法解决通信网的总造价最低问题(设计性实验)

问题描述

若在n个城市之间建通信网络,只需架设n1条线路即可。如何以最低的经济代价建设这个通信网

是一个网的最小生成树问题。

基本要求

以邻接表为存储结构,利用Prim算法或Kruskal算法求网的最小生成树。

测试数据

由读者依据软件工程的测试技术自己确定。注意测试边界数据,如单个结点。

实现提示

设通信线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无向网。为简单起见,

图的顶点数不超过10,网中边的权值设置成小于100。

4.导游问题(综合性实验)

问题描述

给出一张某公园的导游图,游客通过终端询问可知:

(1) 从某一景点到另一个景点的最短路径;

(2) 游客从公园大门进入,选一条最佳路线,使游客可以不重复的游览各景点,最后回到出口。

基本要求

(1) 将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上

的权值表示距离,选择适当的数据结构。

(2) 为游客提供图中任意景点相关信息的查询。

(3) 为游客提供任意两个景点之间最短的简单路径。

(4) 为游客选择最佳游览路径。

测试数据

由读者依据软件工程的测试技术自己确定。注意测试边界数据,如单个结点。

实现提示

以邻接表为存储结构,利用Dijkstra算法或Floyd算法求最短路径,利用搜索求最佳路径

2.概要设计

?验证性实验

函数:

?设计性实验

函数:

?综合性实验函数:

3.详细设计

?验证性实验

typedef int QElemType;

typedef struct QNode

{//节点

QElemType data;

struct QNode *next;//链队列

} QNode;

typedef struct

{

QNode *front;//头指针,带空头节点

QNode *rear;//尾节点

} LinkQueue;

int InitQueue(LinkQueue *q)

{//初始化

q->front=q->rear=(QNode *)malloc(sizeof(QNode));//申请空间,front指向头节点(空的)if(q->front==NULL)

{//若是申请失败

printf("malloc fail in InitQueue");

return fail;

}

q->front->next=NULL;//空队的头节点下一个自然为空

return ok;

}

int EnQueue(LinkQueue *q, QElemType e)

{//插入

QNode *p =(QNode *)malloc(sizeof(QNode));//将要插入的节点

if(p ==NULL)

{

printf("malloc fail in EnQueue");

return fail;

}

p->data= e;//p的值为e

p->next=NULL;//在尾部插入,其下一个为空

q->rear->next= p;//接到尾节点的下一个

q->rear= p;//p为新的尾节点

return ok;

}

int DeQueue(LinkQueue *q, QElemType *e)

{//删除

if(q->front==q->rear)

{//空队无法删除

printf("underflow\n");

return underflow;

}

QNode *p =q->front->next;//需要删除的节点

*e =p->data;//用e带出删掉的值

q->front->next=p->next;//将要删除的节点从链中断开

if(q->rear= p)

{//加入原来队中只有一个节点

q->rear=q->front;//删完后为空队,头节点与尾节点指到一起}

free(p);

return ok;

}

#define empty0

#define notempty1

int isempty(LinkQueue q){

if(q.front==q.rear){

return empty;

}else{

return notempty;

}

}

//图

typedef char vertexType;//顶点数据类型

typedef enum{DG,DN,UDG,UDN}GraphKind;//图的类型

typedef struct arcNode{//边

int adjvex;//边上数据,指向其父节点下一个邻接点在顶点数组中的位置struct arcNode *nextarc;//指向下一条边

}arcNode;

typedef struct vnode{//顶点

vertexType vexData;//顶点数据

arcNode *firstarc;//指向第一个邻接点的边

}vnode;

typedef struct{//图

vnode* vertices;//顶点数组

int vexnum,arcnum;//顶点数目,边的数目

GraphKind kind;//图类型

}alGraph;

void printVertices(alGraph* g){//打印邻接表

for(int i=0;ivexnum;i++){//遍历顶点数组

printf("%c ",g->vertices[i].vexData);

//遍历每个顶点的所有边

arcNode* a=(arcNode*)malloc(sizeof(arcNode));

a=g->vertices[i].firstarc;

while(a!=NULL){

printf("%d ",a->adjvex);

a=a->nextarc;

}

printf("\n");

}

}

int locateVex(alGraph* g,char vex){//确定点vex在邻接表中的位置for(int i=0;ivexnum;i++){//遍历比较

if(g->vertices[i].vexData==vex){

return i;

}

}

printf("vex not exist in locateVex:%c\n",vex);

return-1;//没找到返回-1

}

void CreateGraph(alGraph* g){//先序输入图

printf("输入顶点数,边数和图类\n");

scanf("%d%d%d",&(g->vexnum),&(g->arcnum),&(g->kind));

g->vertices=(vnode*)malloc(g->vexnum*sizeof(vnode));

// printf("%d %d %d",g->vexnum,g->arcnum,g->kind);

printf("输入顶点\n");

for(int i=0;ivexnum;i++){

printf("第%d个顶点:\n",i+1);

getchar();//清掉回车

g->vertices[i].vexData=getchar();

// putchar(g->vertices[i].vexData);

g->vertices[i].firstarc=NULL;//尾部置空

}

// printVertices(g);

printf("输入边\n");

for(int i=0;iarcnum;i++){

char sv;

char tv;

getchar();//清掉回车

printf("第%d条边:\n",i+1);

scanf("%c%c",&sv,&tv);

// printf("%c,%c\n",sv,tv);

int s=locateVex(g,sv);

int t=locateVex(g,tv);

arcNode* pi=(arcNode*)malloc(sizeof(arcNode));

pi->adjvex=t;

pi->nextarc=g->vertices[s].firstarc;//头插法

g->vertices[s].firstarc=pi;

if(g->kind==UDG ||g->kind==UDN){//若是无向图或无向网,在边的另一端也要加入边

arcNode* pj=(arcNode*)malloc(sizeof(arcNode));

pj->adjvex=s;

pj->nextarc=g->vertices[t].firstarc;//头插法

g->vertices[t].firstarc=pj;

}

}

// printVertices(g);

}

int*createVisted(int size){//返回一个size大小的置0数组

int* visited=(int*)malloc(size*sizeof(int));

memset(visited,0,size*sizeof(int));

return visited;

}

void visit(vertexType v){//访问顶点数据

printf("%c",v);

}

int firstAdjVex(alGraph* g,int v){//返回某顶点的第一个邻接点

if(g->vertices[v].firstarc==NULL)return-1;//无邻接点时,返回-1

return g->vertices[v].firstarc->adjvex;

}

int nextAdjVex(alGraph* g,int v,int w){//返回某顶点的w之后的一个邻接点,v是当前父节点,w为上一个访问的邻接点

arcNode* a=(arcNode*)malloc(sizeof(arcNode));

a=g->vertices[v].firstarc;

if(a==NULL)return-1;

while(a->adjvex!=w){//遍历寻找w

if(a==NULL)return-1;//到底返回-1

a=a->nextarc;

}

if(a->nextarc==NULL)return-1;//若是最后一个点,返回-1

return a->nextarc->adjvex;//找到就返回下一个邻接点

}

void DFS(alGraph* g,int v,int* visited){//深度优先遍历

visited[v]=1;//已访问,置1

visit(g->vertices[v].vexData);

for(int w=firstAdjVex(g,v);w!=-1;w=nextAdjVex(g,v,w)){//遍历所有邻接点,深度优先访问它们// printf("#%d#",w);

if(visited[w]==0){

DFS(g,w,visited);

}

}

}

void DFS_unconnected(alGraph* g,int v,int* visited){//非连通图的深度优先遍历for(int i=0;ivexnum;i++){//遍历该图所有点,对未访问的顶点,深度优先遍历

// printf("%d",i);

if(visited[i]==0){

DFS(g,i,visited);

}

// printf("hhh");

}

printf("\n");

}

void BFS(alGraph* g,int v,int* visited,LinkQueue* q){//广度优先遍历

visited[v]=1;

visit(g->vertices[v].vexData);

EnQueue(q,v);//入队要访问的顶点

while(isempty(*q)==notempty){//当队列不为空时

int u;

DeQueue(q,&u);//从队列取出要访问的点,置为u

for(int w=firstAdjVex(g,u);w!=-1;w=nextAdjVex(g,u,w)){//遍历u的所有邻接点if(visited[w]==0){//若未访问就访问

visited[w]=1;

visit(g->vertices[w].vexData);

EnQueue(q,w);//将u的邻接点入队

}

}

}

}

void BFS_unconnected(alGraph* g,int v,int* visited){//非连通图的广度优先遍历

LinkQueue* q=(LinkQueue*)malloc(sizeof(LinkQueue));//设置一个队列,用来存放将要访问的顶点InitQueue(q);

for(int v=0;vvexnum;v++){//遍历该图所有点,广度优先访问

if(visited[v]==0){

BFS(g,v,visited,q);

}

}

}

int main(){//测试

alGraph* g=(alGraph*)malloc(sizeof(alGraph));

if(g==NULL){

printf("malloc fail in main for g\n");

return-1;

}

CreateGraph(g);

// printVertices(g);//查看邻接表

printf("输入遍历起点:\n");

getchar();//清掉回车

char start=getchar();

printf("深度优先遍历结果:\n");

// DFS(g,locateVex(g,start),createVisted(g->vexnum));

DFS_unconnected(g,locateVex(g,start),createVisted(g->vexnum));

printf("广度优先遍历结果:\n");

// BFS(g,locateVex(g,start),createVisted(g->vexnum));

BFS_unconnected(g,locateVex(g,start),createVisted(g->vexnum));

return0;

}

设计性实验

#include

#include

#include

using namespace std;

#define MAX_VERTEX_NUM30//图的最大顶点数目

//图

typedef char vertexType;//顶点数据类型

typedef enum{DG,DN,UDG,UDN}GraphKind;// 定义图的类型 { 有向图, 有向网,无向图, 无向网} typedef struct arcNode{//边

int adjvex;//边上数据,指向其父节点下一个邻接点在顶点数组中的位置

int weight;//边权重

struct arcNode*nextarc;//指向下一条边

}arcNode;

typedef struct vnode{//顶点

vertexType vexData;//顶点数据

arcNode *firstarc;//指向第一个邻接点的边

}vnode;

typedef struct{//图

vnode* vertices;//顶点数组

int vexnum,arcnum;//顶点数目,边的数目

GraphKind kind;//图类型

}alGraph;

void printVertices(alGraph* g){//打印邻接表

for(int i=0;ivexnum;i++){//遍历顶点数组

printf("%c ",g->vertices[i].vexData);

//遍历每个顶点的所有边

arcNode* a=(arcNode*)malloc(sizeof(arcNode));

a=g->vertices[i].firstarc;

while(a!=NULL){

printf("%d&%d ",a->adjvex,a->weight);

a=a->nextarc;

}

printf("\n");

}

}

int locateVex(alGraph* g,char vex){//确定点vex在邻接表中的位置for(int i=0;ivexnum;i++){//遍历比较

if(g->vertices[i].vexData==vex){

return i;

}

}

printf("vex not exist in locateVex:%c\n",vex);

return-1;//没找到返回-1

}

void CreateGraph(alGraph* g){//先序输入图

printf("输入顶点数,边数和图类\n");

scanf("%d%d%d",&(g->vexnum),&(g->arcnum),&(g->kind));

g->vertices=(vnode*)malloc(g->vexnum*sizeof(vnode));

printf("输入顶点\n");

for(int i=0;ivexnum;i++){

printf("第%d个顶点:\n",i+1);

getchar();//清掉回车

g->vertices[i].vexData=getchar();

g->vertices[i].firstarc=NULL;//尾部置空

}

printf("输入边和权重\n");

for(int i=0;iarcnum;i++){

char sv;

char tv;

int w;

getchar();//清掉回车

printf("第%d条边和权重:\n",i+1);

scanf("%c%c",&sv,&tv);

scanf("%d",&w);

int s=locateVex(g,sv);

int t=locateVex(g,tv);

arcNode* pi=(arcNode*)malloc(sizeof(arcNode));

pi->adjvex=t;

pi->weight=w;

pi->nextarc=g->vertices[s].firstarc;//头插法

g->vertices[s].firstarc=pi;

if(g->kind==UDG ||g->kind==UDN){//若是无向图或无向网,在边的另一端也要加入边

arcNode* pj=(arcNode*)malloc(sizeof(arcNode));

pj->adjvex=s;

pj->weight=w;

pj->nextarc=g->vertices[t].firstarc;//头插法

g->vertices[t].firstarc=pj;

}

}

}

void visit(vertexType v){//访问顶点数据

printf("%c",v);

}

int find_element_in_array(char dest,vnode array[],int array_size){//在数组中寻找元素位置,找到返回,没找到返回-1

for(int i=0;i

if(dest==array[i].vexData){

return i;

}

}

// cout<<"fail to find element"<

return-1;

}

void prim(alGraph* g,char start){

alGraph p;//用邻接表存最小生成树

p.vertices=(vnode*)malloc(g->vexnum*sizeof(vnode));

p.vertices[0].vexData=start;

p.vertices[0].firstarc=NULL;

p.vexnum=1;

p.arcnum=0;

p.kind=UDN;

while(true){

if(p.vexnum==g->vexnum)break;//Vnew更新完则退出循环

int min_weight=100;//假设所有边权重不超过100

int min_index=0;

int min_index_source=0;

for(int i=0;i

int index_find=find_element_in_array(p.vertices[i].vexData,g->vertices,g->vexnum); // cout<

if(index_find!=-1){//若在g中找到该点,遍历该点所有邻接边,查找权重最小的边

arcNode* a=(arcNode*)malloc(sizeof(arcNode));

a=g->vertices[index_find].firstarc;

if(a==NULL)continue;

while(true){

if(a==NULL)break;

if(a->weightvertices[a->adjvex].ve xData,p.vertices,p.vexnum)==-1){//若找到更小权值的边(该边另一端点不在Vnew中)

min_weight=a->weight;

min_index=a->adjvex;

min_index_source=i;

}

a=a->nextarc;

}

}

}

//找到权重最小的之后,更新Vnew和Enew

p.vertices[p.vexnum].vexData=g->vertices[min_index].vexData;

p.vertices[p.vexnum].firstarc=NULL;

arcNode* pi=(arcNode*)malloc(sizeof(arcNode));

pi->adjvex=p.vexnum;

pi->weight=min_weight;

pi->nextarc=p.vertices[min_index_source].firstarc;//头插法

p.vertices[min_index_source].firstarc=pi;

if (p .kind ==UDG || p .kind ==UDN ){//若是无向图或无向网,在边的另一端也要加入边

arcNode * pj =(arcNode *)malloc (sizeof(arcNode ));

pj ->adjvex =min_index_source ;

pj ->weight =min_weight ;

pj ->nextarc =p .vertices [p .vexnum ].firstarc ;//头插法

p

.vertices [p .vexnum ].firstarc =pj ;

}

p .vexnum ++;

// printVertices(&p);

}

printVertices (&p );

}

int main (){//测试

alGraph * g =(alGraph *)malloc (sizeof(alGraph ));

if (g ==NULL){

printf ("malloc fail in main for g \n ");

return -1;

}

CreateGraph (g );

printVertices (g );//查看邻接表

printf ("输入起点:\n ");

getchar ();//清掉回车

char start =getchar ();

cout <<"该图最小生成树为:"<

prim (g ,start );

return 0;

}

DG,

DN,

UDG,

UDN

} GraphKind; // 定义图的类型 { 有向图, 有向网,无向图, 无向网}

typedef struct arcNode

{ //边

int adjvex; //边上数据,指向其父节点下一个邻接点在顶点数组中的位置int weight; //边权重

struct arcNode*nextarc; //指向下一条边

}arcNode;

typedef struct vnode

{ //顶点

vertexType vexData; //顶点数据

string info; //顶点信息

arcNode *firstarc; //指向第一个邻接点的边

}vnode;

typedef struct

{ //图

vnode *vertices; //顶点数组

int vexnum, arcnum; //顶点数目,边的数目

GraphKind kind; //图类型

}alGraph;

void printVertices(alGraph*g)//打印邻接表

{

for(int i =0; i < g->vexnum; i++)//遍历顶点数组

{

printf("%c ",g->vertices[i].vexData);

//遍历每个顶点的所有边

arcNode *a =(arcNode *)malloc(sizeof(arcNode));

a =g->vertices[i].firstarc;

while(a !=NULL)

{

printf("%d&%d ",a->adjvex,a->weight);

a =a->nextarc;

}

printf("\n");

}

}

int locateVex(alGraph*g,char vex)//确定点vex在邻接表中的位置

{

for(int i =0; i < g->vexnum; i++)

{ //遍历比较

if(g->vertices[i].vexData== vex)

{

return i;

}

}

printf("vex not exist in locateVex:%c\n", vex);

return-1; //没找到返回-1

}

void CreateGraph(alGraph*g)//先序输入图

{

printf("输入顶点数,边数和图类\n");

scanf("%d%d%d",&(g->vexnum),&(g->arcnum),&(g->kind)); g->vertices =(vnode *)malloc(g->vexnum *sizeof(vnode));

printf("输入顶点\n");

for(int i =0; i < g->vexnum; i++)

{

printf("第%d个顶点:\n", i +1);

getchar(); //清掉回车

g->vertices[i].vexData=getchar();

g->vertices[i].firstarc=NULL; //尾部置空

}

printf("输入边和权重\n");

for(int i =0; i < g->arcnum; i++)

{

char sv;

char tv;

int w;

getchar(); //清掉回车

printf("第%d条边和权重:\n", i +1);

scanf("%c%c",&sv,&tv);

scanf("%d",&w);

int s =locateVex(g, sv);

int t =locateVex(g, tv);

arcNode *pi =(arcNode *)malloc(sizeof(arcNode));

pi->adjvex= t;

pi->weight= w;

pi->nextarc=g->vertices[s].firstarc; //头插法

g->vertices[s].firstarc= pi;

if(g->kind== UDG ||g->kind== UDN)//若是无向图或无向网,在边的另一端也要加入边

{

arcNode *pj =(arcNode *)malloc(sizeof(arcNode));

pj->adjvex= s;

pj->weight= w;

pj->nextarc=g->vertices[t].firstarc; //头插法

g->vertices[t].firstarc= pj;

}

}

}

void visit(vertexType v)//访问顶点数据

{

printf("%c", v);

}

int find_char_in_vnode(char dest,vnode array[],int array_size)//在vnode数组中找dest(char),找到返回位置,没找到返回-1

{

for(int i =0; i < array_size; i++)//遍历寻找

{

if(dest ==array[i].vexData)

{

return i;

}

}

// cout<<"fail to find element"<

return-1;

}

void prim(alGraph*g,char start)//prim算法,求最小生成树

{

alGraph p; //用邻接表存最小生成树

p.vertices =(vnode *)malloc(g->vexnum *sizeof(vnode));

p.vertices[0].vexData = start;

p.vertices[0].firstarc =NULL;

p.vexnum =1;

p.arcnum =0;

p.kind = UDN;

while(true)

{

if(p.vexnum==g->vexnum)//Vnew更新完则退出循环

break;

int min_weight =100; //假设所有边权重不超过100

int min_index =0;

int min_index_source =0;

for(int i =0; i

{

int index_find =find_char_in_vnode(p.vertices[i].vexData,g->vertices,g->vexnum) ;

// cout<

if(index_find !=-1)//若在g中找到该点,遍历该点所有邻接边,查找权重最小的边

{

arcNode *a =(arcNode *)malloc(sizeof(arcNode));

a =g->vertices[index_find].firstarc;

if(a ==NULL)

continue;

while(true)

{

if(a ==NULL)

break;

if(a->weight< min_weight &&find_char_in_vnode(g->vertices[a->adjvex].ve xData,p.vertices,p.vexnum)==-1)//若找到更小权值的边(该边另一端点不在Vnew中)

{

min_weight =a->weight;

min_index =a->adjvex;

min_index_source = i;

}

a =a->nextarc;

}

}

}

//找到权重最小的之后,更新Vnew和Enew

p.vertices[p.vexnum].vexData=g->vertices[min_index].vexData;

p.vertices[p.vexnum].firstarc=NULL;

arcNode *pi =(arcNode *)malloc(sizeof(arcNode));

pi->adjvex=p.vexnum;

pi->weight= min_weight;

pi->nextarc=p.vertices[min_index_source].firstarc; //头插法

p.vertices[min_index_source].firstarc= pi;

if(p.kind== UDG ||p.kind== UDN)//若是无向图或无向网,在边的另一端也要加入边

{

arcNode *pj =(arcNode *)malloc(sizeof(arcNode));

pj->adjvex= min_index_source;

pj->weight= min_weight;

pj->nextarc=p.vertices[p.vexnum].firstarc; //头插法

p.vertices[p.vexnum].firstarc= pj;

}

p.vexnum++;

// printVertices(&p);

}

printVertices(&p);

}

template

void print_array(t array[],int array_size)//模板,打印数组

{

for(int i =0; i < array_size; i++)

{

cout <

}

}

template

int find_element_in_array(t dest,t array[],int array_size)//模板,在数组中寻找元素,找到返回位置,没找到返回-1

{

for(int i =0; i < array_size; i++)

{

if(array[i]== dest)

{

return i;

}

}

return-1;

}

void dijkstra(alGraph*g,char start)//dijkstra算法,求点start到其他所有点最短路径和最短距离

{

int dis[g->vexnum];

int infinity =100; //假设所有边权重不超过100

for(int i =0; i < g->vexnum; i++)

{

if(i ==find_char_in_vnode(start,g->vertices,g->vexnum))

{

dis[i]=0; //start位赋值为0

}

else

{

dis[i]= infinity; //其他位先赋为无穷大

}

}

arcNode *a =(arcNode *)malloc(sizeof(arcNode));

a = g->vertices[find_char_in_vnode(start, g->vertices, g->vexnum)].firstarc;

while(true) //初始化dis

{

if(a ==NULL)

break;

dis[a->adjvex]=a->weight;

a =a->nextarc;

}

// print_array(dis,g->vexnum);

char T[g->vexnum];//已经找到最短路径的点的集合

int T_index =0;

T[T_index++]= start;//T初始化

char temp = start; //当前点

string toTemp="";//当前路径

toTemp=toTemp+temp;

while(true)//寻找start到所有顶点路径和距离

{

if(T_index ==g->vexnum)

break;

int min_dis = infinity;

int min_index =-1;

for(int i =0; i vexnum; i++)//从V-T中找出min(dis)

{

if(find_element_in_array(g->vertices[i].vexData, T,g->vexnum)==-1&&dis[i]< min_dis)

{

min_dis =dis[i];

min_index = i;

}

}

T[T_index++]=g->vertices[min_index].vexData;

cout << toTemp <<"->"<vertices[min_index].vexData<<"="<

arcNode *a2 =(arcNode *)malloc(sizeof(arcNode));

a2 =g->vertices[min_index].firstarc;

while(true)//查看与当前最小所连接的点,是否可发现到其他顶点的更短路径

{

if(a2 ==NULL)

break;

中南大学C++实验报告

《C++程序设计》上机实验报告 上机内容:C++程序的运行环境和运行一个C++程序的方法 数据类型和表达式 专业班级:电气信息类1203班 学号:0909120320 姓名:李湖 日期:2013年3月16日

目录 1.实验目的 2.实验内容 3.程序源码 4.调试结果 5.实验心得

程序设计实验(一) 1、实验目的 (1)了解所用的计算机系统的基本操作方法,学会独立使用该系统。 (2)了解在该系统上如何编辑、编译、连接和运行一个C程序 (3)通过运行简单的C++程序,初步了解C++源程序的结构和特点。 应学会在一种以上的编译环境下运行C++的程序,建议学习并 掌握Visual C++ 6.0和GCC(RHIDE和DJGPP)的使用方法。2、实验内容和步骤 (1)检查所用所用的计算机系统是否已安装了C++编译系统,并确定他所在的子目录。如果使用的是Windows操作系 统,可以按以下步骤进行: 如果想查找Visual C++ 6.0,可以单击Windows桌面上“开 始”按钮,在菜单中选择“查找”窗口,在“名称”栏中 输入文件名“Microsoft Visual C++ 6.0”,请注意搜索范围, 应当使“搜索”栏中的内容为“C:\”,表示从C盘根目录 开始寻找,即搜索整个C盘。单击“开始查找”按钮, 系统会自动在指定的范围内找寻所需的文件,如果找到, 就会显示出文件路径,如“C:\Windows 000\Start Mean\Program\Microsoft Visual Studio 6.0,表示在

C:\Windows 000\Start Mean\Program\Microsoft Visual Studio 6.0文件中有Visual C++ 6.0。也可以选择Windows 桌面上的“开始”—>“程序”命令,在其弹出的菜单中 选择“Microsoft Visual Studio 6.0”命令,再在其子菜单中 查有无“Microsoft Visual C++ 6.0”命令。如果在安装时采 用系统提供的默认方式安装,应该在这个位置找到 Microsoft Visual C++ 6.0。 如果想查找RHIDE和DJGPP,只须选择“开始”—>“查找(F)”—>“文件或文件夹(F)”命令,并指定RHIDE 和DJGPP即可。 (2)在Visual C++环境下编译和运行C++程序。 在第一次上机时,按以下步骤建立和运行C++程序: ①先进入Visual C++ 6.0环境。 ②按照第15章15.2节介绍的方法,在自己指定的子目录中 建立一个名为test.cpp的新文件(此事尚未向文件输入内 容)。 ③从键盘输入以下程序(第1章第8题): int main(); { int a,b; c=a+b; cout>>”a+b=”>>a+b;

中南大学通信原理实验报告(截图完整)

中南大学 《通信原理》实验报告 学生姓名 指导教师 学院 专业班级 完成时间

数字基带信号 1、实验名称 数字基带信号 2、实验目的 (1)了解单极性码、双极性码、归零码、不归零码等基带信号波形特点。 (2)掌握AMI、HDB 3 码的编码规则。 (3)掌握从HDB 3 码信号中提取位同步信号的方法。 (4)掌握集中插入帧同步码时分复用信号的帧结构特点。 (5)了解HDB 3 (AMI)编译码集成电路CD22103。 3、实验内容 (1)用示波器观察单极性非归零码(NRZ)、传号交替反转码(AMI)、三阶高密度双极性码 (HDB 3)、整流后的AMI码及整流后的HDB 3 码。 (2)用示波器观察从HDB 3 码中和从AMI码中提取位同步信号的电路中有关波形。 (3)用示波器观察HDB 3 、AMI译码输出波形。 4、基本原理(简写) 本实验使用数字信源模块和HDB 3 编译码模块。 1、数字信源 本模块是整个实验系统的发终端,模块内部只使用+5V电压,其原理方框图如图1-1所示,电原理图如图1-3所示(见附录)。本单元产生NRZ信号,信号码速率约为170.5KB,帧结构如图1-2所示。帧长为24位,其中首位无定义,第2位到第8位是帧同步码(7位巴克码1110010),另外16位为2路数据信号,每路8位。此NRZ信号为集中插入帧同步码时分复用信号,实验电路中数据码用红色发光二极管指示,帧同步码及无定义位用绿色发光二极管指示。发光二极管亮状态表示1码,熄状态表示0码。 本模块有以下测试点及输入输出点: ? CLK 晶振信号测试点 ? BS-OUT 信源位同步信号输出点/测试点(2个) ? FS 信源帧同步信号输出点/测试点 ? NRZ-OUT(AK) NRZ信号(绝对码)输出点/测试点(4个) 图1-1中各单元与电路板上元器件对应关系如下: ?晶振CRY:晶体;U1:反相器7404 ?分频器U2:计数器74161;U3:计数器74193;U4:计数器40160 ?并行码产生器K1、K2、K3:8位手动开关,从左到右依次与帧同步码、数

数据结构实验答案1

重庆文理学院软件工程学院实验报告册 专业:_____软件工程__ _ 班级:_____软件工程2班__ _ 学号:_____201258014054 ___ 姓名:_____周贵宇___________ 课程名称:___ 数据结构 _ 指导教师:_____胡章平__________ 2013年 06 月 25 日

实验序号 1 实验名称实验一线性表基本操作实验地点S-C1303 实验日期2013年04月22日 实验内容1.编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。 2.编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。 3.编程序实现将单链表的数据逆置,即将原表的数据(a1,a2….an)变成 (an,…..a2,a1)。(单链表的数据域数据类型为一结构体,包括学生的部分信息:学号,姓名,年龄) 实验过程及步骤1. #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define ElemType int #define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/ typedef struct

{ ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/ }SeqList; #include "common.h" #include "seqlist.h" void px(SeqList *A,int j); void main() { SeqList *l; int p,q,r; int i; l=(SeqList*)malloc(sizeof(SeqList)); printf("请输入线性表的长度:"); scanf("%d",&r); l->last = r-1; printf("请输入线性表的各元素值:\n"); for(i=0; i<=l->last; i++) { scanf("%d",&l->elem[i]); } px(l,i); printf("请输入要插入的值:\n");

中南大学软件体系结构实验4-结构型设计模式实验

实验4 结构型设计模式实验 实验学时: 2 每组人数: 1 实验类型: 3 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它) 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的结构型设计模式,包括适配器模式、组合模式和外观模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。 二、实验内容 1. 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找,使用对象适配器实现) 2. Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序绘制类图并编程模拟实现。 3. 使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。绘制类图并编程模拟实现。 4. 某教育机构组织结构如下图所示:

《数据结构》实验报告

苏州科技学院 数据结构(C语言版) 实验报告 专业班级测绘1011 学号10201151 姓名XX 实习地点C1 机房 指导教师史守正

目录 封面 (1) 目录 (2) 实验一线性表 (3) 一、程序设计的基本思想,原理和算法描述 (3) 二、源程序及注释(打包上传) (3) 三、运行输出结果 (4) 四、调试和运行程序过程中产生的问题及采取的措施 (6) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6) 实验二栈和队列 (7) 一、程序设计的基本思想,原理和算法描述 (8) 二、源程序及注释(打包上传) (8) 三、运行输出结果 (8) 四、调试和运行程序过程中产生的问题及采取的措施 (10) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10) 实验三树和二叉树 (11) 一、程序设计的基本思想,原理和算法描述 (11) 二、源程序及注释(打包上传) (12) 三、运行输出结果 (12) 四、调试和运行程序过程中产生的问题及采取的措施 (12) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12) 实验四图 (13) 一、程序设计的基本思想,原理和算法描述 (13) 二、源程序及注释(打包上传) (14) 三、运行输出结果 (14) 四、调试和运行程序过程中产生的问题及采取的措施 (15) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16) 实验五查找 (17) 一、程序设计的基本思想,原理和算法描述 (17)

二、源程序及注释(打包上传) (18) 三、运行输出结果 (18) 四、调试和运行程序过程中产生的问题及采取的措施 (19) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19) 实验六排序 (20) 一、程序设计的基本思想,原理和算法描述 (20) 二、源程序及注释(打包上传) (21) 三、运行输出结果 (21) 四、调试和运行程序过程中产生的问题及采取的措施 (24) 五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24) 实验一线性表 一、程序设计的基本思想,原理和算法描述: 程序的主要分为自定义函数、主函数。自定义函数有 InitList_Sq、Out_List、ListInsert_Sq、ListDelete_Sq、LocateElem_Sq 、compare。主函数在运行中调用上述的自定义函数,每个自定义函数实现程序的每部分的小功能。 1.程序设计基本思想 用c语言编译程序,利用顺序存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;然后根据屏幕菜单的选择,可以进行数据的插入、删除、查找,并在插入或删除数据后,再输出线性表;最后在屏幕菜单中选择结束按钮,即可结束程序的运行。 2.原理 线性表通过顺序表现,链式表示,一元多项式表示,其中链式表示又分为静态链表,双向链表,循环链表等,在不同的情况下各不相同,他可以是一个数字,也可以是一个符号,通过符号或数字来实现程序的运行。 3.算法描述

操作系统实验报告-中南大学

操作系统原理试验报告 班级: 学号: 姓名:

实验一:CPU调度 一、实验内容 选择一个调度算法,实现处理机调度。 二、实验目的 多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。 三、实验题目 1、设计一个按优先权调度算法实现处理机调度的程序; 2、设计按时间片轮转实现处理机调度的程序。 四、实验要求 PCB内容: 进程名/PID; 要求运行时间(单位时间); 优先权; 状态: PCB指针; 1、可随机输入若干进程,并按优先权排序; 2、从就绪队首选进程运行:优先权-1/要求运行时间-1 要求运行时间=0时,撤销该进程 3、重新排序,进行下轮调度 4、最好采用图形界面; 5、可随时增加进程; 6、规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备 队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。 7、每次调度后,显示各进程状态。 实验二:内存管理 一、实验内容 主存储器空间的分配和回收 二、实验目的 帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。 三、实验题目 在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。

四、实验要求 1、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表; 表目内容:起址、长度、状态(未分/空表目) 2、结合实验一,PCB增加为: {PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,PCB指针} 3、采用最先适应算法分配主存空间; 4、进程完成后,回收主存,并与相邻空闲分区合并 .1、Vo类说明(数据存储结构) 进程控制块PCB的结构: Public class PCB{ //进程控制块PCB,代表一个进程 //进程名,作为进程的标识; private String name; //要求运行时间,假设进程运行的单位时间数; private int time; //赋予进程的优先权,调度时总是选取优先数小的进程先执行; private int priority; //状态,假设有“就绪”状态(ready)、“运行”状态(running)、 //“后备”状态(waiting)、“挂起”状态(handup) private String state; //进程存放在table中的位置 private int start; //进程的大小 private int length; //进程是否进入内存,1为进入,0为未进入 private int isIn; //进程在内存中的起始位置 private int base; //进程的大小 private int limit; //一些get和set方法以及构造器省略… };

中南大学机械基础实验报告机类

机械基础实验报告 (机械类) 中南大学机械基础实验教学中心 2011年8月 目录 训练一机构运动简图测绘 (1) 实验二动平衡实验 (3) 实验三速度波动调节实验 (4) 实验四机构创意组合实验 (5) 实验五平面机构创新设计及运动测试分析实验 (6) 实验六螺栓联接静动态实验 (7) 实验七螺旋传动效率实验 (8) 实验八带传动实验 (9) 实验九液体动压轴承实验 (10) 实验十机械传动性能综合测试实验 (12) 实验十一滚动轴承综合性能测试分析实验 (13) 实验十二机械传动设计及多轴搭接实验 (14) 实验十三减速器拆装实验 (15)

训练一机构运动简图测绘 专业班级第组姓名成绩 1.一个正确的“机构运动简图”应能说明哪些内容?绘制机构运动简图的基本步骤是什么? 2.机构自由度与原动件的数目各为多少?当机构自由度=原动件的数目,机构的

运动是否确定? 五.收获与建议

实验二动平衡实验 专业班级第组姓名成绩一、实验目的: 二?设备名称: 三?实验数据 实验转速: 四.思考题: 转子动平衡为什么要在左右两个平面上进行平衡?

实验三速度波动调节实验专业班级第组姓名成绩一?实验目的: 二?设备名称: 三?实验数据 1?当转速不变时,采用不同的飞轮,数据记录: 结论:当转速不变时,飞轮转动惯量越大,则机构的速度波动越二?当飞轮不变时,转速变化,数据记录: 结论:当飞轮不变时,转速越大,则机构的速度波动越

实验四机构创意组合实验 专业班级第组姓名成绩 一、机构运动简图(要求符号规范标注参数) 二、机构的设计方案图(复印件) 三、机构有____________个活动构件?有______个低副,其中转动副_______个, 移动副__________个,有____________复合铰链,在_________处?有________处?有__________个虚约束,在__________处? 四、机构自由度数目为F=3n-2PL-PH=3X-2X-0= 五、机构有_________个原动件 在___________处用__________驱动,在__________处用___________驱动? 六、针对原设计要求,按照实验结果简述机构的有关杆件是否运动到位?曲柄是 否存在?是否实现急回特性?最小传动角数值?是否有“卡住”现象?(原无要求的项目可以不作涉及) 七、指出在机构中自己有所创新之处? 八、指出机构的设计存在的不足之处,简述进一步改进的设想?

数据结构实验报告(2015级)及答案

数据结构实验报告(2015级)及答案

《数据结构》实验报告 专业__信息管理学院______ 年级__2015级___________ 学号___ _______ 学生姓名___ _ _______ 指导老师____________ 华中师范大学信息管理系编

I 实验要求 1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。 2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。 3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。 4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。 II 实验内容 实验一线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1.一个线性表有n个元素(n

的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现;比较两种方法的优劣。 2. 从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表, 并调用该函数,验证算法的正确性。 LinkedList Exchange(LinkedList HEAD,p)∥HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 {q=head->next;∥q是工作指针,指向链表中当前待处理结点。 pre=head;∥pre是前驱结点指针,指向q的前驱。 while(q!=null && q!=p){pre=q;q=q->next;} ∥

中南大学软件体系结构设计模式实验二

中南大学软件体系结构设计模式实验二 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

实验3 设计模式实验二 实验学时: 4 每组人数: 1 实验类型: 3 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它) 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的行为型设计模式,包括职责链模式、命令模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。 二、实验内容 1. 某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如下图所示: 试使用职责链模式设计并模拟实现该系统。 2. 房间中的开关是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。 3. 某软件公司欲开发一个基于Windows平台的公告板系统。系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。 4. 某实时在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设计并实现该系统,要求绘制相应的类图并编程模拟实现。 5. 某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(CautionLight)将闪烁(flicker())、报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(InsulatedDoor)将自动关闭(close())

中南大学制造系统自动化技术实验报告整理

制造系统自动化技术 实验报告 学院:机电工程学院 班级:机制**** 姓名:张** 学号: *********** 指导教师:李** 时间: 2018-11-12 实验一柔性自动化制造系统运行实验 1.实验目的 (1)通过操作MES终端软件,实现对柔性制造系统的任务下达和控制加工,让学生

了解智能制造的特征及优势。 (2)通过创意性的实验让学生了解自动化系统总体方案的构思。 (3)通过总体方案的构思让学生了解该系统的工作原理,并学会绘制控制系统流程图,掌握物料流、信息流、能量流的流动路径。 (4)通过总体方案的构思让学生掌握各机械零部件、传感器、控制元器件的工作原理及性能。 (5)通过实验系统运行让学生了解运行的可靠性、安全性是采用何种元器件来实现的,促进学生进行深层次的思考和实践。 2.实验内容 (1)仔细观察柔性自动化制造系统的实现,了解柔性自动化制造系统的各个模块,熟悉各个模块的机械结构。 (2)了解各种典型传动机构的组装、工作原理、以及如何实现运动方向和速度的改变; (3)学习多种传感器的工作原理、性能和使用方法; (4)了解典型驱动装置的工作原理、驱动方式和性能; (5)理解柔性制造系统的工作原理,完成柔性制造系统的设计、组装; (6)实现对柔性制造系统的控制与检测,完成工件抓取、传输和加工。

3.实验步骤 (1)柔性制造系统的总体方案设计; (2)进行检测单元的设计; (3)进行控制系统的设计; (4)上下料机构的组装与检测控制; (5)物料传输机构的组装与实现; (6)柔性制造系统各组成模块的连接与控制; (7)柔性制造系统各组成单元的状态与工件状态位置的检测; (8)对机器人手动操作,实现对工件的抓取、传输。 4. 实验报告 ①该柔性自动化制造系统由哪几个主要的部分组成; 主要由:总控室工作站、AGV小车输送物料机构、安川机器人上下料工作站、法那科机器人上下料工作站、ABB机器人组装工作站、视觉检测及传送工作站、激光打标工作站、堆垛机及立体仓储工作站。 ②画出该柔性自动化制造系统的物料传输系统结构简图;

数据结构实验报告-答案

数据结构(C语言版) 实验报告

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测 试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"" #include"" #include"" #include"" typedef struct node . . 示意图:

head head head 心得体会: 本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。

实验2 实验题目:二叉树操作设计和实现 实验目的: 掌握二叉树的定义、性质及存储方式,各种遍历算法。 实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历 的操作,求所有叶子及结点总数的操作。 实验主要步骤: 1、分析、理解程序。 2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针), 如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求 所有叶子及结点总数。 实验代码 #include"" #include"" #include"" #define Max 20 ertex=a; irstedge=NULL; irstedge; G->adjlist[i].firstedge=s; irstedge; R[i] 留在原位

中南大学机械制造工艺学实验报告

机械制造工艺学实验报告 班级机械1301 姓名黄佳清 学号 07

中南大学机电学院 《机械制造工艺学》课程实验报告 实验名称:加工误差的统计分析 姓名:黄佳清班级:机械1301 学号: 07 实验日期: 2015 年 10 月 18 日指导教师:成绩: 1. 实验目的 (1)掌握加工误差统计分析方法的基本原理和应用。 (2)掌握样本数据的采集与处理方法,要求:能正确地采集样本数据,并能通过对样本 数据的处理,正确绘制出加工误差的实验分布曲线和图。 (3)能对实验分布曲线和图进行正确地分析,对加工误差的性质、工序能力及工艺 稳定性做出准确的鉴别。 (4)培养对加工误差进行综合分析的能力。 2. 实验内容与实验步骤

1.按加工顺序测量工件的加工尺寸,记录测量结果。 2.绘制直方图和分布曲线 1)找出这批工件加工尺寸数据的最大值x max和最小值x min,按下式计算出极差R。 R=x max一x min 2)确定分组数K(K一般根据样本容量来选择,建议可选在8~11之间)。 3)按下式计算组距 d。 4)确定组界(测量单位:微米)。 5)做频数分布表。 6)计算x和 。 7)画直方图 以样本数据值为横坐标,标出各组组界;以各组频率密度为纵坐标,画出直方图。 8)画分布曲线 若工艺过程稳定,则误差分布曲线接近正态分布曲线;若工艺过程不稳定,则应根据实际情况确定其分布曲线。画出分布曲线,注意使分布曲线与直方图协调一致。 9)画公差带 在横轴下方画出公差带,以便与分布曲线相比较。 3.绘制图 1)确定样组容量,对样本进行分组

样组容量m 通常取4或5件。按样组容量和加工时间顺序,将样本划分成若干个样组。 2)计算各样组的平均值和极差 对于第i 个样组,其平均值和极差计算公式为: ∑==m j ij i x m x 1 1 式中 ——第i 个样组的平均值; ——第i 个样组的标准差; ——第i 个样组第j 个零件的测量值; ——第i 个样组数据的最大值; ——第i 个样组数据的最小值 3)计算图控制限(计算公式见实验原理) 4)绘制 图 以样组序号为横坐标,分别以各样组的平均值和极差R 为纵坐标,画出图,并在图上标出中心线和上、下控制限。 4. 按下式计算工序能力系数Cp 5. 判别工艺过程稳定性 可按下表所列标准进行判别。注意,同时满足表中左列3个条件,工艺过程稳定;表中右列条件之一不满足,即表示工艺过程不稳定。

数据结构实验报告-答案.doc

数据结构实验报告-答案 数据结构(C语言版)实验报告专业班级学号姓名实验1实验题目:单链表的插入和删除实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤:1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序:(1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码:#include“stdio.h“#include“string.h“#include“stdlib.h“#include“ctype. h“typedefstructnode//定义结点{chardata[10];//结点的数据域为字符串structnode*next;//结点的指针域}ListNode;typedefListNode*LinkList;//自定义LinkList单链表类型LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表LinkListCreatList(void);//函数,用头插入法建立带头结点的单链表ListNode*LocateNode();//函数,按值查找结点voidDeleteList();//函数,删除指定值的结点voidprintlist();//函数,打印链表中的所有值voidDeleteAll();//函数,删除所有结点,释放内存

数据结构实验报告图实验

邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; }

int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

中南大学 计算机体系结构实验报告

计算机体系结构课程设计 学院:信息科学与工程学院 专业班级: 指导老师: 学号: 姓名:

目录 实验1 对指令操作码进行霍夫曼编码 (3) 一、实验目的 (3) 二、实验内容 (3) 三、设计思路 (4) 四、关键代码 (4) 五、实验截图 (5) 六、源代码 (5) 实验2 使用LRU 方法更新Cache (8) 一、实验目的 (8) 二、实验内容 (8) 三、设计思路 (9) 四、程序截图 (9) 五、实验代码 (9) 实验总结 (16) 参考文献 (16)

实验1 对指令操作码进行霍夫曼编码一、实验目的 了解和掌握指令编码的基本要求和基本原理 二、实验内容 1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。与扩展操作码和等长编码进行比较。 2. 问题描述以及问题分析 举例说明此问题,例如: 下表所示: 对此组指令进行 HUFFMAN 编码正如下图所示: 最后得到的HUFFMAN 编码如下表所示:

最短编码长度为: H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95. 要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编 码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。 三、设计思路 观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。为此设计一个工作链表(链表的元素时类,此类的功能相当结构。)、HUFFMAN 树节点、HUFFMAN 编码表节点。 四、关键代码 哈夫曼树重点在于如何排列权值大小不同的结点的顺序 private int leafNum; //叶子结点个数 private HaffmanNode[] hnodes; //哈夫曼树的结点数组 public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树 { int n = weight.length; //n个叶子结点 this.leafNum = n; this.hnodes = new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点 for(int i=0; i

中南大学x射线实验报告参考

中南大学 X射线衍射实验报告 学院专业班级 姓名学号同组者 月日指导教师 实验 日期 评分分评阅人评阅日期 实验目的 1)掌握X射线衍射仪的工作原理、操作方法; 2)掌握X射线衍射实验的样品制备方法; 3)学会X射线衍射实验方法、实验参数设臵,独立完成一个衍射实验测试; 4)学会MDI Jade 6的基本操作方法; 5)学会物相定性分析的原理和利用Jade进行物相鉴定的方法; 6)学会物相定量分析的原理和利用Jade进行物相定量的方法。 本实验由衍射仪操作、物相定性分析、物相定量分析三个独立的实验组成,实验报告包含以上三个实验内容。 一、实验原理 1、X射线衍射仪 (1)X射线管 X射线管工作时阴极接负高压,阳极接地。灯丝附近装有控制栅,使灯丝发出的热电子在电场的作用下聚焦轰击到靶面上。阳极靶面上受电子束轰击的焦点便成为X射线源,向四周发射X射线。在阳极一端的金属管壁上一般开有四个射线出射窗口。转靶X射线管采用机械泵+分子泵二级真空泵系统保持管内真空度,

阳极以极快的速度转动,使电子轰击面不断改变,即不断改变发热点,从而达到提高功率的目的 (2)测角仪系统 测角仪圆中心是样品台,样品台可以绕中心轴转动,平板状粉末多晶样品安放在样品台上,样品台可围绕垂直于图面的中心轴旋转;测角仪圆周上安装有X 射线辐射探测器,探测器亦可以绕中心轴线转动;工作时,一般情况下试样台与探测器保持固定的转动关系(即θ-2θ连动),在特殊情况下也可分别转动;有的仪器中样品台不动,而X 射线发生器与探测器连动。 (3)衍射光路 2、物相定性分析 1) 每一物相具有其特有的特征衍射谱,没有任何两种物相的衍射谱是完全相同 的 2) 记录已知物相的衍射谱,并保存为PDF 文件 3) 从PDF 文件中检索出与样品衍射谱完全相同的物相 4) 多相样品的衍射谱是其中各相的衍射谱的简单叠加,互不干扰,检索程序能 从PDF 文件中检索出全部物相 3、物相定量分析 物相定量分析——绝热法 在一个含有N 个物相的多相体系中,每一个相的RIR 值(参比强度)均为已知的情况下,测量出每一个相的衍射强度,可计算出其中所有相的质量分数: 其中某相X 的质量分数可表示为: ∑ == N A i i A i X A X X K I K I W 式中A 表示N 个相中被选定为内标相的物相名称 式中A O Al X O Al X A K K K 3 232= 右边是两个物相X 和A 的RIR 值,可以通过实测、计算或查找PDF 卡片获得。 样品中只含有两相A 和B ,并选定A 为内标物相,则有:

数据结构实验报告

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构 实验学期2015至2016学年第一学期 学生所在系部计算机学院 年级2014专业班级物联B142班 学生姓名杨文铎学号201407054201 任课教师白磊 实验成绩

用哈夫曼编码实现文件压缩 1、了解文件的概念。 2、掌握线性表的插入、删除的算法。 3、掌握Huffman树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用Haffman树及Haffman编码,掌握实现文件压缩的一般原理。 微型计算机、Windows系列操作系统、Visual C++6.0软件 根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。 本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符,无须全部都用S为的ascii码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制数字符进行存储,已达到节省存储空间,压缩文件的目的,解决了压缩需要采用的算法,程序的思路已然清晰: 1、统计需压缩文件中的每个字符出现的频率 2、将每个字符的出现频率作为叶子节点构建Haffman树,然后将树中结点引向 其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码 即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman 编码,将每个字符用最短的二进制字符表示。 3、打开需压缩文件,再将需压缩文件中的每个ascii码对应的haffman编码按bit 单位输出。 4、文件压缩结束。 (1)构造haffman树的方法一haffman算法 构造haffman树步骤: I.根据给定的n个权值{w1,w2,w3…….wn},构造n棵只有根结点的二叉 树,令起权值为wj。 II.在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 III.在森林中删除这两棵树,同时将得到的二叉树加入森林中。 IV.重复上述两步,知道只含一棵树为止,这棵树即哈夫曼树。 对于haffman的创建算法,有以下几点说明: a)这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为

中南大学微机实验报告

中南大学信息科学与工程学院 微机原理与接口技术实验报告 学生学院信息科学与工程学院 专业班级 学号 学生姓名____ 指导教师

目录 第一部分软件实验 (4) DEBUG 的使用 (4) 第二部分硬件实验 (8) 实验一使用ADC0809的A/D转换实验 (10) 实验二使用DAC0832的D/A转换实验(一) ................................. 错误!未定义书签。 实验三使用DAC0832的D/A转换实验(二) ................................. 错误!未定义书签。第三部分实验总结. (13)

第一部分软件实验 DEBUG 的命令及其操作 一、实验目的 1.熟练掌握debug的常用命令,学会用debug来调试程序。 2.深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。 3.掌握各种寻址方法以及简单指令的执行过程。 二、实验内容 1.进入和退出DEBUG程序 2.本实验只要求在DEBUG调试状态下进行,包括汇编程序,调试程序,执行程序 3.掌握一些DEBUG的基本操作 三、实验环境 Windows系统下从进入命令行窗口。 四、实验的基本原理 a 汇编 d显示内存单元内容 e修改单元内存内容 g执行命令 t单步(或多步)调试 n指定文件路径文件名(含扩展名) u反汇编 r查看寄存器值及修改 l加载程序 w写盘命令 五、实验步骤 1.用DEBUG调试简单程序 例1 -A CS:0106 MOV AX,1234 MOV BX,2345 MOV CX,0 ADD AX,BX MOV CX,AX INT 20 运行程序

相关主题
文本预览
相关文档 最新文档