实验1 点列表ADTWord格式文档下载.docx
- 文档编号:1028744
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:658.82KB
实验1 点列表ADTWord格式文档下载.docx
《实验1 点列表ADTWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验1 点列表ADTWord格式文档下载.docx(14页珍藏版)》请在冰点文库上搜索。
PointList()
要求:
无
结果:
构造函数。
创建一个空列表。
voidappend(PointnewPoint)
列表没有满。
把newPoint添加到列表的尾部。
如果列表是空的,则把newPoint添加为列表的第一个点(并且只有这个点),两种情况下都把指针指向newPoint。
voidclear()
删除列表中的所有点。
boolisEmpty()const
如果列表是空的,则返回true,否则返回false。
boolisFull()const
如果列表是满的,则返回true,否则返回false。
voidgotoBeginning()
列表非空。
把指针指向列表的起始点。
voidgotoEnd()
把指针指向列表的末尾点。
boolgotoNext()
如果指针没有指向列表的末尾点,则把指针指向列表的下一个点,并且返回true,否则返回false。
boolgotoPrior()
如果指针没有指向列表的起始点,则把指针指向列表的前一个点,并且返回true,否则返回false。
PointgetCursor()const
返回指针指向的点的拷贝。
voidshowStructure()const
无
输出列表中的点。
如果列表是空的,则输出“Emptylist”。
请注意,这个运算只是为测试/调试目的设计的。
实验1作业单
姓名小组日期
请在教师布置的练习时应的已布置列上打一个钩(√)。
在提交这个实验的一组材料前面附上这个作业单。
练习
已布置:
打钩或
列出练习编号
已完成
实验前练习
过渡练习
实验中练习1
实验中练习2
实验中练习3
实验后练习1
实验后练习2
总计
实验1:
实验前练习
姓名小组日期
我们可以用许多方法实现一个列表。
假设一个列表是线性的,并且列表的所有元素都具有相同的类型(Point类),则数组似乎是自然的选择。
如果我们在运行时间(这会发生在实验3,列表ADT中)定义数组的大小,则会很灵活,但是,现在数组的大小将是固定的。
第一步:
使用一个数组保存点的列表,实现点列表ADT中的运算。
一个列表中的数据项是变化的,因此,我们需要保存列表中点的实际点数(size),还要保存点本身(points)。
我们还需要保持跟踪指针数组索引(cursor)。
根据下面ptlist.h文件中的定义完成我们的实现。
showStructure运算的实现在文件show2.cpp中给出。
constintmaxListSize=10;
//Defaultmaximumlistsize
classPoint
{
public:
Point(floatx0=0,floaty0=0)//Constructor
{x=x0;
y=y0;
}
floatx,y;
//Pointcoordinates(canbeaccesseddirectly)
};
classPointList
{
//Constructor
PointList();
//Listmanipulationoperations
voidappend(PointnewPoint);
//Appendpointtolist
voidclear();
//Clearlist
//Liststatusoperations
boolisEmpty()const;
//Listisempty
boolisFull()const;
//Listisfull
//Listiterationoperations
voidgotoBeginning();
//Gotobeginning
voidgotoEnd();
//Gotoend
boolgotoNext();
//Gotonextpoint
boolgotoPrior();
//Gotopriorpoint
PointgetCursor()const;
//Returnpoint
//Outputtheliststructure-usedintesting/debugging
voidshowStructure()const;
private:
//Datamembers
intsize,//Actualnumberofpointsinthelist
cursor;
//Cursorindex
Pointpoints[maxListSize];
//Arraycontainingthepoints
第二步:
把该点列表ADT实现保存在ptlist.cpp文件中。
要确认形成了代码文档。
文件Ptlist.h中的定义和文件ptlist.cpp中的代码组合形成列表ADT的C++实现。
下面的代码段使用这个ADT中的运算创建一个点列表,并且从列表的起始到末尾遍历列表,按顺序输出每一个点。
#include<
iostreaim>
#include“ptlist.h”
usingnamespacestd;
voidmain()
PointListpolygon;
//Setofverticesforapolygon
Pointvertex;
//Vertex
//Readinthepolygonsvertices.
cout<
<
“Enterthepolygonsvertices(endwitheof):
”;
while(cin>
>
vertex.x>
vertex.y&
&
!
polygon.isFull())
polygon.append(vertex);
//Outputtheverticesoneperline.
if(!
polygon.isEmpty())
Polygon.gotoBeginning();
//Gotobeginningoflist
do{
Vertex=polygon.getCursor();
Cout<
“(“<
vertex.x<
”,”
<
vertex.y<
”)”<
endl;
}
While(polygon.gotoNext());
//Gotonextpoint(ifany)
}
}
实验1过渡练习
姓名小组日期
在这个实验中,我们使用灵活的一种测试程序来评估我们的ADT实现,在这个实现中,我们使用命令定义测试项目,而不使用代码。
这个交互式的、命令驱动的测试程序,通过简单地输人一系列键盘命令并且观察结果,允许我们检查一个新的测试项目。
test2.cpp文件中的测试程序支持下面的命令。
命令
作用
+xy
把点(x,y)添加到列表的末尾
@
显示指针标记的点
N
到下一个点
P
到前一个点
到列表的起始位置
到列表的末尾位置
E
报告列表是否为空
F
报告列表是否为满
C
清除列表
Q
退出测试程序
假设我们希望证实点列表ADT的数组实现成功地构造一个保存正方形顶点的点列表,通过输人下面的键盘命令序列,我们可以测试这个项目。
命令
+11
+12
+22
+21
Q
操作
添加(1,1)
添加(1,2)
添加(2,2)
添加(2,1)
退出
很容易看出,这个交互式测试程序允许我们快速检验一个测试项目的各种情况。
然而,这个速度是有代价的。
我们必须小心,不能违反所进行测试的运算要求的先决条件。
例如,命令
C
@
清除列表
错误
在调用getCursor运算期间引起测试程序失败。
失败的根源不是由于点列表ADT的实现,也不是测试程序的缺陷。
失败的出现是因为这个运算序列产生一个状态,它违反了getCursor运算的先决条件(在调用getCursor运算的时候,列表一定不能是空的)。
使用交互式、命令驱动的测试程序快速创建和评估测试项目,非常容易产生这类错误。
坐在那里并且输人命令是一件非常诱人的事情。
然而,更好的策略是创建一个测试计划,列出我们希望测试的项目,然后写出产生这些测试项目的命令序列。
编译文件ptlist.cpp中的点列表ADT实现。
测试程序在test2.cpp中,把它们链接到一起形成可执行文件。
通过添加测试项目,完成下面的测试计划,这些测试项目检查点列表ADT实现是否正确地处理下列任务:
Ø
向一个已经清除的列表添加点
把一个列表填充到它的最大尺寸
确定一个列表是否是空的
确定一个列表是否是满的
假设一个测试项目的输出用做后续的测试项目的输人,则要注意,虽然在每一个命令序列都为最后的命令列出了预期结果,但是,我们还是应该证实每一个命令都产生一个正确的结果。
第三步:
执行测试计划。
如果在我们的点列表ADT实现中发现错误,纠正它们,并且重新执行测试计划。
点列表ADT中运算的测试计划
测试项目
预期结果
检查
添加一系列点
+12+34+56+78
(1,2)(3,4)(5,6)(7,8)
从起始位置开始遍历
NN
从末尾位置开始遍历
PP
(3,4)
空列表
注:
指针标记的点显示为黑体
实验1实验中练习1
正像我们在概述中注意到的那样,点列表通常用于计算机图形学表示曲线。
并不需要把显示一个给定细节的曲线所需要的所有的点都保存起来,如果要全部保存,就需要巨大的存储空间,因此,我们只有选择地把一些点保存在列表上。
当显示曲线的时候(就像在“连点”游戏一样),这些点用线段连接起来。
下图表示一个回心在(2,2)半径为1的圆、它的点列表表示以及结果显示。
请注意,只使用九个点(有一个点是重复的,以便生成封闭的曲线),我们牺牲了一些圆的圆滑度。
我们应该把圆分割成更小的片段以便产生更圆滑的圆。
以drawcurv.cs文件中的框架为基础,创建一个显示点列表中点的程序。
我们的程序只需要显示点本身,不要用线把它们连接起来。
使用一个正方形测试我们的程序。
调用makeSquare()函数(在drawcurv.cs文件中)生成一个正方形的点列表。
使用一个自由曲线测试我们的程序。
调用makeDragon()函数(在drawcurv.cs文件中)生成一个自由曲线的点列表。
随着递归深度的增加,自由曲线的点列表增长得特别快。
请注意,这需要我们修改ptlist.h中的maxListSize,使得这个数组足以容纳这些点。
第四步:
修改我们的程序,以便显示连接点列表中每一对点的线段。
第五步:
使用一个正方形和一个自由曲线测试我们修改的程序。
曲线绘图程序测试计划
预期曲线
正方形
自由曲线(递归深度2)
自由曲线(递归深度5)
实验1实验中练习2
姓名小组日期
boolisTranslation(constPointList&
otherList)
比较当前PointList对象与otherList对象,以便确定otherList是否代表当前PointList对象的转换。
如果它表示一个转换,则返回true,否则返回false。
如果这些列表的大小不相同或者是空的,则它们不表示一个转换。
在计算机图形领域,通常使用一组点并且对所有点进行一个或者更多的修改
而产生一组新点。
比例产生放大效果。
旋转用于达到令人惊讶的图像旋转效果。
转换移动一组点而不执行旋转。
为了转换单独的二维点(x,y),x值可以用一个特定数量(叫做delta–x(△x))修改,并且y值可以用另外一个数量(叫做delta-y(△y))修改。
为了转换一组点,对每一个点应用相同的△x和△y,如下图所示。
通过把每一个x值(△x=3)加3和每一个y值(△y=1)加1,把点集合{(0,0),(1,l),(2,2),(3,3)}转换成集合{(3,l),(4,2),(5,3),(6,4)}。
实现isTranslation运算并且把它们添加到ptlist.cpp文件中。
这个运算的原型包含在ptlist.h文件中PointList类的定义中。
把isTranslation运算实现添加到Ptlist.cpp文件中。
激活测试程序test2.cpp中的“T"
(测试转换)和“*”(插人到转换测试列表)命令,需要从以“//2”开始的行上删除注释分隔符(和字符“2”)。
完成下面的测试计划,需要填加测试项目,检查我们的isTranslation运算的实现是否正确地确定一个PointList是否代表一个其他列表的一个转换。
如果在这个isTranslation运算的实现中发现错误,纠正它们,并且重新执行测试计划。
isTranslation运算测试计划
点列表1
点列表2
(△x,△y)
期望的结果
(0,0)(1,1)(2,2)
(1,0)(2,1)(3,2)
(1,0)
True
实验1实验中练习3
在一个点列表的起始位置插人点比在末尾添加点需要更多的技巧,耗时也更多。
voidinsertAtBeginnig(PointnewPoint)
在列表的起始位置插人了newPoint。
如果这个列表是空的,则插入的newPoint作为列表的第一个(也是惟一)点。
在任何情况下,都把指针移向newPoint。
实现这个运算,并且把它添加到ptlist.cpp文件中。
这个运算的原形包含在ptlist.h文件中PointList类的定义中。
激活测试程序test2.cpp中的“#”(在开始处插人)命令,需要从以“//3”开始的行上删除注释分隔符(和字符“3”)。
完成下面的测试计划,需要添加测试项目,检查insertAtBeginning运算的实现是否正确地把点插入到一个空列表。
如果在我们的insertAtBegiluung运算实现中发现错误,纠正它们,并且重新执行测试计划。
insertAtBeginning运算的测试计划
在列表的起始位置插入一系列点
#12#34#56#78
(7,8)(5,6)(3,4)(1,2)
实验1实验后练习1
A部分
对Ptlist.h文件中的点数组points的最大尺寸硬编码会引起任何问题吗?
解释为什么会和为什么不会。
B部分
如果会引起问题,克服这些问题我们应该怎么做?
实验1实验后练习2
如果没有指针,运算点列表ADT困难吗?
如果没有指针,对这个类需要进行哪些修改?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验1 点列表ADT 实验 列表 ADT