上机实验是对学生的一种全面综合训练.docx
- 文档编号:9218030
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:34
- 大小:42.80KB
上机实验是对学生的一种全面综合训练.docx
《上机实验是对学生的一种全面综合训练.docx》由会员分享,可在线阅读,更多相关《上机实验是对学生的一种全面综合训练.docx(34页珍藏版)》请在冰豆网上搜索。
上机实验是对学生的一种全面综合训练
前言
上机实验是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,实验题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:
机器是比任何教师都严厉的检查者。
为了达到上述目的,本篇安排了6个主实验单元,除实验0作为预备练习之外,其它各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实验单元与教科书的各章只具有粗略的对应关系,一个实验题常常涉及几部分教学内容。
在每个实验单元中安排有难度不等的4~9个实验题,每个题目的题号之后标有难度系数,对于特别推荐题也作了标记。
与习题的情况类似,在一个单元之内比较题目难度才有意义。
此外,难度系数是根据题目的基本要求而给出的。
每个实验题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等5个部分组成。
问题描述旨在为学生建立问题提出的背景环境,指明问题“是什么”;
基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求;
测试数据部分旨在为检查学生上机作业提供方便,在完成实验题时应自己设计完整和严格的测试方案,当数据输入量较大时,提倡以文件形式向程序提供输入数据;
在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示;选做部分向那些尚有余力的学生提出了更严峻的挑战,同时也能开拓其他学生的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改扩充。
不难发现,这里与传统的做法不同,题目设计得非常详细。
会不会限制学生的想象力,影响创造力的培养呢?
回答是:
软件发展的一条历史经验就是要限制程序设计者在某些方面的创造性,从而使其创造能力集中地用到特别需要创造性的环节之上。
实验题目本身就给出了问题说明和问题分解求精的范例,使学生在无形中学会模仿,它起到把学生的思路引上正轨的作用,避免坏结构程序和坏习惯,同时也传授了系统划分方法和程序设计的一些具体技术,保证实现预定的训练意图,使某些难点和重点不会被绕过去,而且也便于教学检查。
题目的设计策略是:
一方面使其难度和工作量都较大,另一方面给学生提供的辅助和可以模仿的成分也较多。
当然还应指出的是,提示的实现方法未必是最好的,学生不应拘泥于此,而应努力开发更好的方法和结构。
在实现的时候应注意,要尽量减少依赖于具体机器计算环境的用法,例如,某些机器上的Pascal语言编译程序版本允许语言中出现“EXIT”过程调用,作用是终止程序的执行。
若使用,也应在注释中指出。
这样得出的程序易于在不同机器上运行(有好的可移植性),而这里的主要目的在于培养良好的习惯。
Pascal语言是结构化程序设计语言,具有递归能力,可移植性也较好,是特别推荐的实现语言。
本篇的一个特点是为实验制定了严格的规范。
一种普遍存在的错误观念是,调试程序全凭运气。
学生花2个小时的机上时间只找出一个错误,甚至一无所获的情况是常见的。
其原因在于,很多人只认识到找错误,而没有认识到努力预先避免错误的重要性,也不知道应该如何努力。
实际上,结构不好、思路和概念不清的程序可能是根本无法调试正确的。
严格按照实验步骤规范进行实验不但能有效地避免上述种种问题,更重要的是有利于培养软件工作者不可缺少的科学工作方法和作风。
在每个实验单元提供了一个完整的实验报告示例,在起到实验报告规格范例作用的同时,还隐含地提供了很多有益的东西,比如,基于数据类型的系统划分方法;递归算法设计方法和技巧;对于有天然递归属性的问题如何构造非递归算法;以及所提倡的程序设计风格等等。
但从另一方面看,计算机学科在不断发展,可以使用的语言工具越来越丰富,在本篇中的实验示例还只是应用面向过程的语言进行设计和编写程序,同样的实验题,学生也可以用面向对象的语言来实现。
希望书中的实验报告示例能起到一个抛砖引玉的作用,以迎来学生更多更优良的设计范例。
华北工学院应用数学系计算教研室
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.2有理数四则运算
[问题描述]
设计一个可进行有理数运算的演示程序。
[基本要求]
实现两个有理数相加、相减、相乘以及求分子或求分母的运算。
[测试数据]
由学生指定。
[选作内容]
实现两个有理数相除的运算。
§2.3海龟作图
[问题描述]
设计并实现海龟抽象数据类型Turtle,并以此为基础设计一个演示海龟作图的程序。
[基本要求]
(1)设置海龟类型的基本操作为:
procedureStartTurtleGraphlcs;
{显示作图窗口,并在窗口内写出本人的姓名、上机号和实验题号。
}
procedureStartTurtle;
{令海龟处于作图的初始状态。
即显示作图窗口,并将海龟定位在窗口正中;}
{置画笔状态为落笔、龟头朝向为0度(正东方向)。
}
procedurePenUp;
{改变画笔状态为抬笔。
从此时起,海龟移动将不在屏幕上作图。
}
procedurePenDown;
{改变画笔状态为落笔。
从此时起,海龟移动将在屏幕上作图。
}
functionTurtleHeadins:
inteser;
{返回海龟头当前朝向的角度。
}
functionTurtlePos:
PaPoint;
{返回海龟的当前位置。
}
procedureMove(steps:
Integer);
{依照海龟头的当前朝向,向前移动海龟steps步。
}
procedureTurn(degrees:
Integer);
{改变海龟头的当前朝向,逆时针旋转degrees度。
}
procedureMoveTTo(newPos:
aPolnt);
{将海龟移动到新的位置newPos。
如果是落笔状态,则同时作图。
}
ProcedureTurnTTo(angle:
real);
{改变海龟头的当前朝向为,从正东方向起的angle度。
}
proceduresetTurtleColor(color:
Integer);
{设置海龟画笔的颜色为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:
aPolnt);
{初始化一个新海龟,定位在startPos,并置画笔状态为落笔、龟头朝向为0}
{以及步进的尺寸因子为1。
}
procedurePenUp(varraphael:
newTurtle);
{改变画笔状态为抬笔。
从此时起,海龟移动时将不在屏幕上作图。
}
procedurePenDown(varraphael:
newTurtle);
{改变画笔状态为落笔。
从此时起,海龟移动时将在屏幕上作图。
}
functionTurtleHeading(raphael:
newTurtle):
real;
{返回海龟头朝向的当前角度。
}
functionTurtlePos(raphael:
newTurtle):
aPoint;
{返回海龟的当前位置。
}
procedureMove(varaphael:
newTurtle;steps:
real);
{依照海龟头的当前朝向和尺寸因子,向前移动steps步。
}
procedureTurn(varraphael:
newTurtlesize:
real);
{改变海龟头的当前朝向,逆时针旋转size度。
}
procedureScaleTurtle(varraphael:
newTurtlescaleFactor:
real);
{改变海龟移动的步进尺寸SizeFactor,扩大scaleFactor倍}
procedureMoveTTo(varraphael:
newTurtle;newPos:
aPolnt);
{将海龟移动到新位置newPos。
newPos是屏幕窗口中的一个“点”。
}
procedureTurnTTo(varraphael:
newTurtle;angle:
real);
{改变海龟头的当前朝向为从正东方向起的angle度。
}
proceduresetturtleColor(varraphael:
newTurtle;Color;integer);
{设置海龟画笔的当前颜色为color。
}
其中、角度、尺寸因子等定义为实型,可提高作图精度。
(3)在海龟单元的基础上,实现一个用鼠标进行海龟作图的界面。
界面中应提供基本线型、基本图形、抬笔落笔、选择颜色等作图操作的选单或图标。
§3.1运动会分数统计
[问题描述]
参加运动会的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个字符。
每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
[选作内容]
允许用户指定某项目采取其他名次取法。
§3.2约瑟夫环
[问题描述]
约瑟夫(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。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
[选作内容]
向上述程序中添加在顺序结构上实现的部分。
§3.3集合的并、交和差运算
[问题描述]
编制一个能演示执行集合的并、交和差运算的程序。
[基本要求]
(1)集合的元素限定为小写字母字符[a'..'z']。
(2)演示程序以用户和计算机的对话方式执行。
[测试数据]
(1)Setl='magazine',Set2='PaPer',
Setl∪Set2='aeglmnprz',Setl∩Set2='ae',Setl-Set2='gimnz';
(2)Set1='012oper4a6tion89',Set2='errordata',
Set1∪Set2='adeinoprt',Setl∩Set2='aeort',Setl-Set2='inp';
[实现提示]
以有序链表表示集合。
[选作内容]
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
(3)集合的混合运算表达式求值。
(4)集合的元素类型推广到其它类型,甚至任意类型。
§3.4长整数四则运算
[问题描述]
设计一个实现任意长的整数进行加法运算的演示程序。
[基本要求]
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是
。
输入和输出形式:
按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
[测试数据]
(1)0;0;应输出“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;应输出“0”。
(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)整型量范围是
,其中中是由程序读入的参量。
输入数据的分组方法可以另行规定。
§4.1 停车场管理
[问题描述]
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“‘离去”的信息、汽车牌照号码以及9达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
[测试数据]
设n=2,输入数据为:
('A',1,5),('A',2,10),('D',1,15),('A',3,20),('A',4,25),('A',5,30),('D',2,35),('D',4,40),('E',0,0)。
其中:
'A'表示到达;'D'表示离去(Departure);'E'表示输入结束(End)。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据接到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项。
汽车的牌照号码和进入停车场的时刻。
[选作内容]
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
(4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,清思考如何修改结构以满足这种要求。
§4.2车厢调度
[问题描述]
假设停在铁路调度站入口处的车厢序列的编号依次为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)对于每个输出序列印出操作序列或/和状态变化过程。
§4.3算术表达式求值演示
[问题描述]
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
[基本要求]
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书表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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 实验 学生 一种 全面 综合 训练
![提示](https://static.bdocx.com/images/bang_tan.gif)