问答题
问答题【说明】设有关于银行借贷管理系统的E-R图(如图4所示)。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。为了答题的方便,图中的实体和属性同时给出了中英文说明,回答问题时只需写出英文名即可。
问答题【说明】在一栋m层楼的大厦里,用电梯内和每个楼层的按钮来控制n部电梯的运作。当按下电梯内按钮请求电梯在指定楼层停下时,按钮指示灯亮,当电梯到达指定楼层时,指示灯熄灭。除了大厦的最底层和最高层之外,每层楼都有两个按钮分别指示电梯上行和下行,当这两个按钮之一被按下时相应的指示灯亮,当电梯到达此楼层时灯熄灭,电梯向要求的方向移动。当电梯无升降运动时,关门并停止在当前楼层。软件设计师火云龙采用面向对象分析的方法,经过三次逐步求精设计之后,得到如图13-19所示的类图。【问题1】按钮类有一个重要的属性,请将该属性填入图13-19中的(a)处。【问题2】识别关联的多重性是面向对象建模重要的一步,请根据题目说明填空(1)~(6)。【问题3】软件设计师火云龙在初步设计类时,将门(的状态)作为电梯的属性,后经思考,将电梯门设计成一个独立的类,这么做的好处是什么?软件设计师火云龙在初步设计类时,并没有设计“请求”类,后来又加入了该类,这么做的原因是什么?
问答题[说明]以下VisualBasic代码实现了对位图(BMP)进行旋转显示。以下程序共实现了对BMP位图图形进行180°旋转、90°旋转(顺时针)、90°旋转(逆时针)、水平翻转、垂直翻转共5项处理。显示界面如图12-8所示。仔细阅读[代码7-1]至[代码7-3],完成{{U}}(n){{/U}}代码,并写在对应栏内。[代码7-1]BeginVB.FormForm1AutoRedraw=-1'TrueCaption="图像的施转"//...窗体描述(略)BeginVB.CommandButtonCommand7Caption="退出"//...窗体描述(略)EndBeginVB.CommandButtonCommand6Caption="复位"//...窗体描述(略)EndBeginVB.CommandButtonCommand5Caption="垂直翻转"//...窗体描述(略)EndBeginVB.CommandButtonCommand4Caption="水平翻转"//...窗体描述(略)EndBeginVB.CommandButtonCommand3Caption="90°(逆时针)"//...窗本描述(略)EndBeginVB.CommandButtonCommand2Caption="90°(顺时针)"//...窗体描述(略)EndBeginVB.PictureBoxPicture2//...窗体描述(略)EndBeginVB.CommandButtonCommand1Caption="180°"//...窗体描述(略)EndBeginVB.PictureBoxPicture1//...窗体描述(略)EndEnd[代码7-2]PrivateDeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLongConstsrcopy=&HCC0020DimhAsIntegerDimwAsIntegerPrivateSubForm_Load()Picture2.Picture=LoadPicture(App.Path&"/a01.bmp")'导入图片'h=Picture1.Heightw=Picture1.WidthEndSub[代码7-3]PrivateSubCommandl_Click()旋转180°Picture2.Picture=LoadPicture("")Forj=0TohStep1Fori=0TowStep1{{U}}(1){{/U}}NextiNextjEndSubPrivateSubCommand2_Click()'顺时针施转90°'Picture2.Picture=LoadPicture("")Fori-hTo0Step-1Forj-0TowStep1{{U}}(2){{/U}}NextjNextiEndSubPrivateSubCommand3_Click()'逆时针旋转90°'Picture2.Picture=LoadPicture("")Forj=wTo0Step-1Fori=0TohStep1{{U}}(3){{/U}}NextiNextjEndSubPrivateSubCommand4Click()'水平翻转Picture2.Picture=LoadPicture("")Fori=wTo0Step-1Forj=0TohStep1{{U}}(4){{/U}}NextjNextiEndSubPrivateSubCommand5_Click()'垂直翻转Picture2.Picmre=LoadPicmre("")Forj=0TohStep1Fori=0TowStepI{{U}}(5){{/U}}NextiNextjEndSubPrivateSubCommand6_Click()'复位Picture2.Picture=LoadPicmre("")Fori=0TowStep1Forj=0TohStep1{{U}}(6){{/U}}NextjNextiEndSub
问答题[问题4](4 分)
原来的“职员”关系模式存在什么问题?在不增加新关系模式的前提下,请给出修改后的“职员”和“部门”关系模式。
问答题[说明]现准备为某银行开发一个信用卡管理系统(CCMS),该系统的基本功能如下。(1)信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS。如果信用卡申请被银行接受,CCMS将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封拒绝函。非信用卡客户收到确认函后成为信用卡客户。(2)信用卡激活。信用卡客户向CCMS提交激活请求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功激活。(3)信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。(4)交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在CCMS中。信用卡客户可以通过CCMS查询并核实其交易信息(包括信用卡交易记录及交易额)。图1和图12分别给出了该系统的项层数据流图和0层数据流图的初稿。
问答题阅读下列说明和数据流图,回答问题1至问题3。【说明】图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。系统要实现以下4方面的功能:购入新书、读者借书、读者还书及图书注销。(1)购入新书:需要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。(2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。(3)读者还书:根据图书流水号,从借书文件中读出和该图书相关的借阅记录,表明还书日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。(4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。(5)流通查询:管理员可以对图书流通情况进行查询,包括某位读者、某种图书和全部图书,给出流通情况统计表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。如图9-1所示是顶层数据流图,如图9-2所示是第0层数据流图,如图9-3所示是第1层数据流图。【数据字典】(1)数据流条目图书管理要求=[入库单|借书单|还书单|注销单]入库单=分类目录号+数量+书名+作者+内容摘要+价格+购书日期借书单=读者号+{{U}}(d){{/U}}+借阅日期还书单={{U}}(e){{/U}}+还书日期(2)文件说明文件名:目录文件组成:{分类目录号+书名+作者+内容摘要+价格+入库日期+总数+库存数+{{U}}(f){{/U}}}
问答题[说明]某集团公司在全国不同城市拥有多个大型超市,为了有效管理各个超市的业务工作,需要构建一个超市信息管理系统。[需求分析结果](1)超市信息包括:超市名称、地址、经理和电话,其中超市名称唯一确定超市关系的每一个元组。每个超市只有一名经理。(2)超市设有计划部、财务部、销售部等多个部门,每个部门只有一名部门经理,有多名员工,每个员工只属于一个部门。部门信息包括:超市名称、部门名称、部门经理和联系电话。超市名称、部门名称唯一确定部门关系的每一个元组。(3)员工信息包括:员工号、姓名、超市名称、部门名称、职位、联系方式和工资。其中,职位信息包括:经理、部门经理、业务员等。员工号唯一确定员工关系的每一个元组。(4)商品信息包括:商品号、商品名称、型号、单价和数量。商品号唯一确定商品关系的每一个元组。一名业务员可以负责超市内多种商品的配给,一种商品可以由多名业务员配给。[概念模型设计]根据需求分析阶段收集的信息,设计的实体联系图和关系模式(不完整)如下图:实体联系图[关系模式设计]超市(超市名称、经理、地址、电话)部门((a),部门经理、联系电话)员工((b),姓名、联系方式、职位、工资)商品(商品号、商品名称、型号、单价、数量)配给((c),配给时间、配给数量、业务员)
问答题 阅读以下说明和流程图(如图2所示),回答问题1和问题2。
【说明】 本流程图实现从成绩文件生成学生成绩一览表。
某中学某年级的学生成绩数据(分数)登录在成绩文件10中,其记录格式见表2:{{B}} 表2{{/B}}
学号
姓名
课程1成绩
课程2成绩
……
课程6成绩 由该成绩文件生成见表3的学生成绩一览表。生成的学生成绩一览表按学号升序排列。表中的名次是指该生相应课程在年级中的名次。{{B}} 表3{{/B}}
学号
姓名
课程1
课程2
……
课程6
成绩
名次
成绩
名次
……
……
成绩
名次
流程图中的顺序文件F0是学生成绩文件,F0文件经处理1处理后产生顺序文件F,然后经过处理2至处理4对文件F进行处理和更新。在处理5中,仅对文件F的纪录进行学生成绩一览表的编排输出,不进行排序和增加名次等处理。
问答题【说明】已知集合A和B的元素分别用不含头结点的单链表存储,函数Difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},如图(a)所示,运算完成后的结果如图(b)所示。链表结点的结构类型定义如下:typedefstructNode{ ElemTypeelem; structNode*next;}NodeType;【C函数】voidDifference(NodeType**LA,NodeType*LB){ NodeType*pa,*pb,*pre,*q; pre=NULL;{{U}}(1){{/U}}; while(pa){ pb=LB; while({{U}}(2){{/U}}) pb=pb->next; if({{U}}(3){{/U}}){ if(!pre)*LA={{U}}(4){{/U}}; else {{U}}(5){{/U}}=pa->next; q=pa; pa=pa->next;free(q); } else{ {{U}}(6){{/U}};pa=pa->next; } }}
问答题某营销企业拟开发一个销售管理系统,其主要动能描述如下。(1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理,即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理,即将缺货记录单存入缺货记录文件。(2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。(3)根据采购部门提供的进货通知单进行进货处理,即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。(4)根据保留的客户订单进行销售统计,打印统计报表给经理。现采用结构化方法对销售管理系统进行分析与设计,获得如图1所示的顶层数据流图和如图2所示的0层数据流图。图1顶层数据流图图20层数据流图
问答题[说明]下列最短路径算法的具体流程如下:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。该算法的基本思想是:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出n-1条互不构成回路的权值最小边为止。[算法]/*对图定义一种新的表示方法,以一维数组存放图中所有边,并在构建图的存储结构时将它构造为一个“有序表”。以顺序表MSTree返回生成树上各条边。*/typedefstructVertexTypevex1;VertexTypevex2;VRTypeweight;EdgeType;typedefElemTypeEdgeType;typedefstruct//有向网的定义VertexTypevexs[MAX_VERTEX_NUM];//顶点信息EdgeTypeedge[MAX_EDGE_NUM];//边的信息intvexnum,arcnum;//图中顶点的数目和边的数目IELGraph;voidMiniSpanTree_Kruskal(ELGraphG,SqListInitSet(F,G.vexnum);//将森林F初始化为N棵树的集合InitList(MSTree,G.vexnum);//初始化生成树为空树i=0;k=1;while(k<(1))e=G.edge[i];//取第i条权值最小的边/*函数fix_mfset返回边的顶点所在树的树的根代号,如果边的两个顶点所在树的树根相同,则说明它们已落在同一棵树上。*/ri=fix_mfset(F,LocateVex(e.vex1));r2=(2);//返回两个顶点所在树的树根if(r1(3)r2)//选定生成树上第k条边if(Listlnsert(MSTree,k,e)(4);//插入生成树mix_mfset(E,r1,r2);//将两棵树归并为一棵树(5);//继续考察下一条权值最小边DestroySet(F);
问答题【问题1】 转换图中缺少哪三条数据流?请指明每条数据流的名称、起点和终点。
问答题阅读下列说明和流程图2-3,将应填入{{U}} (n) {{/U}}的字句写在答题纸的对应栏内。
【说明】
下面的流程图描述了对8位二进制整数求补的算法。
该算法的计算过程如下:从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然后,对该“1”位左面的更高位(如果有的话),逐位求反,所得的结果就是对原二进制数求补的结果。
例如:对二进制整数10101000求补的结果是01011000。
设8位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的B1T[1]~BIT[8]中。例如,二进制整数10101000存放在数组BIT后,就有BIT[1]=0,BIT[2]=0,…,BIT[7] =0,BIT[8]=1。若流程图中存在空操作,则用NOP表示。
【流程图】
注:流程图中{{U}} (1) {{/U}}处按“循环变量名:循环初值,增量,循环终值”格式描述。
问答题阅读下列说明和C++代码,回答下列问题。[说明]某咖啡店卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。咖啡及配料的种类和价格咖啡价格/杯(¥)配料价格/份(¥)蒸馏咖啡(Espresso)25摩卡(Mocha)10深度烘焙咖啡(DarkRoast)20奶泡(Whip)8[C++代码]#include<iostream>#include<string>usingnamespacestd;consrintESPRESSO_PRICE=25;constintDRAKROAST_PRICE=20;constintMOCHA_PRICE=10;constintWHIP_PRICE=8;classBeverage//饮料______:stringdescription;public:______()returndescription;______;;classCondimentDecorator:publicBeverage//配料protected:______;;classEspresso:publicBeverage//蒸馏咖啡public:Espresso()description="Espresso";intcost()returnESPRESSO_PRICE;;classDarkRoast:publicBeverage//深度烘培咖啡public:DarkRoast()description="DardRoast";intcost()returnDRAKROAST_PRICE;;classMocha:publicCondimentDecorator//摩卡public:Mocha(Beverage*beverage)this->beverage=beverage;stringgetDescription()returnbeverage->getDescription()+",Mocha";intcost()returnMOCHA_PRICE+beverage->cost();;classWhip:publicCondimentDecorator//奶泡public:Whip(Beverage*beverage)this->beverage=beverage;stringgetDescription()returnbeverage->getDescription()+",Whip";intcost()returnWHIP_PRICE+beverage->cost();intmain()Beverage*beverage=newDarkRoast();beverage=newMocha(______);beverage=newWhip(______);cout<<beverage->getDescription()<<"¥"<<beverage->cost()end1;return0;编译运行上述程序,其输出结果为:DarkRoast,Mocha,Whip¥38。
问答题【说明】 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数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; {{U}} (1) {{/U}}; break; case 1:/*LA与LB异号*/ /*比较两者的绝对值大小,结果符号与较大者相同*/ flag={{U}} (2) {{/U}}; if(flag>0){/*LA较大*/ LC[0]=LA[0]; pA=LA; pB=LB; } else if(flag<0){/*LB较大*/ 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指向较小数,不可能出现不够减的情况*/ {{U}} (3) {{/U}}; N=LA[1]>LB[1]?LA[1]:LB[1]; for(i=0;i<N;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({{U}} (4) {{/U}}){/*需要借位,针对减法*/ LC[i+2]+=10; carry--; } }/*for*/ if({{U}} (5) {{/U}}){/*最高进位,针对加法*/ LC[i+2]=carry; i++; } if(LC[i+1]==0)i--;严若最高位为零,针对减法*/ LC[1]=i; return 1; };/*ADD*/
问答题【问题2】
请给出问题1中住宿关系的主键和外键。
问答题【说明】
C++语言本身不提供对数组下标越界的判断。为了解决这一问题,在程序6中定义了相应的类模板,使得对厂任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。
#include<iostream.h>
template <class T> class Array;
template <class T> class ArrayBody {
friend {{U}} (1) {{/U}}
T* tpBody;
int iRows, iColumns, iCurrentRow;
ArrayBody (int iRsz, int iCsz) {
tpBody = {{U}}(2) {{/U}}
iRows = iRsz; iColumns =iCsz; iCurrentRow =-1;
}
public:
T
row_error=column_error=false;
try{
if (iCurrentRow < 0 || iCurrentRow >=iRows)
row_error=true;
if (j < 0 || j >=iColumns)
column_error=true;
if ( row_error==true || column_error == true)
{{U}} (3) {{/U}}
}
catch (char) {
if (row_error==true)
cerr << "行下标越界[" << iCurrentRow << "] ";
if (column_error== true )
cerr << "列下标越界[" <<j << "]";
cout << "/n";
}
return tpBody[iCurrentRow * iColumns +j];
};
~ArrayBody ( ) { delete[] tpBody; }
};
template <class T> class Array {
ArrayBody<T> tBody;
public:
ArrayBody<T>
}
Array (int iRsz, int iCsz) : {{U}}(5) {{/U}}{}
};
void main()
{ Array<int>a1(10,20);
Array<double>a2(3,5);
int b1;
double b2;
b1=a1[-5][10]; //有越界提示:行下标越界[-5]
b1=a1[10][15]; //有越界提示:行下标越界[10]
b1=a1[1][4]; //没有越界提示
b2=a2[2][6]; //有越界提示:列下标越界[6]
b2=s2[10][20]; //有越界提示:行下标越界[10]列下标越界[20]
b2=a2[1][4]; //没有越界提示
}
问答题阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。【说明】在线会议审稿系统(OnlineReviewingSystem,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下:1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置(存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。参与者列表名称说明名称说明User用户Author作者Reviewer审稿人PCChair委员会主席 用例名称列表名称说明名称说明login登录系统register注册submitpaper提交稿件browsereviewresults浏览稿件审阅结果closereviewingprocss关闭审稿过程assignpapertoreviewer分配稿件给审稿人setpreferences设定兴趣领域enterreview审阅稿件给出意见list accepted/rejectedpapers罗列录用或/和拒绝的稿件browse submittedpapers浏览提交的稿件活动名称列表名称说明名称说明selectpaperlocation选择稿件位置uploadpaper上传稿件selectsubjectgroup选择主题类型sendnotification发送通知entertitleandabstract输入标题和摘要 系统的部分用例图和提交稿件的活动图分别见下图。
问答题阅读下列说明以及图3-1和图3-2,回答问题1、问题2和问题3。
[说明] 下面是某公司开发的电梯管理系统,系统功能如下:
1.响应用户召唤指令。当用户需要电梯时可以通过按楼层面板召唤。
2.进入电梯后,乘客可以通过电梯面板选择目的楼层。
3.当电梯到达调度楼层后,判断是否响应停止运行,开启电梯门,完成调度。
4.当电梯到达非调度楼层时,不作响应,继续运行。
5.乘客在电梯中能够知道电梯的运动状态,如运动方向、电梯运行到的楼层等。 6.电梯超载报警。
系统采用面向对象方法进行开发。在开发过程中某设计室设计的电梯管理系统用例如表9-4所示。电梯管理系统用例图如图9-4所示。
{{B}}表9-4
系统用例说明{{/B}}
用例名称
描述
电梯召唤
当用户需要使用电梯时,通过按楼层面板通知电梯管理系统
目的地请求
进入电梯后,乘客可以通过电梯面板选择目的楼层
电梯到达调度楼层
当电梯到达调度楼层后,判断是否响应,如果响应则停止运行,开户电梯门,完成调度,否则继续运行
电梯到达非调度楼层
当电梯到达非调度楼层时,不作响应,继续运行
电梯就绪
电梯不处于忙状态,但符合运行要求,随时可以召唤
电梯超载
电梯所载重量超过额定载荷,给出报警信号,停止运行
电梯不超载
电梯所载重量没有超过额定载荷,可以正常运行
根据说明,回答下面问题: