数据结构实验报告.docx
- 文档编号:5744699
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:31
- 大小:34.25KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
数据结构实验报告
题目:
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告