搜档网
当前位置:搜档网 › 迷宫求解实验报告

迷宫求解实验报告

迷宫求解实验报告
迷宫求解实验报告

《编程实训》

实验报告书

专业:计算机科学与技术

班级: 1班

学号: 31960144 姓名:周*

指导教师:周**

日期:2016年6月30日

目录

一、需求分析 (3)

1.任务要求 (3)

2.软件功能分析 (3)

3.数据准备 (3)

二、概要设计 (3)

1.功能模块图 (4)

2.模块间调用关系 (4)

3.主程序模块 (5)

4.抽象数据类型描述 (5)

三、详细设计 (6)

1.存储结构定义 (6)

2.各功能模块的详细设计 (7)

四、实现和调试 (7)

1.主要的算法 (7)

2.主要问题及解决 (8)

3.测试执行及结果 (8)

五、改进 (9)

六、附录 (9)

1 需求分析

1.1 任务要求

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

1.2 软件功能分析

设计一个迷宫,通过该程序可以找出通往出口的最短路径。程序功能有三(1)创建迷宫;(2)求解迷宫;(3)输出迷宫的解。

1.3 数据准备

迷宫的测试数据如下:左上角

障碍物坐标:

1 3 1 7

2

3 2 7 3 5 3 6 3 8

4 2 4 3 4 4 4 7

5 4

6 2 6 6

6 8

7 2 7 3 7 4 7 5 7

8 8 1

8 2 8 6 8 8 9 1 9 2

2 概要设计

2.1 功能模块图

栈的顺序存储表示

#define StackSize 100 //假定预分配的栈空间最多为100个元素

typedef char DataType;//假定栈元素的数据类型为字符

typedef struct{

DataType data[StackSize];

int top;

}SeqStack;

基本操作的算法描述

(1)置栈空

void InitStack(SeqStack *S)

{//将顺序栈置空

S->top=-1;

}

(2)判栈空

int StackEmpty(SeqStack *S)

{

return S->top==-1;

}

(3)判栈满

int StackFull(SeqStack *SS)

{

return S->top==StackSize-1;

}

(4)进栈

void Push(S,x)

{

if (StackFull(S))

Error("Stack overflow"); //上溢,退出运行 S->data[++S->top]=x;//栈顶指针加1后将x入栈

}

(5)退栈

DataType Pop(S)

