问答题[说明]某银行已有一套基于客户机/服务器模式的储蓄系统A和一套建账软件。建账软件主要用于将储蓄所手工处理的原始数据转换为储蓄系统A所需的数据格式。该建账软件具有以下功能。(1)分户账录入。手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。(2)初录/复录比对。将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。(3)数据确认。当上述两套数据完全一致后,将其中任一套作为最终进入储蓄系统A的原始数据。(4)汇总、核对和打印。对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性。打印输出经过确认的数据,为以后核查可能的错误提供依据。(5)数据转换。将经过确认的数据转换为储蓄系统A需要的中间格式数据。(6)数据清除。为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。该软件的数据流图如图1~图3所示。图中部分数据流数据文件的格式如下。初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质初录数据=手工分户账+一致性标志复录数据=手工分户账+一致性标志会计账目=储蓄所号+总户数+总余额操作结果=初录操作结果+比对操作结果+复录操作结果软件需要打印的分户账清单样式如下表所示。分户账清单样式表储蓄所账号开户日户名其他分户账数据储蓄所1储蓄所1合计共×××户,总余额9999999.99元储蓄所2储蓄所2合计共×××户,总余额9999999.99元
问答题[说明]某大学欲开发一个基于Web的课程注册系统,该系统的主要功能如下:1.验证输入信息(1)检查学生信息:检查学生输入的所有注册所需信息。如果信息不合法,返回学生信息不合法提示;如果合法,输出合法学生信息。(2)检查学位考试结果:检查学生提供的学位考试结果。如果不合法,返回学位考试结果不合法提示;如果合法,检查该学生注册资格。(3)检查学生注册资格:根据合法学生信息和合法学位考试结果,检查该学生对欲选课程的注册资格。如果无资格,返回无注册资格提示;如果有注册资格,则输出注册学生信息(包含选课学生标识)和欲注册课程信息。2.处理注册申请(1)存储注册信息:将注册学生信息记录在学生库。(2)存储所注册课程:将选课学生标识与欲注册课程进行关联,然后存入课程库。(3)发送注册通知:从学生库中读取注册学生信息,从课程库中读取所注册课程信息,给学生发送接受提示;给教务人员发送所注册课程信息和已注册学生信息。现采用结构化方法对课程注册系统进行分析与设计,获得如图1所示的0层数据流图和图2所示的1层数据流图。图1某课程注册系统0层数据流图图2某课程注册系统1层数据流图
问答题[说明] 以下程序实现了利用鼠标任意移动圆形的位置,仔细阅读代码和相关注释,将程序补充完整。 [代码6-1] import java.awt.*; import java.awt.event.*; public class CIUSAMPLE extends Frame implements MouseMotionListener, MouseListener static CIUSAMPLE frm=new CIUSAMPLE ( ); int x=70,y=60,posX=70,posY=60,dx,dy; public static void main (String args[]) frm.setTitle ("Dragging a circle"); frm.setSize (200,150); (1) ffm.addMouseMotionListener (frm); frm.setVisible (true); public void mousePressed (MouseEvent e) (2) dy=e.getY ( ) -posY; public void mouseDragged (MouseEvent e) (3) y=e.getY ( ) -dy; if(dx>0 (4) public void paint (Graphics g) g.setColor (Color.pink); //设置绘图颜色为粉红 g.fillOval(x,y,50,50); //以基准点为图形在左上角绘出圆形 (5) posY=y; public void mouseMoved (MouseEvent e) public void mouseReleased (MouseEvent e) public void mouseEntered (MouseEvent e) public void mouseExited (MouseEvent e) public void mouseClicked (MouseEvent e)
问答题[说明] 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为: m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2] 其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。 运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。 [函数] int cmp(int *LA, int *LB); /*比较长整数LA与LB的绝对值大小*/ /*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/ int ADD (int *LA, int *LB, int *LC) /*计算长整数LA与LB的和,结果存储于LC中*/ /*注意:正数与负数的和相当于正数与负数绝对值的差*/ /*数据有误返回0,正常返回1*/ if(LA == NULL || LB == NULL || LC == NULL)return 0; int *pA, *pB, i, N, carry, flag; flag = LA[0] + LB[0]; switch(flag) /*根据参与运算的两个数的符号进行不同的操作*/ case 0: case 2: Lc[0] = LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/ pA = LA; pB = LB; (1) ; break; case 1: /*LA与LB异号*/ /*比较两者的绝对值大小,结果符号与较大者相同*/ flag = (2) ; if(flag > 0) /*LA较大*/ LC[0] = LA[0]; pA = LA; pB = LB; else if(flag LC[0] = LB[0]; pA = LB; pB = LA; else/*LA与LB相等*/ LC[0] = 0; LC[1] = 0; return 1; flag = -1; break; default: return 0; break; /*switch*/ /*绝对值相加减*/ /*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减情况*/ (3) ; N = LA[1] > LB[1] ? LA[1] : LB[1]; for(i = 0; i if(i >= pA[1])/*LA计算完毕*/ carry += flag * pB[i+2]; else if(i >= pB[1])/*LB计算完毕*/ carry += pA[i+2]; else carry += pA[i+2] + flag * pB[i+2]; LC[i+2] = carry % 10; carry /= 10; if( (4) )/*需要借位,针对减法*/ LC[i+2] += 10; carry--; /*for*/ if( (5) )/*最高进位,针对加法*/ LC[i+2] = carry; i++; if(LC[i+1] == 0) i--; /*若最高位为零,针对减法*/ LC[1] = i; return 1; ;/*ADD*/
问答题[说明]为了有效记录交通事故情况,欲设计一个交通事故记录系统。一辆汽车有一个唯一的“车牌号”,车主购买汽车时需要提供相关信息,包括身份证、姓名、年龄、性别、地址等。一个车主可以拥有多辆汽车,而一辆汽车只有一个车主。驾驶员不一定是车主,因此记录交通事故时要记录驾驶员身份证号,同时记录事故发生时刻。图2-1描绘了人、汽车、交通事故三个实体类型及实体间联系的一个E-R图。[图2-1]对应的关系模式为:·人(身份证号,姓名,性别,年龄,地址)·汽车(车牌号,型号)·事故(车牌号,身份证号,时刻,损失,描述)·拥有(身份证号,车牌号)1.指出每种关系模式的主键。
问答题【说明】下面是一个Applet程序,其功能是将完整的图像显示于Applet的区块中,然后可以通过拖动鼠标让图像随着鼠标拖动的轨迹而移动。程序运行结果如图5所示。importjava.applet.*;importjava.awt.*;/*<appletcode="ex4_7.class",width=800height=400></applet>*/publicclassex4_7extendsApplet{private|mageilmg;privateintxPos,yPos;publicvoidinit(){xPos=yPos={{U}}(1){{/U}};ilmg=getlmage({{U}}(2){{/U}}"ex4_7.jpg");}publicvoidpaint(Graphicsg){g.drawlmage(ilmg,xPos,yPos,{{U}}(3){{/U}});}publicboolean{{U}}(4){{/U}}(Evente,intx,inty){xPos=x;yPos=y;{{U}}(5){{/U}};returntrue;}}ex4_7.html<HTML><HEAD><TITLE>ex4_7</TITLE></HEAD><BODY><appletcode="ex4_7.class"width=800height=400></applet></BODY></HTML>
问答题【说明】
供应商—零件—工程项目数据库由以下4个关系模式构成:
S(SNO,SNAME,STATUS,CITY)
P(PNO,PNAME,COLOR,WEIGHT,CITY)
J(JNO,TNAME,CITY)
SPJ(SNO,PNO,JNO,QTY)
其中,供应商S,零件P和工程项目J分别由供应商号(SNO),零件号(PNO)和工程项目号(JNO)唯一标识。供货SPJ是指由某个供应商向某个工程项目供应某些数量的某种零件。 【问题1】
请用SQL语言完成如下的操作。
①找出给北京的工程项目提供不同的零件号:
②将没有供货的所有工程项目从J中删除;
③查询这样的工程项目号:供给该工程项目的零件P1的平均供应量大于供给工程项目n的任何一种零件的最大供应量。
【问题2】
定义一个视图,它由所有这样的工程项目(工程项目号与所在城市名称)组成:它们由供应商S1供货且使用零件P1。
问答题 阅读下列说明和图,回答问题1至问题3,将解答填入对应栏内。
【说明】 某营销企业拟开发一个销售管理系统,其主要功能描述如下:
1.接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理:修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理:将缺货订单录入缺货记录文件。
2.根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。
3.根据采购部门提供的进货通知单进行进货处理:修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。
4.根据保留的客户订单进行销售统计,打印统计报表给经理。
现采用结构化方法对销售管理系统进行分析与设计,获得如下图所示的顶层数据流图和0层数据流图。
问答题[说明]请完成流程图以描述在数据A(1)至A(10)中求最大数和次大数的程序的算法。并将此改成PAD图。该算法的流程图如下图:
问答题[问题3](2分)
对于某些需求量非常大的小木屋或营地,说明中功能4的赔偿金计算规则,不足以弥补取消预定所带来的损失。如果要根据预定的时段以及所预定场地的需求量,设计不同层次的赔偿金计算规则,需要对图3-2进行怎样的修改? (请用文字说明)
问答题【说明】某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图9-8是顶层数据流图,图9-9所示是第0层数据流图,图9-10是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。【数据字典】(1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:配件号+配件名+规格+数量+允许的最低库存量1.【问题1】根据题意,图9-9中哪个文件可不必画出。
问答题【问题3】
写出OrderDetail中的关键项。
问答题阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。[说明]某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。[图1-1][图1-2][图1-3][数据字典](1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:{配件号+配件名+规格+数量+允许的最低库存量}
问答题【说明】有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。【程序代码13-5】{{U}}(1){{/U}};classWindow{public:roidSetContents(VisualComponent*contents);};//VisualComponent类是一个描述可视对象的抽象类classVisllalComponent{public:VisualComponent(){};{{U}}(2){{/U}}voidDraw(){};VirtualvoidResize(){};};classDecorator:publicVisualComponent{public:Decorator(){//…};Decorator(VisualComponent*vcom){//…};virtualvoldDraw();virtualvoldResize();private:/*Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/VisualComponent{{U}}(3){{/U}};};voldDecorator::Draw(){{{U}}(4){{/U}};//缺省实现}voidDecorator::Resize(){component->Resize();//缺省实现}//BorderDecorator子类为它所包含的组件添加一个边框classBorderDecorator:publicDecorator{public:BorderDecorator(VisualComponent*vcom,intborderWidth){//…};VirtualVoidDraw();private:voidDrawBorder(int);private:intborderWidth;};voidBorderDecorator::Draw(){Decorator::Draw();DrawBorder(_width);}VoidBorderDecorator::DrawBorder(intWidth){//…)VoidWindow::SetConterlts(VlsualComponent*contents){//…}//SerollDecorat给可视组件添加滚动功能classScroliDecoratOr:publicDecorator{public:ScrollDecorator(VlsualComponent*vcom){//…};//…);classTextView:publicVisualComponent{//…};voidmain(void){//创建一个正文视图以及放入这个正文视图的窗口Window*window=newWindow;TcxtView*textView=newTextView;//TextView是一个VisualComponent,它可以放入窗口中window->SetContents(textView);//得到一个有边界的和可以滚动的TextView,边界宽为1window->SetContents({{U}}(5){{/U}});}
问答题
阅读下列程序和控制流图,将应填入{{U}} (n)
{{/U}}的字句写在答题纸的对应栏内。 【程序】
下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度+ int
GetMax (int n, int datalist[]) { int
k=0; for (int j=1;j<n;j++)
if (datalist[j] > datalist[k])
k=j;
retum k; 【控制流图】
问答题[说明]背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limitweight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为图11-4。仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。[流程图11-4][程序说明]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.[问题1]根据程序说明及流程图、部分C源码,充分理解算法思想,填入(n)处。
问答题阅读下列说明和数据流图,回答问题1~问题3。【说明】某考务处理系统主要功能是考生管理和成绩管理:1.对考生送来的报名表进行检查。2.对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3.对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4.填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5.根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图1所示,第0层图如图2所示,加工2子图如图3所示。【数据流图】
问答题【说明】已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如左下所示。该遥控器共有4个按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如右下所示。右上图中,类RomoteController的方法onPressButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。【C++代码】classLight{//电灯类public:voidtrunLight(intdegree){//调整灯光亮度,0表示关灯,100表示亮度最大);};classTV{//电视机类public:voldsetChannel(intchannel]{//调整电视频道,0表示关机,1表示开机并切换到1频道};};classCommand{//抽象命令类public:virtualvoidon()=0;virtualvoidoff()=0;};classRemoteController{//遥控器类protected:Command*commands[4];//遥控器有4个按钮,按照编号分别对应4个Command对象public:voidonPressButton(intbutton){//按钮被按下时执行命令对象中的命令if(button%2==0)commands[button]->on();elsecommands[button]->off();}voidsetCommand(intbutton,Command*command){{{U}}(1){{/U}}=command;//设置每个按钮对应的命令对象}};classLightCommand:publicCommand{//电灯命令类protected:Light*light;//指向要控制的电灯对象public:voidOn(){light->trunLight(100););voidoff()[light->{{U}}(2){{/U}};);LightCommand(Light*light){this->light=light;);};classTVCommand:publicCommand{//电视机命令类protected:TV*tv;//指向要控制的电视机对象public:voidon(){tv->{{U}}(3){{/U}};};voidoff(){tv->setChannel(0););TVCommand(TV*tv){this->tv=tv;);};voidmain(){Lightlight;TVtv;//创建电灯和电视对象LightCommandlightCommand(&light);TVCommandtVCommand(&tv);RemoteControllerremoteController;remoteController.setCommand(0,{{U}}(4){{/U}});//设置按钮0的命令对象…//此处省略设置按钮1、按钮2和按钮3的命令对象代码}本题中,应用命令模式能够有效让类{{U}}(5){{/U}}和类{{U}}(6){{/U}}、类{{U}}(7){{/U}}之间的耦合性降至最小。
问答题
阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。 [说明]
下面给出的是某房产管理系统的一套分层数据流图。其功能描述如下:
(1)系统随时根据住房送来的入住单更新住户基本信息文件;
(2)每月初系统根据物业管理委员会提供的月附加费(例如清洁费、保安费、大楼管理费等)表和房租调整表,计算每家住户的月租费(包括月附加费),向住户发出交费通知单。住户交费时,系统输入交费凭证,核对后输出收据给住户;
(3)系统定期向物业管理委员会提供住房分配表和交费清况表;
(4)住户因分户或换房,在更新住户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分户或换房前的房租。
以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是项层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中A是加工1的细化图,B是加工2的细化图。假定题中提供的顶层图是正确的,请回答下列问题。
[图1-1] [图1-2]
[图1-3]
问答题【问题2】
在状态迁移图中,a,b,c分别表示什么事件?请用转换图中给出的事件名解答。