数据结构实验报告.docx

上传人:b****5 文档编号:5744699 上传时间:2022-12-31 格式:DOCX 页数:31 大小:34.25KB
下载 相关 举报
数据结构实验报告.docx_第1页
第1页 / 共31页
数据结构实验报告.docx_第2页
第2页 / 共31页
数据结构实验报告.docx_第3页
第3页 / 共31页
数据结构实验报告.docx_第4页
第4页 / 共31页
数据结构实验报告.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

数据结构实验报告.docx

《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(31页珍藏版)》请在冰豆网上搜索。

数据结构实验报告.docx

数据结构实验报告

数据结构实验报告

题目:

0.3海龟作图

学院计算机

专业计算机科学与技术

年级班别2007级1班

学号

学生姓名杨颖

指导教师吴伟民

成绩____________________

 

2009年6月

一、实验题目:

0.3海龟作图

二、实验要求

(1)设计并实现海龟抽象数据类型Turtle,并以此为基础设计一个演示海龟作图的程序。

(2)利用上述定义的海龟实现作图命令,画出任意长度的线段、任意大小的矩形和圆。

【实现提示】

海龟的相关类型说明为:

#defineUP0

#defineDOWN1

TypedefintpenState;//取值UP或者DOWN

Typedefstruct{floatv,h;}aPoint;

Typedefstruct{

Intheading;//龟头(画笔)方向,简称龟头朝向

penStatepen;//画笔状态:

UP抬笔,DOWN落笔

Intcolor;//画笔当前颜色

aPointPos;//海龟当前位置

}newTurtle;

三、编程环境

WIN-TC

四、抽象数据类型定义以及各基本操作的简要描述

(1).题目

设置海龟类型的基本操作为:

VoidStartTurtleGraphics()

//显示作图窗口,并在窗口内写出本人姓名、上机号和实习题号。

VoidStartTurtle()

//令海龟处于作图的初始状态。

即显示作图窗口,并将海龟定位在窗口正中;置画笔状态为//落笔、龟头朝向为0度(正东方向)。

VoidPenUp()

//改变画笔状态为抬笔。

从此时起,海龟移动将不在屏幕上作图。

VoidPenDown()

//改变画笔状态为落笔。

从此时起,海龟移动将在屏幕上作图。

intTurtleHeading()

//返回海龟当前朝向位置。

aPoint*TurtlePos()

//返回海龟的当前位置。

ViodMove(intsteps)

//依照海龟头的当前朝向,向前移动海龟steps步。

VoidTurn(intdegrees)

//改变海龟头的当前朝向,逆时针旋转degrees度。

VoidMoceTTo(aPointnewPos)

//将海龟移动到新的位置newPos。

如果是落笔状态,则同时作图。

VoidTurnTTo(floatangle)

//改变海龟头的当前朝向为,从正东方向起的angle度。

VoidSetTurtleColor(intcolor)

//设置海龟画笔的颜色为color。

(2).存储结构定义

#include"graphics.h"

#include"math.h"

#include"stdio.h"

#include"conio.h"

#include"bios.h"

#include"dos.h"

#include"io.h"

#defineBOOLenumbool

#defineENTER0x1c

#definePEN_DOWN0x50

#definePEN_UP0x48

#defineLEFT0x4b

#defineRIGHT0x4d

#defineF_110x57

#defineF_100x44/*清除*/

#defineF_60x40/*改变颜色*/

#defineF_80x42/*改变龟头转动的度数*/

#defineESC0x01

#definenoname10x4a

#definenoname20x4e

#defineUP0

#defineDOWN1

#definePen_Up0x49/*抬笔*/

#definePen_Down0x51/*落笔*/

#defineCHOOSEenumchoose

charSTATE[128],PRESS[128];

floatRadius=100.00;

voidinterruptfar(*oldfunc)();/*取得中断向量入口*/

enumbool{FALSE,TRUE};

enumchoose{LIST,IN_ERROR,PEN_UP_DONE,PEN_DOWN_DONE,NEW_COLOR_DONE,NEW_POSITION_DONE,

Draw_DONE,FORWARD_DONE,BACKWARD_DONE,NEW_ANGLE_DONE,NEW_DEGREES_DONE,

CLEAR_DONE,DRAW_DONE,INPUT_COLOR,INPUT_POSITION,INPUT_HEAD,INPUT_STEPS};

