问答题试题一至试题四是必答题试题一(共15分)阅读以下说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下:1.每门课程都有3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课程的考试成绩。2.学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。3.在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。4.对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。5.若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。6.在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。7.根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。现采用结构化方法对这个系统进行分析与设计,得到如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。图1-1顶层数据流图图1-20层数据流图
问答题【说明】设有下列关于图书借阅系统的E—R图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。假定已通过下列SQL语言建立了基本表:CREATETABLEReaders(RaoCHAR(6)PRIMARYKEY,RnameCHAR(20)NOTNULL,RaddressCHAR(200),RphoneCHAR(15));CREATETABLEBooks(BrioCHAR(6)PRIMARYKEY,RnameCHAR(50)NOTNULL);CREATETABLEAdministrators(AnoCHAR(6)PRIMARYKEY,AnameCHAR(20)NOTNULL);CREATETABLEBorrows(RnoCHAR(6)NOTNULL,BnoCHAR(15)NOTNULL,AnoCHAR(6)NOTNULL,BdateDATE,RdateDATE,PRIMARYKEY(Rno,Bno,Ano),FOREGINKEY(Rno)REFERENCEReaders(Rno),FOREGINKEY(Bno)REFERENCEBook(Bno)FOREGINKEY(Ano)REFERENCEAdministrators(Ano));CREATETABLEReaders(RaoCHAR(6)PRIMARYKEY,RnameCHAR(20)NOTNULL,RaddressCHAR(200),RphoneCHAR(15));CREATETABLEBooks(BrioCHAR(6)PRIMARYKEY,RnameCHAR(50)NOTNULL);CREATETABLEAdministrators(AnoCHAR(6)PRIMARYKEY,AnameCHAR(20)NOTNULL);CREATETABLEBorrows(RnoCHAR(6)NOTNULL,BnoCHAR(15)NOTNULL,AnoCHAR(6)NOTNULL,BdateDATE,RdateDATE,PRIMARYKEY(Rno,Bno,Ano),FOREGINKEY(Rno)REFERENCEReaders(Rno),FOREGINKEY(Bno)REFERENCEBook(Bno)FOREGINKEY(Ano)REFERENCEAdministrators(Ano));为了答题的方便,图中的实体和属性同时给出了中英文两种名字,回答问题时只需写出英文名即可。【系统E-R图】1.【问题1】填写下列SQL程序中的(1)~(6),使它们分别完成相应的功能。程序1:查没有借阅过编号为111111图书的所有读者名单。SELECTRno,Rname,address,phoneFROMReadersWHERERno(1)(SELECT(2)FROMBorrowWHEREBno='llllll');程序2:统计在2005年1月1日借书的读者人数。SELECT(3)FROMBorrowWHERE(4);程序3:查借书证号为123456的读者所借过的所有图书。SELECTBno,BnameFROMBooksWHERE(5)(SELECT*FROMBorrowWHERE(6)ANDRno='123456';
问答题[说明]一个新的音像商店准备向比较广泛的人群出租录像带和光碟。该商店的管理决定在计算机系统的支持下来运作。音像商店在货架上存放着题材广泛的当前流行的电影库。由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。某个特定的电影可以存放在录像带或光碟上,录像带和光碟的租金不同。录像带要么是Beta格式要么是VHS格式;光碟为DVD格式,容量比较大,一张光碟可以存储同一电影片名的不同版本。每个电影都有特定的租用期(用天表示),并带有在租用期内的租金。音像商店必须能够立即回答关于某个电影的库存和有多少供租用的带子或光碟。音像商店的店员负责定购音像、联系客户、音像上架,并对客户的询问给出答复。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的用例图,图1-2是该系统的类图的一部分。[图1-1][图1-2]1.根据题意,给出“电影”类的主要属性。
问答题[说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。 以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式中,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是C++语言实现,能够正确编译通过。 [C++代码] class Hand private: int handvalue; static Hand *hand0; static Hand *hand1; static Hand *hand2; (1) ; Hand(int handvalue) this->handvalue = handvalue; public: (2) Hand* getHand(int handvalue) /*省略具体实现*/ ; Hand *Hand::hand0 = new Hand(0); Hand *Hand::hand1 = new Hand(1); Hand *Hand::hand2 = new Hand(2); class Strategy public: (3) Hand* nextHand() = 0; ; class WinningStrategy : public Strategy private: bool won; Hand *prevHand; public: winningStrategy() won = false; Hand* nextHand() if(!won) prevHand = Hand::getHand(rand()%3); return prevHand; ; class probstrategy : public Strategy public: Hand* nextHand() int handvalue = 0; /*省略具体实现*/ return Hand::getHand(handvalue); ; class Player private: string name; Strategy* strategy; public: Player(string name, (4) strategy) this->name = name; this->strategy = strategy; Hand *nextHand()(//向战略请示手势 return (5) ; ;
问答题【说明】一般的树结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。例如,图10-8(a)所示的树的孩子-兄弟表示如图10-8(b)所示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对图10-1所示的树进行层序遍历时,结点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示:函数原型说 明 VoidInitQueue(Queue*Q) 初始化队列 BoolIsEmpty(QueueQ) 判断队列是否为空,若是则返回TRUE,否则返回FALSE VoidEnQueue(Queue*Q,TreeNodep) 元素入队列 VoidDeQueue(Queue*Q,TreeNode*p) 元素出队列Bool、Status类型定义如下:typedefenum{FALSE=0,TRUE=1}Bool;typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1}Status;树的二叉链表结点定义如下:typedefstructNode{chardata;structNode*firstchild,*nextbrother;}Node,*TreeNode;【函数】StatusLevelTraverse(TreeNoderoot){/*层序遍历树,树采用孩子-兄弟表示法,root是树根结点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue(&tempQ);{{U}}(1){{/U}};brotherptr=root->nextbrother;while(brotherptr){EnQueue(&tempQ,brotherptr);{{U}}(2){{/U}};}/*end-while*/while({{U}}(3){{/U}}){{{U}}(4){{/U}};printf("%c\t",ptr->data);if({{U}}(5){{/U}})continue;{{U}}(6){{/U}};brotherptr=ptr->firstchild->nextbrother;while(brotherptr){EnQueue(&tempQ,brotherptr);{{U}}(7){{/U}};}/*end-while*/}/*end-while*/returnOK;}/*LevelTraverse*/
问答题[说明]
以下代码实现了当用户推出界面时,判断TextEdit中的文字是否发生改变,弹出对话框判断,让用户选择选择是否保存文件或取消退出界面操作。阅读下面代码,补充完整。
[代码7-1]
Begin VB.Form Forml
//...窗体描述(略)
Begin VB.TextBox TextEdit
Height = 1830
Left = 180
TabIndex = 0
Text = "TextEdit"
Top = 360
Width = 3885
End
//...窗体描述(略)
End
[代码 7-2]
Dim txtchange As Boolean
Dim myval As String
Private Sub Form Load ( )
TextEdit.Text = "CIU, 中国软考联盟!
txtchange = False
End Sub
[代码 7-3]
Private Sub TextEdit_Change ( )
Static notchange As Boolean
{{U}} (1) {{/U}}
{{U}} (2) {{/U}}
End Sub
Private Sub Form_Unload ( Cancel As Integer )
Dim myval As String
If {{U}}(3) {{/U}} Then
myval = MsgBox ( "保存文件的更改吗?", vbYesNoCancel, "提示信息" )
If {{U}}(4) {{/U}} Then
MsgBox "保存成功"
End
End If
If {{U}}(5) {{/U}} Then End
If {{U}}(6) {{/U}} Then Cancel = 1
End If
End Sub
问答题[说明]背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limitweight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为下图。仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。[流程图][程序说明]structThing:物品结构typedefstructBag:背包结构类型input():将物品按序号依次存入数组函数inbag():物品按物价比入包函数init():初始化函数sort():对物品按价格重量比排序函数outbag():取出包中weiht最大的物品函数print():最佳方案输出函数[C程序]#defineN255structThingdoubleweight;doublevalue;doubledens;thing[N];typedefstmctBagThingthing[N];doubleweighttmp;doublesumvalue;bag,best;inbag()dobag.thing[i]=thing[i](1)(2)i++;while((3))init()for(inti=0;i<N;i++)input(thing[i].weight,thing[i].value)thing[i].dens=thing[i].value/thing[i].weight;;main()init();sort();inbag();dobest=bag;//把包中物品放入暂存数组outbag();//取出包中weight最大的物品(4)while((5))print(best);//输出temp因为是最佳方案
问答题[说明]假设某大型商业企业由商品配送中心和连锁超市组成,其中商品配送中心包括采购、财务、配送等部门。为了实现高效管理,设计了商品配送中心信息管理系统,其主要功能描述如下。(1)系统接受由连锁超市提出的供货请求,并将其记录到供货请求记录文件。(2)在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处理发送配送通知;否则,向采购部门发出缺货通知。(3)配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件。(4)采购部门接到缺货通知后,与供货商洽谈,进行商品采购处理,合格商品入库,并将采购清单记录至采购清单记录文件,向配送处理发出配送通知,同时通知财务部门给供货商支付货款。该系统采用结构化方法进行开发,得到待修改的数据流图如下图所示。
问答题【说明】某大学准备开发一个学生课程注册系统,学生可以使用该系统查询新学期将开设的课程和讲课教师情况,选择自己要学习的课程进行登记注册,并可以查询成绩单;教师可以使用该系统查询新学期将开设的课程和选课学生情况,并可以登记成,绩单;注册管理员使用该系统进行注册管理,包括维护教师信息、学生信息和课程信息等。在每个学期的开始,学生可以获得该学期的课程目录表,课程目录表列出每门课程的所有信息,诸如基本信息、教师、开课系和选课条件等。新学期开始前两周为选课注册时间,在此期间学生可以选课注册,并且允许改变或取消注册申请,开学两周后注册管理员负责关闭课程注册。每个学生可以选择不超过4门课程,同时指定2门侯选课程以备主选课程未选上。每门课程最多不能超过10人,最少不能低于3人,低于3人选课的课程将被取消。一旦学生的注册过程完毕,注册系统将有关信息提交收费系统以便学生付费。如果在实际注册过程中名额已满,系统将通知学生在提交课程表之前予以更改。在学期结束时,学生可以存取系统查看电子成绩单。由于学生成绩属于敏感信息,系统必须提供必要的安全措施以防非法存取。【用例图】 表1学生课程注册系统的实体类实体类说明Professor学校中讲课的教师student学校中注册课程的学生Schedule学生在新学期选择登记的课程列表CourseCatalog学校所有课程的目录Course课程的基本信息CourseOffering新学期课程的开设信息,如讲课教师、时间、地点等信息 表2学生课程注册系统的边界类边界类说明LoginForm为教师、学生和注册管理员提供登录的操作RegisterCoursesForm为学生提供选课注册的操作ViewReportForm为学生提供成绩查询的操作selecrTeachCoursesForm为教师提供查看学生选课情况的操作SubmitCradesForm为教师提供登记成绩的操作MaintainProfessorsForm为注册管理员提供维护教师信息的操作MaintainStudentsForm为注册管理员提供维护学生信息的操作MaintainCoursesForm为注册管理员提供维护课程信息的操作CloseRegistrationForm为注册管理员提供关闭注册的操作BillingSystemNotice提供与收费系统的信息交换接口 表3学生课程注册系统的控制类控制类说明RegisterCoursesControl负责新学期学生的选课登记ViewReportControl负责学生成绩的查询SelectTeachCoursesControl负责新学期课程的学生选择情况SubmitGradesControl负责学生成绩的登记CloseRegistrationControl负责关闭课程注册【协作图】【时序图】注释1:学生打算注册新的课程。注释2:一张这学期可选择的课程列表。注释3:显示一张为学生选课用的空白登记表。
问答题【说明】在一条农村公路的一边稀疏地分布着房子,其分布如图10-5所示。某电信公司需要在某些位置放置蜂窝电话基站,由于基站的覆盖范围是6公里,因此必须使得每栋房子到某个基站的直线距离不超过6公里。为简化问题,假设所有房子在同一直线上,并且基站沿该直线放置。现采用贪心策略实现用尽可能少的基站覆盖所有的房子。实现贪心算法的流程如图10-6所示,请填充其中空白并计算该算法的时间复杂度,其中:1.d[i](1≤i≤N)表示第i个房子到公路A端的距离,N表示房子的总数,房子的编号按照房子到公路A端的距离从小到大进行编号。2.s[k]表示第k(k≥1)个基站到公路A端的距离,算法结束后k的值为基站的总数。该算法的时间复杂度为{{U}}(5){{/U}}。
问答题[说明](1)对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d)及其权值2、7、4、5,可构造如图3-26所示的最优二叉树,以及相应的结构数组Ht(如表3-12所示,其中数组元素Ht[0]不用)。{{B}}表3-12结构数组Ht{{/B}}{{B}}数组下标{{/B}}{{B}}ch{{/B}}{{B}}weight{{/B}}{{B}}parent{{/B}}{{B}}lchild{{/B}}{{B}}rchild{{/B}}1a25002b77003c45004d5600566136180267结构数组Ht的类型定义如下:(2)用“0”或“1”标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用“0”(或“1”)标识该分支(示例见图3-26)。(3)若用上述规则标识最优二叉树的每条分支后,从根结点开始到叶子结点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子结点的前缀编码。例如图3-26所示的叶子结点a、b、c、d的前缀编码分别是110、0、111、10。[函数说明1]函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中,形参root为最优二叉树的根结点下标;形参n为叶子结点个数。在函数voidLeafCode(introot,intn)构造过程中,将Ht[p].weight域用做被遍历结点的遍历状态标志。[函数4.1][函数说明2]函数voidDecode(char(作图)buff,introot)的功能是:将前缀编码序列翻译成叶子结点的字符序列,并输出。其中,形参root为最优二叉树的根结点下标;形参buff指向前缀编码序列。[函数4.2]
问答题【说明】某网络故障诊断系统,使用故障代理(aZent、Sm4PTrap等)来检测各种意外情况,如大幅丢包、路由冲突、广播风暴等。网络管理员可以在安装该系统时配置安全监控程序(如故障代理程序、实时诊断程序、报警器等),也可以在系统运行时修改配置,通过网络状态采集器和故障特征数据库,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,系统给每个故障代理赋予一个编号(即id)和类型,并设置管理员密码以启动和关闭系统,设置故障代理事件发生时应自动拨出的电话号码。当系统检测到一个故障代理事件时,就激活警报,拨出预置的电话号码,并报告关于位置和检测到的事件的性质等信息。【数据流图】1.【问题1】数据流图1(网络故障检测系统顶层图)中的A和B分别表示什么?
问答题[说明]某汽车制造工厂有两条装配线。汽车装配过程如下图所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-1,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。(3)ai,j表示在工位Si,j处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。(4)ti,j表示从Si,j处装配完成后转移到另一条装配线下一个工位的时间。(5)x0和x1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。图4-17所示的流程图描述了求最短装配时间的算法,该算法的输入为:n:表示装配线上的工位数;e[i]:表示e1和e2,i取值为0或1;a[i][j]:表示ai,j,i的取值为0或1,j的取值范围为0~n-1;t[i][j]:表示ti,j,i的取值为0或1,j的取值范围为0~n-1;x[i]:表示x0和x1,i取值为0或1。算法的输出为:fi:最短的装配时间;li:获得最短装配时间的下线装配线号(0或者1)。算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
问答题[说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。 以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。 以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。 [C代码] typedef (1) (*funl)(); enum HandValueHANDVALUE_GUU=0, HANDVALUE_CHO=1, HANDVALUE_PAA=2; //手势可取值,依次为“石头”、“剪刀”、“布” //其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头 bool won; struct Hand *WSprevHand; struct Hand//手势 enum HandValue handvalue; hand[3]=HANDVALUE_GUU, HANDVALUE_CHO, HANDVALUE_PAA; int fight(struct Hand *h1, struct Hand *h2) //比较h1和h2。h1代表的手势较大时返回1,h1较小时返回-1,相等时返回0 // if(h1->handvalue == h2->handvalue) return 0; else if((h1->handvalue+1)% (2) == h2>handvalue) return 1; else return -1; struct Hand* getHand(int handvalue) //依据手势代表的值取得手势,若handvalue不合法,返回NULL switch(handvalue) case 0: return break; case 1: return bteak; case 2; return break; return (3) ; struct Strategy//策略 funl nextHand;//下一个手势 ; struct Hand* WSnextHand() if(!won) PSprevHand = getHand(rand()%3); return PSprevHand; struct Player char name[20]; (4) strategy;//策略 int wincount; int losecount; int gamecount; ; void main() Strategy WS; WS.nextHand = WSnextHand; WSpreVHand = NULL; struct Player WSplayer; (5)(WSplayer.name,"ww"); WSplayer.wincount = 0; WSplayer.losecount = 0; WSplayer.gamecount = 0; WSplayer.strategy =
问答题[说明]
下面代码实现类A、B、C、D的继承定义和应用。仔细阅读[代码5-1],在{{U}} (n) {{/U}}处写出正确的运行结果。
[代码5-1]
#include<iostream.h>
class A {
public:
int a;
A (int v1): a(v1) {} //构造函数
void disp ( )
{
cout<<"a in class A="<<a<<endl;
}
};
class B: virtual public A {
public:
int b;
B (int v1,int v2): A(v1),b v2) {} //构造函数
void disp ( )
{
cout<<"a in class B="<<a<<endl
cout<<"b in class B="<<b<<endl;
}
};
class C: virtual public A {
public:
int c;
C (int v1,int v2): A(v1) ,c(v2) {} //构造函数
void disp ( )
{
cout<<"a in class C="<<a<<endl;
cout<<"c in class C="<<c<<endl;
}
};
class D: public B, public C {
public:
int d;
D (int v1,int v2,int v3,int v4 ): A(v1) ,B(v1,v2) ,C(v1,v3),d(v4) {} //构造函数
void disp ( )
{
cout<<"a="<<a<<endl;
cout<<"b="<< b<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
}
};
void main( )
{
D demo (10,20,30,40);
demo.disp ( );
}
[运行结果]
a={{U}} (1) {{/U}}
b={{U}} (2) {{/U}}
c={{U}} (3) {{/U}}
d={{U}} (4) {{/U}}
问答题【说明】 类Queue表示队列,类中的方法如下表所示。 isEmpty() 判断队列是否为空。如果队列不为空,返回true;否则,返回false enqueue(Object newNode) 入队操作 dequeue() 出队操作。如果队列为空,则抛出异常 类Node表示队列中的元素;类EmptyQueueException给出了队列操作中的异常处理操作。 public class TestMain //主类 public static viod main (String args[]) Queue q=new Queue(); q.enqueue("first!"); q.enqueue("second!"); q.enqueue("third!"); (1) while(true) System.out.println(q.dequeue()); catch( (2) ) public class Queue //队列 Node m_FirstNode; public Queue()m_FirstNode=null; public boolean isEmpty() if(m_FirstNode==null)return true; else return false; public viod enqueue(Object newNode) //入队操作 Node next=m_FirstNode; if(next==null)m_FirstNode=new Node(newNode); else while(next.getNext()!=null)next=next.getNext(); next.setNext(new node(newNode)); public Object dequeue() (3) //出队操作 Object node; if (isEempty()) (4) ; //队列为空, 抛出异常 else node=m_FirstNode.getObject(); m_FirstNode=m_FirstNode.getNext(); return node; public class Node //队列中的元素 Object m_Data; Node m_Next; public Node(Object data) m_Data=data; m_Next=null; public Node(Object data, Node next) m_Data=data; m_Next=-next; public void setObject(Object data) m_Data=data; public Object getObject(Object data) return m_data; public void setNext(Node next) m_Next=next; public Node getNext() return m_Next; public class EmptyQueueException extends (5) //异常处理类 public EmptyQueueException() System.out.println("队列已空! ");
问答题[问题3](3分)
用例“借书”的备选事件流4a中,根据借书制度来判定读者能否借阅图书。若图书馆的借书制度会不断地扩充,并需要根据图书馆的实际运行情况来调整具体使用哪些制度。为满足这一要求,在原有类设计的基础上,可以来用何种设计模式?简要说明原因。
问答题[说明]某银行计划开发一个自动存提款机模拟系统(ATMSystem)。系统通过读卡器(CardReader)读取ATM卡;系统与客户(Customer)的交互由客户控制台(clastomerConsole)实现:银行操作员(Operator)可控制系统肩动(SystemStartup)和系统停止(SystemShutdown);系统通过网络和银行系统(Bank)实现通信。当读卡器判断用户已将ATM卡插入后,创建会话(Session)。会话开始后,读卡器进行读卡,并要求客户输入个人验证码(PIN)。系统将卡号和个人验证码信息送到银行系统进行验证。验证通过后,客户可从菜单选择以下事务(Transaction)。(1)从ATM卡账户取款(Withdraw)。(2)向ATM卡账户存款(Deposit)。(3)进行转账(Transfer)。(4)查询(Inquire)ATM卡账户信息。一次会话可以包含多个事务,每个事务处理也会将卡号和个人验证码信息送到银行系统进行验证。若个人验证码错误,则转个人验证码错误处理(InvalidPINProcess)。每个事务完成后,客户可选择继续上述事务或退卡。选择退卡时,系统弹出ATM卡,会话结束。系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图如图1所示,一次会话的序列图(不考虑验证)如图2所示。可能的消息名称列表如下表所示。可能的消息名称列表名称说明名称说明CardInserted()ATM卡已插入performTransaction()执行事务performSession()执行会话readCard()读卡readPIN()读取个人验证码PIN个人验证码信息Create(atm,this,card,pin)为当前会话创建事务create(this)为当前ATM创建会话CardATM卡信息doAgain执行下一个事务ejectCard()弹出ATM卡
问答题有下列关于运动会管理系统的ER图,如图所示。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。假定已通过下列SQL语言建立了基本表。CREATETABLEATHLETEANAMECHAR(20),ASEXCHAR(1),ATEAMCHAR(20));CREATETABLE|TEM(INOCHAR(6)NOTNULL,INAMECHAR(20),ITIMECHAR(12),IPLACECHAR(20);CREATETABLEGAMES(ANOCHAR(6)NOTNULL,INOCHAR(6)NOTNULL,SCORRECHAR(10));为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。【E-R图】【问题】填充下列SQL程序1~4中的(1)~(7),使它们分别完成相应的功能:程序1:统计参加比赛时男运动员人数。SELECT(1)FROMATHLETEWHEREASEX='M';程序2:查100872号运动员参加的所有项目及其比赛时间和地点。SELECTITEM,INO,INAME,ITIME,IPLACEFROMGAMES,ITEMWHERE(2);AND(3);程序3:查参加100035项目的所有运动员名单。SELECTANO,ANAME,ATEAMFROMATHLETEWHERE(4);(SELECT(4)(5)FROMGAMESWHEREGAMESANO=ATHLETE.ANOANDINO='100035');程序4:建立运动员成绩视图。(6)ATHLETE-SCOREASSELECTATHLETE,ANO,ANAME,ATEAM,INAME,SCOREFORM(7)WHEREATHLETE.ANO=GAMES.ANOANDGAMES.INO=ITEM.INO;
问答题[说明]某图书管理系统的主要功能如下。(1)图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态(可借阅或己借出)。(2)资源可以分为两类:图书和唱片。对于图书,系统需登记作者和页数;对于唱片,系统需登记演唱者和介质类型(CD或者磁带)。(3)读者信息保存在图书管理系统的读者信息数据库中,记录的信息包括读者的识别码和读者姓名。系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息。现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。下表中给出了说明中出现的所有名词。表1 图书管理系统图书管理系统资源目录读者资源索引号系统名称出版时间资源状态图书唱片作者页数演唱者介质类型CD磁带读者信息读者信息数据库识别码姓名借书记录文件信息通过对上表中的名词进行分析,最终得到如下图所示的UML类图。类的说明如下表所示。表2 类的说明类名说明LibrarySystem图书管理系统BorrowerDB保存读者信息的数据库Catalogltem资源目录中保存的缚项资源Borrower读者BorrowerItems为每个读者创建的借书记录文件
