数据结构课程设计实习指导书

上传人:痛*** 文档编号:88601091 上传时间:2022-05-11 格式:DOC 页数:34 大小:169.50KB
收藏 版权申诉 举报 下载
数据结构课程设计实习指导书_第1页
第1页 / 共34页
数据结构课程设计实习指导书_第2页
第2页 / 共34页
数据结构课程设计实习指导书_第3页
第3页 / 共34页
资源描述:

《数据结构课程设计实习指导书》由会员分享,可在线阅读,更多相关《数据结构课程设计实习指导书(34页珍藏版)》请在装配图网上搜索。

1、. . . . 数据结构课程设计实习指导书一 课程设计的目的和意义1、初步具备根据应用需求选择合理数据结构并进行算法设计的能力;2、进一步提升C语言的应用能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、训练用系统的观点和软件开发一般规进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;6、提升文档写作能力。二 课程设计要求1、认真分析课题容和要求,明确设计任务。2、仔细分析课题,合理设计算法。3、一人一题,独立完成。对于较难题目可两人一题,但所做模块不能一样。 4、严禁抄袭,否则成绩作

2、废。5、设计达到一定工作量。三 课程设计方法与步骤1、问题定义与需求分析:根据设计题目的要求,充分地分析和理解问题,确定功能需求和限制条件。2、数据结构设计:对问题描述中涉与的操作对象定义相应的数据类型和各抽象数据类型,写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明)。3、概要设计:采用结构化设计方法,按照以数据结构为中心的原则划分模块,设计软件层次结构和模块间的调用关系,定义主程序,画出模块之间的调用关系图。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试。4、详细设计:定义数据存储结构,各个主要模块的算法定义。详细设计的结果是对数据结构和基本

3、操作作出进一步的求精,写出数据存储结构的类型定义,用伪码写出函数的算法。5、程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解,使程序中逻辑概念清楚。要求用C语言编写。6、程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能。调试正确后,认真整理源程序与其注释,形成格式和风格良好的源程序清单和结果。7、设计结果分析:程序运行结果包括正确的输入与其输出结果和含有错误的输入与其输出结果。算法的时间、空间复杂性分析。8、编写课程设计报告。四 教材与参考文献1 严蔚敏,数据结构 C语言,清华大学;2 谭浩强,c语言程序设计,清华大学;3 数据

4、结构,高教;4 春保,数据结构习题,清华大学;5 严蔚敏,数据结构习题,清华大学;6 王立柱,c语言与数据结构,清华大学;7 春葆,数据结构(C语言篇)习题与解析,清华大学;注:还可以查阅与数据结构有关的书籍、论文、网络资料。五 数据结构课程设计题目ch1 线性表与其应用本次实习的主要目的在于帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用作为重点容。1. 运动会分数统计问题描述参加运动会的n个学校编号为1n。比赛分成m个男子项目和w个女子项目,项目编号分别为1m和m+1m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些

5、项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。基本要求产生各学校的成绩单,容包括各校所取得的每项成绩的项目号、名次 ( 成绩 )、和得分;产生团体总分报表,容包括校号、男子团体总分、女子团体总分和团体总分。测试数据对于n=4,m=3,w =2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。实现提示可以假设n20,m30,w20,长度不超过 20 个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名) 输入,并按名次顺序输入运动员、校名(和成绩)。选作容允许用户指定某项目采取其他名次取法。2. 约瑟夫环问题描述约瑟夫 (Jose

6、ph) 问题的一种描述是:编号为 1,2, ,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。测试数据m的初值为 20;n=7,7 个人的密码依次为:3,1,7,2,4,8,4, 首先m值为 6( 正确的出列顺序应为 6,1,4,7,2,3,5) 。实现提示程序运行后

7、,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n30。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。选作容向上述程序中添加在顺序结构上实现的部分。3. 集合的并、交和差运算问题描述编制一个能演示执行集合的并、交和差运算的程序。基本要求(1) 集合的元素限定为小写字母字符 a.z 。(2) 演示程序以用户和计算机的对话方式执行。测试数据(1)Set1=magazine,Set2=paper,Set1Set2=aegimnprz,SetlSet2=ae,Set1-Set2=gimnz。(2)Set1= 012oper4a6tion89,Set2=error data,

