问答题[问题1]
试将[算法2-1)和[算法2-2]中(1)~(7)处补充完整。
[问题2]
从下面的选项中选择相应的判断逻辑填补[算法2-2]中的“判断条件1”至“判断条件 3”。注意,若“判断条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。
(a)字符是括号(b)字符是左括号(c)字符是右括号(d)栈空(e)栈不空
(f)栈顶元素表示的是与当前字符匹配的左括号
(g)栈顶元素表示的是与当前字符匹配的右括号
问答题【问题4】
加工1(录入比对处理)除能够检查出初录数据和复录数据不一致外,还应当检测出下列哪些错误。
①输入的无效字符 ②输入的半个汉字 ③显示器无法显示
④初录员重复录入同一账户 ⑤汇总数据与会计账目不符 ⑥打印机卡纸
问答题【程序说明】
定义一个多边形结构:struct polygon实现以下内容:(1)建立该结构的链表:create函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为0时,链表创建结束。(3)编写一个函数disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。
【程序】
#include "iomanip.h"
struct polygon
{
int n;
int* x;
int *y;
polygon * next;
};
void Push(polygon * & head,int n)
{
polygon * newNOde=newpolygon;
newNOde=newpo,Ygon;
newNOde->next={{U}} (1) {{/U}};
newNOde->x=new int [n];
newNOde->y=new int[n];
newNOde->n={{U}} (2) {{/U}};
for(int i=0;i<={{U}} (3) {{/U}};i++){
cout<<“请输入多边形各顶点x、y坐标,坐标值之间用空格分隔:”;
cin>>newNOde->x[i]>>newNOde->y[i];
}
{{U}} (4) {{/U}}=head; //在head前不需要额外的。
head=newNOde;
}
polygon * create()
{
polygon * head=NULL;
polygon * tail;
int n;
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
if(n==0)return{{U}} (5) {{/U}};
Push(head,{{U}} (6) {{/U}};
tail=head;
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
while(n!=0)
{
Push(tail->next,{{U}} (7) {{/U}}; //在tail->next增加结点
tail =tail->next; //advance tail to point to last node
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
}
return head;
}
void disp(polygon * head)
{
int i,No=1;
cout<<setw(10)<<"x" <<setw(6)<<"y"<<end1;
while(head!=NULL)
{
cout<<“第” <<No<<“结点:” <<end1;
for(i=0;i<=head->n-1;i++)
cout<<setw(10)<<head- >x[i]<<setw(6)<<head- >y[i]<<endl;
{{U}} (8) {{/U}};
head={{U}} (9) {{/U}};
}//Match while statement
}
void del(polygon * head)
{
polygon * p;
while(head!=NULL)
{
p={{U}} (10) {{/U}};
head=head->next;
delete p->x;
delete P->y;
deletep;
}//Match while statement
}
void main()
{
polygon * head;
head=create();
disp(head);
del(head);
}
问答题阅读以下技术说明,根据要求回答下列问题。[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器等,其示意图见图8-18。2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到如表8-8所示的类/用例/状态列表,如图8-19所示的用例图,如图8-20所示的初始类图以及如图8-21所示的描述入口自动栏杆行为的UML状态图。表8-8类/用例/状态列表用户名说明类名说明状态名说明Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离开停车场PaymentMachine付款机器Disable没有车位ReportStatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏
问答题[说明]在数据链路层扩展局域网时使用网桥。网桥工作在数据链路层,它根据MAC帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的MAC地址,然后确认将该帧转发到哪个端口。最简单的网桥有两个端口(即接口)。网桥的每个端口与一个网段相连。每当收到一个帧时,通过查找转发表将收到的帧转发。当一个网桥刚刚连接到局域网上时,其转发表是空的,此时若收到一个帧,按照以下算法处理和建立自己的转发表:(1)从端口x收到的无差错的帧(如有差错即丢弃),在转发表中查找目的站MAC地址;(2)如有,则查找出到此MAC地址应走的端口d,然后进行(3),否则转到(5);(3)如到这个MAC地址去的端口d=x,则丢弃此帧(因为这表示不需要经网桥进行转发),否则从端口d转发此帧;(4)转到(6);(5)向网桥除x以外的所有端口转发此帧(这样做可以保证找到目的站);(6)如源站不在转发表中,则将源站MAC地址加入转发表,登记该帧进入网桥的端口号,设置计时器,然后转到(8),如源站在转发表中,则执行(7);(7)更新计时器;(8)等待新的数据帧,转到(1)。这时,网桥就在转发表中登记以下三个信息:站地址——登记收到帧的源MAC地址、端口——登记收到的帧进入该网桥的端口号、时间——登记收到的帧进入该网桥的时间。现有五个工作站分别连接在三个局域网上,并且用两个网桥连接起来,如图3-1。每一个网桥的两个端口号都标明在图上。在一开始,两个网桥中的转发表都是空的。以后有以下各站向其他的站发送了数据帧,即H1发送给H5,H3发送给H2,H4发送给H3,H2发送给H1。[图3-1]
问答题
阅读下列说明和数据流图,回答问题1至问题3, [说明]
考务处理系统具有如下功能: (1)对考生送来的报名单进行检查。
(2)对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷。
(3)对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者。
(4)制作考生通知单送给考生。 (5)
进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表。
以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第l层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。
[图1-1]
[图1-2]
[图1-3]
[数据字典]
报名单=地区+序号+姓名+性别+年龄+文化程度+职业+考试级别+通信地址 正式报名单=报名单+准考证号
准考证=地区+序号+姓名+准考证号+考试级别 考生名单={准考证号+考试级别}
统计分析表=分类统计表+难度分析表 考生通知单=考试级别+准考证号+姓名+合格标志+通信地址
问答题【问题2】 (1)[说明]中的几个关系仍无法实现甲公司的要求,为什么? (2)需要在哪个关系中增加什么数据项才能实现这个要求?
问答题阅读下列函数说明和C代码,填入{{U}}(n){{/U}}处字句,并回答相应问题。[说明]背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limitweight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为图11-4。仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。[流程图11-4][程序说明]structThing:物品结构typedefstructBag:背包结构类型input():将物品按序号依次存入数组函数inbag():物品按物价比入包函数init():初始化函数sort():对物品按价格重量比排序函数outbag():取出包中weiht最大的物品函数print():最佳方案输出函数[C程序]#defineN255structThing{doubleweight;doublevalue;doubledens;}thing[N];typedefstmctBag{Thingthing[N];doubleweighttmp;doublesumvalue;}bag,best;inbag(){do{bag.thing[i]=thing[i]{{U}}(1){{/U}}{{U}}(2){{/U}}i++;}while({{U}}(3){{/U}})}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();do{best=bag;//把包中物品放入暂存数组outbag();//取出包中weight最大的物品{{U}}(4){{/U}}}while({{U}}(5){{/U}})print(best);//输出temp因为是最佳方案}
问答题[问题3](3分)
电子商务公司的主营业务是销售各类家电,对账户有余额的客户,还可以联合第三方基金公司提供理财服务,为此设立客户经理岗位。客户通过电子商务公司的客户经理和基金公司的基金经理进行理财。每名客户只由一名客户经理和一名基金经理负责,客户经理和基金经理均可负责多名客户。请根据该要求,对图2-1进行修改,画出修改后的实体间联系和联系的类型。
问答题[问题2] 根据说明结合问题1的解答,指出在该系统的顶层数据流图中应有哪些数据流。请采用说明中的词汇给出这些数据流的起点、终点以及数据流名称,下表给出了数据流的部分信息,请填充空缺处。
序号
起点
终点
数据流名称
1
{{U}}(1) {{/U}}
网上作业提交与管理系统
申业申请
2
{{U}}(2){{/U}}
网上作业提交与管理系统
提交的作业
3
网上作业提交与管理系统
{{U}}(3){{/U}}
需完成的作业
4
网上作业提交与管珲系统
{{U}}(4){{/U}}
{{U}}(5){{/U}}
5
网上作业提交与管理系统
{{U}}(6){{/U}}
作业申请
6
网上作业提交与管理系统
{{U}}(7){{/U}}
{{U}}(8){{/U}}
7
{{U}}(9){{/U}}
网上作业提交与管理系统
选课学生名单
8
{{U}}(10){{/U}}
网上作业提交与管理系统
{{U}}(11){{/U}}
9
{{U}}(12){{/U}}
网上作业提交与管理系统
账号和密码
10
{{U}}(13){{/U}}
网上作业提交与管理系统
账号和密码
问答题【说明】某公司要开发一个销售管理系统,该系统的主要功能是:处理客户和销售员送来的订单;工厂是根据订货安排生产的,交出货物同时开出发票,收到客户付款后,根据发票存根进行应收款处理。每张订单由订单号,若干头信息和订单细节组成。一张订单可定购多种产品,工厂对大宗订货给予优惠。每种产品都规定了不同订货数量的折扣。根据—上述要求公司的销售部王经理写下了以卜数据表结构:客户:(客户号,客户名,地址,电话)订单:(订单号,客户号,产品号,订货数,订货日期,交货日期,金额)应收账款:(客户号,订单号,发票号,应收金额,支付日期,支付金额,当前余额)产品描述:(产品号,产品名,单价,重量)折扣规则:(产品号,订货量,折扣)1.【问题1】上表中带下划线的为主码。请为还没有确定主码或是主码不合理的数据表选定最合适的主码。
问答题某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。咖啡及配料的种类和价格表咖啡价格/杯配料价格/份蒸馏咖啡(Espresso)25摩卡(Mocha)10深度烘焙咖啡(DarkRoast)20奶泡(Whip)8现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。用类图[Java代码]importjava.util.*;{{U}}{{U}}{{/U}}{{/U}}classBeverage{//饮料Stringdescription="UnknownBeverage";public{{U}}{{U}}{{/U}}{{/U}}(){returndescription;)public{{U}}{{U}}{{/U}}{{/U}};}abstractclassCondimentDecoratorextendsBeverage{//配料{{U}}{{U}}{{/U}}{{/U}};}classEspressoextendsBeverage;//蒸馏咖啡privatefinalintESPRESSO_PRICE=25;publicEspress0(){description="Espresso";}publicintcost()(returnESPRESSO_PRICE;}}classDarkRoastextendsBeverage{//深度烘焙咖啡privatefinalintDARKROASTPRICE=20;publicDarkRoast0{description="DarkRoast";}publicintcost(){returnDARKROASTPRICE;}}classMochaextendsCondimentDecorator{//摩卡privatefinalintMOCHAPRICE=10;publicMocha(Beveragebeverage){this.beverage=beverage;}publicStringgetDescription(){returnbeverage.getDescription0+",Mocha";}publicintcost()(returnMOCHA_PRICE+beverage.cost();}}classWhipextendscondimentDecorator{//奶泡privatefinalintWHIPPRICE=8;publicWhip(Beveragebeverage){this.beverage=beverage;}publicStringgetDescription(){returnbeverage.getDescription()+",Whip";}publicintcost()(returnWHIP_PRICE+beverage.cost();}}publicclassCoffee{publicstaticvoidmain(Stringargs[]){Beveragebeverage=newDarkRoast();beverage=newMocha{{U}}{{U}}{{/U}}{{/U}};beverage=newWhip{{U}}{{U}}{{/U}}{{/U}};System.out.println(beverage.getDescription0+"¥"+beverage.cost());}}编译运行上述程序,其输出结果为:DarkRoast,Mocha,Whip¥38
问答题[说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(singleton)模式。但在多线程情况下,singleton模式有可能出现问题,需要进行同步检查。如果对“检查singleton对象是否已经创建”进行同步,则存在严重的瓶颈,所有的线程都必须等待检查对象是否存在。解决方式是一种称为Double-Checked-Locking模式,其意图是将非必须的锁定优化掉,同步检查最多只发生一次,因此不会成为瓶颈。以下是C++语言实现,能够正确编译通过。 [C++代码] class USTax ______: USTax( ) ; //构造函数 public: static USTax* getInstance(); private: static USTax* instance; ; ______ = NULL; USTax* USTax∷getInstance() if (instance == NULL) //进行某种同步 cout<<"实例暂时不存在"<<endl; if(______) cout<<"实例不存在,创建实例... "<<endl; instance = ______; cout <<"实例创建成功 "<<endl; else cout <<"实例已被创建了"<<endl; else cout<<"实例已经存在" <<endl; return ______;
问答题【说明】 某公司要开发一个销售管理系统,该系统的主要功能是:处理客户和销售员送来的订单;工厂是根据订货安排生产的,交出货物同时开出发票,收到客户付款后,根据发票存根进行应收款处理。每张订单由订单号,若干头信息和订单细节组成。一张订单可定购多种产品,工厂对大宗订货给予优惠。每种产品都规定了不同订货数量的折扣。 根据上述要求公司的销售部王经理写下了以下数据表结构: 客户:(客户号,客户名,地址,电话) 订单:(订单号,客户号,产品号,订货数,订货日期,交货日期,金额) 应收账款:(客户号,订单号,发票号,应收金额,支付日期,支付金额,当前余额) 产品描述:(产品号,产品名,单价,重量) 折扣规则:(产品号,订货量,折扣)
问答题问题:2.3 (3分)
【关系模式设计】中的“客房”关系模式是否存在规范性问题,请用100字以内文字解释你的观点(若存在问题,应说明如何修改“客房”关系模式)。
问答题现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图所示。采用该设计模式的原因在于:系统解析BMP、GIF与/PEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。[C++代码]classMatrix{//各种格式的文件最终都被转化为像素矩阵┇//此处代码省略};classImageImp{public;virtualvoiddoPaint(Matrixm)=0;//显示像素矩阵m};classWinImp:publicImageImp{public;voiddoPaint(Matrixm){/*调用Windows系统的绘制函数绘制像素矩阵*/)};classLinuxImp:publicImageImp{public;voiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/)};classImage{public:voidsetImp(ImageImp*imp){{{U}}{{U}}{{/U}}{{/U}}=imp;}virtualvoidparseFile(stringfileName)=0;protected:{{U}}{{U}}{{/U}}{{/U}}*imp;};classBMP:publicImage{public:voidparseFile(stringfileName){//此处解析BMP文件并获得一个像素矩阵对象m{{U}}{{U}}{{/U}}{{/U}};//显示像素矩阵m}};classGIF:publicImage{//此处代码省略};classJPEG:publicImage{//此处代码省略};voidmain(){//在windows操作系统上查看demo.bmp图像文件Image*imagel={{U}}{{U}}{{/U}}{{/U}};ImageImp*imageImpl={{U}}{{U}}{{/U}}{{/U}};{{U}}{{U}}{{/U}}{{/U}};image1->parseFile("demo.bmp");}现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix,若采用桥接设计模式则至少需要设计{{U}}{{U}}{{/U}}{{/U}}个类。
问答题[说明] 目前大多数操作系统都采用虚拟存储技术,这样可在较小的可用内存中执行较大的用户程序,可在内存中容纳更多程序并发执行。 引入虚拟存储技术,其基本思想是利用大容量的外存来扩充内存,产生一个比有限的实际空间大得多、逻辑的虚拟内存空间,以便能够有效地支持多道程序系统的实现和大型程序运行的需要,从而增强系统的处理能力。 虚拟存储技术主要分为虚拟页式存储管理和虚拟段式存储管理。 虚拟页式存储管理中,在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面之后根据进程运行的需要,动态装入其他页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。在简单页式存储管理的基础上,增加请求调页和页面置换功能。 使用虚拟页式存储管理时需要在页表中增加以下内容:页号、驻留号、内存块号、外存地址、访问位、修改位。其中,驻留位,又称中断位,表示该页是在内存还是在外存;访问位表示该页在内存期间是否被访问过;修改位表示该页在内存中是否被修改过。访问位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定。
问答题阅读以下某门禁控制系统的技术说明,根据要求回答问题1~问题3。
[说明]
门禁系统是楼宇安防系统的重要组成部分,也是大厦智能化管理的体现。其工作过程是,如果在入口处的读卡器上刷卡,锁控器(LockController)接收读卡器(FingerReader)的读卡信息并进一步识别,如果为有效卡,则触发控制电控锁(Lock)的继电器,让持卡人通过。锁控器还会将这些读卡及进出事件存储起来,并将相关事件记录传送给上位机。每个锁控器管理1~4个门,每5~8个锁控器接入1条RS-485总线,并转换成RS-232方式与管理主机的串行口。对锁控器进行相关设置后,允许它脱机独立对门禁点进行控制,管理主机或通信线路故障都不会影响它的正常运行。在普通场合通常会设置1个出门按钮,允许已进入的人员按动此按钮以打开电控锁;而对于一些重要场合通常会在门的内外安装两个读卡器,进出门时都需按预设方式进行刷卡。
门禁系统中的每个电控锁都有一个唯一的编号。锁的状态有两种:“已锁住”和“未锁住”。在管理主机上可以设置每把锁的安全级别及用户的开锁权限。只有当用户的开锁权限大于或等于锁的安全级别并且锁处于“已锁住”状态时,才能将锁打开。用户的感应卡信息、开锁权限及锁的安全级别都保存在管理主机的数据库中。表2-19给出了门禁系统主要组成部件的作用。
{{B}}表2-19 感应门禁系统主要组成部件及其作用表{{/B}}
{{B}}部件名称{{/B}}
{{B}}主要作用(功能){{/B}}
读卡感应器(FingerReader)
通过射频感应原理,识别感应卡内置加密卡号
锁控器(LockController)
存储感应卡权限和刷卡记录,向管理软件上传读卡器送来的信号,并负责和上位机通讯和其他数据存储器协调
电控锁(Lock)
电动执行机构
主机管理软件(Win-Pak Software)
通过计算机对所有单元进行中央管理和监控,进行相应的时钟、授权、统计管理工作
RS-485/232信号转换器
对所有数据存储器进行联网和远距离通信
门禁电源
提供系统工作时所需的电源能量
感应卡
存储用户的不可复制和解密的ID号
开门按钮
出门时可以设置为按此按钮出门(可选部件)
软件开发公司A承担了该门禁控制系统的开发任务,其开发小组采用根据问题领域的模型建立系统结构的面向对象方法完成该系统的设计,系统中的类及类之间的关系用UML类图表示。
问答题[问题1] 画出该问题的风险决策树,你会选择玩哪个游戏?
问答题【说明】请设计一个图书馆数据库,此数据库中对每个借阅者保存的读者记录包括:读者号、姓名、地址、性别、年龄、单位。对每本书存有:书号、书名、作者、出版社。对每本书被借出的书存有读者号、借出日期和应还日期。【问题1】给出E-R图【问题2】转换成关系模型【问题3】给其中任何一个表用SQL语句建表。