{

if(StackEmpty(S))

Error("Stack underflow"); //下溢,退出运行 return S->data[S->top--];//栈顶元素返回后将栈顶指针减1 }

(6)取栈顶元素

DataType StackTop(S)

{

if(StackEmpty(S))

Error("Stack is empty");

return S->data[S->top];

}

2.2 模块间调用关系

Stack.h中调用的base.h

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

2.3 主程序模块

主程序maze.c中调用的stack.h

#define INIT_SIZE 100 //存储空间初始分配量

#define INCREMENT 10 //存储空间分配增量

typedef struct{ //迷宫中r行c列的位置

int r;

int c;

}PostType;

typedef struct{

int ord; //当前位置在路径上的序号

PostType seat;//当前坐标

int di; //往下一坐标的方向

}SElemType; //栈元素类型

typedef struct{

SElemType* base;//栈基址,构造前销毁后为空

SElemType* top;//栈顶

int stackSize; //栈容量

}Stack; //栈类型

Status InitStack(Stack &S){ //构造空栈s

S.base=(SElemType*)malloc(INIT_SIZE *sizeof(SElemType)); if(!S.base)

exit(OVERFLOW);//存储分配失败

S.top=S.base;

S.stackSize=INIT_SIZE;

return OK;

}//InitStack

Status StackEmpty(Stack S){

//若s为空返回TRUE,否则返回FALSE

if(S.top==S.base)

return TRUE;

return FALSE;

}//StackEmpty

Status Push(Stack &S,SElemType e){

//插入元素e为新的栈顶元素

if(S.top-S.base >=S.stackSize){//栈满,加空间

S.base=(SElemType

*)realloc(S.base,(S.stackSize+INCREMENT)*sizeof(SElemType));

if(!S.base)

exit(OVERFLOW); //存储分配失败

S.top=S.base+S.stackSize;

S.stackSize+=INCREMENT;

}

*S.top++=e;

return OK;

}//push

Status Pop(Stack &S,SElemType &e){//若栈不空删除栈//顶元素用e返回并返回OK,否则返回ERROR

if(S.top==S.base)

return ERROR;

e=*--S.top;

return OK;

}//Pop

Status DestroyStack(Stack &S){//销毁栈S,

free(S.base);

S.top=S.base;

return OK;

}//DestroyStack

2.4 抽象数据类型描述

栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。

假设栈S=(a1,a2,…,an),则称a1为栈底元素,an为栈顶元素。栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(List In First Out)的线性表。

在迷宫问题中,假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。

3 详细设计

3.1 存储结构定义

typedef int Status;

#define INIT_SIZE 100 //存储空间初始分配量

#define INCREMENT 10 //存储空间分配增量

typedef struct

{ //迷宫中r行c列的位置

int r;

int c;

}PostType;

typedef struct

{

int ord; //当前位置在路径上的序号

PostType seat;//当前坐标

int di; //往下一坐标的方向

}SElemType;

//栈元素类型

typedef struct

{

SElemType* base;//栈基址,构造前销毁后为空

SElemType* top;//栈顶

int stackSize; //栈容量

}Stack;

//栈类型

3.2 各功能模块的详细设计

●初始化迷宫

Status InitMaze(MazeType &maze)

●可通位置

Status Pass(MazeType maze,PostType curpos)

●标记非通路

Status MarkPrint(MazeType &maze,PostType curpos)

●迷宫maze从入口start到end的通道

Status MazePath(MazeType &maze,PostType start,PostType end)

●标记路径信息

void PrintMaze(MazeType &maze)

4 实现和调试

4.1 主要的算法

设定当前位置的初值为入口位置;

do{

若当前位置可通,则

将当前位置入栈;//纳入路径

若该位置是出口位置,则结束;//求得路径存放在栈中

否则切换当前位置的上方位置为新的当前位置;

否则

若栈不空且栈顶位置尚有其他方向未被探索,

则设定新的当前位置为沿着顺时针方向旋转找到的栈顶位置的下一个相邻块;

若栈不空但栈顶位置的四周均不可通,

删去栈顶位置;//后退一步,从路径中删去该通道块

若栈不空,则重新测试新的栈顶位置,

直至找到一个可通的相邻块或出栈至栈空;

}while(栈不空)

{栈空说明没有路径存在}

4.2 主要问题及解决

经过对程序的编制,调试和运行,使我更好的掌握了栈基本性质和有关迷宫问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。

4.3 测试执行及结果

输入数据:当入口为(1,1)时,出口为(9,8)

用一个字符类型的二微数组表示迷宫,数组中的每个元素表示一个小方格,取值“0”(表示可以进出)或“1”(表示不可以进出)

随机产生一个9*8的迷宫,其中使用迷宫障碍坐标如下:

1 3 1 7

2

3 2 7 3 5 3 6 3 8

4 2 4 3 4 4 4 7

5 4

6 2 6 6

6 8

7 2 7 3 7 4 7 5 7

8 8 1

8 2 8 6 8 8 9 1 9 2

输入过程如下图所示:输入时(-1,-1)结束,接着输入入口参数(1,1)

然后输入出口参数(9,8),运行:

运行结果如下图所示:

图中“1”表示围墙和障碍物。“@”表示走过但不是通路.而“0”表示最短路径。

5 改进

通过不断的调试简短了程序并最终实现了功能。第一次写的程序出现错误,找不到路径,陷入死循环。经过多次改进,程序可以找到最短路径。再次改进后能标出走过的但非最短的路径,有了很大的进步。

6 附录

源程序代码

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

#define INIT_SIZE 100 //存储空间初始分配量

#define INCREMENT 10 //存储空间分配增量

typedef struct

{ //迷宫中r行c列的位置

int r;

int c;

}PostType;

typedef struct

{

int ord; //当前位置在路径上的序号

PostType seat;//当前坐标

int di; //往下一坐标的方向

}SElemType;

//栈元素类型

typedef struct

{

SElemType* base;//栈基址,构造前销毁后为空

SElemType* top;//栈顶

int stackSize; //栈容量

}Stack;

//栈类型

Status InitStack(Stack &S)

{//构造空栈s

S.base=(SElemType*)malloc(INIT_SIZE *sizeof(SElemType));

if(!S.base)

exit(OVERFLOW);//存储分配失败

S.top=S.base;

S.stackSize=INIT_SIZE;

return OK;

}//InitStack

Status StackEmpty(Stack S)

{

//若s为空返回TRUE,否则返回FALSE

if(S.top==S.base)

return TRUE;

return FALSE;

}//StackEmpty

Status Push(Stack &S,SElemType e)

{

//插入元素e为新的栈顶元素

if(S.top-S.base >=S.stackSize)

{//栈满,加空间

S.base=(SElemType

*)realloc(S.base,(S.stackSize+INCREMENT)*sizeof(SElemType));

if(!S.base)

exit(OVERFLOW); //存储分配失败

S.top=S.base+S.stackSize;

S.stackSize+=INCREMENT;

}

*S.top++=e;

return OK;

}//push

Status Pop(Stack &S,SElemType &e)

{//若栈不空删除栈//顶元素用e返回并返回OK,否则返回ERROR if(S.top==S.base)

return ERROR;

e=*--S.top;

return OK;

}//Pop

Status DestroyStack(Stack &S)

{//销毁栈S,

free(S.base);

S.top=S.base;

return OK;

}//DestroyStack

#define MAXLEN 10//迷宫包括外墙最大行列数目

typedef struct

{

int r;

int c;

char adr[MAXLEN][MAXLEN];//可取' ''*' '@' '#'

}MazeType; //迷宫类型

Status InitMaze(MazeType &maze)

{

//初始化迷宫若成功返回TRUE,否则返回FALSE

int m,n,i,j;

printf("输入行和列数: ");

scanf("%d%d",&maze.r,&maze.c); //迷宫行和列数

for(i=0;i<=maze.c+1;i++)

{//迷宫行外墙

maze.adr[0][i]='1';

maze.adr[maze.r+1][i]='1';

}//for

for(i=0;i<=maze.r+1;i++)

{//迷宫列外墙

maze.adr[i][0]='1';

maze.adr[i][maze.c+1]='1';

}

for(i=1;i<=maze.r;i++)

for(j=1;j<=maze.c;j++)

maze.adr[i][j]=' ';//初始化迷宫

printf("输入障碍物坐标,以-1 -1结束: ");

scanf("%d%d",&m,&n);//接收障碍的坐标

while(m!=-1)

{

if(m>maze.r || n>maze.c)//越界

exit(ERROR);

maze.adr[m][n]='1';//迷宫障碍用'#'标记

printf("输入障碍物坐标,以-1 -1结束: ");

scanf("%d%d",&m,&n);

}//while

return OK;

}//InitMaze

Status Pass(MazeType maze,PostType curpos)

{

//当前位置可通则返回TURE,否则返回FALSE

if(maze.adr[curpos.r][curpos.c]==' ')//可通return TRUE;

else

return FALSE;

}//Pass

Status FootPrint(MazeType &maze,PostType curpos) {

//若走过并且可通返回TRUE,否则返回FALSE

//在返回之前销毁栈S

maze.adr[curpos.r][curpos.c]='0';//"*"表示可通return OK;

}//FootPrint

PostType NextPos(PostType &curpos,int i)

{

//指示并返回下一位置的坐标

PostType cpos;

cpos=curpos;

switch(i)

{ //1.2.3.4分别表示东,南,西,北方向

case 1 : cpos.c+=1; break;

case 2 : cpos.r+=1; break;

case 3 : cpos.c-=1; break;

case 4 : cpos.r-=1; break;

default: exit(ERROR);

}

return cpos;

}//Nextpos

Status MarkPrint(MazeType &maze,PostType curpos)

{

//曾走过但不是通路标记并返回OK

maze.adr[curpos.r][curpos.c]='@';//"@"表示曾走过但不通

return OK;

}//MarkPrint

Status MazePath(MazeType &maze,PostType start,PostType end) {

//若迷宫maze存在从入口start到end的通道则求得一条存放在栈中 //并返回TRUE,否则返回FALSE

Stack S;

PostType curpos;

int curstep;//当前序号,1.2.3.4分别表示东,南,西,北方向

SElemType e;

InitStack(S);

curpos=start; //设置"当前位置"为"入口位置"

curstep=1; //探索第一步

do

{

if(Pass(maze,curpos))

{//当前位置可以通过,

//即是未曾走到过的通道

FootPrint(maze,curpos);//留下足迹

e.ord=curstep;

e.seat=curpos;

e.di=1;

Push(S,e); //加入路径

if(curpos.r==end.r&& curpos.c==end.c)

if(!DestroyStack(S))//销毁失败

exit(OVERFLOW);

else

return TRUE; //到达出口

else

{

curpos=NextPos(curpos,1); //下一位置是当前位置的东邻

curstep++; //探索下一步

}//else

}//if

else

{ //当前位置不通

if(!StackEmpty(S))

{

Pop(S,e);

while(e.di==4 && !StackEmpty(S))

{

MarkPrint(maze,e.seat);

Pop(S,e); //留下不能通过的标记,并退一步

}//while

if(e.di < 4)

{

e.di++;//换下一个方向探索

Push(S,e);

curpos=NextPos(e.seat,e.di);//设定当前位置是该

//新方向上的相邻

}//if

}//if

}//else

}

while(!StackEmpty(S));

if(!DestroyStack(S))//销毁失败

exit(OVERFLOW);

else

return FALSE;

}//MazePath

void PrintMaze(MazeType &maze)

{ //将标记路径信息的迷宫输出到终端(包括外墙)

int i,j;

printf("\n迷宫的路径(*---路径):\n\n");

printf(" ");

for(i=0;i<=maze.r+1;i++)//打印列数名

printf("%4d",i);

printf("\n\n");

for(i=0;i<=maze.r+1;i++)

{

printf("%2d",i);//打印行名

for(j=0;j<=maze.c+1;j++)

printf("%4c",maze.adr[i][j]);//输出迷宫//当前位置的标记printf("\n\n");

}

}//PrintMaze

int main()

{ //主函数

MazeType maze;

PostType start,end;

char cmd;

do

{

printf("-------迷宫求解--------\n");

if(!InitMaze(maze)){ //初始化并创建迷宫

printf("\n初始化错误!!!\n");

exit(OVERFLOW); //初始化错误

}

do

{ //输入迷宫入口坐标

printf("\n输入入口坐标: ");

scanf("%d%d",&start.r,&start.c);

if(start.r>maze.r || start.c>maze.c)

{

printf("\nBeyond the maze!!!\n");

continue;

}

}

while(start.r>maze.r || start.c>maze.c);

do

{ //输入迷宫出口坐标

printf("\n输入出口坐标: ");

scanf("%d%d",&end.r,&end.c);

if(end.r>maze.r || end.c>maze.c)

{

printf("\nBeyond the maze!!!\n");

continue;

}

}

while(end.r>maze.r || end.c>maze.c);

if(!MazePath(maze,start,end))//迷宫求解

printf("\n没有路径!\n");

else

PrintMaze(maze);//打印路径

printf("\n继续?(y/n): ");

scanf("%s",&cmd);

}

while(cmd=='y' || cmd=='Y'); return 0;

}

数据结构迷宫问题实验报告

《数据结构与算法设计》迷宫问题实验报告 ——实验二 专业:物联网工程 班级:物联网1班 学号:15180118 姓名:刘沛航

一、实验目的 本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。 二、实验内容 用一个m*m长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序对于任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 三、程序设计 1、概要设计 (1)设定栈的抽象数据类型定义 ADT Stack{ 数据对象:D={ai|ai属于CharSet,i=1、2…n,n>=0} 数据关系:R={|ai-1,ai属于D,i=2,3,…n} 基本操作: InitStack(&S) 操作结果:构造一个空栈 Push(&S,e) 初始条件:栈已经存在 操作结果:将e所指向的数据加入到栈s中 Pop(&S,&e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素 Getpop(&S,&e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元

StackEmpty(&S) 初始条件:栈已经存在 操作结果:判断栈是否为空。若栈为空,返回1,否则返回0 Destroy(&S) 初始条件:栈已经存在 操作结果:销毁栈s }ADT Stack (2)设定迷宫的抽象数据类型定义 ADT yanshu{ 数据对象:D={ai,j|ai,j属于{‘ ’、‘*’、‘@’、‘#’},0<=i<=M,0<=j<=N} 数据关系:R={ROW,COL} ROW={|ai-1,j,ai,j属于D,i=1,2,…M,j=0,1,…N} COL={|ai,j-1,ai,j属于D,i=0,1,…M,j=1,2,…N} 基本操作: InitMaze(MazeType &maze, int a[][COL], int row, int col){ 初始条件:二维数组int a[][COL],已经存在,其中第1至第m-1行,每行自第1到第n-1列的元素已经值,并以值0表示障 碍,值1表示通路。 操作结果:构造迷宫的整形数组,以空白表示通路,字符‘0’表示障碍 在迷宫四周加上一圈障碍 MazePath(&maze){ 初始条件:迷宫maze已被赋值 操作结果:若迷宫maze中存在一条通路,则按如下规定改变maze的状态;以字符‘*’表示路径上 的位置。字符‘@’表示‘死胡同’;否则迷宫的状态不变 } PrintMaze(M){ 初始条件:迷宫M已存在 操作结果:以字符形式输出迷宫 } }ADTmaze (3)本程序包括三个模块 a、主程序模块

机械设计综合实验指导书与实验报告

机械设计综合实验指导书 及实验报告 班级 学号 姓名 机械基础实验中心雷代明 2017年3月 第一部分机械设计

实验一机械零件认知与分析实验 一、实验目的 1、熟悉常用的机械零件的基本结构,以便对所学理论知识产生一定的感性认识。 2、分析常用机械零件的基本构造及制造原理。 3、了解常用机械零件的实际使用情况。 二、实验内容 通过观察,掌握常用的机械零件的基本结构及应用场合。 三、实验简介 机械零件陈列观摩,共包括: (1)螺纹联接与应用 (2)键、花键、销、铆、焊、铰接 (3)带传动 (4)链传动 (5)齿轮传动 (6)蜗杆传动 (7)滑动轴承与润滑密封 (8)滚动轴承与装置设计 (9)轴的分析与设计 (10)联轴器与离合器。 共10个陈列柜,罗列了机械设计内容中大多数常用的基本零件与标准件,并对相应的零件进行了结构和基本受力分析,联接和安装的基本方法的说明,有些常用的零件还给出了简单的应用举例。 通过本实验的观摩,学生可以对照书本所学的基本内容,初步领会机械设计的一些常用零部件的基本设计与应用原理,从而达到举一反三的教学目的,对其所学的课本理论知识进一步巩固和深化。 四、实验要求 1、学生必须带上课本,以便于与书本内容进行对照观察。 2、进入实验室必须保持安静,不得大声喧哗,以免影响其他同学。 3、不得私自打开陈列柜,不得用手触摸各种机械零件模型。 4、服从实验人员的安排,认真领会机械零件的构造原理。 五、思考题 1、常用螺纹联接的方法有哪些? 2、说明无键联结的优缺点. 3、在带传动中,带张紧的方法有哪些?

4、轴上零件轴向常用的定位方法有哪些?举例说明。 第二章滑动轴承实验 实验二滑动轴承基本性能实验 一、概述 滑动轴承用于支承转动零件,是一种在机械中被广泛应用的重要零部件。根据轴承的工作原理,滑动轴承属于滑动摩擦类型。滑动轴承中的润滑油若能形成一定的油膜厚度而将作相对转动的轴承与轴颈表面分开,则运动副表面就不发生接触,从而降低摩擦、减少磨损,延长轴承的使用寿命。 根据流体润滑形成原理的不同,润滑油膜分为流体静压润滑(外部供压式)及流体动压润滑(内部自生式),本章讨论流体动压轴承实验。 流体动压润滑轴承其工作原理是通过轴颈旋转,借助流体粘性将润滑油带入轴颈与轴瓦配合表面的收敛楔形间隙内,由于润滑油由大端入口至小端出口的流动过程中必须满足流体流动连续性条件,从而润滑油在间隙内就自然形成周向油膜压力(见图2-1),在油膜压力作用下,轴颈由图2-1(a)所示的位置被推向图2-1(b)所示的位置。 当动压油膜的压力p在载荷F方向分力的合力与载荷F平衡时,轴颈中心处于某一相应稳定的平衡位置O1,O1位置的坐标为O1(e,φ)。其中e=OO1,称为偏心距;φ为偏位角(轴承中心0与轴颈中心0l连线与外载荷F作用线间的夹角)。 随着轴承载荷、转速、润滑油种类等参数的变化以及轴承几何参数(如宽径比、相对间隙)的不同,轴颈中心的位置也随之发生变化。对处于工况参数随时间变化下工作的非

人因工程模板(0803607张永梅迷宫实验报告)

实验报告——迷宫实验 实验目的: 1、测定睁眼闭眼时学习效果的不同。 2、学习效果随实验次数的变化。 实验地点:杭州电子科技大学现代工业工程实验室(第9教学科研楼401-407室) 实验时间:实验仪器:EP713型迷宫实验 指导老师:蔡敏 实验人员: 所学专业姓名性别年龄籍贯2008级工业工程张永梅 1. 实验设计(必须) 本实验测量被试迷宫学习的学习曲线,学会的标准是连续三次不发生错误(即没有一次进入盲巷)走出迷宫,学习的效果用每遍内错误(走入盲巷)的次数和走一遍所用的时间为指标,并记录学会迷宫总共用的学习遍数。 变量控制(可选) (1) 实验仪器都是正常工作的,不存在差异性。 (2) 实验进行的外部条件(包括温度、亮度等)都是适宜的,假定其保持不变。 (3) 在实验进行前,已详细地向其解释实验操作过程,并事先熟悉、练习一遍,以排 除熟悉度对于动作稳定实验的影响。 对照设置(可选) A.测定睁眼闭眼时学习效果的差异 理论上控制其它的各种因素,将睁眼、闭眼作为实验中的唯一自变量,以准确反映其对因变量(所用时间和出错次数)的影响。

B.测定学习次数的增加对于学习效果的影响 让一名被试连续做多次实验,记录每次实验所用的时间以及出错的次数,分析实验次数的增加是否对学习效果产生影响。 2. 实验过程(必须) (1)将随机附件电源变换器输出插头插入仪器的电源伸入端,然后将电源变换器插入交流220V供电电网的插座 (2)合上仪器的电源开关,仪器数字显示的计时状态,使用者可按动N/T按钮选择仪器数字显示计时状态()或计数状态(000) (3)拉出小抽板,拿出试笔,被试者手握试笔,试笔尽量和迷宫平面保持垂直,开始实验前,被试者作为第一次学习,应仔细观察迷宫的走道和盲道 (4)开始实验,将试笔在迷宫内滑动,计时器开始计时,如试笔进入盲道并到短点,计数器加1,当试笔到达终点时,仪器内的蜂鸣器鸣响,计时计数器停止工作,按动N/T按钮,数字显示实验时间和出错次数 (5)主试记录数据,被试取下眼罩 (6)按仪器的RET按钮,仪器复位,数字显示 (7)第二次实验,被试再一次观察迷宫的走道和盲道,作为第二次学习,然后按照第一次的步骤,再戴上眼罩,重复上一次实验 (8)被试连续三次无错误地走完整个迷宫后,即可根据实验数据绘制出时间曲线和出错曲线 3. 3. 实验结果(必须) 实验结果记录(必须) 实验结果记录如下表所示: 表1 闭眼时走完迷宫所需时间和错误次数随着学习次数的变化

迷宫问题c++实验报告

数据结构实验报告 班级: 姓名: 学号: 组员: 问题描述: 迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的

门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。老鼠经多次试验终于得到它学习走迷宫的路线。设计功能要求: 迷宫由m行n列的二维数组设置,0表示无障碍,1表示有障碍。设入口为(1,1),出口为(m,n),每次只能从一个无障碍单元移到周围四个方向上任一无障碍单元。编程实现对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 算法输入:代表迷宫入口的坐标 算法输出:穿过迷宫的结果。算法要点:创建迷宫,试探法查找路 任务分派 为了达到锻炼大家独立设计算法的能力,大家一致决定,先自己独立设计算法,不论算法的好坏、难易,完完全全出自于自己的手中。 在大家独立完成算法后,进行小组集中讨论,将自己的算法思想与大家交流,特别是自己最自豪的部分或是自己觉得可以改进的地方,之后得出最优结果。 独立设计 求解思想: 利用递归的方式进行求解。从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。 如果现在位置(i,j)处于迷宫的边界位置,则有2种或3种可能的走法,为使问题简单化,用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1,这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 struct Pos { int x,y; int di; }; 其中x、y分别表示横纵坐标值、di表示前进的方向。 在已经某一位置(i, j, d)的情况下,其下一个位置横、纵坐标的取值如表4-2所示。 而走到一个新位置时,其方向值初始置为1。 代码 #include "iostream" #include "iomanip" using namespace std; struct Pos { int x,y; int di; };

数据结构-迷宫实验报告

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 实验难度 A □ B □ C □ 承担任务 (难度为C时填写) 指导教师评分(签名) 【实验题目】 实验4.数组的表示极其应用 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。如;对于下列数据的迷宫,输出的一条通路为:(l,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。?

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) (本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识) 本实验的目的是设计一个程序,实现手动或者自动生成一个n×m矩阵的迷宫,寻找一条从入口点到出口点的通路。我们将其简化成具体实验内容如下:选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为墙,即无法穿越。假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“→”代表行走迷宫的路径。输出迷宫原型图、迷宫路线图以及迷宫行走路径。如果迷宫为死迷宫,输出信息。 可以二维数组存储迷宫数据,用户指定入口下标和出口下标。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。? 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1. 设定迷宫的抽象数据类型定义: ADT Maze { 数据对象:D = { a i, j | a i, j ∈ { ‘■’、‘□’、‘※’、‘→’、‘←’、 ‘↑’、‘↓’ } , 0≤ i≤row+1, 0≤j≤col+1, row, col≤18 } 数据关系:R = { ROW, COL } ROW = { < a i-1, j , a i, j > | a i-1, j , a i, j ∈D, i=1, … , row+1, j=0, … , col+1} COL = { < a i, j-1, a i, j > | a i, j-1 , a i, j ∈D, i=0, … , row+1, j=1, … , col+1} 基本操作: Init_hand_Maze( Maze, row, col) 初始条件:二维数组Maze[][]已存在。

微机综合设计实验报告

微机接口实验报告 学院:计算机与通信工程学院专业:计算机科学与技术 班级: 学号: 姓名: 综合设计实验

带分频的AD转换 实现功能: 利用8254实现分频功能,再利用AD0809实现数模转换功能。 设计思路: 首先利用8254芯片的计时功能,将CLK0端输入的1MHz的脉冲信号分频为0.1MHz的脉冲,并且从OUT0端输出,然后将输出的脉冲信号作为AD0809数模转换单元的输入信号,从而实现8254的分频功能和AD0809的数模转换功能。 设计接线图: 实验代码: (加粗为分频部分代码,未加粗为AD转换部分代码) IO8254_MODE EQU 283H ;8254控制寄存器端口地址 IO8254_COUNT0 EQU 280H ;8254计数器0端口地址 IO0809 EQU 298H ;AD0809DE STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, IO8254_MODE ;初始化8254工作方式 MOV AL,37H ;计数器0,方式3 00110111 OUT DX,AL MOV DX,IO8254_COUNT0 ;装入计数初值 MOV AX,000AH ;10D=0AH(可以自己设计分频倍数或者利用多个计数器实现更大倍数的分频) MOV AL,03H

OUT DX,AL MOV AL,AH OUT DX,AL MOV DX, IO0809 ;启动A/D转换器 OUT DX, AL MOV CX, 0FFH ;延时 DELAY: LOOP DELAY IN AL, DX ;从A/D转换器输入数据 MOV BL,AL ;将AL保存到BL MOV CL, 4 SHR AL, CL ;将AL右移四位 CALL DISP ;调显示子程序显示其高四位 MOV AL, BL AND AL, 0FH CALL DISP ;调显示子程序显示其低四位 MOV AH, 02 MOV DL, 20H ;加回车符 INT 21H MOV DL, 20H INT 21H PUSH DX MOV DL, 0FFH ;判断是否有键按下 MOV AH, 06H INT 21H POP DX JE START ;若没有转START MOV AH, 4CH ;退出 INT 21H DISP PROC NEAR ;显示子程序 MOV DL, AL CMP DL, 9 ;比较DL是否>9 JLE DDD ;若不大于则为'0'-'9',加30h为其ASCII码 ADD DL, 7 ;否则为'A'-'F',再加7 DDD: ADD DL,30H ;显示 MOV AH, 02 INT 21H RET DISP ENDP CODE ENDS END START

迷宫实验报告

一、实验内容 3、迷宫问题。假设迷宫由m行n列构成,有一个出口和一个入口,入口坐标为(1,1),出口坐标为(m,n),试设计并验证以下算法:找出一条从入口通往出口的路径,或报告一个“无法通过”的信息。 (1)用C语言实现顺序存储队列上的基本操作,然后利用该队列的基本操作找出迷宫的一条最短路径。 (2)设计一个二维数组MAZE[m+2][n+2]表示迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。MAZE[1][1]、MAZE[m][n]分别为迷宫的入口和出口。 (3)输入迷宫的大小m行和n列,动态生成二维数组;由随机数产生0或1,建立迷宫,注意m*n的迷宫需要进行扩展,扩展部分的元素设置为1,相当于在迷宫周围布上一圈不准通过的墙。 (4)要求输出模拟迷宫的二维数组;若存在最短路径,则有出口回溯到入口(出队列并利用栈实现),再打印从入口到出口的这条路径,例如(1,1),......,(i,j),......,(m,n);若没有路径,则打印“No path”。 (5)迷宫的任一位置(i,j)上均有八个可移动的方向,用二维数组Direction存放八个方向的位置偏移量。 Direction[8][2]={{0,1},{1,1},{0,-1},{-1,-1},{1,-1},{1,0},{-1,0},{-1,1}}; (6)为避免出现原地踏步的情况需要标志已经通过的位置,采用一个标志数组MARK[m+2][n+2],初值均为0,在寻找路径的过程中,若通过了位置(i,j),则将MARK[i][j]置为1。 (7)为了记录查找过程中到达位置(i,j)及首次到达(i,j)的前一位置(i_pre,j_pre),需要记住前一位置(i_pre,j_pre)在队列中的序号pre,即队列中数据元素应该是一个三元组(i,j,pre)。 (8)搜索过程简单下:将入口MAZE[1][1]作为第一个出发点,依次在八个方向上搜索可通行的位置,将可通行位置(i,j,pre)入队,形成第一层新的出发点,然后依次出队,即对第一层中各个位置分别搜索它所在八个方向上的可通行位置,形成第二层新的出发点,...,如此进行下去,直至达到出口MAZE[m][n]或者迷宫所有位置都搜索完毕为止。 二、实验过程及结果 一、需求分析 1、用栈的基本操作完成迷宫问题的求解,其中栈的基本操作作为一个独立的模块存在。 2、以二维数组M[m+2][n+2]表示迷宫,M[i][j] 表示迷宫中相应(i,j)位置的通行状态(0:表示可以通行,1:表示有墙,不可通行),完成迷宫的抽象数据类型,包括出口、入口位置等。 3、用户从屏幕上输入迷宫,从键盘输入迷宫的大小,即迷宫的长和宽(由于控制台大小限制,输入的长宽需在50以下),完成对应迷宫的初始化。根据键盘输入的迷宫规格随机生成大小相同的迷宫,产生方块的地方为墙,无方块的地方可通过,如下例所示: 如下所示:

最简单的c语言迷宫游戏实验报告

一、内容: 1、本游戏主要实现了人控制键盘方向键使小人(*)走出迷宫。 2、具有的功能: 1)、在游戏菜单里人可以选择不同难度的游戏进行游戏; 2)、在游戏过程中,可以通过键盘方向键使小人移动,走出迷宫; 3)、在游戏过程中,当人碰到墙壁(#)的时候小人过不去; 4)、当人顺利完成游戏之后,输出“========you are win!======”字样,30秒钟后自动返回到游戏菜单; 5)、在游戏过程中,人可以通过按Esc键返回游戏菜单;也可以可以按0直接退出游戏; 6)、在游戏菜单里,按0键可以退出游戏。 3、具体应用: 1)、人主要同过键盘的1,2,3数字键来选择游戏难度; 2)、在游戏中通过Esc键来返回菜单; 3)、同过0键退出游戏。 二、上机环境 操作系统:windows7 开发工具:VC6.0 三、函数调用关系图

四、各函数功能说明 main() 主函数; menu() 游戏菜单; roadcake() 消去小人路径; introduce() 游戏介绍; system(“cls”) 消屏函数; exit(0) 退出游戏; drawmg1() 画初级难度迷宫; drawmg2() 画中级难度迷宫; drawmg3() 画高级难度迷宫; control1() 控制初级难度游戏; control2() 控制中级难度游戏; control3() 控制高级难度游戏; 五、算法流程图 首先定义三个全局数组mg1[20][20]、mg2[30][30]、mg3[30][30]用于画出迷宫的地图;1表示墙(#),0表示空地(); Introduce( )函数里如果按Enter键,则调用menu( )函数,从键盘中输入相应的提示数字,进入难度不同的游戏;游戏的执行在此只初级难度进行描述,其余的难 度与其类似; 选了1后调用system(”cls”)进行清屏;drawmg1()函数进行迷宫的地图的绘

计算机操作系统综合设计实验报告实验一

计算机操作系统综合设计 实验一 实验名称:进程创建模拟实现 实验类型:验证型 实验环境: win7 vc++6.0 指导老师: 专业班级: 姓名: 学号: 联系电话: 实验地点:东六E507 实验日期:2017 年 10 月 10 日 实验报告日期:2017 年 10 月 10 日 实验成绩:

一、实验目的 1)理解进程创建相关理论; 2)掌握进程创建方法; 3)掌握进程相关数据结构。 二、实验内容 windows 7 Visual C++ 6.0 三、实验步骤 1、实验内容 1)输入给定代码; 2)进行功能测试并得出正确结果。 2、实验步骤 1)输入代码 A、打开 Visual C++ 6.0 ; B、新建 c++ 文件,创建basic.h 头文件,并且创建 main.cpp 2)进行功能测试并得出正确结果 A 、编译、运行main.cpp B、输入测试数据 创建10个进程;创建进程树中4层以上的数型结构 结构如图所示:。