8、Set1Set2=adeinoprt,SetlSet2=aeort,Set1-Set2=inp。实现提示以有序链表表示集合。选作容(1) 集合的元素判定和子集判定运算。(2) 求集合的补集。(3) 集合的混合运算表达式求值。(4) 集合的元素类型推广到其他类型 , 甚至任意类型。4. 长整数四则运算问题描述设计一个实现任意长的整数进行加法运算的演示程序。基本要求利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的围是(215-l)(215-1) 。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。测试数据(1)0;0; 应输出 0 。(2)2345,6

9、789; 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; 应输出 1 。(6)-9999,9999,9999;9999,9999,9999;应输出 1,9999,9999,9998 。 (7)1,0000,9999,9999;1; 应输出 1,0001,0000,0000 。实现提示(1) 每个结点中可以存放的最大整数为 215-1=32767, 才能保证两数相

10、加不会溢出。但若这样存放,即相当于按32768进制数存放,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。(2) 可以利用头结点数据域的符号代表长整数的符号。相加过程中不要破坏两个操作数链表。不能给长整数位数规定上限。选作容(1) 实现长整数的四则运算;(2) 实现长整数的乘方和阶乘运算;(3) 整型量围是 (2n1)(2n1), 其中,n是由程序读人的参量。输入数据的分组方法可以另行规定。5.一元稀疏多项式计算器问题描述设计一个一元稀疏多项式简单计算器。基本要求一元稀疏多项式简单计算器的基本功能是:(

11、1) 输入并建立多项式 ;(2) 输出多项式,输出形式为整数序列:n,cl,el,c2,e2,cn,en,其中n是多项式的项数,ci和ei,分别是第 i 项的系数和指数,序列按指数降序排列;(3) 多项式a和b相加,建立多项式a+b;(4) 多项式a和b相减,建立多项式a -b。测试数据(1)(2x+5x83.1x11) + (75x8+11x9)=(3.lx11+11x9+2x+7)(2)(6x-3x+4.4x21.2x9) (-6x-3+5.4x2x2+7.8x15)=(-7.8x15-1.2x9+12x-3-x)(3)(1 +x+x2+x3+x4+x5)+(-x3x4)=(1+x+x2+

12、x5) (4)(x+x3)+(-xx3)=0(5)(x+x100)+(x100+x200)=(x+2x100+x200)(6)(x+x2+x3)+0=x+x2+x3(7) 互换上述测试数据中的前后两个多项式实现提示用带表头结点的单链表存储多项式。选作容(1) 计算多项式在x处的值。(2) 求多项式 a 的导函数。(3) 多项式a和b相乘,建立乘积多项式ab 。(4) 多项式的输出形式为类数学表达式。例如 ,多项式 -3x8+6x318 的输出形式为,x15+(8)x714的输出形式为。注意,数值为1的非零次项的输出形式中略去系数1,如项1x8的输出形式为x8,项1x3的输出形式为x3。(5)

13、计算器的仿真界面。6. 池塘夜降彩色雨问题描述设计一个程序,演示美丽的“池塘夜雨”景色:色彩缤纷的雨点飘飘洒洒地从天而降, 滴滴入水有声,溅起圈圈微澜。基本要求(1) 雨点的空中出现位置、降过程的可见程度、入水位置、颜色、最大水圈等,都是随机确定的 ;(2) 多个雨点按照各自的随机参数和存在状态,同时演示在屏幕上。测试数据适当调整控制雨点密度、最大水圈和状态变化的时间间隔等参数。实现提示(1) 每个雨点的存在周期可分为三个阶段:从天而降、入水有声和圈圈微澜,需要一个记录存储其相关参数、当前状态和下一状态的更新时刻。(2) 在图形状态编程。雨点下降的可见程度应是断断续续、依稀可见;圈圈水波应是由