typedefintpenState;

typedefstruct

{floatv,h;}aPoint;

typedefstruct

{

floatheading;

penStatepen;

intcolor;

aPointPos;

}newTurtle;

newTurtleturtle;/*声明海龟类型*/

unsignedcharTEM[4];

unsignedcharTEM1[4];

typedefstructnode

{

intcolor;

intx1,x2,y1,y2;

}NODE;

五、算法设计(程序清单)

---------------------------------turtle.h--------------------------------------

#include"Define.h"/*海龟类型*/

voidHuaChuangKou()/*画窗口*/

{

setcolor(5);

setfillstyle(SOLID_FILL,0);

bar(51,250,171,275);

rectangle(51,250,171,275);

while(bioskey

(1)==0)

{

setcolor(5);

line(93,270,98,270);

setcolor(5);

line(93,270,98,270);

}

window(66,17,66,17);

}

voidGuanChuangKou()/*关闭窗口*/

{

setfillstyle(SOLID_FILL,0);

bar(51,250,171,275);

}

intGET_history()

{inti,j;

unionREGSregs;

unsignedchart;

regs.h.ah=0x07;

IN_AGAIN:

for(i=0;i<4;i++)

TEM[i]=48;/*用于比较来寻找菜单号的数组全部置零*/

for(i=0;i<4;i++)

{IN:

while(bioskey

(1)==0);

if(bioskey

(1)==0x1c0d)/*若输入是回车*/

{bioskey(0);gotoOUT;}

int86(0x21,®s,®s);/*使用int86()函数进行BIOS接口的系统调用*/

t=regs.h.al;/*接收出口信息*/

if(t>57||t<48)gotoIN;

else

{for(j=3;j>0;j--)TEM[j]=TEM[j-1];

TEM[0]=t;

printf("%c",t);

}

}

while(bioskey

(1)==0);

if(bioskey

(1)!

=0x1c0d)/*若不是回车且超出输入窗口的范围时*/

{bioskey(0);

GuanChuangKou();/*关闭窗口*/

HuaChuangKou();/*重开窗口*/

gotoIN_AGAIN;/*再次输入*/

}

OUT:

returnYY(0);

}

intYY(inti)

{if(i==0)

returnTEM[0]+TEM[1]*10+TEM[2]*100+TEM[3]*1000-53328;

else

returnTEM1[0]+TEM1[1]*10+TEM1[2]*100+TEM1[3]*1000-53328;

}

voidSAVE_history()

{inti,j;

unionREGSregs;

unsignedchart;

regs.h.ah=0x07;

IN_AGAIN1:

for(i=0;i<4;i++)

{TEM[i]=48;TEM1[i]=48;}

for(i=0;i<4;i++)

{IN1:

while(bioskey

(1)==0);

if(bioskey

(1)==0x1c0d)

{bioskey(0);gotoOVER;}

int86(0x21,®s,®s);

t=regs.h.al;

if(t==44)

{printf("%c",t);gotoOUT1;}

if(t>57||t<48)gotoIN1;

else

{for(j=3;j>0;j--)TEM[j]=TEM[j-1];

TEM[0]=t;

printf("%c",t);

}

}

while(bioskey

(1)==0);

if(bioskey

(1)!

=0x1c0d)

{int86(0x21,®s,®s);

t=regs.h.al;

if(t==44)

{printf("%c",t);gotoOUT1;}

GuanChuangKou();

HuaChuangKou();

gotoIN_AGAIN1;

}

OUT1:

for(i=0;i<4;i++)TEM1[i]=48;

for(i=0;i<4;i++)

{IN2:

while(bioskey

(1)==0);

if(bioskey

(1)==0x1c0d)

{bioskey(0);gotoOVER;}

int86(0x21,®s,®s);

t=regs.h.al;

if(t>57||t<48)gotoIN2;

else

{for(j=3;j>0;j--)TEM1[j]=TEM1[j-1];

TEM1[0]=t;

printf("%c",t);

}

}

while(bioskey

(1)==0);

if(bioskey

(1)!

=0x1c0d)

{bioskey(0);

GuanChuangKou();

HuaChuangKou();

gotoIN_AGAIN1;

}

OVER:

;

}