createpc 创建进程命令。 参数: 1 pid(进程id)、 2 ppid(父进程id)、3 prio(优先级)。 示例:createpc(2,1,2) 。创建一个进程,其进程号为2,父进程号为1,优先级为2 3)输入创建进程代码及运行截图 4)显示创建的进程

3、画出createpc函数程序流程图 分析createpc函数的代码,画出如下流程图:

四、实验总结 1、实验思考 (1)进程创建的核心内容是什么? 答: 1)申请空白PCB 2)为新进程分配资源 3)初始化进程控制块 4)将新进程插入到就绪队列 (2)该设计和实际的操作系统进程创建相比,缺少了哪些步骤? 答:只是模拟的创建,并没有分配资源 2、个人总结 通过这次课程设计,加深了对操作系统的认识,了解了操作系统中进程创建的过程,对进程创建有了深入的了解,并能够用高 级语言进行模拟演示。一分耕耘,一分收获,这次的课程设计让 我受益匪浅。虽然自己所做的很少也不够完善,但毕竟也是努 力的结果。另外,使我体会最深的是:任何一门知识的掌握, 仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能 达到功效。

c++迷宫游戏实验报告

1、问题描述 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求: (1)老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动; (2)迷宫的墙足够结实,老鼠不能穿墙而过; (3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,并给出一条路径,否则提示失败。 提高要求: (1)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙; (2)增加闯关和计分功能; (3)找出走出迷宫的所有路径,以及最短路径。 。 2.需求分析 软件的基本功能:通过键盘控制光标移动实现老鼠在迷宫中的行走、全部路径和最短路径的显示、自定义地图(墙变路,路变墙)。在老鼠闯关只能在地图显示是路的地方行走,不能穿墙,有计时功能,当时间结束时若没有到达指定地点,显示game over,查看排行榜,游戏结束,若成功到达指定位置,进去下一关,直到所有关结束,程序结束;。 输入/输出形式:用户可以通过控制台,根据输入提示。 输入形式: ①方向键、空格键、enter键 输出形式: ①输出地图菜单。 ②输出地图 ③输出是否成功信息、输出排行榜 3.概要设计 (1)主程序流程

图1:主程序流程图 (3)模块调用关系: 本程序中函数包括:main函数,menu函数,menu2函数,mouse类内函数,path 类内函数,change函数, 函数调用关系如下:

图2:函数调用关系 4.详细设计 (1)实现概要设计的数据类型: Mouse类 class mouse { private: int m_x; int m_y; time_t begin ,stop; public: int move_up(int map[x][y],int end);//向上移动 int move_down(int map[x][y],int end);//向下移动 int move_left(int map[x][y],int end);//左 int move_right(int map[x][y],int end);//右 void initialize(int map[x][y],int end){ m_x=S;m_y=S;map[end][end]=9;} void print(int map[x][y],int end);//打印地图

电子电路综合设计实验报告

电子电路综合设计实验报告 实验5自动增益控制电路的设计与实现 学号: 班序号:

一. 实验名称: 自动增益控制电路的设计与实现 二.实验摘要: 在处理输入的模拟信号时,经常会遇到通信信道或传感器衰减强度大幅变化的情况; 另外,在其他应用中,也经常有多个信号频谱结构和动态围大体相似,而最大波幅却相差甚多的现象。很多时候系统会遇到不可预知的信号,导致因为非重复性事件而丢失数据。此时,可以使用带AGC(自动增益控制)的自适应前置放大器,使增益能随信号强弱而自动调整,以保持输出相对稳定。 自动增益控制电路的功能是在输入信号幅度变化较大时,能使输出信号幅度稳定不变或限制在一个很小围变化的特殊功能电路,简称为AGC 电路。本实验采用短路双极晶体管直接进行小信号控制的方法,简单有效地实现AGC功能。 关键词:自动增益控制,直流耦合互补级,可变衰减,反馈电路。 三.设计任务要求 1. 基本要求: 1)设计实现一个AGC电路,设计指标以及给定条件为: 输入信号0.5?50mVrm§ 输出信号:0.5?1.5Vrms; 信号带宽:100?5KHz; 2)设计该电路的电源电路(不要际搭建),用PROTE软件绘制完整的电路原理图(SCH及印制电路板图(PCB 2. 提高要求: 1)设计一种采用其他方式的AGC电路; 2)采用麦克风作为输入,8 Q喇叭作为输出的完整音频系统。 3. 探究要求: 1)如何设计具有更宽输入电压围的AGC电路; 2)测试AGC电路中的总谐波失真(THD及如何有效的降低THD 四.设计思路和总体结构框图 AGC电路的实现有反馈控制、前馈控制和混合控制等三种,典型的反馈控制AGC由可变增益放大器(VGA以及检波整流控制组成(如图1),该实验电路中使用了一个短路双极晶体管直接进行小信号控制的方法,从而相对简单而有效实现预通道AGC的功能。如图2,可变分压器由一个固定电阻R和一个可变电阻构成,控制信号的交流振幅。可变电阻采用基极-集电极短路方式的双极性晶体管微分电阻实现为改变Q1电阻,可从一个由电压源V REG和大阻值电阻F2组成的直流源直接向短路晶体管注入电流。为防止Rb影响电路的交流电压传输特性。R2的阻值必须远大于R1。

迷宫实验实验报告

迷宫实验 一.摘要 迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。本实验的被试是华东师范大学应用心理学系大二的一名女同学,本实验以学习遍数为自变量,以所用时间和错误次数为因变量,让被试在排除视觉条件下,用小棒从迷宫起点凹槽移动到达终点,其间小棒每次进入盲巷并与盲巷末端金属片接触算一次错误,学会的定义为连续三遍不出错。而且主试也不能给予被试任何提示或暗示。被试要运用动觉,思维,记忆等自己认为有效的方法独立完成。测试中为了控制疲劳带来的误差,若被试感到疲劳,可稍事休息再进行实验。分析实验数据可知,被试走完迷宫所用时间成减少趋势,错误次数也成减少趋势。在最初几次走迷宫时,错误次数会出现反复的时多时少的情况,所用时间也在反复,时多时少,这表明被试在摸索迷宫路线,处于对整个迷宫的整体定位中。随着学习遍数的增加,错误次数与走完一次迷宫所用的时间开始减少,这表明被试对于迷宫的整体情况有了比较清楚的了解。 关键词迷宫学习次数学习时间错误次数 二.引言 人类从十九世纪末就开始研究迷宫学习了。1899 年,斯莫尔(W. S. Small ) 让白鼠学习一条相当复杂的迷津通路。通过研究他认为,白鼠迷宫学习所依靠的主要是触觉和动觉记忆。1912 年希克思(V. C. Hicks) 和卡尔把迷宫用于研究人类学习。泊金斯(Perkins,1927)最早使用这种在手指迷宫的基础上发展起来的最简便、最常用的触棒迷宫(pencil maze)。近年来,学者们则利用迷宫进行逆反学习能力的研究。而在特殊教育领域,也利用迷宫队正常人和盲人进行了触棒迷宫的对比试验,并得出了盲人心理的巨大补偿作用和学习潜能的结论。 迷宫是研究一个人只靠自己的动觉、触觉和记忆获得信息的情况下,如何学会在空间中定向。迷宫的种类很多,结构方式也不一样,但是有一个特征,这就是有一条从起点到终点的正确途径与从此分出的若干条盲巷。被试的任务是寻找与巩固掌握这条正确途径。迷宫的学习一般可分为四个阶段:1.一般方位辨认。2.掌握迷宫的首段、尾段和中间的一、二部分。3.扩大可掌握的部分,直至全部掌握空间图形。4.形成集体对空间图形的自动化操作。迷宫学习与被试的智商有关,它涉及被试的空间定向能力、思维、记忆诸多方面。 在此迷宫实验中,被试排除视觉条件,用小棒从迷宫起点沿凹槽移动到达终点。在此过程中,被试要运用动觉,思维,记忆等自己认为有效

迷宫实验报告

实习报告、 题目:编制一个求解迷宫通路的程序 班级:计算机04(2)姓名:王金锭学号:04120087 完成日期:06.03.01 一.需求分析: 1.以二维数组Maze[m+2][n+2]表示迷宫,其中:Maze[0][j]和Maze[m+1][j](0<=j<=n+1)及Maze[i][0]Maze[i][n+1](0<=i<=m+1)为添加的一圈障碍.数组中以元素值为0表 示通路,1表示障碍,限定迷宫的大小m,n<=10. 2.用户以文件的形式输入迷宫的数据:文件中的第一行的数据为迷宫的行数m和列数n;从第二行至第m+1(每行n个数)为迷宫值,同一行中的两个数字之间用空白 字符相隔。 3.迷宫的入口位置和出口位置可由用户随时设定。 4.若设定的迷宫存在通路,则以长方阵形式将迷宫及其通路输出到标准输出文件(即终端)上,其中,字符“#”表示障碍,字符“*”表示路径上的位置,字符“@” 表示“死胡同”,即曾途径然而不能到达出口的位置,余者用空格符印出。若设定 的迷宫不存在通路,则报告相应信息。 5.本程序给出一条成功的通路,并且可以通过用户输入把所有的通路输出到指定的文件中。 6.测试数据见原题,当入口位置为(1,1),出口位置为(9,8)时,输出数据为: 二.概要设计: 1.设定栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai∈IntSet,i=1,2….,n,n>=0} 数据关系:{ai-1,ai|ai-1,ai∈D,i=1,2…..n} 基本操作: InitStack(&S) 操作结果:构造一个空栈。 DestroyStack(&S)

初始条件:栈S已存在 操作结果:将S清空为空栈。 ClearStack(&S) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackLength(S) 初始条件:栈S已存在。 操作结果:返回栈S的长度。 StackEmpty(S) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回TURE,否则返回FAULE。 GetTop(S,&e) 初始条件:栈S已存在。 操作结果:若S不空,则以e返回栈顶元素。 Push(&S,e) 初始条件:栈S存在。 操作结果:在栈S的栈顶插入新的栈顶元素e。 Pop(&S,e) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素,并以e返回其值。 StackTraverse(S,visit()) 初始条件:栈S已存在。 操作结果:从栈底到栈顶依次对S中的每个元素调用visit()。 }ADT Stack 2. 求解迷宫中的一条通路的伪码算法 : 设定当前位置的初值为入口位置; do {若当前位置可通, 则{将当前位置插入栈顶; 若该位置是出口位置,则结束; 否则切换当前位置的东邻方块为新的当前位置; } 否则{ 若栈不空且栈顶位置尚有其他方向未被搜索, 则设定新的当前位置为沿顺时针方向旋转找到的栈顶苇子后的下一个相邻块;若栈不空但粘顶位置的四周均不可通, 则{删去栈顶位置; 若栈不空,则重新测试新的栈顶位置, 直至找到一个可通的相邻块或出栈至空栈; } } }while(栈不空); {栈空说明没有路径存在}

吉林大学无机化学研究生化学综合设计实验报告--全

化学综合和设计实验 实验报告 姓名:李玲云 学号:2014332036 专业:无机化学

扫描电子显微镜和EDS能谱演示实验 一、实验目的 1、初步了解扫描电子显微镜的工作原理、基本构造、操作及用途 2、掌握样品的制备方法 二、扫描电子显微镜的工作原理及用途 从电子枪阴极发出的直径20cm~30cm的电子束,受到阴阳极之间加速电压的作用,射向镜筒,经过聚光镜及物镜的会聚作用,缩小成直径约几毫微米的电子探针。在物镜上部的扫描线圈的作用下,电子探针在样品表面作光栅状扫描并且激发出多种电子信号。这些电子信号被相应的检测器检测,经过放大、转换,变成电压信号,最后被送到显像管的栅极上并且调制显像管的亮度。显像管中的电子束在荧光屏上也作光栅状扫描,并且这种扫描运动与样品表面的电子束的扫描运动严格同步,这样即获得衬度与所接收信号强度相对应的扫描电子像,这种图象反映了样品表面的形貌特征。第二节扫描电镜生物样品制备技术大多数生物样品都含有水分,而且比较柔软,因此,在进行扫描电镜观察前,要对样品作相应的处理。扫描电镜样品制备的主要要求是:尽可能使样品的表面结构保存好,没有变形和污染,样品干燥并且有良好导电性能。 在高压(2~20kV)的作用下,利用聚焦得到非常细的高能电子束,使其在试样上扫描(电子束与试样表层物质相互作用),激发出背散射电子、二次电子等信息,通过对上述信息的接收、放大和显示

成像,对试样表面进行分析。 根据量子力学理论,物质中存在着隧道现象,电子可以通过隧道穿过一个能级高度大于其总能量的势垒而出现在势垒的另一侧。因此,物质的表面电子可以借助隧道作用散逸出来,在物质表面附近形成电子云。在导体表面电子云中某位置的电子几率密度,会随着此位置与表面距离的增大而以指数形式迅速衰减。 扫描电子显微镜被广泛应用于材料科学、生物医学、信息产业、地质、石油化工和其它相关学科领域。是在微观尺度范围内,对样品的形貌进行观察、分析和测量的工具。现在的扫描电子显微镜,在配备相应附件后,可以获得试样表面的化学成分,晶体缺陷、电势、磁场及晶体取向等信息,是对固体物质表层进行综合分析的仪器。 吉林大学无机合成与制备化学国家重点实验室拥有场发射扫描电子显微镜。该显微镜通过接收二次电子信息来对样品表面形貌进行分析。显微镜的扫描倍数从25到650000倍,最大分辨率可达到1nm。显微镜有Oxford的能谱附件,可以进行样品的能谱测试。该显微镜不能对具有较强磁性的物质进行分析。 三、扫描电子显微镜的构造 1、电子光学系统(镜筒) 电子枪、三个电磁透镜、扫描线圈、试样室 电子枪中的灯丝产生高能电子束,电子枪的引出电压直接反映了灯丝状态的好坏(5kV~8kV不等)。每次实验都必须注意并记录电子枪引出电压。

迷宫问题实验报告(优选.)

最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改 赠人玫瑰,手留余香。 武汉纺织大学数学与计算机学院 数据结构课程设计报告 迷宫问题求解

学生姓名: 学号: 班级: 指导老师: 报告日期: 一、问题描述 以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。 二、需求分析 1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。 2、迷宫的入口和出口需由用户自行设置。

3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。 4、本程序只求出一条成功的通路。但是只要对函数进行小量的修改,就可以求出其他全部的路径。 5、程序执行命令为:(1)输入迷宫;(2)、求解迷宫;(3)、输出迷宫。 三、概要设计 1、设定栈的抽象数据类型定义: ADT zhan{ 基本操作: InitStack(SqStack &S) 操作结果:构造一个空栈 push(*s,*e) 初始条件:栈已经存在 操作结果:将e所指向的数据加入到栈s中 pop(*s,*e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素 getpop(*s,*e) 初始条件:栈已经存在 操作结果:若栈不为空,用e返回栈顶元素

stackempty(*s) 初始条件:栈已经存在 操作结果:判断栈是否为空。若栈为空,返回1,否则返回0 }ADT zhan 2、设定迷宫的抽象数据类型定义 ADT migong{ 基本操作: Status print(MazeType maze); //显示迷宫 Status Pass(MazeType maze,PosType curpos); //判断当前位 置是否可通 Status FootPrint(MazeType &maze,PosType curpos);//标记当前位置 已经走过 Status MarkPrint(MazeType &maze,PosType curpos);//标记当前位 置不可通PosType NextPos(PosType curpos,DirectiveTypedi);// 进入下一位置 }ADT yanshu 3、本程序包括三个模块 a、主程序模块 void main() { 初始化;

实验报告迷宫问题

实习2栈的应用 本次实习的主要目的在于帮助学生深入了解栈的特性,以便在实际问题背景下灵活运用他们;同时还将巩固对栈这种结构的构造方法的理解。 实验课时6课时 程序1:迷宫问题 [问题描述] 以一个m×n的长方阵表示迷宫,‘0’和‘1’分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 [基本要求] 首先实现一个以顺序表或链表做存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),… [测试数据] 迷宫的测试数据如下:左上角(1,1)为入口,右下角(3,4)为出口。[实现提示] 计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止,如果所有可能的通路都试探过,还是不能走到终点,那就说明该迷宫不存在从起点到终点的通道,可以二维数组存储迷宫数据。 [程序实现] #include #include //1.迷宫位置坐标类型 typedefstruct { intx;//行 inty;//列 }PosType; #defineMAXENGTH25//迷宫最大行列数位25 typedefintMazeType[MAXENGTH][MAXENGTH];//迷宫数列 typedefstruct//定义栈 { intord;//通道块在路径上的序号 PosTypeseat;//通道块在迷宫中的位置 intdi;//走向下一块的方向(0~3表示东、南、西、北) }SElemType;

迷宫问题实验报告用栈解决迷宫问题

数据结构实验报告 题目:用栈解决迷宫问题 .需求分析 1.以结构体 Maze 表示迷宫,其中 pos 表示该位置是否有障碍; freq 记录该位置被经过的次数;数组 move 表示下一步的方向。 2. 本程序自动随机生成一个12 × 12大小的迷宫,字符“ H”表示有障碍,空符表示通 路。 3. 迷宫的入口为左上角,出口为右下角。 4. 本程序只求出一条成功的通路。 .概要设计 为了实现上述操作,以栈为存储结构。 本程序包含三个模块: 1)主程序模块 :实现人机交互。 2)迷宫生产模块:随机产生一个12× 12的迷 宫。 3)路径查找模块:实现通路的查找。 4)求解迷宫中一条通路的伪代码: do{ 若当前位置可同,则{ 将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东临方块为新的当前位置;} 否则 { 若栈不空且栈顶位置尚有其他方向未被探索,则设定新的的当前位置为沿顺时针 方向旋转找到的栈顶位置的下一相邻块若栈不空但栈顶位置的四周均不可通, 则{ 删去栈顶位置; 若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈 至栈空。 } } } while( 栈不空 ) 三. 详细设计栈的设计: typedef struct { Node *base,*top; int length; }Stack; Stack *initstack(); // 初始化栈 void printstack(Stack *s); // 打印栈 Status destroy(Stack *); // 销毁整个栈 Status deltop(Stack *s); // 出栈 Status pushelem(Stack *,ElemType ,ElemType); // 进栈 1. 主程序模块: int main() { printf(" 随机产生一个12× 12 的迷宫, X 字符表示障碍,空符表示通路: \n"); Maze a[N][N]; makemaze(a); printf(" 输入回车键显示路径 ,* 字符表示路径。 \n"); getchar(); findpath(a); while(1); return 0;

相关主题