14、里至外逐渐扩大和消失。(3) 每个雨点发生时,生成其记录,并预置下一个雨点的发生时间。(4) 用一个适当的结构管理当前存在的雨点,使系统能利用它按时更新每个雨点的状态,一旦有雨点的水圈全部消失,就从结构中删去。选作容(1) 增加“电闪雷鸣”景象。(2) 增加风的效果,展现“风雨飘摇”的情景。(3) 增加雨点密度的变化:时而“和风细雨”, 时而“暴风骤雨”。(4) 将“池塘”改为“荷塘”,雨点滴在荷叶上的效果是溅起四散的水珠,响声也不同。ch2 栈和队列与其应用仅仅认识到栈和队列是两种特殊的线性表是远远不够的,本次实习的目的在于使读者深入了解钱和队列的特性,以便在实际问题背景下灵活运用他们;同时

15、还将巩固对这两种结构的构造方法的理解。编程技术训练要点有:钱的“任务书“观点与其典型用法(见本实习2。2);问题求解的状态表示与其递归算法(2.3,2.4和2.9);利用栈实现表达式求值的技术(2.5);事件驱动的模拟方法(2.63.8);以与动态数据结构的实现(2.6,2.7和2.8)。1. 停车场管理问题描述设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场己停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开人;当停

16、车场某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。基本要求以桟模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达“或“离去“信息、汽车牌照以与到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应交纳的费用(在便道上停留的时间不收费)。钱以顺序结构实现,队列以

17、链表结构实现。2. 魔王语言解释问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能昕得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)(2)在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。基本要求用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。(1)(2)测试数据B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae若将

18、小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。tdsaezgxnh天地上一只鹅追赶下蛋恨实现提示将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考应如何处理。应首先实现栈和队列的基本操作。选作容(1)由于问题的特殊性,可以实现栈和队列的顺序存储空间共享。(2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中)。3. 马踏棋盘问题描述

19、设计一个国际象棋的马踏遍棋盘的演示程序。基本要求将马随机放在国际象棋的88棋盘Board88的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,64依次填入一个88的方阵,输出之。4. 算术表达式求值演示问题描述表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。基本要求以字符序列的形式从终端输入语确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1

20、演示在求值中运算符械、运算数校、输入字符和主要操作的变化过程。5. 银行业务模拟问题描述客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等

21、于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行逗留的平均时间。基本要求利用动态存储结构实现模拟。测试数据一天营业开始时银行拥有的款额为10000(元),营业时间为600(分钟)。其他模拟参量自定,注意测定两种极端的情况:一是两个到达事件之间的间隔时间很短,而客户的交易时间很长,另一个恰好相反,设置两个到达事件的间隔时间很长,而

22、客户的交易时间很短。实现提示事件有两类:到达银行和离开银行。初始时银行现存资金总额为total。开始营业后的第一今事件是客户到达,营业时间从0到closetime。到达事件发生时随机地设置此客户的交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也是随机确定的,用负值和正值分别表示第一类和第二类业务。变量total,closetime以与上述两个随机量的上下界均交互地从终端读入,作为模拟参数。两个队列和一个事件表均要用动态存储结构实现。注意弄清应该在什么条件下设置离开事件,以与第二个队列用怎样的存储结构实现时可以获得较高的效率。注意:事件表是按时间顺序有序的。选作容自己实现动态数据类

23、型。例如对于客户结点,定义pool为CustNodepoolfMAX;/ 结构类型CustNode含四个域:aITHIne,durtime,amount,next或者定义四个同样长的,以上述域名为名字的数组。初始时,将所有分量的next域起来,形成一个静态链找,设置一个楼顶元素下标指示量top,top=0表示找空。动态存储分配函数可以取名为myMalloc,其作用是出钱,将钱顶元素的下标返回。若返回的值为0,则表示无空间可分配。归还函数可取名为myFree,其作用是把该分量入钱。用FOR-TRAN和BASIC等语言实现时只能如此地自行组织。6. 航空客运订票系统问题描述航空客运订票的业务活动包

24、括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。基本要求(1)每条航线所涉与的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量、已订票的客户(包括、订票量、舱位等级1,2或3)以与等候替补的客户(包括、所需票量);(2)作为示意系统,全部数据可以只放在存中;(3)系统能实现的操作和功能如下:查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额

25、少于订票额,则需重新询问客户要求。若需要,可登记排队候补;承办退票业务:根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。测试数据由读者自行指定。实现提示两个客户可分别由线性表和队列实现。为查找方便,已订票客户的线性表应按客户有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预计,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这表上的一个记