voidfarinterruptNEW()

{unsignedcharScanCode,history;

ScanCode=inportb(0x60);/*从写控制器的RAM(0x60)一个字节*/

history=inportb(0x61);/*从地址为0x61的接口读入一个字节*/

outportb(0x61,history|0x80);

outportb(0x61,history&0x7f);

if(ScanCode&0x80)

{ScanCode&=0x7f;

STATE[ScanCode]=0;

}

else

{STATE[ScanCode]=1;PRESS[ScanCode]=1;}

outportb(0x20,0x20);

}

voidKeyboard_Input()/*接收键盘对海龟的控制输入*/

{inti;

for(i=0;i<128;i++)STATE[i]=PRESS[i]=0;

oldfunc=getvect(9);/*保存中断向量地址*/

setvect(9,NEW);/*取中断向量地址给函数NEW*/

}

voidKeyboard_Stop()/*停止控制输入*/

{setvect(9,oldfunc);}

intGetKey(intScanCode)

{intres;

res=STATE[ScanCode]|PRESS[ScanCode];

PRESS[ScanCode]=0;

returnres;

}

intGetKey_Begin()

{unionREGSrg;

rg.h.ah=0;

int86(0x16,&rg,&rg);/*创建文件*/

returnrg.h.ah;

}

intGet_Color()/*设置画笔颜色*/

{intc;

HuaChuangKou();

c=GET_history();

returnc;

}

floatGet_Degrees()/*读取龟头从中东方起的度数*/

{floath;

HuaChuangKou();

h=GET_history();

returnh;

}

floatGetX(floats)/*取画笔X坐标*/

{floatx;

x=.h+s*cos(ng*M_PI/180);

returnx;

}

floatGetY(floats)/*取画笔Y坐标*/

{floaty;

y=.v-s*sin(ng*M_PI/180);

returny;

}

voidPaintTurtle()/*画龟*/

{floatx,y,h,v,x1,y1;

circle(.h,.v,15);/*画一个圆作为龟壳*/

h=18*cos(ng*M_PI/180);

v=18*sin(ng*M_PI/180);

x=.h+h;

y=.v-v;/*画四条线为龟的四只脚*/

line(.h-15.00/1.414,.v-15.00/1.414,.h-17.00/1.414,.v-17.00/1.414);

line(.h+15.00/1.414,.v-15.00/1.414,.h+17.00/1.414,.v-17.00/1.414);

line(.h+15.00/1.414,.v+15.00/1.414,.h+17.00/1.414,.v+17.00/1.414);

line(.h-15.00/1.414,.v+15.00/1.414,.h-17.00/1.414,.v+17.00/1.414);

circle(x,y,3);/*画一个小圆为龟头*/

x=.h-h;

y=.v+v;

x1=.h-15*cos(ng*M_PI/180+M_PI/180);

y1=.v+15*sin(ng*M_PI/180+M_PI/180);

line(x,y,x1,y1);/*画一条线为龟尾*/}

 

voidStartTurtleGraphics()/*显示作图窗口,并在窗口内写出本人姓名、上机号和实习题号*/

