上机实验是对学生的一种全面综合训练文档格式.docx
- 文档编号:22354121
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:34
- 大小:42.80KB
上机实验是对学生的一种全面综合训练文档格式.docx
《上机实验是对学生的一种全面综合训练文档格式.docx》由会员分享,可在线阅读,更多相关《上机实验是对学生的一种全面综合训练文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
以及所提倡的程序设计风格等等。
但从另一方面看,计算机学科在不断发展,可以使用的语言工具越来越丰富,在本篇中的实验示例还只是应用面向过程的语言进行设计和编写程序,同样的实验题,学生也可以用面向对象的语言来实现。
希望书中的实验报告示例能起到一个抛砖引玉的作用,以迎来学生更多更优良的设计范例。
华北工学院应用数学系计算教研室
2002.8
目录
1.实验步骤和实验报告规范
1.1实验报告的规范
2.抽象数据类型
2.1复数四则运算
2.2有理数四则运算
2.3海龟作图
3.线性表
3.1运动会分数统计
3.2约瑟夫环
3.3集合的并、交和差运算
3.4长整数四则运算
4.栈、队列与递归算法设计
4.1
停车场管理
4.2车厢调度
4.3算术表达式求值演示
5.串及其应用
5.1
文本格式化
5.2
简单行编辑程序
5.3
串基本操作的演示
6.数组和广义表
6.1稀疏矩阵运算器
6.2识别广义的“头”或“尾”的演示
7.树、图及其应用
7.1图遍历的演示
7.2教学计划编制问题
7.3最小生成树问题
7.4全国交通咨询模拟
8.存储管理、查找和排序
8.1伙伴存储管理系统演示
8.2哈希表设计
8.3
图书管理
8.4
平衡二叉树操作的演示
8.5英语词典的维护和识别
§
1.1实验报告的规范
实验报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:
一、需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
二、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的(调用)关系。
三、详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;
对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);
画出函数和过程的调用关系图。
四、调试分析
内容包括:
a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;
c.经验和体会等。
五、用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
六、测试结果
列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
七、附录
带注释的源程序。
如果提交源程序软盘,可以只列出程序文件名的清单。
在以下各实验单元中都提供了实验报告实例。
值得注意的是,实验报告的各种文档资料,如;
上述中的前三部分要在程序开发的过程中逐渐充实形成,而不是最后补写(当然可以也应该最后用实验报告纸誊清或打印)。
2.1复数四则运算
[问题描述]
设计一个可进行复数运算的演示程序。
[基本要求]
实现教科书1.2节例1-6中定义的6种基本运算,运算结果以复数的表示形式显示。
[测试数据]
(1)0;
0;
应输出“0”
(2)3.l,0;
4.22,8.9;
应输出’7.32+i8.9’
(3)-1.33,2.34;
0.1,-6.5;
应输出'
-1.23-i4.16'
(4)0,9.7;
-2.1,-9.7;
应输出’-2.1’
(5)7.7,-8;
-7.7,0;
应输出’-i8’
[实现提示]
定义复数为由两个相互之间存在次序关系的实数构成的抽象数据类型测可以利用经数的操作来实现复数的操作。
[选作内容]
实现复数的其它运算,如:
两个复数相除、求共轭等。
[问题描述]
设计一个可进行有理数运算的演示程序。
[基本要求]
实现两个有理数相加、相减、相乘以及求分子或求分母的运算。
由学生指定。
实现两个有理数相除的运算。
2.3海龟作图
设计并实现海龟抽象数据类型Turtle,并以此为基础设计一个演示海龟作图的程序。
(1)设置海龟类型的基本操作为:
procedureStartTurtleGraphlcs;
{显示作图窗口,并在窗口内写出本人的姓名、上机号和实验题号。
}
procedureStartTurtle;
{令海龟处于作图的初始状态。
即显示作图窗口,并将海龟定位在窗口正中;
}
{置画笔状态为落笔、龟头朝向为0度(正东方向)。
procedurePenUp;
{改变画笔状态为抬笔。
从此时起,海龟移动将不在屏幕上作图。
procedurePenDown;
{改变画笔状态为落笔。
从此时起,海龟移动将在屏幕上作图。
functionTurtleHeadins:
inteser;
{返回海龟头当前朝向的角度。
functionTurtlePos:
PaPoint;
{返回海龟的当前位置。
procedureMove(steps:
Integer);
{依照海龟头的当前朝向,向前移动海龟steps步。
procedureTurn(degrees:
{改变海龟头的当前朝向,逆时针旋转degrees度。
procedureMoveTTo(newPos:
aPolnt);
{将海龟移动到新的位置newPos。
如果是落笔状态,则同时作图。
ProcedureTurnTTo(angle:
real);
{改变海龟头的当前朝向为,从正东方向起的angle度。
proceduresetTurtleColor(color:
{设置海龟画笔的颜色为color。
}
(2)利用上述定义的海龟实现作图命令,以画出任意长度的线段、任意大小的矩形和圆。
由学生自行指定线段(的长度)、矩形(的长度和宽度)及圆(的半径)等参数。
(1)海龟的相关类型说明为:
type
penstate=(up,down);
aPoint=recordv,h:
realend;
newTurtle=record
heading:
integer;
{龟头(画笔)方向,简称龟头朝向}
pen:
penstate;
{画笔状态:
uP抬笔,down落笔}
color:
Integer;
{画笔当前颜色}
Pos:
aPoint
{海龟当前位置}
end;
(2)将“海龟”实现为TurboPascal的一个单元,并将其相关类型和变量说明封装在年元的实现部分,宿主程序仅通过单元的接口部分调用海龟进行作图。
(1)扩充海龟抽象数据类型,增添SizeFactor域,作为海龟的尺寸因子(移动单位),其值可改变;
(2)宿主程序中可定义多个海龟变量,以实现多个海龟同时画不同的图形;
扩充后的海龟抽象数据类型的基本操作可定义为:
procedureStartTurtle(varraphael:
newTurtle;
startPos:
{初始化一个新海龟,定位在startPos,并置画笔状态为落笔、龟头朝向为0}
{以及步进的尺寸因子为1。
procedurePenUp(varraphael:
newTurtle);
从此时起,海龟移动时将不在屏幕上作图。
procedurePenDown(varraphael:
从此时起,海龟移动时将在屏幕上作图。
functionTurtleHeading(raphael:
newTurtle):
real;
{返回海龟头朝向的当前角度。
functionTurtlePos(raphael:
aPoint;
procedureMove(varaphael:
steps:
{依照海龟头的当前朝向和尺寸因子,向前移动steps步。
procedureTurn(varraphael:
newTurtlesize:
{改变海龟头的当前朝向,逆时针旋转size度。
procedureScaleTurtle(varraphael:
newTurtlescaleFactor:
{改变海龟移动的步进尺寸SizeFactor,扩大scaleFactor倍}
procedureMoveTTo(varraphael:
newTurtle;
newPos:
{将海龟移动到新位置newPos。
newPos是屏幕窗口中的一个“点”。
procedureTurnTTo(varraphael:
angle:
{改变海龟头的当前朝向为从正东方向起的angle度。
proceduresetturtleColor(varraphael:
Color;
integer);
{设置海龟画笔的当前颜色为color。
其中、角度、尺寸因子等定义为实型,可提高作图精度。
(3)在海龟单元的基础上,实现一个用鼠标进行海龟作图的界面。
界面中应提供基本线型、基本图形、抬笔落笔、选择颜色等作图操作的选单或图标。
参加运动会的n个学校编号为l~n。
比赛分成m个男子项目和w个女子项目,项目编号分别为l~m和m+1~m+w。
由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;
还有些项目只取前三名,得分顺序为5,3,2。
写一个统计程序产生各种成绩单和得分报表。
产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;
产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。
[测试数据]
对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。
[实现提示]
可以假设n≤20,m≤30,w≤20,姓名长度不超过20个字符。
每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
[选作内容]
允许用户指定某项目采取其他名次取法。
约瑟夫(Joseph)问题的一种描述是:
编号为1,2,,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从l报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
m的初值为20;
n=7,7个人的密码依次为:
3,1,7,2,4,8,4(正确的出列顺序应为6,l,4,7,2,3,5)。
程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。
设n≤30。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
向上述程序中添加在顺序结构上实现的部分。
编制一个能演示执行集合的并、交和差运算的程序。
(1)集合的元素限定为小写字母字符[a'
..'
z'
]。
(2)演示程序以用户和计算机的对话方式执行。
(1)Setl='
magazine'
,Set2='
PaPer'
,
Setl∪Set2='
aeglmnprz'
,Setl∩Set2='
ae'
,Setl-Set2='
gimnz'
;
(2)Set1='
012oper4a6tion89'
errordata'
Set1∪Set2='
adeinoprt'
aeort'
inp'
以有序链表表示集合。
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
(3)集合的混合运算表达式求值。
(4)集合的元素类型推广到其它类型,甚至任意类型。
设计一个实现任意长的整数进行加法运算的演示程序。
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是
。
输入和输出形式:
按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
应输出“0”。
(2)-2345,6789;
-7654,3211;
应输出“-1,0000,0000”。
(3)-9999,9999;
1,0000,0000,0000;
应输出“9999,0000,0001”。
(4)1,0001,0001;
-1,0001,0001;
(5)1,0001,0001;
-1,0001,0000;
应输出“l”。
(6)-9999,9999,9999;
-9999,9999,9999;
应输出“-1,9999,9999,9998”。
(7)1,0000,9999,9999d;
应输出“1,0001,0000,0000”。
(1)每个结点中可以存放的最大整数为
,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表视为万进制数。
(2)可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
(1)实现长整数的四则运算;
(2)实现长整数的乘方和阶乘运算;
(3)整型量范围是
,其中中是由程序读入的参量。
输入数据的分组方法可以另行规定。
[问题描述]
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“‘离去”的信息、汽车牌照号码以及9达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
[测试数据]
设n=2,输入数据为:
('
A'
,1,5),('
,2,10),('
D'
,1,15),('
,3,20),('
,4,25),('
5,30),('
,2,35),('
,4,40),('
E'
,0,0)。
其中:
'
表示到达;
表示离去(Departure);
表示输入结束(End)。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据接到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项。
汽车的牌照号码和进入停车场的时刻。
[选作内容]
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
(4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,清思考如何修改结构以满足这种要求。
假设停在铁路调度站入口处的车厢序列的编号依次为1,2,3,...n。
设计一个程序,求出所有可能由此输出的长度为n的车厢序列。
首先在教科书第3.1.2节中提供的栈的顺序存储结构SqStack之上实现栈的五种基本操作,即实现栈类型。
除了栈初始化操作之外,都要按函数实现。
Push(s,x)是一个布尔函数,当且仅当栈s上溢时返回“假”值;
再说明一个ElemType型的常量StackEmptyMark,操作pop(s)和top(s)遇到栈s为空的情况时返回值StackEmptyMark。
程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作进行。
分别取n=l,2,3和4
按上述要求定义的栈类型是通用的。
对于栈元为结构类型的情形,由于标准Pascal语言限制函数类型为简单类型,操作pop和top要改为过程,通过变量参数返回栈顶值。
对于本题情形,可以定义StackEmptyMark=0;
nmax=10;
ElemType=0...nmax;
{即要求n≤10}。
一般地说,在操作过程的任何状态下都有两种可能的操作:
“入”和“出”。
每个状态下处理问题的方法都是相同的,这说明问题本身具有天然的速归特性,可以考虑用递归算法实现。
输入序列可以仅由一对整型变量表示,即给出序列头/尾编号。
输出序列用栈实现是方便的(思考:
为什么不应该用队列实现),只要再定义一个栈打印操作print(s),自底至顶顺序地印出栈元素的值。
(1)利用教科书中3.1.2节图3.3所示的存储结构实现调度站和输出序列这两个栈的空间共享。
思考m的值取多少最合适。
(2)对于每个输出序列印出操作序列或/和状态变化过程。
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-2演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
可以使用下列表达式:
8;
1+2+3+4;
88-1*5;
1024/4*8;
1024/(4*8);
(20+2)*(6/2);
3-3-3;
8/(9-9);
2*(6+2*(3+6*(6+6));
(((6+6)*6+3)*2+6)*2;
(1)设置运算符栈和运算数栈辅助分析算符优先关系。
(2)在读入表达式的字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 实验 学生 一种 全面 综合 训练