26、录,包含上述8个域、其中乘员域为指向乘员链表的头指针,等候替补的客户域为分别指向队头和队尾的指针。选作容当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线情况。读者还可充分发挥自己的想象力,增加你的系统的功能和其他服务项目。7. 电梯模拟问题描述设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体“构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。基本要求(1) 模拟某校五层教学楼的电

27、梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第层、第二层、第三层和第四层,其中第一层是大楼的迸出层,即是电梯的“本垒层“,电梯“空闲“时,将来到该层候命。(2) 乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。(3) 模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要耗费一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20tg每个人进出电梯均需要25h如果电梯在某层静止时间超过300t,则驶回1层候命。(4) 按时序显示系统状态的变化过程:发生

28、的全部人和电梯的动作序列。测试数据模拟时钟Time的初值为0,终值可在50010000围逐步增加。实现提示(1)楼层由下至上依次编号为0,1,2,3,4。每层有要求Up(上)和Down(下的两个按钮,对应10个变量CaliUp0.4和CallDOWEl0.4。电梯5个目标层按钮对应变量Caucar0.4。有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。(2)电梯处于三种状态之-zGoingUp(上行)、GoingDown(下行)和Idle(停候)。如果电梯处于Idle状态且不在1层,则关门并驶回1层。在1层停候时,电梯是闭门候命。一旦收到往另一层的命令,就转入Go

29、ingUp或GoingDown状态,执行相应的操作。(3)用变量Time表示模拟时钟,初值为0,时间单位。)为0。l秒。其他重要的变量有:Floor电梯的当前位置(楼层);DI值为0,除非人们正在进入和离开电梯;D2值为0,如果电梯已经在某层停候30Ot以上;D3值为0,除非电梯门正开着又无人迸出电梯;State电梯的当前状态(GoingUp,GoingDOWEl,Idle)。系统初始时,Floor=1,Dl=D2=D3=0,State=Idle。(4)每个人从进入系统到离开称为该人在系统中的存在周期。在此周期,他有6种可能发生的动作:M1.进入系统,为下一人的出现作准备产生以下数值:InFl