{intgraphdriver,graphmode;graphdriver=DETECT;

registerbgidriver(EGAVGA_driver);

initgraph(&graphdriver,&graphmode,"");

setcolor(5);

rectangle(40,40,600,20);

setcolor(14);

outtextxy(50,30,"Name:

YangYing");

outtextxy(240,30,"StudentNum:

");

outtextxy(455,30,"WorkNum:

0.3");

setcolor(5);

rectangle(190,50,600,450);/*画图区域*/

rectangle(40,50,180,450);/*菜单区域*/

}

voidStartTurtle()/*令海龟处于作图的初始状态,置画笔状态为落笔、龟头朝向为0度*/

{

.h=400;/*置笔头位置,正中间*/

.v=250;

=WHITE;/*置画笔当前颜色*/

ng=0;/*设置笔头方向为和x轴为0度*/

=DOWN;/*初始状态为落笔*/

PaintTurtle();

}

voidPenUp()/*改变画笔状态为抬笔*/

{=UP;}

voidPenDown()/*改变画笔状态为落笔*/

{=DOWN;}

intTurtleHeading()/*返回海龟的当前角度*/

{returnng;}

aPoint*TurtlePos()/*返回海龟当前位置*/

{return&;}

voidPut_in_history()/*把海龟画图的所有资料以数字的形式存进文件history中*/

{FILE*fp;

NODEn;

if((fp=fopen("","rb"))==NULL);

else

{/*fileno函数用来取得参数stream指定的文件流所使用的文件描述词,返回文件描述词*/

if(filelength(fileno(fp)))

{fseek(fp,0,0);/*从文件第一个字符开始搜索*/

while(!

feof(fp))/*检测流上的文件结束符*/

{fread(&n,sizeof(NODE),1,fp);/*读取history数据*/

setcolor(n.color);

line(n.x1,n.y1,n.x2,n.y2);/*画线*/

}

}

fclose(fp);

}

setcolor(5);

PaintTurtle();

}

voidClear()/*清除*/

{FILE*fp;

NODEn;

if((fp=fopen("","rb"))==NULL);

else

{if(filelength(fileno(fp)))

{fseek(fp,0,0);

while(!

feof(fp))/*按照原路径用黑色覆盖画出的颜色*/

{fread(&n,sizeof(NODE),1,fp);

setcolor(0);

line(n.x1,n.y1,n.x2,n.y2);

}

}

fclose(fp);

}

if((fp=fopen("","w"))==NULL);

else

fclose(fp);

}

voidMoveTTo(aPointnewPos)/*将海龟移动到新的位置newPos*/

{FILE*fp;

NODEn;

/*超出范围的处理*/

if(newPos.h>625)newPos.h=625;

if(newPos.h<65)newPos.h=65;

if(newPos.v>625)newPos.v=625;

if(newPos.v<75)newPos.v=75;

if(==DOWN)

{n.color=;

n.x1=.h;n.y1=.v;

n.x2=newPos.h;n.y2=newPos.v;

if((fp=fopen("","ab"))==NULL);

else

{fwrite(&n,sizeof(NODE),1,fp);fclose(fp);}

}

setcolor(0);PaintTurtle();

=newPos;

setcolor(5);PaintTurtle();

}

voidMove(intsteps)/*依照海龟的当前朝向,向前移动海龟steps步*/

{FILE*fp;

NODEn;

aPointp;

BOOLsc=FALSE;

p.h=GetX(steps);p.v=GetY(steps);

if(==UP)MoveTTo(p);

else

{n.color=;

n.x1=(int).h;

n.y1=(int).v;

MoveTTo(p);

n.x2=(int).h;

n.y2=(int).v;

if((fp=fopen("","ab"))==NULL);

else

{fwrite(&n,sizeof(NODE),1,fp);fclose(fp);}

}

setcolor(5);PaintTurtle();

if(sc==TRUE)=DOWN;

}

voidTurn(intdegrees)/*改变龟头当前朝向*/

{ng+=degrees;

if(ng>360)

while(ng>360)ng-=360;

if(ng<0)

while(ng<0)ng+=360;

}

voidTurnTTo(floatangle)/*改变海龟当前朝向为从正东方向*/

{ng=angle;}

voidSetTurtleColor(intcolor)/*设置海龟画笔的颜色为color*/

{=color;}

---------------------------------turtle.c--------------------------------------

#include"Turtle.h"

voidChoose(CHOOSETHIS)/*选择菜单框*/

{char*textstring;

setfillstyle(3,13);/*以淡紫色的//线填充下面的窗口*/

bar(45,65,175,285);/*设定菜单窗口*/

switch(THIS)

{

caseLIST:

{

setcolor(14);

outtextxy(49,73,"PenUp");

setcolor(15);

outtextxy(152,73,"F1");

setcolor(14);

outtextxy(49,93,"PenDown");

setcolor(15);

outtextxy(152,93,"F2");

setcolor(14);

outtextxy(49,113,"MoveForward");

setcolor(15);

outtextxy(152,113,"F3");

setcolor(14);

outtextxy(49,133,"MoveBackward");

setcolor(15);

outtextxy(152,133,"F4");

setcolor(14);

outtextxy(49,153,"NewPos");

s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1