30、oor该人进入哪层楼;011tFloor他要去哪层楼;GiveupTime他能容忍的等候时间;Inter-Time下一人出现的时间间隔,据此系统预置下一人进入系统的时刻。M2. 按电钮并等候此时应对以下不同情况作不同的处理:Floor=InFloor且电梯的下一个活动是E6(电梯在本层,但正在关门;Floor=InFloor且D3手0(电梯在本层,正有人迸出);其他情况,可能D2=0或电梯处于活动El(在1层停候)。M3. 进入排队在等候队列QueueInFloor末尾插入该人,并预置在GiveupTime个t之后,他若仍在队列中将实施动作M4。M4. 放弃如果Floor手InFloor或Dl

31、=0,则从QuemInFloor和系统删除该人。如果Floor=InFloor且D1学0,他就继续等候(他知道马上就可进入电梯。M5.进入电梯从QueueInFloor删除该人,并把他插入到lElevator(电梯)校中。置Cancar011tFloor为1。M6.离去从Elevator和系统删除该人。(5)电梯的活动有9种:E1.在1层停候若有人按下一个按钮,则调用Controler将电梯转入活动E3或E60。E2. 要改变状态?如果电梯处于GoingUp(或GoingDown状态,但该方向的楼层却无人等待,则要看反方向楼层是否有人等候,而决定置State为GoingDown(或GoingU

32、p还是Idle。E3. 开门置DI和D2为非0值,预置300个t后启动活动E9和76个t后启动E5,然后预置20个t后转到目。E4.让人出入如果Elevator不空且有人的011tFloor=Floor,则按进入的倒序每隔25个t让这类人立即转到他们的动作M6。Elevator中不再有要离开的人时,如果QueueFloor不空,则以25个t的速度让他们依次转到MLQueueFloor空时,置Dl为0,D3手0,而且等候某个其他活动的到来。E5.关门每隔40个t检查D1,直到是D1=O(若D1手0,则仍有人出入。置D3为0并预置电梯再20个t后启动活动E6(再关门期间,若有人到来,则如M2所述,

33、门再次打开)。E6.准备移动置CaucarFloor为0,而且若State手GoingDown,则置CallUPCFloor为05若State手GoingUp,则置CallDownCFloor为0。调用Controler函数。如果State=Idle,则即使已经执行了Controler,也转到E1。否则,如果D2手0,则取消电梯活动E9。最后,如果State=GoingUp,则预置15个t后(电梯加速转到E7;如果State=GoingDown,则预置15个t后(电梯加速)转到E8。E7.上升一层置Floor加1并等候51个人如果现在CaucarFloor=1或CallUpFloor=1,或者

34、如果(Floor=1或CallDOWElFloor=1)且CallUpj=CallDOWElj=CallCar-0=0对于所有jFloor),则预置14个t后(减速)转到E2;否则重复E7。E8. 下降一层除了方向相反之外,与E7类似,但那里的51和14个t,此时分别改为61和23个t(电梯下降比上升慢)。E9. 置不活动指示器置D2为0并调用Controler函数(E9是由E3预置的,但几乎总是被E6取消了训。(6)当电梯须对下一个方向作出判定时,便在若干临界时刻调用Controler函数。该函数有以下要点:C1. 需要判断?若State手Idle,则返回。C2.应该开门?如果电梯处于E1且

35、CallUp1,CallDown1或Caucar1非0,则预置20个t后启动E3,并返回。C3.有按钮按下?找最小的j手Floor,使得CallUpj,CallDOWElj或Caucarj非0,并转到C4。但如果不存在这样的j,那么,如果Controler正为E6所调用,则置j为1,否则返回。C4. 置State如果Floorj,则置State为GoingDOWEl;如果Floorj,则置State为GoingUp。C5.电梯静止?如果电梯处于E1而且j手1,则预置20个t后启动E6。返回。(7)由上可见,关键是按时序管理系统中所有乘客和电梯的动作设计合适的数据结构。选作容(l)增加电梯数量,

36、模拟多梯系统。(2)某高校的一座30层住宅楼有三部自动电梯,每梯最多载客15人。大楼每层8户,每户平均3。5人,每天早晨平均每户有3人必须在7时之前离开大楼去上班或上学。模拟该电梯系统,并分析分别在一梯、二梯和三梯运行情况下,下楼高峰期间各层的住户应提前多少时间候梯下楼?研究多梯运行最佳策略。8. 迷宫问题问题描述以一个mn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。基本要求首先实现一个以链表作存储结构的钱类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)

37、指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为z(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),。测试数据迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8001000100010001000001101011100100001000001000101011110011100010111000000实现提示计算机解迷宫通常用的是“穷举求解“方法,即从人口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

38、假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。选作容(l) 编写递归形式的算法,求得迷宫中所有可能的通路;(2)以方阵形式输出迷宫与其通路。ch3 串与其应用本实习单元的目的是熟悉串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法,较复杂问题的分解求精方法。本实习单元的难度较大,在教学安排上可以灵活掌握完成此单元实习的时间。编程技术训练要点:并行的模式匹配技术(3.1);字符

39、填充技术(3.2,3.4);逻辑/物理概念隔离技术(GetAWord,3.2);活区操作技术(3.3);不定长对象的成块存储分配技术(3.3);命令识别与分析技术(3.3,3.4);串的动态组织技术(3.4);合理有效的错误处理方法(3.4);程序语法结构基本分析技术(3.5).1. 文学研究助手问题描述文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统,称为文学研究助手。基本要求英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行

40、设计。测试数据以你的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。实现提示约定小说中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数。出现位置所在行的行号可以用链表存储。若某行中出现了不止一次,不必存多个一样的行号。如果读者希望达到选做部分(1善和(2)所提出的要求,则首先应把KMP算法改写成如下的等价形式,再将它推广到多个模式的情形。i=1;j=1;while(i!=s.curlen+1&j!=t.curlerl十1)while(j!=0&s.chi!=t.chj)j=nextj; /j=O或s.chi=t.chjj+;i+;/每次进入循环体,i只增加一次选作容

41、(1)模式匹配要基于KMP算法。(2)整个统计过程中只对小说文字扫描一遍以提高效率。(3)假设小说中的每个单词或者从行首开始,或者前置一个空格符。利用单词匹配特点另写一个高效的统计程序,与KMP算法统计程序进行效率比较。(4)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:定义操作GetAChar)。2. 文本格式化问题描述输入文件中含有待格式化或称为待排版的文本,它由多行的文字组成,例如一篇英文文章。每一行由一系列被一个或多个空格符所隔开的字组成,任何完整的字都没有被分割在两行(每行最后一个字与下一行的第一个字之间在逻辑上应该由空格分开),每行字符数不超过80。除了上述文本类字符

42、之外,还存在着起控制作用的字符:符号指示它后面的正文在格式化时应另起一段排放,即空一行,并在段首缩入8个字符位置。自成一个字。一个文本格式化程序可以处理上述输入文件,按照用户指定的版面规格重排版面z实现页调整、分段、分页等文本处理功能,排版结果存入输出文本文件中。试写一个这样的程序。基本要求(1)输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。(2)在输出文件中,任何完整的字仍不能分割在两行,行尾不齐没关系,但行首要对齐(即左对齐)。(3)如果所要求的每页页底所空行数不少于3,则将页号印在页底空行中第2行的中间位置上,否则不印。(4)版面要求的参数要包含:页长(PageLength

43、)一一每页文字(不计页号)的行数。页宽(PageWedth)一一每行文字所占最大字符数。左空白(LeftMargin)-一一每行文字前的固定空格数。头长(HeadingLength)一一每页页顶所空行数。脚长(FootingLength)一一每页页底所空行数(含页号行)。起始页号(StartingPageNumber)一一首页的页号。测试数据略。注意在标点之后加上空格符。实现提示可以设:左空白数2+页宽=160,即行印机最大行宽,从而只要设置这样大的一个行缓冲区就足够了,每加工完一行,就输出一行。如果输入文件和输出文件不是由程序规定死,而是可由用户指定,则有两种做法:一是像其他参量一样,将文件

44、名交互地读入字符串变量中;更好的方式是让用户通过命令行指定,具体做法依机器的操作系统而定。应该首先实现GetAWord(w)这一操作,把诸如行尾处理、文件尾处理、多余空格符压缩等一系列低级事务留给它处理,使系统的核心部分集中对付排版要求。每个参数都可以实现缺省值设置。上述排版参数的缺省值可以分别取56,60,10,5,5和1。选作容(1)输入文件名和输出文件名要由用户指定。(2)允许用户指定是否右对齐,即增加一个参量右对齐否(RightJustifying),缺省值可设为y(yes)。右对齐指每行最后一个字的字尾要对齐,多余的空格要均匀分布在本行中各字之间。(3)实现字符填充(characte

45、rstuffing)技术。作为分段控制符之后,限制了原文中不能有这样的字。现在去掉这一限制:如果原文中有这样的字,改用两个并列起来表示一个字。当然,如果原文中此符号夹在字中,就不必特殊处理了。(4)允许用户自动按多栏印出一页。3. 简单行编辑程序问题描述文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间(存)的作法既不经济,也不总能实现。一种解决方法是逐段地编辑。任何时刻只把待编辑文件的一段放在存,称为活区。试按照这种方法实现一个简单的行编辑程序。设文

46、件每行不超过320个字符,很少超过80个字符。基本要求实现以下4条基本编辑命令:(1) 行插入。格式:i.将插入活区中第行之后。(2)行删除。格式:d删除活区中第行(到第行)。例如:d10和d1014。(3)活区切换。格式n将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p逐页地(每页20行)显示活区容,每显示一页之后请用户决定是否继续显示以后备页(如果存在)。印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。各条命令中的行号均须在活区中各行行号围之,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。测试

47、数据自行设定,注意测试将活区删空等特殊情况。实现提示(1)设活区的大小用行数ActiveMULen(可设为100)来描述。考虑到文本文件行长通常为正态分布,且峰值在60到70之间,用320ActiveMULen大小的字符数组实现存储将造成大量浪费。可以以标准行块为单位为各行分配存储,每个标准行块可含81个字符。这些行块可以组成一个数组,也可以利用动态链表连接起来。一行文字可能占多个行块。行尾可用一个特殊的ASCII字符(如(012)8)标识。此外,还应记住活区起始行号。行插入将引起随后各行行号的顺序下推。(2)初始化函数包括:请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能一样

48、。然后尽可能多地从输入文件中读入各行,但不超过ActiveMULen-LX的值可以自定,例如20。(3)在执行行插入命令的过程中,每接收到一行时都要检查活区大小是否已达ActiveMaxLen。如果是,则为了在插入这一行之后仍保持活区大小不超过ActiveMaxLen应将插入点之前的活区部分中第一行输出到输出文件中;若插入点为第一行之前,则只得将新插入的这一行输出。(4)若输入文件尚未读完,活区切换命令可将原活区中最后几行留在活区顶部,以保持阅读连续性;否则,它意味着结束编辑或开始编辑另一个文件。(5)可令前三条命令执行后自动调用活区显示。选作容(1)对于命令格式非法等一切错误作严格检查和适当

49、处理。(2)加入更复杂的编辑操作,如对某行进行串替换;在活区进行模式匹配等,格式可以为S和m。4. 串基本操作的演示问题描述如果语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉与串操作的软件系统时,用户必须自己实现串类型。试实现串类型,并写一个串的基本操作的演示系统。基本要求在教科书4.2.2节用堆分配存储表示实现HString串类型的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。参数合法性检查必须严格。利用上述基本操作函数构造以下系统:它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。命令定义如下:

50、(1)赋值。格式:A用所表示的串的值建立新串,并显示新串的部名和串值。例:AHi!(2)判相等。格式: E若两串相等,则显示EQUAL,否则显示UNEQUAL。(3)联接。格式:C将两串拼接产生结果串,它的部名和串值都显示出来。(4)求长度。格式:L串标识显示串的长度。(5)求子串。格式:S+如果参数合法,则显示子串的部名和串值。不带正负号。(6)子串定位。格式:I显示第二个串在第一个串中首次出现时的起始位置。(7)串替换。格式:R将第一个串中所有出现的第二个串用第三个串替换,显示结果串的部名和串值,原串不变。(8)显示。格式:P显示所有在系统中被保持的串的部名和串值的对照表。(9)删除。格式

51、:D删除该部名对应的串,即赋值的逆操作。(10)退出。格式:Q结束程序的运行。在上述命令中,如果一个自变量是串,则应首先建立它。基本操作函数的结果(即函数值)如果是一个串,则应在尚未分配的区域新辟空间存放。测试数据自定。但要包括以下几组:(1)E,应显示EQUAL。(2)Eabcabcd,应显示UNEQUAL。(3)C,应显示。(4)Ia,应报告:参数非法。(5)Raaaaab,应显示ba(6)Raaabcaaab,应显示aabaabaabbc。(7)RFaaaaaaaaaaaaab,应显示abab。实现提示选作容(1) 串头表改用单链表实现。(2) 对命令的格式(即语法)作严格检查,使系统既

52、能处理正确的命令,也能处理错误的命令。注意,语义检查(如某部名对应的串已被删除而无定义等)和基本操作参数合法性检查仍应留给基本操作去做。(3)支持串名。将串名(可设不超过6个字符)存于串头表中。命令(1)(3)(5)要增加命令参数;命令(7)中的 改为,并用此名作为结果串名,删除原被替串标识,用代替定义和命令解释中的部名。每个命令执行完毕时立即自动删除无名串。5. 程序分析问题描述读入一个C程序,统计程序中代码、注释和空行的行数以与函数的个数和平均行数,并利用统计信息分析评价该程序的风格。基本要求(1) 把 C 程序文件按字符顺序读入源程序;(2) 边读入程序,边识别统计代码行、注释行和空行,

53、同时还要识别函数的开始和结束,以便统计其个数和平均行数。(3) 程序的风格评价分为代码、注释和空行三个方面。每个方面分为 A,B,C 和 D 四个等级 , 等级的划分标准是 :A级B级C级D级代码(函数平均长度)1015行89或1620行57或2124行24行注释(占总行数比率)1525%1014或2630%59或3135%35%空行(占总行数比率)1525%1014或2630%59或3135%35%测试数据先对较小的程序进行分析。当你的程序能正确运行时,对你的程序本身进行分析。实现提示为了实现的方便,可作以下约定:(1) 头两个字符是 FFF 的行称为注释行(该行不含语句)。除了空行和注释行

54、外,其余均为代码行(包括类型定义、变量定义和函数头)。(2) 每个函数代码行数(除去空行和注释行)称为该函数的长度。(3) 每行最多只有一个 、switch 和struet(便于识别函数的结束行)。选作容(1) 报告函数的平均长度。(2) 找出最长函数与其在程序中的位置。(3) 允许函数的嵌套定义,报告最大的函数嵌套深度。ch4 数组和广义表本实习单元是作为从线性结构到非线性结构的过渡来安排的。数组和广义表可以看成其元素本身也是自身结构( 递归结构 ) 的线性表。广义表本质上是一种层次结构 , 自顶向下识别并建立一个广义表的操作 , 可视为某种树的遍历操作 : 遍历逻辑的或符号形式的 ) 结构

55、 , 访问动作是建立一个结点。稀疏矩阵的十字链表存储结构也是图的一种存储结构。由此可见 , 这个实习单元的训练具有承上启下的作用。希望读者能深入研究数组的存储表示和实现技术 , 熟悉广义表的存储结构的特性。编程技术训练要点 : 稀疏矩阵的表示方法与其运算的实现 (4.1 ; 共享数据的存储表示方法 (4.2); 形式系统的自底向上和自顶向下识别技术 (4.3 ; 递归算法的设计方法 (4.3); 表达式求值技术 (4.4) 。1. 稀疏矩阵运算器问题描述稀疏矩阵是指那些多数元素为零的矩阵。利用 稀疏 特点进行存储和计算可以大大节省存储空间 , 提高计算效率。实现一个能进行稀疏矩阵基本运算的运算

56、器。基本要求以带行逻辑信息的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示 , 而运算结果的矩阵则以通常的阵列形式列出。测试数据实现提示1. 首先应输入矩阵的行数和列数 , 并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过 20 。2. 程序可以对三元组的输入顺序加以限制 , 例如 , 按行优先。注意研究教科书5.3.2节中的算法 , 以便提高计算效率。3. 在用三元组表示稀疏矩阵时 , 相加或相减所得结果矩阵应该另生成 , 乘积矩阵也可用二维数组存放。选作容1. 按教科书5.3.2节中的描述方法 , 以十

57、字链表表示稀疏矩阵。2. 增添矩阵求逆的运算 , 包括不可求逆的情况。在求逆之前 , 先将稀疏矩阵的部表示改为十字链表。2. 多维数组问题描述设计并模拟实现整型多维数组类型。 基本要求尽管 C 等程序设计语言已经提供了多维数组 , 但在某些情况下 , 定义用户所需的多维数组很有用的。通过设计并模拟实现多维数组类型 , 可以深刻理解和掌握多维数组。整型多维数组应具有以下基本功能 :(1) 定义整型多维数组类型 , 各维的下标是任意整数开始的连续整数 ;(2) 下标变量赋值 , 执行下标围检查 ;(3 同类型数组赋值 ;(4) 子数组赋值 , 例如 ,a1.n=a 2.n+1;a2.43.5=b1

58、.32.4; (5) 确定数组的大小。 测试数据由读者指定。实现提示各基本功能可以分别用函数模拟实现 , 应仔细考虑函数参数的形式和设置。定义整型多维数组类型时 , 其类型信息可以存储在如下定义的类型的记录中:define MaxDim 5Typedef structint dim , BoundPtr lower ,Upper;ConstPtr constants;)NArray,*NarrayPtr;整型多维数组变量的存储结构类型可定义为:Typedef structElemType *elem;Int num;NArrayType TypeRecord;NArrayType;选作容(1)

59、 各维的下标是任意字符开始的连续字符。(2) 数组初始化。(3) 可修改数组的下标围。3. 识别广义表的头或尾问题描述写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头/求尾操作序列的结果。基本要求(1) 设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅由字母或数字组成的串。(2) 广义表采用如教科书中图5.8所示结点的存储结构,试按表头和表尾的分解方法编写建立广义表存储结构的算法。(3) 对已建立存储结构的广义表施行操作,操作序列为一个仅由t或h组成的串,它可以是空串(此时印出整个广义表),自左至右施行各操作,再以符号形式显示结果。测试数据实现提示(1) 广义表串可以利用 C 语言中的串类型或者利用实习三中已实现的串

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!