← 目录51CTO 讲义

案例分析

51CTO 软考题库 · 共 111 题(单选 1 + 问答 110)


1. 在一条笔直公路的一边有许多房子,现要安装消防栓,每个消防栓的覆盖范围远大于房子的面积,如下图所示。现求解能覆盖所有房子的最少消防栓数和安装方案(问题求解过程中,可将房子和消防栓均视为直线上的点)。 该问题求解算法的基本思路为:从左端的第一栋房子开始,在其右侧m米处安装一个消防栓,去掉被该消防栓覆盖的所有房子。在剩余的房子中重复上述操作,直到所有房子被覆盖。算法采用的设计策略为(请作答此空);对应的时间复杂度为( )。 图片 假设公路起点A的坐标为0,消防栓的覆盖范围(半径)为20米,10栋房子的坐标为(10,20,,30,35,60,80,160,210,260,300),单位为米。根据上述算法,共需要安装( )个消防栓。以下关于该求解算法的叙述中,正确的是( )。

答案:C

解析:

(一)对于第一空,本题使用的是贪心法。 1、分治法特征:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 2、动态规划法:在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解。本题情景没有列出所有的可能解进行筛选,因此,本题不属于动态规划法。 3、回溯法:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。这种走不通就退回再走的技术就是回溯法。本题情景没有探索和回退的过程,因此,本题不属于回溯法。 4、贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不必为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。

由于本题的算法过程,是依次与各个房子进行判断,当所有房子都被比较之后,则问题结束,因此时间复杂度与房子的个数相关,本问题的时间复杂度应该趋于现象,为O(n)。

对于第三空,关于对应序列(10,20,30,35,60,80,160,210,260,300) 第一轮放置:在第一座房子x=10的右侧20米处安装一个消防栓,可以覆盖10,20,30,35这4栋房子; 2、第二轮放置:去掉前4栋房子,在第5栋房子x=60的右侧20米处安装一个消防栓,可以覆盖60、80这2栋房子; 3、第三轮放置:去掉前面已覆盖的房子,在第7栋房子x=160的右侧20米处安装一个消防栓,只可以覆盖160这一栋房子; 4、第四轮放置:去掉前面已覆盖的房子,在第8栋房子x=210的右侧20米处安装一个消防栓,可以覆盖210这一栋房子 第五轮放置:去掉前面已覆盖的房子,在第9栋房子x=260的右侧20米处安装一个消防栓,可以覆盖260、300这2栋房子; 房子全部覆盖完毕,因此共需安装5个消防栓。

对于第四空,对于得到一个最优解是动态规划的特点,可以得到问题所有的最优解,是回溯法的特征,可以排除A、B选项。选择C 。有些实例,可能得不到最优解。

单选题


2. 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。 【说明】 某网课教育平台欲添加在线作业批改系统,以实现高效的作业提交与批改,并进行统计。学生和讲师的基本信息已经初始化为数据库中的学生表和讲师表。系统的主要功能如下: (1)提交作业。验证学生标识后,学生将电子作业通过在线的方式提交,并进行存储。系统给学生发送通知表明提交成功,通知中包含唯一编号;并通知讲师有作业提交。 (2)下载未批改作业。验证讲师标识后,讲师从系统中下载学生提交的作业。下载的作业将显示在屏幕上。 (3)批改作业。讲师按格式为每个题目进行批改打分,并进行整体评价。 (4)上传批改后的作业。将批改后的作业(包括分数和评价)返回给系统,进行存储。 (5)记录分数和评价。将批改后的作业的分数和评价记录在学生信息中,并通知学生作业已批改。 (6)获取已批改作业。根据学生标识,给学生查看批改后的作业,包括提交的作业、分数和评价。 (7)作业抽检。根据教务人员标识抽取批改后的作业样本,给出抽检意见,然后形成抽检报告给讲师。 现采用结构化方法对在线作业批改系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 【问题1】(3分) 使用说明中的词语,给出图1-1中的实体E1~E3的名称。 【问题2】(4分)使用说明中的词语,给出图1-2中的数据存储D1~D4的名称。 【问题3】(6分)根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。 【问题4】(2分)若发送给学生和讲师的通知是通过第三方Email系统进行的,则需要对图1-1和图1-2进行哪些修改?用100字以内文字加以说明。 图片 图片

参考答案:

【问题1】(3分) 答案:E1:学生 E2:讲师 E3:教务人员

【问题2】(4分) 答案:D1:提交的作业表 D2:学生表 D3:讲师表 D4:批改后的作业表

【问题3】(6分) 答案: 图片

【问题4】(2分) 答案: 增加外部实体“第三方Email系统”,将原来的两条“通知”数据流合并为一条“通知”数据流,终点为“第三方Email系统”。

解析(AI 生成):

上下文图中E1学生、E2讲师、E3教务人员;0层图数据存储按信息类别命名:提交的作业表、学生表、讲师表、批改后的作业表。补数据流须按加工输入输出配平;问题4增加第三方Email系统,两条通知合并为一条指向它。

问答题


3. 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某公司拟研制一款高空监视无人直升机,该无人机采用遥控一自主复合型控制实现垂直升降。该直升机飞行控制系统由机上部分和地面部分组成,机上部分主要包括无线电传输设备、飞控计算机、导航设备等,地面部分包括遥控操纵设备、无线电传输设备以及地面综合控制计算机等。其主要工作原理是地面综合控制计算机负责发送相应指令,飞控计算机按照预定程序实现相应功能。经过需求分析,对该无人直升机控制系统纵向控制基本功能整理如下: (a)飞控计算机加电后,应完成系统初始化,飞机进入准备起飞状态; (b)在准备起飞状态中等待地面综合控制计算机发送起飞指令,飞控计算机接收到起飞指令后,进入垂直起飞状态; (c)垂直起飞过程中如果飞控计算机发现飞机飞行异常,飞行控制系统应转入无线电遥控飞行状态,地面综合控制计算机发送遥控指令; (d)垂直起飞达到预定起飞高度后,飞机应进入高度保持状态; (e)飞控计算机在收到地面综合控制计算机发送的目标高度后,飞机应进入垂直升降状态,接近目标高度;垂直升降过程中出现飞机飞行异常,控制系统应转入无线电遥控飞行; (f)飞机到达目标高度后,应进入高度保持状态,完成相应的任务; (g)飞机在接到地面综合控制计算机发送的任务执行结束指令后,进入飞机降落状态; (h)飞机降落过程中如果出现飞机飞行异常,控制系统应转入无线电遥控飞行; (i)飞机降落到指定着陆高度后,进入飞机着陆状态,应按照预定着陆算法,进行着陆; (j)无线电遥控飞行中,地面综合控制计算机发送着陆指令,飞机进入着陆状态,应按照预定着陆算法,进行着陆。 【问题1】(1分) 状态图和活动图是软件系统设计建模中常用的两种手段,请简述二者的区别。 【问题2】(5分) 根据题干中描述的基本功能需求,架构师王工通过对需求的分析和总结给出了无人直升机控制系统纵向控制状态图(如下图)。请根据题干描述,提炼出相应状态及条件,并完善下图所示状态图中的(1)~(5)。 图片 【问题3】(9分) 根据题目中描述的基本功能需求,架构师王工给出了无人直升机控制系统纵向控制的顶层活动图(如下图)。请根据题干描述,完善下图活动图中的(1)~(9)。 图片

参考答案:

【问题1】 活动图主要描述行为的动作。 状态图主要描述行为的结果。 【问题2】 (1)垂直起飞状态 (2)飞机飞行异常 (3)高度保持状态 (4)垂直升降状态 (5)无线遥控飞行状态 【问题3】 (1)地面综合控制计算机 (2)下传起飞就绪信息 (3)垂直起飞 (4)高度保持 (5)发送目标高度 (6)垂直升降 (7)发送任务结束指令 (8)飞机降落 (9)无线电遥控飞行

解析(AI 生成):

活动图侧重动作与流程控制,状态图侧重事件驱动下状态迁移的结果。按说明顺序可定出垂直起飞、飞机飞行异常、高度保持、垂直升降、无线电遥控飞行等状态;补全时依据迁移写出触发事件与动作,如发送目标高度、发送任务结束指令、按着陆算法着陆。

问答题


4. 阅读以下说明和C程序,将应填入  (n) 处的字句写在答题纸的应栏内。 假设需要将N个任务分配给N个工人同时去完成,每个人都能承担着N个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配1个不同的任务。 程序中,N个任务从0开始依次编号,N个工人也从0开始依次编号,主要的变量说明如下: C[i][j]:将任务i分配给工人i的费用;  Task[i]:值为0表示任务i未分配。值为j表示任务i分配给工人j。 Worker[k]:值为0表示工人k未分配任务,值为1表示工人k已分配任务。 mincost:最小总费用。  [C程序]  #Include<stdio.h>  #Define N 8     /*N 表示任务数和工人数*/ int c[N][N];  unsigned int mincost = 65535 /*设置的初始值,大于可能的费用*/   int task[N],temp[N],worker[N];  void plan(int k,unsigned int cost) { int i;  If(     (1)    &&cost<mincost){  mincost = cost;  for(i=0;i<N;i++)  temp[i]=task[i];  }  else{   for(i=0;i<N;i++)         /*分配任务 k*/        if(worker[i]==0 &&    (2)    ){       worker[i]=1;task[k]=   (3)    ;  plan(   (4)    ,cost+c[k][i];  (5) ; task[k] = 0;     }/*if*/     } }/*Plan/*/  Void main() { int i,j;  for(i=o;i<N;i++){//*设置每个人任务由不同工人承担时的费用及全局数组的初值/*worker[i]=0;task[i]=0;temp[i]=0;  for(j=0;j<n;j++) scanf(“%d”,&c[i][j]);  }  plan(0.0);              /*从任务0开始分配*/ printf(“\n 最小费用=%d\n”,mincost); for (i = 0; i < N; i ++) printf (“Task%d is assigned to Worker%d\n”,i,temp[ i ]); }/main/

参考答案:

(1) k>=N或k==N (2) cost+c[k][i]<mincost ⑶i (4) k+1 (5) worker[i] =0

解析:

可以用下面代码进行测试:

#include<stdio.h>

#define N 8 int c[N][N] = {{2,3,1,4,5,2,3,6},{4,1,7,4,3,5,6,4},{4,1,2,2,3,4,6,7},{5,4,3,1,5,3,2,1},{2,3,4,5,6,3,2,1},{1,1,2,2,3,4,5,5},{4,3,6,2,7,1,1,2},{2,2,3,1,1,4,3,6}};

int mincost=65535;

int task[N],temp[N],worker[N];

void plan(int k,unsigned int cost) { int i; if(k == N && cost < mincost) { mincost=cost; for(i=0;i<N;i++) temp[i]=task[i]; }else{ for(i=0;i<N;i++) { if(worker[i]==0 && (cost+c[k][i]) < mincost){

			worker[i]=1;
			task[k]=i;

			plan(k+1,cost+c[k][i]);

			worker[i] =0;
			task[k]=0;

		}
	}

} }

void main(){

int i,j;
// for(i=0;i<N;i++){
// 	worker[i]=0;task[i]=0;temp[i]=0;
// 	for(j=0;j<N;j++)
// 		scanf("%d",&c[i][j]);
// }

plan(0,0);
printf("\n 最小费用=%d\n",mincost);
for(i = 0; i < N; i++)
{
	printf ("Task%d is assigned to Worker%d\n",i,temp[i]);
}

}

问答题


5. 阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图5-1所示。 图片 现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图5-2所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图5-1中的甜点菜单。类MenuItem表示菜单中的菜式。 图片 java代码: 图片 图片 图片

参考答案:

(1) abstract class或public abstract class (2) public abstract void add (MenuComponent menuComponent) 或abstract void add (MenuComponent menuComponent) 或protected abstract void add (MenuComponent menuComponent) (3) add (menuComponent) (4) menuComponent.print () (5) allMenus.print ()

解析(AI 生成):

组合模式中MenuComponent为抽象类,add声明为抽象方法由子类实现;Menu内部保存子菜单列表,print遍历调用menuComponent.print();客户端统一调用allMenus.print(),对调用者透明。

问答题


6. 阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 【程序4.1说明】 "背包问题"的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,...,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。 如下程序均能求得"背包问题"的一组解,其中程序4.1是"背包问题"的递归解法,而程序4.2是"背包问题"的非递归解法。 【程序4.1】 #include<stdio.h> #define N 7 #define S 15 int w[N+1]={0,1,4,3,4,5,2,7}; int knap(int s,int n) { if(s==0)return 1; if (s<0||(s>0& &n<1))return 0; if( (1) )){ printf(″%4d″,w[n]);return 1; }return (2) ; } main(){ if( knap(S,N))printf(″OK!\n″); else printf(″N0!\n″); } 【程序4.2】 #include<stdio.h> #define N 7 #define S 15 typedef struct { int s; int n: int job; } KNAPTP; int w[N+1]={0,1,4,3,4,5,2,7}; int knap (int s,int n); main( ) { if (knap (S,N)) printf (″OK!\n″); else printf (″NO!\n″);} int knap (int s,int n) { KNAPTP stack[100],x; int top,k,rep; x.s=s;x.n=n; x.job=0; top=l;stack[top]=x; k=0; while( (3) ) { x=stack [ top ]; rep=1; while ( !k && rep ) { if (x.s==0)k=1;/已求得一组解/ else if (x.s<0 || x.n <=0)rep=0; else{x.s= (4) ;x.job=1; (5) =x; } } if(!k){ rep=1; while(top>=1&&rep){ x=stack[top--]; if(x.job==1){ x.s+=w[x.n+1]; x.job=2; stack[++top]=x; (6) ; } } } } if(k){/输出一组解/ while(top>=1){ x=stack[top--]; if(x.job==1) printf(″%d\t″,w[x.n+1]); } } return k; }

参考答案:

(1)knap(s-w[n],n-1)(2)knap(s,n-1)(3)top>=1 && !k 或 top>0 && k == 0 (4)x.s - w [x.n--](5)stack[++top](6)rep = 0

解析:

试题提供了两种解决问题的方法,程序4.1是用递归的方法来解决背包问题,程序4.2使用非递归的方法来解决背包问题。每次选择一个物品放入背包,那么剩余的物品和背包剩余的重量,又构成一个"背包问题"。程序从数组下标最大的物品开始考查,因此(1)处应该填"knap(s-w[n],n-1)",即将数组中第N个物品放入背包,如果它能够放入到背包中,则该物品是构成解的元素之一;否则,将该物品从背包中取出,该物品不构成解的元素,在以后的考查中,它可以被排除,因此(2)处应该填"knap(s,n-1)"。在此程序中用栈来保存已经考查过的物品,结构KNAPTP表示经过考查的物品,s表示考查过该物品后背包所能够盛放的物品的重量;n表示该物品在数组W中的下标;job表示物品当前的状态:当job等于1,表示物品n可以放入背包;job等于2表示物品n不能被放入到背包,那么在以后的选取中将不再考虑该物品。初始时job等于0,表示背包中没有任何放入任何物品。K为有解的标志。Rep为一个标志变量,rep等于0,表示结束当前的动作;rep等于1表示继续进行当前的动作。当栈顶物品不能放入背包时,将rep设置为0,表示下一步不从数组w中取物品。其初值为1。开始时,将数组中下标最大的物品放入栈中,然后开始考查该物品。该物品满足放入背包的条件,第(4)(5)空将完成将物品放入背包的操作,因此(4)空填"x.s-w[x.n--]",修改背包的可容纳物品的重量;(5)处填"stack[++top]",将下一个要考查的物品放入栈中。若该物品不满足放入背包的条件,则将该物品从背包中取出,因此将rep置为0,结束循环while(!k&&rep)。将物品从背包中取出,即释放该物品在背包中所占的重量,并标记为不能放入到背包(job=2),再将其放入到栈中;然后继续考查数组w中的下一个物品,因此需要结束循环while(top>=1&&rep),将rep置为0,所以第(6)处应该填"rep=0"。在第三处要求给出循环结束的条件,即可以继续选取物品的条件,在此处填"top>=1&&!k"。

问答题


7. 阅读以下说明和Java程序,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。 【说明】 以下Java代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图5-1所示,包括:乐器Instrument)、打击乐器(Percussion)、弦乐器(Stringed)、管乐器(Wind)、木管乐器(Woodwind)、铜管乐器(Brass)。 图片 【Java代码】 import java.util.ArrayList; enum Note{/枚举各种音调/ MIDDLE_C,C_SHARP,B_FLAT; //其它略 } abstract class Instrument{/乐器/ (1); //play方法 abstract void adjust( ) //adjust抽象方法 图片 图片

参考答案:

1.abstract void play(Note n) 2. extends Instrument 3. extends Wind 4. ArrayList 5. Music 图片

解析(AI 生成):

抽象类Instrument中声明abstract void play(Note n),具体乐器extends继承它,木管再继承Wind;Music用ArrayList保存乐器集合,实现面向抽象统一调用。

问答题


8. 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。 [说明] 学校欲开发一学生跟踪系统, 以更自动化、更全面地对学生在校情况(到课情况和健康状态等相关信息)进行管理和追踪,使家长能及时了解子女的到课情况和健康状态,并在有健康问题时及时与医护机构对接。该系统的主要功能是: (1)采集学生状态。通过学生卡传感器,采集学生心率、体温(摄氏度)等健康指标及其所在位置等信息并记录。每张学生卡有唯一的标识 (ID) 与一个学生对应。 (2)健康状态告警。在学生健康状态出现问题时,系统向班主任、家长和医护机构健康服务系统发出健康状态警告,由医护机构健康服务系统通知相关医生进行处理。 (3) 到课检查。综合比对学生状态、课表以及所处校园场所之间的信息对学生到课情况进行判定。对旷课学生,向其家长和班主任发送旷课警告。 (4)在校情况汇总。定期汇总在校情况,并将报告发送给家长和班主任。 (5)家长注册。家长注册使用该系统,指定自己子女,经学校管理人员审核后,向家长发送注册结果。 (6)基础信息管理。学校管理人员对学生及其所用学生卡和班主任、课表(班级、上课时间及场所等)、校园场所(名称和所在位置区域)等基础信息进行管理,对家长注册申请进行审核,将家长ID加入学生信息记录中使家长与其子女进行关联,一个学生至少有一个家长,可以有多个家长。课表信息包括班级、班主任、时间和位置等。 现采用结构化方法对学生跟踪系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 [问题1] (5分) 使用说明中的词语,给出图1-1中的实体E1E5的名称。 [问题2] (4分) 使用说明中的词语,给出图1-2中的数据存储D1D4的名称。 [问题3] (3分) 根据说明和图中术语,补充图1-2 中缺失的数据流及其起点和终点(三条即可)。 [问题4] (3分) 根据说明中术语,说明图1-1 中数据流“学生状态”和“学生信息”的组成。

参考答案:

1、E1:学生,E2:学校管理人员,E3:班主任,E4:家长,E5:医护机构。 2、D1:学生状态信息,D2:学生信息,D3:校园场所信息,D4:课表。 3、D4→P3 课表;D3→P3 校园场所;P6→D2 注册信息。 4、要满足上述系统需求,并有有效管理查询数据。 (1)学生状态的组成为:学生编号、学生卡号、各种健康状态信息 (2)学生信息的组成为:学生基本信息、学生卡号、班主任编号、家长编号(一名主要联系人)。

解析(AI 生成):

按数据来源确定外部实体:学生、学校管理人员、班主任、家长、医护机构。数据存储按说明归类为学生状态信息、学生信息、校园场所信息、课表;到课检查需课表与校园场所两类输入,注册审核结果则写入学生信息记录。

问答题


9. 试题六(共 15 分) 阅读下列说明和 Java 代码,将应填入一且上一处的字句写在答题纸的对应栏内。 【说明】 某图像预览程序要求能够查看 BMP 、JPEG 和 GIF 三种格式的文件,且能够在 Windows 和 Linux 两种操作系统上运行。程序需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,现采用桥接模式进行设计,得到如图 6-1 所示 的类图。 图片 【Jave 代码】 Import java.util.*; class Matrix{ //各种格式的文件最终都被转化为像素矩阵 //此处代码省略 }; abstract class Implementor{ Public(1);//显示像素矩阵 m }; class WinImp extends Implementor{ public void doPaint(Matrix m){ //调用Windows 系统的绘制函数绘制像素矩阵 } }; class LinuxImp extends Implementor{ public void doPaint(Matrix m){//调用Linux 系统的绘制函数绘制像素矩阵 } }; abstract class Image{ public void setImp(Implementor imp){ this.imp= imp; } public abstract void parseFile(String fileName); protected Implementor imp; }; class BMPImage extends Image{ //此处代码省略 }; class GIFImage extends Image{ public void parseFile(String fileName) { //此处解析 BMP 文件并获得一个像素矩阵对象 m (2);//显示像素矩阵 m } }; Class Main{ Public static viod main(String[]args){ //在 Linux 操作系统上查看 demo.gif 图像文件 Image image=(3) Implementor imageImp=(4) (5) Image.parseFile(〝demo.gif〝); } }

参考答案:

1.abstract void doPaint(Matrix m) 2.imp.doPaint(m) 3.new GIFImage() 4.new LinuxImp() 5.image.setImp(imageImp)

解析(AI 生成):

桥接模式分离抽象与实现:Implementor声明抽象方法doPaint(Matrix m),Image用imp.doPaint(m)调用平台绘制;客户端注入new LinuxImp(),新格式只需加new GIFImage()子类。

问答题


10. 【说明】 某电话公司决定开发一个管理所有客户信息的交互式网络系统。系统功能如下。 (1)浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码等)。 (2)登录:电话公司授予每个客户一个帐号。拥有授权帐号的客户,可以使用系统提供的页面设置个人密码,并使用该帐号和密码向系统注册。 (3)修改个人信息:客户向系统注册后,可以发送电子邮件或者使用系统提供的页面,对个人信息进行修改。 (4)删除客户信息:只有公司的管理人员才能删除不再接受公司服务的客户的信息。系统采用面向对象方法进行开发,在开发过程中认定出的类见下表。 图片 【问题1】(8分)    在需求分析阶段,采用UML的用例图(use case diagram)描述系统功能需求,如图所示。请指出图中的A、B、C和D分别是哪个用例?  图片 【问题2】8分 (1)在面向对象建模中,类的关系有几种?分别是什么? (2)用例的关系有几种?分别是什么?

参考答案:

【问题1】 A:浏览客户信息 B:修改个人信息 C:登录 D:删除客户信息 【问题2】

(1)类的关系有6种 依赖,泛化,聚合,实现,组合,继承 (2)用例的关系有3种 包含,扩展,泛化

解析(AI 生成):

用例图中A为浏览客户信息,任何网络用户均可执行;B为修改个人信息,C为登录,是修改个人信息的前置;D为删除客户信息,仅管理人员可用。类之间关系有依赖、泛化、实现、关联、聚合、组合六种,用例关系为包含、扩展、泛化三种。

问答题


11. 阅读以下说明和Java代码,将应填入( )处的字句写在答题纸的对栏内。 【说明】 现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡( Card)(信用卡( Creditcard)和储蓄卡( Debitcard))等多种支付方式( PaymentMethod)对物品(tem)账单(Bill)进行支付。图 5-1 是某支付系统的略类图。 图片 【Java代码】 import java. util. Array List; import java. util. List; interface PaymentMethod { Public ( 1 ) } ∥cash、 Debitcard和ltem 实现略,ltem中getPrice( )取当前物品对象的价格 abstract class Card (2) { private final String name, num; public Card(string name, String num){this.name= name; this, num = num; } @Overide public String toString ( ) { return String. format(“%s card[name = %s, num =%s}”, this. getType( ), name, num); @override public void pay(int cents) { System. out. printin(“Payed"+ cents+"cents using"+toString( )); this, execute Transaction(cents); } protected abstract String getType( ): protected abstract void execute Transaction(int cents) } class CreditCard ( 3 ) { public CreditCard(String name, String num){ (4) ;} @Override protected String getType( ){ return"CREDIT";} @Override protected void execute Transaction(int cents) { System. out. Println(cents +"paid using Credit Card. "); } } Class Bill {//包含所有购买商品的账单 private List items =new ArrayList< >( ); public void add(Item item) { items. add(item): } public intgetTotalPrice( ) {/计算所有 item 的总价格,代码略/} public void pay( PaymentMethod paymentMethod) {//用指定的支付方式完成支付 (5) (getTotalPrice()): } } public class Paymentsystem { public void pay( ) { Bill bill =new Bill ( ); Item item1 = new Item(1234, 10); Item item2 new Item(“5678”, 40); Bill.add(item1); bill. add(item2);//将物品添加到账单中 Bill.pay(new Creditcard("LI SI”, "98765432101"))∥信用卡支付 } public static void main(Stringl args) { (6) = new Paymentsystem( ); payment pay( ); } }

参考答案:

(1)void pay(int cents) (2)implements PaymentMethod (3)extends Card (4)super(name, num) (5)paymentMethod.pay (6)Paymentsystem payment

解析(AI 生成):

接口PaymentMethod声明void pay(int cents),Card用implements实现;信用卡、储蓄卡extends Card并用super(name,num)复用构造;Bill调用paymentMethod.pay。

问答题


12. 阅读以下说明和C++代码,将应填入( )处的字句写在答题纸的对栏内。 【说明】 现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡( Card)(信用卡( Creditcard)和储蓄卡( Debitcard))等多种支付方式( PaymentMethod)对物品(tem)账单(Bill)进行支付。图 5-1 是某支付系统的略类图。 图片 【C++代码】 #include #include (vector) #include(string) using namespace std class PaymentMethod t public: virtual void pay(int cents)=0; }; //class、DebitCard和item实现略,item中getprice( )获取当前物品对象的价格 class Card: public PaymentMethod { private: string name, num; public Card(string name, string num)(this->name name; this->num num; } string toString ( ) { return this->getType( )+"card[name =”+name +" ,num ="+num+"]”; ) } void pay(int cents) { cout<<"Payed "<<cents <<"cents using"<<toString()<<end1; this->execute Transaction(cents); } Protected: virtual string getType( )=0; virtual void (1) =0; }; class Creditcard(2) { public. Creditcard(stringname, stringnum) ( 3) { } Protected: string getType()( return"CREDIT":} void executeTransaction(int cents)( cout<<cents <<"paid using"<<getType( ) <<"Card. <<end1; } } Class Bill{ //包含所有购买商品的账单 Private: vector< Item*>tems;∥包含物品的 vector Public: void add(Item" item items. push back(item):} int getTotalPrice ( ) { /计算所有 item 的总价格,代码略”/} old pay( PaymentMethod paymentMethod) {//用指定的支付方式完成支付 (1) (getTotalPrice()); } } Class PaymentSystem Public: void pay( ){ Bill" bill new Bill( ); Item"item1= new Item"1234”, 10); Item*item2= new Item(“5678", 40); Bill_>add(item1);bill>add(tem2);∥将物品添加到账单中 (2) ( new CreditCard("LI SI","98765432101”);∥信用卡支付 } }; Intmain( ) { (6) =new PaymentSystem( ); payment->pay ( ); return 0; }

参考答案:

(1)execute Transaction(int cents) (2):public Card (3): Card(name, num) (4)paymentMethod->pay (5)bill->pay (6)PaymentSystem*payment

解析(AI 生成):

C++中PaymentMethod是含纯虚函数pay的抽象类,Card以public继承并实现;子类public继承Card,构造用Card(name,num)初始化基类;Bill通过paymentMethod->pay调用。

问答题


13. 【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。 6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。 数据流图10-1和图10-2分别给出了该系统的顶层数据流图和0层数据流图。 图片 【问题1】(4分) 使用[说明]中给出的词汇,将数据流图中(1)~(4)处的数据流补充完整。 【问题2】(5分) 使用[说明]中给出的词汇,将数据流图中的(5)~(8)补充完整。 【问题3】(6分) 数据流程图中缺失了三条数据流,请指出这三条数据流的起点、终点和数据流名称。

参考答案:

【问题1】(4分) (1)费用单 (2)待租赁房屋列表 (3)看房请求 (4)变更房屋状态请求 【问题2】(5分) (5)房主信息文件(6)租赁者信息文件(7)房屋信息文件 (8)看房记录文件 【问题3】(6分) (1)起点:房主 终点:变更房屋状态 数据流名称:变更房屋状态请求 (2) 起点:租赁者 终点:登记租赁者信息数据流名称:租赁者信息 (3) 起点:租赁者 终点:安排租赁者看房数据流名称:看房请求

解析(AI 生成):

顶层图数据流按外部实体与系统的交互命名:房主提交费用单和变更房屋状态请求,租赁者获取待租赁房屋列表并提出看房请求;0层图的数据存储对应房主信息文件、租赁者信息文件、房屋信息文件和看房记录文件。

问答题


14. [说明]  某银行计划开发一个自动存提款机模拟系统(ATM System)。系统通过读卡器 (CardReader)读取ATM卡;系统与客户(Customer)的交互由客户控制台(Customer-Console)实现;银行操作员(Operator)可控制系统的启动(System Startup)和停止(System Shutdown):系统通过网络和银行系统(Bank)实现通信。  当读卡器判断用户已将ATM卡插入后,创建会话(Session)。会话开始后,读卡器进行读卡,并要求客户输入个人验证码(PIN)。系统将卡号和个人验证码信息送到银行系统进行验证。验证通过后,客户可从菜单选择如下事务(Transaction):      1.从ATM卡账户取款(Withdraw);      2.向ATM卡账尸存款(Deposit);      3.进行转账(Transfer):  4.查询(Inquire)ATM卡账户信息。  一次会话可以包含多个事务,每个事务处理也会将卡号和个人验证码信息送到银行系统进行验证。若个人验证码错误,则转个人验证码错误处理(Invalid PIN Process)。每个事务完成后,客户可选择继续上述事务或退卡。选择退卡时,系统弹出ATM卡,会话结束。     系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图如图3-1所示,一次会话的序列图(不考虑验证)如图3-2所示。 图片 图片 [问题1] (6分) 根据[说明]中的描述,给出图3-1中A1和A2所对应的参与者,U1至U3所对应的用例,以及该图中空  (1) 所对应的关系。(U1至U3的可选用例包括:Session、Transaction、Insert Card、Invalid PIN Process和Transfer) 。 【问题2】(8分) 根据[说明]中的描述,使用消息名称列表中的英文名称,给出图3-2中6~9对应的消息。消息名称参见下表。 图片

参考答案:

[问题1]  A1:Customer    A2:Bank    U1:Session     U2:Invalid PIN Process    U3:Transaction     (1):<<extend>> 【问题2】   6:readPIN()            7:PIN    8:creat(atm,this,card,pin)   9:preformTransaction()

解析(AI 生成):

用例图参与者为Customer与Bank,Session包含Transaction,Invalid PIN Process与事务为扩展关系;序列图中readPIN()取PIN后建会话,会话再调用performTransaction()。

问答题


15. 阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 在一块电路板的上下两端分别有n个接线柱。根据电路设计,用(i,π(i))表示将上端接线柱i与下端接线柱π(i)相连,称其为该电路板上的第i条连线。如图4-1所示的π(i)排列为{8,7,4,2,5,1,9,3,10,6}。对于任何1≤i<j≤n,第i条连线和第j条连线相交的充要条件是π(i)>π(j)。 图片 阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 在一块电路板的上下两端分别有n个接线柱。根据电路设计,用(i,π(i))表示将上端接线柱i与下端接线柱π(i)相连,称其为该电路板上的第i条连线。如图4-1所示的π(i)排列为{8,7,4,2,5,1,9,3,10,6}。对于任何1≤i<j≤n,第i条连线和第j条连线相交的充要条件是π(i)>π(j)。 图片 【C代码】 下面是算法的C语言实现。 (1)变量说明 size[i][j]:上下端分别有i个和j个接线柱的电路板的第一层最大不相交连接数 pi[i]: π(i),下标从1开始 (2)C程序 #include "stdlib.h" #include <stdio.h> #define N 10 /问题规模/ int m=0; /牢记录最大连接集合中的接线柱/ Void maxNum(int pi[],int size[N+1][N+1],int n) {/求最大不相交连接数/ int i, j; for(j=0; j < pi[1]; j++) (1) ; /*当j<π(1)时 */ for(j=pi[1];j<=n;j++) (2) ; /*当j>=π(1)时 */ for(i=2; i < n; i++) { for(j=0; j < pi[i]; j++) (3) ; /*当j<pi[i]时 / for(j=pi[i];j<=n;j++) {/*当j>=c[i]时,考虑两种情况/ size[i][j]=size[i-1][j]>=size[i-1][pi[i]-1]+1 ?size[i-1][j]:size[i-1][pi[i]-1]+1; } } /*最大连接数 */ size[n][n]=size[n-1][n]>=size[n-1][pi[n]-1]+1 ? size[n-1][n]:size[n-1][pi[n]-1]+1; } /构造最大不相交连接集合,net[i]表示最大不相交子集中第i条连线的上端接线柱的序号 / void constructSet(int pi[],int size[N+1][N+1],int n,int net[n]){ int i,j=n; m=0; for(i=n ; i>1 ; (4) ) { /从后往前/ if(size[i][j]!=size[i-1][j]){ /(i,pi[i])是最大不相交子集的一条连线/ (5) ; /将i记录到数组net中,连接线数自增1/ j= pi[i]-1; /更新扩展连线柱区间/ } } if(j>=pi[1]) net[m++]=1; /当i=1时/ } 【问题1】 根据以上说明和C代码,填充C代码中的空(1)~(5)。

参考答案:

(1) size[1][j] = 0;(2)size[i][j]=1; (3)size[i][j]=size[i-1][j]; (4)i--;(5)net[m++]=i;

解析(AI 生成):

最大不相交连线数用动态规划:size[i][j]表示前i条线与前j个接线柱的最优值;j小于π(1)时置0,π(i)不大于j时取1加前一状态,否则继承size[i-1][j];回溯用i--和net[m++]=i记录。

问答题


16. 阅读以下说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 [说明] 在股票交易中,股票代理根据客户发出的股票操作指示进行股票的买卖操作。其类图如下图所示,相应的C++代码附后。 图片 类图 图片 图片

参考答案:

(1)publicOrder (2) this->stock 或(this).stock (3)Order (4) orderList[i] 或 *(orderList+i) (5) placeOrders

解析(AI 生成):

命令模式中Order为抽象命令,具体买卖命令实现publicOrder;StockAgent持有Order*指针数组,构造时用this->stock绑定股票;执行时通过orderList[i]逐个调用placeOrders。

问答题


17. 阅读以下说明和C函数,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。 【 说明 】 编写程序,对于从键盘输入的3个实数a、b、c,计算实系数一元二次方程的根并输出所求的根。 【函数】 #include<stdio.h> #include<stdlib.h> #include<math.h> Main() { float a,b,c,delta,x1,x2; printf("Enter a,b,c"); scanf("%f%f%f",&a,&b,&c)); if((1)) if((2)) printf("Input error!\n"); else printf("The single root is %f\n",(3)); else { delta=bb-4ac; if((4)) { x1=(-b+sqrt(delta))/(2a); x2=(-b-sqrt(delta))/(2a); printf("x1=%8.2f\nx2=%8.2f\n",x1,x2,); } else if(delta==0) printf("x1=x2=%8.2f\n",(5)); else { Printf("z2=%8.2f+%8.2fi\n",-b/(2a),sqrt(-delta)/)(2abs(a))); Printf("z2=%8.2f-%8.2fi\n",-b/(2a),sqrt(-delta)/(2*abs(a))); } } }

参考答案:

(1)a==0 (2)b==0 (3)-c/b (4)delta>0(或bb-4ac>0) (5)-b/(2a) (或-b/2/a)

解析:

对于如何求出一元二次方程的根,是解决这个题目的关键。首先我们来回忆一下数学中求一元二次方程根的方法。在数学中求一元二次方程根的步骤如下。 第一步是确定方程是否为一元二次方程,这需要判断二次方系数和一次方系数是否为0,如果都为0,则方程有错。如果只是二次方系数为零,则方程为一元一次方程,方程有一个解。 第二步是用Δ=bb-4ac与0的关系来判断解的个数,如果Δ>0,方程有2个不同的解;如果Δ=0,方程有一个解;而Δ<0时,方程无解。 第三步才是求解。 现在我们来看主函数,在主函数中,首先声明了一些实数变量,其中变量a、b、c分别存放我们从键盘输入的3个实数,而detal中存放的是Δ的值,x1、x2中存放方程根的值。 接下来是从键盘输入3个值,作为一元二次方程的系数,在对一元二次方程求解以前我们需要考虑系数值为0的情况,因此,第1空应该填“a==0”,第2空应该填“b==0”。 在a等于0而b不等于0的情况下,方程为一元一次方程,可以直接用-c/b求得其解,第3空明显是要输出这个解。 再往下看,程序计算了Δ的值,那么接下来应该是判断Δ与0的关系了,从程序中可以看出,方程在第4空的条件下有两个解,那么第4空应该填“delta>0”。而第5空是在delta=0的条件下方程的解,因此第5空应该填“-b/(2a)”。

问答题


18. 阅读以下Java代码,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。 【 说明 】 进行两个整数之间的比较,由考生通过输入窗口分别输入两个整数,程序比较出结果。例如:先后输入的两个数分别为25和36。 比较结果显示: 25!=36 25<36 25<=36 【Java代码】 import javax.swing.JOptionPane; public class Java3 { public static void main(String args[]) { String (1) //用户输入第1个字符串 secondNuimber, //用户输入第2个字符串 result; //包含输出结果的字符串 int number1, //比较的第1个数 number2; //比较的第2个数 //读用户输入的第1个字符串 firstNumber= JOptionPane(2)("Enter first integer:"); //读用户输入的第2个字符串 secondNumber= JOpttionPane.showlnputDialog("Enter second integer:"); //将字符串类型转换成整数类型 number1=Integer.(3)(firstNumber); number2=Integer.parselnt(secondNumber); result=""; if((4)) result=number1+"=="+number2; if(number1!=number2) result=number1+"!=”"+number2; if(number1<number2) result=result+"\n"+number1+"<"+number2; if(numbe1>number2) result=result+"\n"+number1+">"+number2; if(number1<=number2) result=result+"\n"+number1+"<="+number2; if(number1>=number2) result=result+"\n"+number1+">="+number2; //显示结果 JOptionPane.(5)( null,result,"Comparison Results", JOptionPane.INFORMATION_MESSAGE.; //程序正常退出 System.exit(0); } }

参考答案:

(1)firstNumber (2)showInputDialog (3)parseInt (4)number1==number2 (5)showMessageDialog

解析:

试题要求由考生通过输入窗口分别输入两个整数,比较其大小并输出结果。下面来分析程序代码,程序中定义了一个类Java3,在这个类中实现题目要求的功能。 第1空所在代码行的注释是用户输入第1个字符串,但这在程序的开始,没有进行输入操作,应该是声明一个字符串型变量用来存放用户输入的第1个字符串,而在这个空的前面有一个关键字String用来表明所声明的变量是字符串型的,结合后面的程序,我们知道用来存放输入的第1个字符串的变量是firstNumber,因此,此空答案为“firstNumber。 根据注释,第2空所在代码行的作用是读用户输入的第1个字符串,而实现这个功能的是JOptionPane包中的showInputDialog()函数,结合后面的程序,我们不难找出此空的答案为“showlnputDialog”。 再根据注释,我们知道第3空所在代码行的作用是将第1个字符串类型的内容转换成整数类型,在Java中,一般通过类型对象的parseInt()方法,结合后面的程序,我们也不难找出此空的答案为“parseInt”。 第4空是条件判断语句中的条件,根据整个程序,我们不难发现变量result中存放的是要输出的结果,而语句result=number1+"=="+number2是将number1=number2这样一个结果存放到result中,那么只有当number1等于number2时,才输出这个结果,因此,第4空的作用应该是确定number1等于number2。所以,此空答案为“number1==number2”。 第5空在注释显示结果下面,从上面的程序中我们知道,变量result中存放的是要输出的结果,根据下面的程序,很明显是要调用包JOptionPane中的某个方法来实现输出。此方法应该是showMessageDialog(),因此,此空答案为“showMessageDialog”。

问答题


19. 阅读以下C++代码,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。 【 说明 】 在下面程序横线处填上适当的字句,使其输出结果为: x=5 x=6 y=7 x=8 z=9 【程序】 #include<iostream.h> class X1{ int x; (1): X1(int xx=0){x=xx;} (2)void Output()( cout<<"x="<<x<<end; } }; (3)Y1:public X1{ int y; public: Y1(int xx=0,int yy=0):X1(xx){y=yy;} (2)void Output(){ (4)Output(); cout<<"y="<<y<<end1; } }; class Z1:pubtic X1{ int z: (5): Z1(int xx=0,int zz=0):X1(xx){z=zz;} ②void Output(){ X1::Output(); cout<<"z="<<z<<end1; } }; void main() { X1 a(5);Y1 b(6,7);Z1 c(8,9); X1*p[3]={&a,&b,&c}; For(int i=0;i<3;i++){ p[i]-->Output();cout<<end1; } }

参考答案:

(1)public (2)virtual (3)class (4)X1:: (5)public

解析:

通过对比三个类的定义就可以发现,在类X1和Z1的定义中缺少类的成员属性声明,而类一般将成员变量声明为公有的、私有的或受保护的三种类型中的一种,在类的定义中,我们一般将类的构造函数放在公有的属性下面,在题目中只能选择公有的属性了,因此,第1空和第5空中应该填“public”。 对三个类的定义进行仔细观察后,我们同样可以发现,每个类中都定义了一个同名函数Output(),而且在后两个类的函数体中调用了函数Output(),由此,我们应该想到虚函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。因此,第2空应该填“virtual”。 第3空就简单了,考查类的定义,应该填类的标识符“class”。 从程序中我们可以看到,类Y1和Z1都以公有的方式继承类X1。从输出的结果来分析,类Y1和Z1都输出了两个数,但单从类Z1的函数来看,只能输出一个变量的值z,因此,可以发现在类Z1中应该和类Y1一样,都调用了类X1的函数Output(),因此,第4空的答案为“X1::”。

问答题


20. 【说明】 某公司欲开发一款二手车物流系统,以有效提升物流分发效率,改系统的主要功能是: (1)订单管理。系统抓取线索,将车辆交易系统中的交易信息抓取为线索,帮买顾问看到有买车线索后,会打电话询问买家是否需要物流,若需要。帮买顾问就将这个线索发起为订单,并在存储系统中存储,然后系统帮买家寻找物流商进行承运。 (2)路线管理。帮买顾问对物流商的路线进行管理,存储的路线信息包括:路线类型、物流商、起止地点。路线分为三种:固定路线、包车路线、竞拍体系。其中固定路线和包车路线是合约制,包车路线的发车时间由公司自行管理,是订单的首选途径。 (3)合约管理。帮买顾问根据公司与物流商确定的合约,对合约内容进行设置,合约信息包括物流商信息、路线起止城市、价格、有效期等。 (4)寻找物流商。系统根据订单的类型(保卖车、全国购和普通二手军)、起止城市,需要的服务模式(买家接、送到买家等)进行自动派发或以竞拍体系方式选择合适的物流商。即:有新订单时,若为保卖车或全国购,则直接分配到竞拍体系中:否则,若符合固定路线和/或包车路线,系统自动分配给合约物流商,若不符合固定路线和包车路线,系统将订单信息分配到竞拍体系中.竞拍体系接收到订单后,将订单信息推送给有相关路线的物流商,物流商对订单进行竞拍出价,最优报价的物流商中标。最后,给承运商的物流商发送物流消息,更新订单的物流信息,给车辆交易系统发送物流信息。 (5)物流商注册:物流商账号的注册开通。 现采用结构化方法对二手车物流系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 问题1:使用说明中的词语,给出图1-1中的实体E1-E3名称; 问题2:使用说明中的词语,给出图1-2中的数据存储,D1-D5名称; 问题3:根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点; 问题4:根据说明采用结构化语言对“P5寻找物流商”的加工逻辑进行描述。

参考答案:

问题1: E1:系统帮买商 E2: 车辆交易系统 E3: 物流商 问题2: D1: 交易线索信息表 D2:订单信息表 D3:路线信息表 D4:合约信息表 D5:物流商信息表 问题3: 图片 问题4: 略

解析(AI 生成):

上下文图的外部实体是帮买顾问、车辆交易系统和物流商;0层图按业务对象划分数据存储:交易线索信息表、订单信息表、路线信息表、合约信息表、物流商信息表,分别支撑线索抓取、订单派发与竞拍、路线与合约管理。

问答题


21. 【问题1】 使用说明中的词语,给出图1-7所示的外部实体E1-E4的名称。

材料: 某营销企业拟开发一个销售管理系统,其主要动能描述如下。 (1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理,即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理,即将缺货记录单存入缺货记录文件。 (2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。 (3)根据采购部门提供的进货通知单进行进货处理,即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。 (4)根据保留的客户订单进行销售统计,打印统计报表给经理。 现采用结构化方法对销售管理系统进行分析与设计,获得如图1-7所示的顶层数据流图和如图1-8所示的0层数据流图。 图片 图片

参考答案:

【问题1】 E1:客户 E2:库房 E3:采购部门 E4:经理

解析(AI 生成):

顶层数据流图的外部实体是系统之外的数据来源与去向,不参与系统内部加工:客户提交订单并接收反馈,库房负责出入库,采购部门提出采购需求,经理获取统计报表,四者与系统之间以数据流相连。

问答题


22. 【问题1】 根据问题描述,填写图3-21中(1)-(4)处联系的类型。联系类型分为一对一、一对多和多对多3种,分别使用1:1、1:n或1:、m:n或:*表示。

材料: 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 【需求分析】 (1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表3-9所示。 表3-9 客户及车辆信息 图片 (2)记录维修车辆的故障信息,包括维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书,如表3-10所示。 (3)维修车间根据维修委托书和车辆故障现象,在已有维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表3-11所示。 表3-10 维修委托书 图片 表3-11 维修派工单 图片 (4)客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,并记录在委托书中。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下所示。图3-21所示的业务员和维修工是员工的子实体。 图片 【逻辑结构设计】 客户((5),折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书((6),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单((7),工时) 员工((8),工种,员工类型,级别)

参考答案:

【问题1】 (1)1 (2)1 (3)n或m或* (4) n或m或*

解析(AI 生成):

联系类型由业务规则判定:一个订单只属于一个客户、一次采购只由一个采购部门发起,故(1)(2)填1;而一个客户可有多张订单、一个部门可多次采购,(3)(4)填n或m或*。判断时先看单侧实体能否对应多个对方实体。

问答题


23. 【问题2】 补充图3-21所示的联系并指明其联系类型。联系名可为联系1,联系2,……。

材料: 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 【需求分析】 (1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表3-9所示。 表3-9 客户及车辆信息 图片 (2)记录维修车辆的故障信息,包括维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书,如表3-10所示。 (3)维修车间根据维修委托书和车辆故障现象,在已有维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表3-11所示。 表3-10 维修委托书 图片 表3-11 维修派工单 图片 (4)客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,并记录在委托书中。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下所示。图3-21所示的业务员和维修工是员工的子实体。 图片 【逻辑结构设计】 客户((5),折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书((6),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单((7),工时) 员工((8),工种,员工类型,级别)

参考答案:

【问题2】 完整的实体联系图如下图所示: 图片

解析(AI 生成):

补充联系要找出尚未建模的实体对并连线,标注联系名与两端基数:先按业务规则确定参与实体,再判断是一对一、一对多还是多对多;多对多联系一般需独立建表,联系名可用联系1、联系2依次表示。

问答题


24. 【问题3】 根据图3-21和说明,将逻辑结构设计阶段生成的关系模式中的空(5)-(8)补充完整。

材料: 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 【需求分析】 (1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表3-9所示。 表3-9 客户及车辆信息 图片 (2)记录维修车辆的故障信息,包括维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书,如表3-10所示。 (3)维修车间根据维修委托书和车辆故障现象,在已有维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表3-11所示。 表3-10 维修委托书 图片 表3-11 维修派工单 图片 (4)客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,并记录在委托书中。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下所示。图3-21所示的业务员和维修工是员工的子实体。 图片 【逻辑结构设计】 客户((5),折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书((6),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单((7),工时) 员工((8),工种,员工类型,级别)

参考答案:

【问题3】 (5)客户编号,客户名称,客户性质 (6)委托书编号,客户编号,车牌号,业务员编号 , ,或者 , , ,委托书编号,车牌号,业务员编号 (7)委托书编号,维修工编号,维修项目编号 (8)员工编号,员工姓名

解析(AI 生成):

按ER图转关系模式:实体转为表,属性即字段;1:n联系在n端加入1端主键作外键。客户表取客户编号、名称、性质;委托书补入客户编号与业务员编号;派工单由委托书、维修工、维修项目三端主键组成;员工表存员工编号与姓名。

问答题


25. 【问题4】 根据问题描述,写出客户、委托书和派工单这3个关系的主键。

材料: 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 【需求分析】 (1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表3-9所示。 表3-9 客户及车辆信息 图片 (2)记录维修车辆的故障信息,包括维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书,如表3-10所示。 (3)维修车间根据维修委托书和车辆故障现象,在已有维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表3-11所示。 表3-10 维修委托书 图片 表3-11 维修派工单 图片 (4)客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,并记录在委托书中。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下所示。图3-21所示的业务员和维修工是员工的子实体。 图片 【逻辑结构设计】 客户((5),折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书((6),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单((7),工时) 员工((8),工种,员工类型,级别)

参考答案:

【问题4】 客户:客户编号 委托书:委托书编号 派工单:委托书编号,维修项目编号,维修工编号

解析(AI 生成):

主键须能唯一标识元组且不含冗余。客户由客户编号唯一确定;委托书由委托书编号唯一确定;派工单是委托书、维修工与维修项目三者的联系,单个属性无法唯一区分,故用三属性组合主键。

问答题


26. 【问题1】 请使用说明中的术语,给出图2-26中类Customer和类Person的属性。

材料: 某客户信息管理系统中保存着两类客户的信息: (1)个人客户。对于这类客户,系统保存了其客户标识(由系统生成)和基本信息(包括姓名、住宅电话和E-mail)。 (2)集团客户。集团客户可以创建和管理自己的若干名联系人。对于这类客户,系统除了保存其客户标识(由系统生成)之外,也保存了其联系人的信息。联系人的信息包括姓名、住宅电话、E-mail、办公电话以及职位。 该系统除了可以保存客户信息之外,还具有以下功能: (1)向系统中添加客户(addCustomer); (2)根据给定的客户标识,在系统中查找该客户(getCustomer); (3)根据给定的客户标识,从系统中删除该客户(removeCustomer); (4)创建新的联系人(addContact); (5)在系统中查找指定的联系人(getContact); (6)从系统中删除指定的联系人(removeContact)。 该系统采用面向对象方法进行开发。在面向对象分析阶段,根据上述描述,得到如表2-5所示的类。 表2-5 得到的各种类 图片 类名说明 CustomerInformationSystem客户信息管理系统 IndividualCustomer个人客户 InstitutionalCustomer集团客户 Contact联系人 描述该客户信息管理系统的UML类图如图2-26所示。 图片

参考答案:

【问题1】 Customer的属性:客户标识。 Person的属性:姓名、住宅电话、E-mail。

解析:

根据题目描述得知,客户信息管理系统的功能是管理个人用户和集团用户,个人用户和集团用户的区别在于集团用户有自己的联系人,而个人用户没有。 【问题1】 问题1要求考生给出类Customer和Person的属性。在图2-26中,Customer表示客户类,IndividualCustomer和InstitutionalCustomer都是Customer的子类,IndividualCustomer是个人客户,InstitutionalCustomer是集团客户。既然Customer是个人客户类和集团客户类的父类,则它必有两者的共同点。由于集团客户和个人客户都有客户标识,所以Customer的属性为“客户标识”。Contact是联系人,只有集团客户才有联系人。Person类是Contact类的父类,同时又与IndividualCustomer有关联,所以Person类应具有Contact与IndividualCustomer的共同点,它们的共同点就是联系人与个人客户都有自己的基本信息:姓名、住宅电话和E-mail。因此,Person的属性有:姓名、住宅电话和E-mail。

问答题


27. (本题为选做题,选做题共2道,请任选其一作答,若2道题都作答,按照题号小的1道计分) 阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明 】 以下C++代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物品(Item)加入购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账,设计如图5-1所示类图。 图片 【C++代码】 using namespace std; class Book; class Visitor { public: virtual void visit(Book* book)=0; //其它物品的visit方法 }; class Item { public:virtual void accept(Visitor* visitor)=0; virtual double getPrice()=0; }; class Book (1){ private: double price; public: Book (double price){ //访问本元素 (2); } void accept(Visitor* visitor) { (3); } double getPrice() { return price; } }; class Cashier(4){ private; double totalForCart; public: //访问Book类型对象的价格并累加 (5){ //假设Book类型的物品价格超过10元打8折 if(book->getPrice()<10.0) { totalForCart+=book->getPrice(); } else totalForCart+=book->getPrice()0.8; } //其它visit方法和折扣策略类似,此处略 double getTotal() { return totalForCart; } }; class ShoppingCart { private: vector<<item*>item>items; public: double calculatePrice() { Cashier* visitor=new Cashier(); for(int i=0;i<items.size();i++) br=""> <<item*>items.size();i++) (6); } double total=visitor->getTotal(); return total; } void add(Item*e) { items.push_back(e); } };

参考答案:

(6)(1):public Item (2)this->price=price (3)visitor->visit(this) (4)public visitor (5)void visit(Book*book) (6)item->accept(visitor)

解析:

这里考察的是访问者模式。其定义如下:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

问答题


28. (本题为选做题,选做题共2道,请任选其一作答,若2道题都作答,按照题号小的1道计分) 阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 以下Java代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物件 (Item)加入购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账。设计如图5-1所示类图。 图片 【Java代码】 interface Item{ public void accept(Visitor visitor); public double getPrice(); } class Book (1){ private double price; public Book(double price){(2);} public void accept(Visitor visitor){ //访问本元素 (3); } public double getPrice() { return price; } } //其它物品类略 interface Visitor { public void visit(Book book); //其它物品的visit方法 } class Cashier(4){ private double totalForCart; //访问Book类型对象的价格并累加 (5){ //假设Book类型的物品价格超过10元打8折 if(book.getPrice()<10.0){ totalForCart+=book.getPrice(); } else totalForCart+=book.getPrice()*0.8; } //其它visit方法和折扣策略类似,此处略 public double getTotal() { return totalForCart; } } class ShoppingCart { //normal shopping cart stuff private java.util.ArrayListitems=new java.util.ArrayList<>(); public double calculatePrice() { Cashier visitor=new Cashier(); for(Item item:items) { (6); } double total=visitor.getTotal(); return total; } public void add(Item e) { this.items.add(e); } }

参考答案:

(5)(1)implements Item (2)this.price=price (3)visitor.visit(this) (4)implements Visitor (5)public void visit(Book book) (6)item.accept(visitor)

解析:

这里考察的是访问者模式。其定义如下:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
第一、四空为接口与实现,接口使用Interface,实现使用implements。第二空this表示类实例本身。第三空为访问本元素。第五空实现接口里面的方法。第六空调用accept方法。

问答题


29. 【问题1】 (3分) 使用说明中的词语,给出图1-1中的实体E1〜E3的名称。

材料: 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。   【说明】   某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下:    (1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实 体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。   (2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。   (3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。   (4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。   (5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。   现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

【问题1】 E1:前端应用 E2:数据管理员 E3:后端数据库

解析(AI 生成):

数据流图的外部实体是系统之外、与系统交换数据的对象。按说明中的角色分工:发起业务操作的是前端应用,负责维护用户与权限数据的是数据管理员,提供数据服务的是后端数据库,故E1至E3依次对应。

问答题


30. 【问题2】 (3分) 使用说明中的词语,给出图1-2中的数据存储D1〜D3的名称。

材料: 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。   【说明】   某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下:    (1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实 体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。   (2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。   (3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。   (4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。   (5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。   现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

【问题2】 D1:用户表 D2:操作表 D3:权限表

解析(AI 生成):

数据存储命名取自说明中的名词,依据流入流出的数据内容判断:存放账号与身份信息的是用户表,记录操作行为的是操作表,保存角色与授权关系的是权限表,故D1、D2、D3依次对应。

问答题


31. 【问题3】 (6分) 给出图1-2中加工P的名称及其输入、输出流。  图片 除加工P的输入与输出流外,图1-2还缺失了两条数据流,请给出这两条数据流的起点和终点。  图片 注:名称使用说明中的词汇,起点和终点均使用图1-2中的符号或词汇。

材料: 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。   【说明】   某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下:    (1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实 体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。   (2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。   (3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。   (4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。   (5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。   现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

【问题3】 图片

解析(AI 生成):

先按加工P的输入、输出数据内容概括其功能并命名,输入流取自上游实体或数据存储,输出流指向被更新或查询的存储。再依据父图与子图平衡、每个加工既有输入又有输出的原则,检查并补出遗漏的两条数据流,起点终点均用图中已有符号。

问答题


32. 【问题4】 (3分) 在绘制数据流图时,需要注意加工的绘制。请给出三种在绘制加工的输入、输出时可能出现的错误。

材料: 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。   【说明】   某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下:    (1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实 体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。   (2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。   (3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。   (4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。   (5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。   现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

【问题4】 在绘制数据流图的加工时,可能出现的输入、输出错误; 只有输入而无输出 或者 黑洞 只有输出而无输入 或者 奇迹 输入的数据流无法通过加工产生输出流 或者 灰洞 输入的数据流与输出的数据流名称相同

解析(AI 生成):

加工应既有输入又有输出。常见错误:只有输入无输出称黑洞;只有输出无输入称奇迹;输入数据无法加工出所标输出称灰洞;此外输入流与输出流同名也属错误,说明加工未产生新信息。这些都会破坏数据流图的平衡与一致性。

问答题


33. 【问题1】(4分)根据题意,给出两个联系的属性。实体间的联系有“一对一”、“一对多”和“多对多”,指出各联系分别属于哪一种。

材料: 阅读下列说明和图,回答下面问题。 [说明] 某学校的教学系统描述如下: 学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。 教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Ttitle),其中教工号是唯一编定的。 课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cperiod)、学分(Ccredit),其中课程号是唯一编定的。 每个专业每个年级只有一个班级,这样班级就可用入学年份标识。 每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。 每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。 下图是经分析得到的E-R图。 图片

参考答案:

教授:上课地点、上课时间,一对多 ,, ,选修:任课教师、成绩,多对多

解析:

“每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同”,因此联系教授”的属性应有:上课地点,上课时间,是一对多联系。 “每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,……,选修课程时要指定任课教师,……,任课教师给选修该课程的学生一个成绩(Grade)”,因此联系“选修”的属性应有:任课教师、成绩,是多对多联系。

问答题


34. 【问题2】(5分)按照“有关模式名(属性,属性,…)”的格式,将此E-R图转换为5个关系模式,指出每个关系模式中的主键,其中模式名根据需要取实体名或联系名。

材料: 阅读下列说明和图,回答下面问题。 [说明] 某学校的教学系统描述如下: 学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。 教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Ttitle),其中教工号是唯一编定的。 课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cperiod)、学分(Ccredit),其中课程号是唯一编定的。 每个专业每个年级只有一个班级,这样班级就可用入学年份标识。 每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。 每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。 下图是经分析得到的E-R图。 图片

参考答案:

教师 (教工号,姓名,性别。年龄,职称),主键:教工号 ,, ,课程 (课程号,课程名称,学时,学分),主键:课程号 ,, ,学生 (学号,姓名,性别,年龄,主修专业,入学年份),主键:学号 ,, ,教授 (教工号,课程号,上课地点,上课时间),主键:教工号 ,, ,选修 (学号,课程号,任课教师,成绩),主键:(学号,课程号)或(学号,任课教师)

解析:

E-R模型向关系模型的转换应遵循如下原则: ①每个实体类型转换成一个关系模式。 ②一个1:1的联系(一对一联系)可转换为一个关系模式,或与任意一段的关系模式合并。 ③一个1:n的联系(一对多联系)可转换为一个关系模式,或与n段的关系模式合并。若独立转换为一个关系模式,那么两端关系的码及其联系的属性为该关系的属性,而n端的码为关系的码。 ④一个n:m的联系(多对多联系)可转换为一个关系模式,两端关系的码及其联系的属性为该关系的属性,而关系的码为两端实体的码的组合。 ⑤三个或三个以上多对多的联系可转换为一个关系模式,诸关系的码及联系的属性为关系的属性,而关系的码为各实体的码的组合。 ⑥具有相同码的关系可以合并。 由于“每位教师只教授特定的一门的课程,学生不能重复选修同一门课程”,因此教授联系的主码是“教工号”,修选联系的主码可以是“(学号,课程号)”,也可以是“(学号,任课教师)”。

问答题


35. 【问题3】(6分)若用Student表存储学生信息,Teacher表存储教师信息,Course表存储课程信息,Study表存储学生选修课程情况。教务处想要“查询2006年入学的计算机专业(CS)的学生中平均成绩在85分以上的学生信息”。请将以下SQL语句补充完整。注:用对应英文表示。 SELECT * FROM student WHERESmajor="CS"AND Syear="2006" AND (1) (SELECT Sno FROM Study GROUP BY Sno HAVING _(2))

材料: 阅读下列说明和图,回答下面问题。 [说明] 某学校的教学系统描述如下: 学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。 教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Ttitle),其中教工号是唯一编定的。 课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cperiod)、学分(Ccredit),其中课程号是唯一编定的。 每个专业每个年级只有一个班级,这样班级就可用入学年份标识。 每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。 每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。 下图是经分析得到的E-R图。 图片

参考答案:

(1)Sno IN,, ,(2)AVG(Grade)>85

解析:

SELECT [ALLi DISTINCT]<目标列表达式>[,<目标列表达式>]... FROM <表名或视图名>[,<表名或视图名>] [WHERE <条件表达式>] [GROUP BY <列名1>[HAVING<条件表达式>]] [ORDER BY <列名2>[ASC | DESC]...] 子句顺序为SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY,但SELECT和FROM是必须存在的,HAVING子句只能与GROUP BY搭配起来使用。 子查询的语意应为“按学号分组、平均分大于85的学生的学号”,可得第一个空应填Sno IN,第二个空应填AVG(Grade)>85。

问答题


36. 【问题一】根据题意,给出类“传阅记录”的主要属性。(5分)

材料: 阅读下列说明和图,回答下面问题。 [说明] 公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。 期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认己收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。 公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。 该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1是该系统的类图的一部分,图2描述了成功传递期刊的序列图。 [图1] 图片 [图2] 图片

参考答案:

“传阅记录”属性:期刊流水号、员工号、日期、备注。

解析:

根据期刊传阅描述,传阅时需记录员工号、日期以及传入/传出。故“传阅记录”应有属性:员工号、日期、备注。 每一本“期刊”有一份“传阅记录”,因此“传阅记录”还应有属性:期刊流水号。

问答题


37. 阅读以下说明和C语言函数,将应填入(n)处。 [说明] 函数int find_Max_Min(int a[],int n)的功能是:找出n个元素的数组a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值:再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。 [函数] int find_Max_Min(int a[],int n) {/找出n个元素的数组a的最大、最小元素并输出,返回查找过程元素中的比较次数/ int i,Count=0; int temp,Maxnum,Minnum; for(i=0; i<n/2; i++){ Count=Count+1 /元素比较次数计数/ if(a[i]>a[(1)]) {/数组元素交换代码略/} } Maxnum=a[n-1]; Minnum=a[0]; for(i=1;i<n/2+n%2;i++){ Count=(2); /元素比较次数计数/ Minnum=(3)? a[i]:Minnum; /找最小元素/ Maxnum=(4)?(5):Maxnum; /找最大元素/ } printf("Max=%d\n",Maxnum); printf("Min=%d\n",Minnum); return Count; }

参考答案:

(1)n-i-1 (2)Count+2 (3)a[i]<Minnum (4)a[n-i-1]>Maxnum (5)a[n-i-1]

解析:

先分析第一个for语句。 for(i=0; i<n/2; i++){ Count=Count+1; /元素比较次数计数/ if(a[i]>a[ (1) ]) {/数组元素交换代码略/) } 根据函数int find_Max_Min(int a[],int n)的功能以及题于中描述的查找方法,可知经过第一个for循环后,数组a中的元素被分成了前半区(最小元素所在区域)和后半区 (最大元素所在区域)。由于元素a[0]与a[n-1]比较,a[1]与a[n-2]比较,由于i值随循环的变化规律是0,1,2,…,因此空(1)处应填入n-1-1。 再分析第二个for语句,此前先假设a[n-1]为最大元素Maxnum,a[0]为最小元素 Minnum。 for(i=1;i<n/2+n%2;i++){ Count= (2) ; /元素比较次数计数/ Minnum= (3) a[i]:Minnum; /找最小元素/ Maxnum= (4) (5) :Maxnum; /找最大元素/ } 显然,同一个循环中在前半区查找最小元素,在后半区查找最大元素,元素比较次数计数器count的值随循环每次增加2。由于i值的变化规律为0,1,2,…,因此空(3)处填入“a[i]<Minnum”,结合“ a[i]:Minnum” 表示找到更小元素a[i]时用a[i]更新 Minnum的值:同理,在后半区找到更大元素时更新Maxnum的值,题干中已经明确在后半区从后往前找出大元素,因此空(4)处应填入“a[n-I-1]>Maxnum”,空(5)处填入“a[n-i-1]”。

问答题


38. 1、[问题1](8分) 使用[说明]中的词语,给出上图中外部实体E1至E4的名称和数据存储D1至D4的名称。

材料: 试题一(15分) 阅读下列说明,回答问题1和问题2,将解答填入的对应栏内。 [说明] 假设某大型商业企业由商品配送中心和连锁超市组成,其中商品配送中心包括采购、财务、配送等部门。为实现高效管理,设计了商品配送中心信息管理系统,其主要功能描述如下: 1.系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件。 2.在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处理发送配送通知;否则,向采购部门发出缺货通知。 3.配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件。 4.采购部门接到缺货通知后,与供货商洽谈,进行商品采购处理,合格商品入库,并记录采购清单至采购清单记录文件、向配送处理发出配送通知,同时通知财务部门给供货商支付货款。 该系统采用结构化方法进行开发,得到待修改的数据流图如下图所示。 图片

参考答案:

1、E1:财务部门 E2:采购部门 E3:连锁超市 E4:配送部门 D1:采购清单记录文件 D2:商品库存记录文件 D3:商品配送记录文件 D4:供货请求记录文件

解析:

问题一主要考查DFD中的外部实体和数据存储,由于在题干中已经提到“系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件”,因此可以明确出“连锁超市”外部实体和“供货请求记录文件”数据存储;对应到DFD图中为E3和D4。描述中的第二项提出“从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处发送配送通知;否则,向采购部门发出缺货通知”,因为配送通知需要发送到采购部门,因此采购部门将成为系统的外部实体;同时,商品库存记录文件能够提供库存信息,所以DFD图中E2和D2分别为采购部门和商品配送记录文件。第三项需求“配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件”,所以配送处理需要查询供货请求记录文件,更新商品库存记录文件与商品配送记录文件,因此D3为商品配送记录文件;采购处理需要记录采购清单同时通知财务部门,所以E1应该为财务部门,D1为采购清单记录文件,剩下的E4则为配送部门。 DFD中出现的错误数据流为:E1到E2,E1与E2的数据流不属于系统的范围;D3到E4,多余的数据流;D2到采购处理,数据流方向错误;D4到供货请求处理,数据流方向错误。 需要补充的数据流为:E2到采购处理,因为E2是采购部门,采购部门需要给采购处提供入库商品信息;采购处到D2需要一条数据流,因为采购处理需要更改库存信息;供货请求处理到D4需要一条数据流,因为供货请求处理需要记录供货请求信息。

问答题


39. 【问题1】(4分) 根据[说明]中的描述,使用参与者列表的英文名称,给出ORS用例图中A1~A4所对应的参与者。

材料: 试题三(15分) 阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下: 1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。 2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置 (存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。 3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。 系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。 图片 系统的部分用例图和提交稿件的活动图分别见下图。 图片

参考答案:

解析:

构建用例图时,常用的方式是先识别参与者,然后确定用例。创建参与者之间的继承关系是为了简化绘图。继承关系可以通过子类型“是一种”父类型进行判定。在本题中,作者和审稿人分别是一种用户,委员会主席是一种特殊审稿人。因此,A1:User、 A2:Author、A3:Reviewer、A4:PCChair。 考查用例时,通过判断用例是哪一个特定参与者发起或者触发,来建立和参与者之间的关联。审稿人可以设定兴趣领域、审阅稿件给出意见和罗列录用或/和拒绝的稿件,因此U1:list accepted/rejiected papers,会议委员会主席可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程,U2和U3分别为browse submitted papers和assign paper to reviewer(可互换)。 考查用例之间的关系时,<<extend>>(扩展)关系可以通过判断是否可以从一个用例的执行中,在需要时转向执行另一个用例,执行完返回继续,即存在<<extend>>关系。<<include>>(包含)定义了用例之间的包含关系,用于一个用例包含另一个用例的行为的建模,通过这种方式,可以把抽象(公共)行为从多个行为中分离出来。本题中,只有作者能提交稿件,“提交稿件”时判断是否登录,如果没有登录,先“登录”,然后返回继续提交稿件,所以(1)处应填<<extend>>。审稿人可以罗列录用和(或)拒绝的稿件,会议委员会主席在关闭审稿过程时须包括罗列录用和(或)拒绝的稿件,即用例“list accepted/rejected papers”和用例“close reviewing process”存在包含关系,所以(2)处应填<<include>>。 可以通过为每个用例构造一个活动图对用例进一步细化。构造活动图时可以通过如下步骤进行:从一个作为起点的初始节点开始;为用例的每个主要步骤添加一个动作:从一个活动到另一个活动、决策点或终点添加一条流;在流分解成不同路线的地方添加决策,并用一个合并将各个流重新合并;在有并行执行活动的地方添加分支和联合;用一个单一的活动终止符号结束。本题中,根据说明中条目2中描述的提交稿件的过程构建活动图,所以Actionl处填enter title and abstract、Action2处填select subject group、 Action3处填select paper location、Action4处填upload paper。

问答题


40. 【问题2】(3分) 根据[说明]中的描述,使用用例名称列表中的英文名称,给出ORS用例图中U1一 U3所对应的用例。

材料: 试题三(15分) 阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下: 1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。 2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置 (存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。 3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。 系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。 图片 系统的部分用例图和提交稿件的活动图分别见下图。 图片

参考答案:

问题2:U1:list accepted/rejected papersU2:browse submitted papers U3:assign paper to reviewer 注:U2和U3的答案可互换

解析:

构建用例图时,常用的方式是先识别参与者,然后确定用例。创建参与者之间的继承关系是为了简化绘图。继承关系可以通过子类型“是一种”父类型进行判定。在本题中,作者和审稿人分别是一种用户,委员会主席是一种特殊审稿人。因此,A1:User、 A2:Author、A3:Reviewer、A4:PCChair。 考查用例时,通过判断用例是哪一个特定参与者发起或者触发,来建立和参与者之间的关联。审稿人可以设定兴趣领域、审阅稿件给出意见和罗列录用或/和拒绝的稿件,因此U1:list accepted/rejiected papers,会议委员会主席可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程,U2和U3分别为browse submitted papers和assign paper to reviewer(可互换)。 考查用例之间的关系时,<<extend>>(扩展)关系可以通过判断是否可以从一个用例的执行中,在需要时转向执行另一个用例,执行完返回继续,即存在<<extend>>关系。<<include>>(包含)定义了用例之间的包含关系,用于一个用例包含另一个用例的行为的建模,通过这种方式,可以把抽象(公共)行为从多个行为中分离出来。本题中,只有作者能提交稿件,“提交稿件”时判断是否登录,如果没有登录,先“登录”,然后返回继续提交稿件,所以(1)处应填<<extend>>。审稿人可以罗列录用和(或)拒绝的稿件,会议委员会主席在关闭审稿过程时须包括罗列录用和(或)拒绝的稿件,即用例“list accepted/rejected papers”和用例“close reviewing process”存在包含关系,所以(2)处应填<<include>>。 可以通过为每个用例构造一个活动图对用例进一步细化。构造活动图时可以通过如下步骤进行:从一个作为起点的初始节点开始;为用例的每个主要步骤添加一个动作:从一个活动到另一个活动、决策点或终点添加一条流;在流分解成不同路线的地方添加决策,并用一个合并将各个流重新合并;在有并行执行活动的地方添加分支和联合;用一个单一的活动终止符号结束。本题中,根据说明中条目2中描述的提交稿件的过程构建活动图,所以Actionl处填enter title and abstract、Action2处填select subject group、 Action3处填select paper location、Action4处填upload paper。

问答题


41. 【问题3】(2分) 根据[说明]中的描述,给出ORS用例图中 (1) 和 (2) 所对应的关系。

材料: 试题三(15分) 阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下: 1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。 2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置 (存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。 3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。 系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。 图片 系统的部分用例图和提交稿件的活动图分别见下图。 图片

参考答案:

解析:

构建用例图时,常用的方式是先识别参与者,然后确定用例。创建参与者之间的继承关系是为了简化绘图。继承关系可以通过子类型“是一种”父类型进行判定。在本题中,作者和审稿人分别是一种用户,委员会主席是一种特殊审稿人。因此,A1:User、 A2:Author、A3:Reviewer、A4:PCChair。 考查用例时,通过判断用例是哪一个特定参与者发起或者触发,来建立和参与者之间的关联。审稿人可以设定兴趣领域、审阅稿件给出意见和罗列录用或/和拒绝的稿件,因此U1:list accepted/rejiected papers,会议委员会主席可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程,U2和U3分别为browse submitted papers和assign paper to reviewer(可互换)。 考查用例之间的关系时,<<extend>>(扩展)关系可以通过判断是否可以从一个用例的执行中,在需要时转向执行另一个用例,执行完返回继续,即存在<<extend>>关系。<<include>>(包含)定义了用例之间的包含关系,用于一个用例包含另一个用例的行为的建模,通过这种方式,可以把抽象(公共)行为从多个行为中分离出来。本题中,只有作者能提交稿件,“提交稿件”时判断是否登录,如果没有登录,先“登录”,然后返回继续提交稿件,所以(1)处应填<<extend>>。审稿人可以罗列录用和(或)拒绝的稿件,会议委员会主席在关闭审稿过程时须包括罗列录用和(或)拒绝的稿件,即用例“list accepted/rejected papers”和用例“close reviewing process”存在包含关系,所以(2)处应填<<include>>。 可以通过为每个用例构造一个活动图对用例进一步细化。构造活动图时可以通过如下步骤进行:从一个作为起点的初始节点开始;为用例的每个主要步骤添加一个动作:从一个活动到另一个活动、决策点或终点添加一条流;在流分解成不同路线的地方添加决策,并用一个合并将各个流重新合并;在有并行执行活动的地方添加分支和联合;用一个单一的活动终止符号结束。本题中,根据说明中条目2中描述的提交稿件的过程构建活动图,所以Actionl处填enter title and abstract、Action2处填select subject group、 Action3处填select paper location、Action4处填upload paper。

问答题


42. 【问题4】(4分) 根据[说明]中的描述,使用用例名称列表和活动名称列表中的英文名称,给出提交稿件过程的活动图中Action1~Action4对应的活动。

材料: 试题三(15分) 阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下: 1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。 2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置 (存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。 3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。 系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。 图片 系统的部分用例图和提交稿件的活动图分别见下图。 图片

参考答案:

问题4:Action1:enter title and abstractAction2:select subject groupAction3:select paper locationAction4:upload paper

解析:

构建用例图时,常用的方式是先识别参与者,然后确定用例。创建参与者之间的继承关系是为了简化绘图。继承关系可以通过子类型“是一种”父类型进行判定。在本题中,作者和审稿人分别是一种用户,委员会主席是一种特殊审稿人。因此,A1:User、 A2:Author、A3:Reviewer、A4:PCChair。 考查用例时,通过判断用例是哪一个特定参与者发起或者触发,来建立和参与者之间的关联。审稿人可以设定兴趣领域、审阅稿件给出意见和罗列录用或/和拒绝的稿件,因此U1:list accepted/rejiected papers,会议委员会主席可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程,U2和U3分别为browse submitted papers和assign paper to reviewer(可互换)。 考查用例之间的关系时,<<extend>>(扩展)关系可以通过判断是否可以从一个用例的执行中,在需要时转向执行另一个用例,执行完返回继续,即存在<<extend>>关系。<<include>>(包含)定义了用例之间的包含关系,用于一个用例包含另一个用例的行为的建模,通过这种方式,可以把抽象(公共)行为从多个行为中分离出来。本题中,只有作者能提交稿件,“提交稿件”时判断是否登录,如果没有登录,先“登录”,然后返回继续提交稿件,所以(1)处应填<<extend>>。审稿人可以罗列录用和(或)拒绝的稿件,会议委员会主席在关闭审稿过程时须包括罗列录用和(或)拒绝的稿件,即用例“list accepted/rejected papers”和用例“close reviewing process”存在包含关系,所以(2)处应填<<include>>。 可以通过为每个用例构造一个活动图对用例进一步细化。构造活动图时可以通过如下步骤进行:从一个作为起点的初始节点开始;为用例的每个主要步骤添加一个动作:从一个活动到另一个活动、决策点或终点添加一条流;在流分解成不同路线的地方添加决策,并用一个合并将各个流重新合并;在有并行执行活动的地方添加分支和联合;用一个单一的活动终止符号结束。本题中,根据说明中条目2中描述的提交稿件的过程构建活动图,所以Actionl处填enter title and abstract、Action2处填select subject group、 Action3处填select paper location、Action4处填upload paper。

问答题


43. 【问题2】(2分) 若有序数组中有n个元素,采用二分查找法查找一个元素时,最多与( )个数组元素进行比较,即可确定查找结果。 (7)备选答案: A.[log2(n+1)] B.[n/2] C.n-1 D.n

材料: 试题四(共15分) 阅读以下说明、C函数和问题,回答问题1和问题2将解答填入答题纸的对应栏内。 【说明】 当数组中的元素已经排列有序时,可以采用折半查找(二分查找)法查找一个元素。下面的函数biSearch(int r[],int low,int high,int key)用非递归方式在数组r中进行二分查找,函数biSearch_rec(int r[],int low,int high,int key)采用递归方式在数组r中进行二分查找,函数的返回值都为所找到元素的下标;若找不到,则返回-1。 【C函数1】 int biSearch(int r[],int low,int high,int key) //r[low..high] 中的元素按非递减顺序排列 //用二分查找法在数组r中查找与key相同的元素 //若找到则返回该元素在数组r的下标,否则返回-1 { int mid; while((1)) { mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key<r[mid]) (2); else (3); }/while/ return -1; }/biSearch/ 【C 函数 2】 int biSearch_rec(int r[],int low,int high,int key) //r[low..high]中的元素按非递减顺序排列 //用二分查找法在数组r中查找与key相同的元素 //若找到则返回该元素在数组r的下标,否则返回-1 { int mid; if((4)) { mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key<r[mid]) return biSearch_rec((5),key); else return biSearch_rec((6),key); }/if/ return -1; }/biSearch_rec/

参考答案:

解析(AI 生成):

二分查找每比较一次区间规模减半,最多比较⌊log2n⌋+1次,等价于⌈log2(n+1)⌉,故第(7)空选A。n/2只是平均折半的粗略估计,n-1和n是顺序查找的最坏比较次数,均不符合折半特性。

问答题


44. 【问题1】(4分) 使用说明中的词语,给出图1-7所示的外部实体E1-E4的名称。

材料: 试题一(共15分) 某营销企业拟开发一个销售管理系统,其主要动能描述如下。 (1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理,即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理,即将缺货记录单存入缺货记录文件。 (2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。 (3)根据采购部门提供的进货通知单进行进货处理,即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。 (4)根据保留的客户订单进行销售统计,打印统计报表给经理。 现采用结构化方法对销售管理系统进行分析与设计,获得如图1-7所示的顶层数据流图和如图1-8所示的0层数据流图。 图片

参考答案:

【问题1】 E1:客户 E2:库房 E3:采购部门 E4:经理

解析(AI 生成):

外部实体是系统外与系统交换数据的对象。按说明:提交订单并查询的是客户;负责出入库与备货的是库房;提出采购需求的是采购部门;审批与查看报表的是经理,故E1至E4依次对应。

问答题


45. 【问题2】(3分) 使用说明中的词语,给出图1-8所示的数据存储D1-D3的名称。

材料: 试题一(共15分) 某营销企业拟开发一个销售管理系统,其主要动能描述如下。 (1)接受客户订单,检查库存货物是否满足订单要求。如果满足,进行供货处理,即修改库存记录文件,给库房开具备货单并且保留客户订单至订单记录文件;否则进行缺货处理,即将缺货记录单存入缺货记录文件。 (2)根据缺货记录文件进行缺货统计,将缺货通知单发给采购部门。 (3)根据采购部门提供的进货通知单进行进货处理,即修改库存记录文件,并从缺货记录文件中取出缺货订单进行供货处理。 (4)根据保留的客户订单进行销售统计,打印统计报表给经理。 现采用结构化方法对销售管理系统进行分析与设计,获得如图1-7所示的顶层数据流图和如图1-8所示的0层数据流图。 图片

参考答案:

【问题2】 D1:缺货记录文件 ?D2:库存记录文件 D3:订单记录文件

解析(AI 生成):

数据存储按其中保存的记录内容命名:记录缺货商品及数量的是缺货记录文件;记录当前库存的是库存记录文件;记录客户订单的是订单记录文件。由数据流指向的存储内容即可判定D1至D3。

问答题


46. 【问题1】 经过进一步分析,设计人员决定定义一个类Items_on_loan,以表示类Book和CD的共有属性和方法。请采用图2-23中属性和方法的名称给出类Items_on_loan应该具有的属性和方法。(注意:不同名称的属性和方法表示不同的含义,如CD中的composer与Book中的author无任何关系)

材料: 【试题三】(15分) 某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托希赛公司开发一套信息管理系统。该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。希赛公司决定采用面向对象的分析和设计方法开发此系统。图2-22所示为某类图书或唱碟被借阅时应记录的信息,图2-23描述了系统定义的两个类Book和CD,分别表示图书和唱碟的信息。 图片

参考答案:

【问题1】 属性:title 方法:Reference Title

解析(AI 生成):

提取Book与CD中名称和含义都相同的成员上移到父类:两者都有题名,故属性为title;两者都有按编号引用馆藏的方法,故方法为Reference Title。author与composer含义不同,不能作为共有成员上移。

问答题


47. 【问题2】 为了记录每种图书或唱碟租借的历史记录,引入类CirculationHistory,类中存储的信息是图2-22中所表示的内容。请采用UML表示法将下列四个类之间的关系表示出来。 图片

材料: 【试题三】(15分) 某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托希赛公司开发一套信息管理系统。该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。希赛公司决定采用面向对象的分析和设计方法开发此系统。图2-22所示为某类图书或唱碟被借阅时应记录的信息,图2-23描述了系统定义的两个类Book和CD,分别表示图书和唱碟的信息。 图片

参考答案:

【问题2】 图片

解析(AI 生成):

用关联线连接Items_on_loan与CirculationHistory,在历史端标0..*、馆藏端标1,表示一种图书或唱碟可对应多条借阅记录;若历史信息依附于借阅关系,可用关联类表示。Book与CD作为子类同样参与该关联。

问答题


48. 【问题3】 现需了解十大最畅销(借出次数最多)图书或唱碟。为此,引入TenPopulate类以存储所有十大畅销图书或CD的名称及其被借出的次数。图2-24的顺序图描述了某类图书或唱碟被借出后成为十大畅销图书或唱碟时对象间的消息交互。系统在一次运行过程中,应有 (1) 个TenPopulate实例对象最合适,一个TenPopulate类实例对象最多需要和 (2) 个Items_on_loan实例对象交互。 图片

材料: 【试题三】(15分) 某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托希赛公司开发一套信息管理系统。该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。希赛公司决定采用面向对象的分析和设计方法开发此系统。图2-22所示为某类图书或唱碟被借阅时应记录的信息,图2-23描述了系统定义的两个类Book和CD,分别表示图书和唱碟的信息。 图片

参考答案:

【问题3】 (1)1 (2)图书和唱碟种类数

解析(AI 生成):

TenPopulate保存全局十大畅销榜单,整个系统运行期间只需一个实例,故(1)填1;每个品种对应一个Items_on_loan实例,榜单更新时需与各品种对象交互,故(2)最多为图书和唱碟的种类数。

问答题


49. 【问题1】(15分) 根据以上说明和C代码,填充C代码中的空(1)~(5)。

材料: 【试题四】(15分) 阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 在一块电路板的上下两端分别有n个接线柱。根据电路设计,用(i,π(i))表示将上端接线柱i与下端接线柱π(i)相连,称其为该电路板上的第i条连线。如图4-1所示的π(i)排列为{8,7,4,2,5,1,9,3,10,6}。对于任何1≤i<j≤n,第i条连线和第j条连线相交的充要条件是π(i)>π(j)。 图片 在制作电路板时,要求将这n条连线分布到若干绝缘层上,在同一层上的连线不相交。现在要确定将哪些连线安排在一层上,使得该层上有尽可能多的连线,即确定连线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。 【分析问题】 记N(i,j)={t|(t,π(t))∈Nets,t≤i,π(t)≤j}。N(i,j)的最大不相交子集为MNS(i,j),size(i,j)=|MNS(i,j)|。 经分析,该问题具有最优子结构性质。对规模为n的电路布线问题,可以构造如下递归式: 图片 【C代码】 下面是算法的C语言实现。 (1)变量说明 size[i][j]:上下端分别有i个和j个接线柱的电路板的第一层最大不相交连接数 pi[i]: π(i),下标从1开始 (2)C程序 #include "stdlib.h" #include <stdio.h> #define N 10 /问题规模/ int m=0; /牢记录最大连接集合中的接线柱/ Void maxNum(int pi[],int size[N+1][N+1],int n) {/求最大不相交连接数/ int i, j; for(j=0; j < pi[1]; j++) (1) ; /*当j<π(1)时 */ for(j=pi[1];j<=n;j++) (2) ; /*当j>=π(1)时 */ for(i=2; i < n; i++) { for(j=0; j < pi[i]; j++) (3) ; /*当j<pi[i]时 / for(j=pi[i];j<=n;j++) {/*当j>=c[i]时,考虑两种情况/ size[i][j]=size[i-1][j]>=size[i-1][pi[i]-1]+1 ?size[i-1][j]:size[i-1][pi[i]-1]+1; } } /*最大连接数 */ size[n][n]=size[n-1][n]>=size[n-1][pi[n]-1]+1 ? size[n-1][n]:size[n-1][pi[n]-1]+1; } /构造最大不相交连接集合,net[i]表示最大不相交子集中第i条连线的上端接线柱的序号 / void constructSet(int pi[],int size[N+1][N+1],int n,int net[n]){ int i,j=n; m=0; for(i=n ; i>1 ; (4) ) { /从后往前/ if(size[i][j]!=size[i-1][j]){ /(i,pi[i])是最大不相交子集的一条连线/ (5) ; /将i记录到数组net中,连接线数自增1/ j= pi[i]-1; /更新扩展连线柱区间/ } } if(j>=pi[1]) net[m++]=1; /当i=1时/ }

参考答案:

(1) size[1][j] = 0; (2)size[i][j]=1; (3)size[i][j]=size[i-1][j]; (4)i--;(5)net[m++]=i;

解析(AI 生成):

按状态定义初始化边界:j为0时size[1][j]置0;元素可单独成段时size[i][j]置1。比较后不能延长则继承前一行的size[i-1][j],否则长度加1。输出时从末元素回溯,i--逐步前移,把选中的下标依次存入net数组。

问答题


50. 试题四 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。c语言代码如下。 【C语言】 #include <stdio.h> #include <stdlib.h> // 归并函数,用于合并两个有序数组 void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; // 创建临时数组 int L[n1], R[n2]; // 拷贝数据到临时数组L[]和R[] for (i = 0; i < n1; i++) (1); for (j = 0; j < n2; j++) (2); // 合并临时数组到arr[l..r] i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { (3) ; i++; } else { arr[k] = R[j]; j++; } k++; } // 拷贝L[]的剩余元素到arr[] while (i < n1) { arr[k] = L[i]; i++; k++; } // 拷贝R[]的剩余元素到arr[] while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序函数 void mergeSort(int arr[], int l, int r) { if (l < r) { // 找到中间点 int m = l + (r - l) / 2; // 对左半部分排序 (4) ; // 对右半部分排序 (5) ; // 合并结果 merge(arr, l, m, r); } } /* 一个打印数组的函数 */ void printArray(int arr[], int size) { int i; for (i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } 【问题1】(15分) 根据以上说明和C代码,填充(1)~(5)。

参考答案:

【问题1】 (1) L[i] = arr[l + i] (2)R[j] = arr[m + 1 + j] (3)arr[k] = L[i] (4) mergeSort(arr, l, m) (5)mergeSort(arr, m + 1, r)

解析(AI 生成):

归并前先把两段数据复制到临时数组:L[i]取arr[l+i],R[j]取arr[m+1+j]。合并时较小者写回arr[k],相等取L保证稳定,故(3)为arr[k]=L[i]。递归先排左半,再排右半。

问答题


51. 试题六 阅读下列说明和JAVA代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 命令模式的类图如下,请填写代码到对应的填空内。 图片 【Java代码】 public interface Command { (1); } public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { (2); } public void execute() { receiver.action(); } } public class Receiver { public void action() { System.out.println("Executing the command."); } } public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } public class Client { public static void main(String[] args) { // 创建接收者 Receiver receiver = new Receiver(); // 创建具体命令,并将接收者注入 (3) ; // 创建调用者,并将命令注入 (4) ; // 执行命令 (5) ; } }

参考答案:

(1) void execute() (2)this.receiver = receiver (3)Command command = new ConcreteCommand(receiver) (4)Invoker invoker = new Invoker(command) (5) invoker.executeCommand()

解析(AI 生成):

接口只声明execute();命令在构造时用this.receiver=receiver保存接收者。客户端建接收者,再创建ConcreteCommand传入接收者,用Invoker装配该命令,最后调用executeCommand()触发。

问答题


52. 【问题1】(8分) 请用300字以内的文字简述需求开发的主要活动及其重要性。

材料: 试题一(25分) 阅读以下关于在线购物平台开发的叙述,在答题纸上回答问题1至问题3。 【说明】 某大型电商公司计划开发一款全新的在线购物平台,旨在为用户提供更加便捷、个性化的购物体验。在需求调研阶段,项目经理李工首先进行了需求分析,并整理出以下系统需求: ① 用户可以注册账号并登录平台,享受个性化服务。 ② 平台应提供商品搜索功能,支持按关键词、价格、销量等条件进行筛选。 ③ 用户可以将商品加入购物车,并查看购物车内的商品列表及总价。 ④ 用户可以选择多种支付方式完成订单支付,并支持查看订单状态和物流信息。 ⑤ 平台应具备推荐系统,根据用户的浏览历史和购买记录推荐相关商品。 ⑥ 用户可以发布商品,并调整商品价格。 开发团队内部围绕系统需求展开了讨论,系统分析师张工对于需求的完整性和准确性提出了质疑。

参考答案:

需求开发的主要活动有: ① 需求获取:通过与客户的沟通和交流,收集并理解客户的实际需求和期望。在在线购物平台开发中,这有助于确保系统能够真正满足客户的业务需求。 ② 需求分析:对收集到的需求进行深入分析,明确需求的范围、目标、约束等。在在线购物平台开发中,这有助于识别出关键的业务流程和功能点,为后续的系统设计提供指导。 ③ 需求定义:将分析后的需求以清晰、准确的方式表达出来,形成需求规格说明书。在在线购物平台开发中,这有助于确保开发团队对需求有共同的理解,减少歧义和误解。 ④需求验证:通过原型验证、评审等方式,对需求规格说明书进行验证和确认。在在线购物平台开发中,这有助于确保需求的正确性和完整性,避免在后续开发过程中出现偏差或遗漏。

解析(AI 生成):

需求开发包括获取、分析、定义、验证四项活动。获取靠与客户沟通收集真实期望;分析明确范围、目标与约束,识别关键业务流程;定义形成需求规格说明书统一理解;验证通过评审与原型确认正确性和完整性,减少后期返工。

[材料型]问答题


53. 【问题1】(10分) 请用300字以内的文字简述在面向对象设计过程中,李工应遵循的主要设计原则,并简要说明每个原则的作用。

材料: 试题二(25分) 阅读以下关于系统分析与设计的叙述,在答题纸上回答问题1至问题3。 【说明】 某大学计划开发一套在线图书馆管理系统,以实现图书的借阅、归还、查询、预订以及用户信息管理等功能。系统分析师李工负责对该系统进行需求分析与建模。经过初步调研,李工整理出以下系统需求: ① 图书馆管理员可以录入图书的基本信息,包括书名、作者、ISBN号、出版日期、库存数量等。 ② 用户可以以不同的方式查询图书的详细信息,并预订或借阅图书。 ③ 用户借阅图书时,系统应记录借阅信息,包括借阅人、借阅时间、归还日期等。 ④ 当图书库存不足时,系统应能够提醒管理员进行图书采购。 ⑤ 用户可以撤销预订的图书。 在面向对象设计过程中,李工需要遵循面向对象设计的原则,并考虑使用合适的设计模式来优化系统结构。

参考答案:

李工应遵循以下主要面向对象设计原则: ① 单一职责原则(SRP):每个类应该只有一个引起变化的原因。这有助于将功能划分到不同的类中,提高系统的可维护性和可复用性。 ② 开放封闭原则(OCP):软件实体(类、模块、函数等)应当对扩展开放,对修改封闭。这意味着在设计时应考虑未来的变化,通过添加新功能而不是修改现有功能来应对变化。 ③ 里氏替换原则(LSP):子类必须能够替换其基类。这确保了基类与子类之间的行为一致性,从而增强了系统的健壮性。 ④ 接口隔离原则(ISP):客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该是最小的。这有助于减少类之间的耦合,提高系统的可维护性和灵活性。 ⑤ 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这有助于降低类之间的耦合度,提高系统的可复用性和可测试性。 ⑥ 组合/聚合复用原则:尽量使用组合/聚合的方式来实现代码复用,而不是使用继承。这可以减少代码之间的耦合度,提高系统的灵活性和可扩展性。 ⑦ 最少知识原则(迪米特法则):一个对象应当对其他对象保持最少的了解。这意味着一个模块或类应该尽可能少地与其他模块或类发生相互作用,这样可以降低系统的复杂性,提高模块之间的独立性。 (答出5点即可)

解析(AI 生成):

应遵循单一职责、开放封闭、里氏替换、接口隔离、依赖倒置,以及组合聚合复用和迪米特法则。单一职责降低变化影响;开闭原则支持扩展而不改旧码;里氏替换保证子类可替代父类;接口隔离与依赖倒置降低耦合;组合复用优于继承;迪米特限制对象间知识。

[材料型]问答题


54. 【问题1】(8分) 分布式数据库系统是在集中式数据库系统技术的基础上发展起来的,请用200字以内的文字说明分布式数据库系统的特点。

材料: 试题四(25分) 阅读以下关于数据管理的叙述,在答题纸上回答问题1至问题3。 【说明】 某大型金融机构正在构建一个分布式数据库系统,以支持其全球范围内的业务运营。该系统需要处理大量的交易数据,并确保数据的一致性和高可用性。系统中包含多个地理位置分散的数据库节点,每个节点负责存储和管理特定业务域的数据。为了确保数据的一致性和实时性,系统需要实现高效的跨节点数据同步和查询优化。

参考答案:

① 共享性,数据资源在不同的节点是全局共享的; ② 自治性,每个节点上的局部数据库都具有一定的自治性,可以独立地管理自己的数据资源,完成局部应用; ③ 可用性,确保数据库在任何时候都能正常工作,即使在某些节点出现故障的情况下,系统也能够通过其他节点上的数据副本进行操作,保持数据的可用性和完整性; ④ 分布性,数据被分布存储在不同的节点上,每个节点负责存储和管理一部分数据资源。

解析(AI 生成):

分布式数据库具有四个特点:共享性,各节点数据可全局共享;自治性,局部数据库能独立管理本地数据、完成局部应用;可用性,部分节点故障时可用副本继续服务;分布性,数据分散存储在不同节点,各节点管理一部分数据。

[材料型]问答题


55. 【问题1】(4分) 使用【说明】中给出的词汇,将数据流图1-1中(1)~(4)处的数据流补充完整。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。 6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。数据流图1-1和图1-2分别给出了该系统的顶层数据流图和0层数据流图。 图片

参考答案:

【问题1】 (1)费用单 (2)待租赁房屋列表 (3)看房请求(4)变更房屋状态请求

解析(AI 生成):

数据流应与说明词汇一致:租客看房后形成费用单;系统向租客返回待租赁房屋列表;租客提交看房请求;看房成功后需发出变更房屋状态请求,使房源由待租变为已租,故(1)至(4)依次对应。

[材料型]问答题


56. 【问题2】(4分) 使用【说明】中给出的词汇,将数据流图1-2中的(5)~(8)补充完整。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。 6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。数据流图1-1和图1-2分别给出了该系统的顶层数据流图和0层数据流图。 图片

参考答案:

【问题2】 (5)房主信息文件 (6)租赁者信息文件 (7)房屋信息文件 (8)看房记录文件

解析(AI 生成):

数据存储按所存信息命名:记录房主资料的是房主信息文件,记录租客资料的是租赁者信息文件,记录房源的是房屋信息文件,记录每次带看情况的是看房记录文件,故(5)至(8)依次对应。

[材料型]问答题


57. 【问题3】(6分) 数据流图1-2中缺失了三条数据流,请指出这三条数据流的起点、终点和数据流名称。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。 6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。数据流图1-1和图1-2分别给出了该系统的顶层数据流图和0层数据流图。 图片

参考答案:

【问题3】 (1)起点:房主 终点:变更房屋状态 数据流名称:变更房屋状态请求 (2)起点:租赁者终点:登记租赁者信息数据流名称:租赁者信息 (3)起点:租赁者终点:安排租赁者看房数据流名称:看房请求

解析(AI 生成):

数据流方向由数据产生方指向使用方。房主发起变更房屋状态请求,送交“变更房屋状态”加工;租赁者提交租赁者信息给“登记租赁者信息”;租赁者提出看房请求给“安排租赁者看房”。作答须写全起点、终点、数据流名称三要素,缺一即扣分。

[材料型]问答题


58. 【问题1】(4分) 根据说明中的描述,给出图3-1中(1)~(4)所对应的用例名。

材料: 试题三(15分) 阅读下列说明和图,回答下列问题,将解答填入对应栏内。 【说明】 某出版社拟开发一个在线销售各种学术出版物的网上商店(ACShop),其主要的功能需求描述如下: (1)ACShop在线销售的学术出版物包括论文、学术报告或讲座资料等。 (2)ACShop的客户分为两种:未注册客户和注册客户。 (3)未注册客户可以浏览或检索出版物,将出版物添加到购物车中。未注册客户进行注册操作之后,成为ACShop注册客户。 (4)注册客户登录之后,可将待购买的出版物添加到购物车中,并进行结账操作。结账操作的具体流程描述如下。 ① 从预先填写的地址列表中选择一个作为本次交易的收货地址。如果没有地址信息,则可以添加新地址。 ② 选择付款方式。ACShop支持信用卡付款和银行转账两种方式。注册客户可以从预先填写的信用卡或银行账号中选择一个付款。若没有付款方式信息,则可以添加新付款方式。 ③ 确认提交购物车中待购买的出版物后,ACShop会自动生成与之相对应的订单。 (5)管理员负责维护在线销售的出版物目录,包括添加新出版物或者更新在售出版物信息等操作。 现采用面向对象方法分析并设计该网上商店ACShop,得到如图3-1所示的用例图和图3-2所示的类图。 图片 图片

参考答案:

(1)将(待购买)出版物添加到购物车 (2)结账 (3)选择收货地址 (4)选择付款方式

解析(AI 生成):

按参与者与用例的对应关系补名:购物者浏览目录后把出版物放入购物车,故(1)为将待购买出版物添加到购物车;购物车确认后进入(2)结账;结账须确定配送与支付,故(3)选择收货地址、(4)选择付款方式。用例名统一用动宾短语,与说明中的业务动作一致。

[材料型]问答题


59. 【问题2】(4分) 根据说明中的描述,分别说明用例“添加新地址”和“添加新付款方式”会在何种情况下由图3-1中的用例(3)和(4)扩展而来?

材料: 试题三(15分) 阅读下列说明和图,回答下列问题,将解答填入对应栏内。 【说明】 某出版社拟开发一个在线销售各种学术出版物的网上商店(ACShop),其主要的功能需求描述如下: (1)ACShop在线销售的学术出版物包括论文、学术报告或讲座资料等。 (2)ACShop的客户分为两种:未注册客户和注册客户。 (3)未注册客户可以浏览或检索出版物,将出版物添加到购物车中。未注册客户进行注册操作之后,成为ACShop注册客户。 (4)注册客户登录之后,可将待购买的出版物添加到购物车中,并进行结账操作。结账操作的具体流程描述如下。 ① 从预先填写的地址列表中选择一个作为本次交易的收货地址。如果没有地址信息,则可以添加新地址。 ② 选择付款方式。ACShop支持信用卡付款和银行转账两种方式。注册客户可以从预先填写的信用卡或银行账号中选择一个付款。若没有付款方式信息,则可以添加新付款方式。 ③ 确认提交购物车中待购买的出版物后,ACShop会自动生成与之相对应的订单。 (5)管理员负责维护在线销售的出版物目录,包括添加新出版物或者更新在售出版物信息等操作。 现采用面向对象方法分析并设计该网上商店ACShop,得到如图3-1所示的用例图和图3-2所示的类图。 图片 图片

参考答案:

“添加新地址”的扩展条件:地址信息为空或没有地址信息。 “添加新付款方式”的扩展条件:付款方式信息为空或没有付款方式信息。

解析(AI 生成):

扩展用例只在基本用例执行到某一点且满足特定条件时才被触发,这里的条件就是“缺少必要信息”。选择收货地址时若地址为空或尚无地址,则转入添加新地址;选择付款方式时若付款方式为空或尚未登记,则转入添加新付款方式。答题要点是写明判定条件并指明被扩展的用例。

[材料型]问答题


60. 【问题3】(7分) 根据说明中的描述,给出图3-2中(1)~(7)所对应的类名。

材料: 试题三(15分) 阅读下列说明和图,回答下列问题,将解答填入对应栏内。 【说明】 某出版社拟开发一个在线销售各种学术出版物的网上商店(ACShop),其主要的功能需求描述如下: (1)ACShop在线销售的学术出版物包括论文、学术报告或讲座资料等。 (2)ACShop的客户分为两种:未注册客户和注册客户。 (3)未注册客户可以浏览或检索出版物,将出版物添加到购物车中。未注册客户进行注册操作之后,成为ACShop注册客户。 (4)注册客户登录之后,可将待购买的出版物添加到购物车中,并进行结账操作。结账操作的具体流程描述如下。 ① 从预先填写的地址列表中选择一个作为本次交易的收货地址。如果没有地址信息,则可以添加新地址。 ② 选择付款方式。ACShop支持信用卡付款和银行转账两种方式。注册客户可以从预先填写的信用卡或银行账号中选择一个付款。若没有付款方式信息,则可以添加新付款方式。 ③ 确认提交购物车中待购买的出版物后,ACShop会自动生成与之相对应的订单。 (5)管理员负责维护在线销售的出版物目录,包括添加新出版物或者更新在售出版物信息等操作。 现采用面向对象方法分析并设计该网上商店ACShop,得到如图3-1所示的用例图和图3-2所示的类图。 图片 图片

参考答案:

(1)目录或出版物目录 (2)待购买的出版物 (3)出版物 (4)论文 (5)学术报告 (8)讲座资料 (7)订单 注:(4)~(6)答案次序可以互换。

解析(AI 生成):

依类图的聚合与泛化关系填名:整体为目录,其中存放待购买的出版物;出版物是父类,论文、学术报告、讲座资料是其子类,三者次序可互换;一次购买行为对应订单。判断依据是继承箭头指向父类、聚合菱形位于整体一端,类名取说明中的业务名词。

[材料型]问答题


61. 【问题1】2分 图(a)中只有一个外部实体E1。使用【说明】中的词语,给出E1的名称。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下: 1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。 2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。 3.根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。 4.客户租借某种音像制品的具体流程如下。 1根据客户提供的用户名和密码,验证客户身份。 2若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。 3若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。 4系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。 5客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。 5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。 6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。 图片 图片

参考答案:

1.E1:客户

解析:

本题考查数据流图的设计和应用。 根据题目说明,本系统的外部实体仅仅涉及到客户,因此系统的顶层数据流图中E1应该对应为客户。 题目的第二个问题在于识别系统中的数据文件D1~D4,根据0层数据流图中的数据文件与处理之间的关系分析可以得知: D1为创建新客户加工的输出,并且为加工1、6和7的输入,再根据题目中的描述,客户信息文件与创建客户信息、预约、归还和履行预约都相关,因此D1便是客户信息文件。同理可分析出D2为音像制品信息文件、D3为租借记录文件、D4为预约记录文件。 图(b)中缺少了3条数据流,我们先检查顶层数据流图和。层数据流是否一致。首先,从顶层数据流图中可以看出,与E1直接相关的数据流共有9条,而在0层数据流图中与E1直接关联的只有7条,因此可以直接断定,图(b)中至少缺少直接与E1相关的两条数据流:新客户创建请求和预约流水号。新客户创建请求通过创建新客户加工将客户的信息写入客户信息文件中,因此其起点和终点分别为:E1和4。同理,预约流水号的起点和终点为5和E1。在说明中,客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。因此,在客户归还和履行预约服务之间存在着数据上的联系。 面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。面向数据结构的设计方法用于规模不大的数据处理系统。

[材料型]问答题


62. 【问题2】4分 使用【说明】中的词语,给出图(b)中的数据存储D1~D4的名称。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下: 1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。 2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。 3.根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。 4.客户租借某种音像制品的具体流程如下。 1根据客户提供的用户名和密码,验证客户身份。 2若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。 3若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。 4系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。 5客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。 5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。 6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。 图片 图片

参考答案:

D1:客户信息文件 D2:音像制品信息文件 D3:租借记录文件 D4:预约记录文件

解析:

本题考查数据流图的设计和应用。 根据题目说明,本系统的外部实体仅仅涉及到客户,因此系统的顶层数据流图中E1应该对应为客户。 题目的第二个问题在于识别系统中的数据文件D1~D4,根据0层数据流图中的数据文件与处理之间的关系分析可以得知: D1为创建新客户加工的输出,并且为加工1、6和7的输入,再根据题目中的描述,客户信息文件与创建客户信息、预约、归还和履行预约都相关,因此D1便是客户信息文件。同理可分析出D2为音像制品信息文件、D3为租借记录文件、D4为预约记录文件。 图(b)中缺少了3条数据流,我们先检查顶层数据流图和。层数据流是否一致。首先,从顶层数据流图中可以看出,与E1直接相关的数据流共有9条,而在0层数据流图中与E1直接关联的只有7条,因此可以直接断定,图(b)中至少缺少直接与E1相关的两条数据流:新客户创建请求和预约流水号。新客户创建请求通过创建新客户加工将客户的信息写入客户信息文件中,因此其起点和终点分别为:E1和4。同理,预约流水号的起点和终点为5和E1。在说明中,客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。因此,在客户归还和履行预约服务之间存在着数据上的联系。 面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。面向数据结构的设计方法用于规模不大的数据处理系统。

[材料型]问答题


63. 【问题3】6分 数据流图(b)缺少了3条数据流,根据说明及数据流图(a)提供的信息,分别指出这3条数据流的起点和终点。 图片

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下: 1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。 2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。 3.根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。 4.客户租借某种音像制品的具体流程如下。 1根据客户提供的用户名和密码,验证客户身份。 2若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。 3若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。 4系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。 5客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。 5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。 6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。 图片 图片

参考答案:

图片 注意:3条数据流无前后顺序区分。

解析:

本题考查数据流图的设计和应用。 根据题目说明,本系统的外部实体仅仅涉及到客户,因此系统的顶层数据流图中E1应该对应为客户。 题目的第二个问题在于识别系统中的数据文件D1~D4,根据0层数据流图中的数据文件与处理之间的关系分析可以得知: D1为创建新客户加工的输出,并且为加工1、6和7的输入,再根据题目中的描述,客户信息文件与创建客户信息、预约、归还和履行预约都相关,因此D1便是客户信息文件。同理可分析出D2为音像制品信息文件、D3为租借记录文件、D4为预约记录文件。 图(b)中缺少了3条数据流,我们先检查顶层数据流图和。层数据流是否一致。首先,从顶层数据流图中可以看出,与E1直接相关的数据流共有9条,而在0层数据流图中与E1直接关联的只有7条,因此可以直接断定,图(b)中至少缺少直接与E1相关的两条数据流:新客户创建请求和预约流水号。新客户创建请求通过创建新客户加工将客户的信息写入客户信息文件中,因此其起点和终点分别为:E1和4。同理,预约流水号的起点和终点为5和E1。在说明中,客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。因此,在客户归还和履行预约服务之间存在着数据上的联系。 面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。面向数据结构的设计方法用于规模不大的数据处理系统。

[材料型]问答题


64. 【问题4】3分 在进行系统分析与设计时,面向数据结构的设计方法(如Jackson方法)也被广泛应用。简要说明面向数据结构设计方法的基本思想及其适用场合。

材料: 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下: 1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。 2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。 3.根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。 4.客户租借某种音像制品的具体流程如下。 1根据客户提供的用户名和密码,验证客户身份。 2若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。 3若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。 4系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。 5客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。 5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。 6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。 图片 图片

参考答案:

面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。 面向数据结构的设计方法用于规模不大的数据处理系统。

解析:

本题考查数据流图的设计和应用。 根据题目说明,本系统的外部实体仅仅涉及到客户,因此系统的顶层数据流图中E1应该对应为客户。 题目的第二个问题在于识别系统中的数据文件D1~D4,根据0层数据流图中的数据文件与处理之间的关系分析可以得知: D1为创建新客户加工的输出,并且为加工1、6和7的输入,再根据题目中的描述,客户信息文件与创建客户信息、预约、归还和履行预约都相关,因此D1便是客户信息文件。同理可分析出D2为音像制品信息文件、D3为租借记录文件、D4为预约记录文件。 图(b)中缺少了3条数据流,我们先检查顶层数据流图和。层数据流是否一致。首先,从顶层数据流图中可以看出,与E1直接相关的数据流共有9条,而在0层数据流图中与E1直接关联的只有7条,因此可以直接断定,图(b)中至少缺少直接与E1相关的两条数据流:新客户创建请求和预约流水号。新客户创建请求通过创建新客户加工将客户的信息写入客户信息文件中,因此其起点和终点分别为:E1和4。同理,预约流水号的起点和终点为5和E1。在说明中,客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。因此,在客户归还和履行预约服务之间存在着数据上的联系。 面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。面向数据结构的设计方法用于规模不大的数据处理系统。

[材料型]问答题


65. 【问题1】(8分) 根据说明中的描述,给出图3-1中C1-C4所对应的类名(类名使用说明中给出的 英文词汇)。

材料: 试题三(共15分) 阅读下列说明和图,回答问题1至问题3.将解答填入答题纸的对应栏内。 【说明】 某公司欲开发一个管理选民信息的软件系统。系统的基本需求描述如下: (1)每个人(Person)可以是一个合法选民(Eligible)或者无效的选民(Ineligible)。 (2)每个合法选民必须通过该系统对其投票所在区域(即选区,Riding)进行注册 (Registration)。每个合法选民仅能注册一个选区。 (3)选民所属选区由其居住地址(Address)决定。假设每个人只有一个地址,地址 可以是镇(Town)或者城市(City)。 (4)某些选区可能包含多个镇,而某些较大的城市也可能包含多个选区。 现采用面向对象方法对该系统进行分析与设计,得到如图3-1所示的初始类图。 图片

参考答案:

1.C1:Address ; C2:Riding ;C3:Ineligible ;C4:Eligible。

解析:

本题考察在面向对象分析与设计过程中,如何利用类图描述系统需求模型及设计模型。考试需要理解面向对象方法的相关概念和思想,并熟悉UML的语法及应用。类图及用例图是考试题中最多出现的两种UML模型。 1.由需求1可知,Person下面只有Ineligible和Eligible,C3是孤立点,C4还与其他类有关系,所以C3是Ineligible,C4是Eligible。Person与C1 的关系是livesAt,所以C1是Address,C2是Riding。 2.Address与Person应为一对多,所以M1是1,M2是*。 Eligible与Riding的关系应该是多对多,所以M3是*,M4是1; 一个选区包含多个镇,每个镇多个地址,所以Address和Riding是多对多。 3.由需求1可知,一个人可能有多个地址,则M1应该为1..。 需求2表示合法选民与选区的关系也变为多对多,所以M4应该改为1..。

[材料型]问答题


66. 【问题2】(3分) 根据说明中的描述,给出图3-1中Ml-M6处的多重度

材料: 试题三(共15分) 阅读下列说明和图,回答问题1至问题3.将解答填入答题纸的对应栏内。 【说明】 某公司欲开发一个管理选民信息的软件系统。系统的基本需求描述如下: (1)每个人(Person)可以是一个合法选民(Eligible)或者无效的选民(Ineligible)。 (2)每个合法选民必须通过该系统对其投票所在区域(即选区,Riding)进行注册 (Registration)。每个合法选民仅能注册一个选区。 (3)选民所属选区由其居住地址(Address)决定。假设每个人只有一个地址,地址 可以是镇(Town)或者城市(City)。 (4)某些选区可能包含多个镇,而某些较大的城市也可能包含多个选区。 现采用面向对象方法对该系统进行分析与设计,得到如图3-1所示的初始类图。 图片

参考答案:

M1:1 ; M2:* ; M3:* ; M4:1 ; M5:* ; M6:* ;

解析:

本题考察在面向对象分析与设计过程中,如何利用类图描述系统需求模型及设计模型。考试需要理解面向对象方法的相关概念和思想,并熟悉UML的语法及应用。类图及用例图是考试题中最多出现的两种UML模型。 1.由需求1可知,Person下面只有Ineligible和Eligible,C3是孤立点,C4还与其他类有关系,所以C3是Ineligible,C4是Eligible。Person与C1 的关系是livesAt,所以C1是Address,C2是Riding。 2.Address与Person应为一对多,所以M1是1,M2是*。 Eligible与Riding的关系应该是多对多,所以M3是*,M4是1; 一个选区包含多个镇,一个城市包含多个选区,所以Address和Riding是多对多。 3.由需求1可知,一个人可能有多个地址,则M1应该为1..。 需求2表示合法选民与选区的关系也变为多对多,所以M4应该改为1..。

[材料型]问答题


67. 【问题3】(4分) 现对该系统提出了以下新需求: (l)某些人拥有在多个选区投票的权利,因此需要注册多个选区: (2)对于满足(1)的选民,需要划定其“主要居住地”,以确定他们应该在哪个 选区进行投票。 为了满足上述需求,需要对图3-1所示的类图进行哪些修改?请用100字以内 文字说明。

材料: 试题三(共15分) 阅读下列说明和图,回答问题1至问题3.将解答填入答题纸的对应栏内。 【说明】 某公司欲开发一个管理选民信息的软件系统。系统的基本需求描述如下: (1)每个人(Person)可以是一个合法选民(Eligible)或者无效的选民(Ineligible)。 (2)每个合法选民必须通过该系统对其投票所在区域(即选区,Riding)进行注册 (Registration)。每个合法选民仅能注册一个选区。 (3)选民所属选区由其居住地址(Address)决定。假设每个人只有一个地址,地址 可以是镇(Town)或者城市(City)。 (4)某些选区可能包含多个镇,而某些较大的城市也可能包含多个选区。 现采用面向对象方法对该系统进行分析与设计,得到如图3-1所示的初始类图。 图片

参考答案:

将M1与M4由1,修改为1..*

解析:

本题考察在面向对象分析与设计过程中,如何利用类图描述系统需求模型及设计模型。考试需要理解面向对象方法的相关概念和思想,并熟悉UML的语法及应用。类图及用例图是考试题中最多出现的两种UML模型。 1.由需求1可知,Person下面只有Ineligible和Eligible,C3是孤立点,C4还与其他类有关系,所以C3是Ineligible,C4是Eligible。Person与C1 的关系是livesAt,所以C1是Address,C2是Riding。 2.Address与Person应为一对多,所以M1是1,M2是*。 Eligible与Riding的关系应该是多对多,所以M3是*,M4是1; 一个选区包含多个镇,一个城市包含多个选区,所以Address和Riding是多对多。 3.由需求1可知,一个人可能有多个地址,则M1应该为1..。 需求2表示合法选民与选区的关系也变为多对多,所以M4应该改为1..。

[材料型]问答题


68. 试题六(共15分) 阅读下列说明和Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新。 现在采用观察者(Observer)模式来开发该系统。观察者模式的类图如图6-1所示。 图片 【Java代码】 import java.util.; interface Observer { public void update(float temp, float humidity, float cleanness); } interface Subject { public void registerObserver(Observer o); //注册对主题感兴趣的观察者 public void removeObserver(Observer o); //删除观察者 public void notifyObservers(); //当主题发生变化时通知观察者 } class EnvironmentData implements (1) { private ArrayList observers; private float temperature, humidity, cleanness; public EnvironmentData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { / 代码省略 / } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); (2) ; } } public void measurementsChanged() { (3) ; } public void setMeasurements(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; (4) ; } } class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData) { this.envData = envData; (5) ; } public void update(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; display(); } public void display() {/ 代码省略 */ } } class EnvironmentMonitor{ public static void main(String[] args) { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay currentDisplay = new CnrrentConditionsDisplay(envData); envData.setMeasurements(80, 65, 30.4f); }

参考答案:

(1)Subject (2)observer.update( temperature,humidity,cleanness ) (3)notifyObservesers() (4)mesasurementsChanged() (5)envData.regisiterObserver(this)

解析:

本题考察观察者(Observer)模式的概念及应用。 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 Observer模式适用于: ①当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立地对象中以使它们可以各自独立地改变和复用。 ②当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。 ③当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的。 观察者模式的结构如下图所示,其中: 图片 Subject (主题)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。 Observer (观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。 ConcreteSubject (具体主题)将有关状态存入一个ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。 ConcreteObserver (具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与主题的状态保持一致;实现Observer的更新接口以使自身状态与主题的状态保持一致。 在本题的说明中,给出了观察者模式的结构图,答题时需要首先确定程序中的类与观察者模式结构的对应关系,也就是要找到哪些是ConcreteSubject,哪些是 ConcreteObserver。由程序上下文可以判断出,类EnvironmentData对应的是ConcreteSubject,类CurrentConditionsDisplay 对应的是ConcreteObserver。根据类图,它们分别为Subject和Observer的子类。由此可以,空(1) Subject。 空(2)要求给出方法notifyObservers的实现,其功能是在主题发生变化时通知观察者。通知的实现是通过向对该主题感兴趣的所有观察者发送update消息实现的。对主题EnvironmentData感兴趣的观察者由向量observers表示,所以在notifyObservers方法中,就是对向量observers中的每个成员发送update消息,因此空(2)应填写 observer.update( temperature,humidity,cleanness )。 方法measurementsChanged表示主题发生了变化,这时应该通知对应的观察者,所以空(3)处应填写notifyObservers()。 方法setMeasurements用于设置发生变化后的主题内容,所以空(4)处应填写measurementsChanged()。 CurrentConditionsDisplay是对主题EnvironmentData感兴趣的一个观察者,要能够获得主题的变化,需要首先将自己注册为该主题的观察者,这个注册行为在其构造函数中完成。因此空(5)处应填写envData.regisiterObserver(this)。

问答题


69. 【问题3】(2分) 根据[说明]中的描述,给出ORS用例图中 (1) 和 (2) 所对应的关系。

材料: 试题三(15分) 阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。 【说明】 在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下: 1.用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。 2.作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置 (存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。 3.审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 4.会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。 系统采用面向对象方法开发,使用UMi进行建模。在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见以下各表。 图片 系统的部分用例图和提交稿件的活动图分别见下图。 图片

参考答案:

问题3:(1):<<extend>>(2):<<include>>

解析:

构建用例图时,常用的方式是先识别参与者,然后确定用例。创建参与者之间的继承关系是为了简化绘图。继承关系可以通过子类型“是一种”父类型进行判定。在本题中,作者和审稿人分别是一种用户,委员会主席是一种特殊审稿人。因此,A1:User、 A2:Author、A3:Reviewer、A4:PCChair。 考查用例时,通过判断用例是哪一个特定参与者发起或者触发,来建立和参与者之间的关联。审稿人可以设定兴趣领域、审阅稿件给出意见和罗列录用或/和拒绝的稿件,因此U1:list accepted/rejiected papers,会议委员会主席可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程,U2和U3分别为browse submitted papers和assign paper to reviewer(可互换)。 考查用例之间的关系时,<<extend>>(扩展)关系可以通过判断是否可以从一个用例的执行中,在需要时转向执行另一个用例,执行完返回继续,即存在<<extend>>关系。<<include>>(包含)定义了用例之间的包含关系,用于一个用例包含另一个用例的行为的建模,通过这种方式,可以把抽象(公共)行为从多个行为中分离出来。本题中,只有作者能提交稿件,“提交稿件”时判断是否登录,如果没有登录,先“登录”,然后返回继续提交稿件,所以(1)处应填<<extend>>。审稿人可以罗列录用和(或)拒绝的稿件,会议委员会主席在关闭审稿过程时须包括罗列录用和(或)拒绝的稿件,即用例“list accepted/rejected papers”和用例“close reviewing process”存在包含关系,所以(2)处应填<<include>>。 可以通过为每个用例构造一个活动图对用例进一步细化。构造活动图时可以通过如下步骤进行:从一个作为起点的初始节点开始;为用例的每个主要步骤添加一个动作:从一个活动到另一个活动、决策点或终点添加一条流;在流分解成不同路线的地方添加决策,并用一个合并将各个流重新合并;在有并行执行活动的地方添加分支和联合;用一个单一的活动终止符号结束。本题中,根据说明中条目2中描述的提交稿件的过程构建活动图,所以Actionl处填enter title and abstract、Action2处填select subject group、 Action3处填select paper location、Action4处填upload paper。

[材料型]问答题


70. 试题五(15分) 阅读下列说明和C++代码,回答问题,将答案填入相应横线处。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如下图所示。 图片 类图 【C++代码】 #include #include using namespace std; class Observer { public: virtual void update(float temp, float humidity, float cleanness)=0; }; class Subject { public: virtual void registerObserver(Observer* o) = 0; //注册对主题感兴趣的观察者 virtual void removeObserver(Observer* o) = 0; //删除观察者 (1) ;//当主题发生变化时通知观察者 }; class EnvironmentData : public Subject { private: vector<Observer*> observers; float temperature, humidity, cleanness; public: void registerObserver(Observer* o) { observers.push_back(o); } void removeObserver(Observer* o) { /* 代码省略 / } void notifyObservers() { for(vector<Observer*>::const_iterator it = observers.begin(); it != observers.end(); it++) {(it)->update(temperature,humidity,cleanness); } } Void measurementsChanged() {notifyObservers(); } void setMeasurements(float temperature, float humidity, float cleanness) { (2) ; (3) ; (4) ; measurementsChanged(); } }; class CurrentConditionsDisplay : public Observer() { private: float temperature, humidity, cleanness; Subject envData; public: CurrentConditionsDisplay(Subject envData) { this->envData = envData; (5) ; } void update(float temperature, float humidity, float cleanness) {this->temperature = temperature; this->humidity = humidity; this->cleanness = cleanness; display(); } void display() { /* 代码省略 / } }; int main() { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay* currentDisplay = new CurrentConditionsDisplay(envData); envData->setMeasurements(80, 65, 30.4f); return 0; }

参考答案:

(1)virtual void notifyObservers() = 0 (2)this->temperature = temperature (3)this->humidity = humidity (4)this->cleanness = cleanness (5)this->envData->registerObserver(this)

解析(AI 生成):

Subject为抽象类,须声明纯虚函数notifyObservers供子类实现,故(1)填virtual void notifyObservers()=0。setter的形参与成员同名,用this->限定后赋值。观察者构造时以this调用registerObserver把自己注册到主题,主题变化后统一通知。

问答题


71. 试题六(15分) 阅读下列说明和JAVA代码,回答问题,将答案填入相应横线处。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者 图片 类图 【Java代码】 import java.util.; interface Observer { public void update(float temp, float humidity, float cleanness); } interface Subject { public void registerObserver(Observer o); //注册对主题感兴趣的观察者 public void removeObserver(Observer o); //删除观察者 (1) ; //当主题发生变化时通知观察者 } class EnvironmentData (2) Subject { private ArrayList observers; private float temperature, humidity, cleanness; public EnvironmentData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { / 代码省略 / } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); observer.update(temperature,humidity,cleanness); } } public void measurementsChanged() {notifyObservers(); } public void setMeasurements(float temperature, float humidity, float cleanness) { (3) ; (4) ; (5) ; measurementsChanged(); } } class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData) { this.envData = envData; envData.registerObserver(this); } public void update(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; display(); } public void display() {/ 代码省略 */ } } class EnvironmentMonitor{ public static void main(String[] args) { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay currentDisplay = new CnrrentConditionsDisplay(envData); envData.setMeasurements(80, 65, 30.4f); } }

参考答案:

(1)public void notifyObservers() (2)implements (3)this.temperature = temperature (4) this.humidity = humidity (5) this.cleanness = cleanness

解析(AI 生成):

接口中的方法只声明不实现,所以(1)填public void notifyObservers()。Java实现接口用implements,填(2)。setter的形参与成员同名,须用this.temperature等限定后赋值,否则成了自赋值;注册观察者仍用observers.add(o)。

问答题


72. 【问题1】(12分) 根据以上说明和C代码,填充(1)~(4)。

材料: 试题四 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 p,q,r:一个子数组的位置从p到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临耐变量 【C代码】 #include #include #define MAX 65536 void merge(int arr[],int p,int q,int r) { int *left, right; int n1,n2,i,j,k; n1=q-p+1; n2=r-q; if((left=(int)malloc((n1+1)sizeof(int)))==NULL) { perror("malloc error"); exit(1); } if((right=(int)malloc((n2+1)*sizeof(int)))==NULL) { perror("malloc error"); exit(1); } for(i=0;i<n1;i++){ left[i]= (1) ; } left[i]=MAX; for(i=0; i<n2; i++){ right[i]=arr[q+i+1]; } right[i]=MAX; i=0; j=0; for(k=p; k<=r ; k++) { if((2)) { arr[k]=right[j] ; j++; }else { arr[k]=left[i]; i++; } } } void mergeSort(int arr[],int begin,int end){ int mid; if( (3) ){ mid= (begin+end)/2 ; mergeSort(arr,begin,mid) ; mergeSort(arr,mid+1,end) ; (4); } }

参考答案:

【问题1】 (1)arr[p+i] (2)left[i]> right[j] (3)begin<end (4)merge(arr,begin,mid,end)

解析(AI 生成):

归并阶段把辅助数组的有序结果写回原数组,故(1)为arr[p+i]。合并时left[i]>right[j]表示右段更小,先取右段以保持升序,即(2)。begin<end是继续划分的条件,填(3);随后调用merge(arr,begin,mid,end)合并。

[材料型]问答题


73. 【问题2】(2分) 根据题干说明和以上C代码,算法采用了(5)算法设计策略。其空间复杂度为(6)(用O符号表示)。

材料: 试题四 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 p,q,r:一个子数组的位置从p到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临耐变量 【C代码】 #include #include #define MAX 65536 void merge(int arr[],int p,int q,int r) { int *left, right; int n1,n2,i,j,k; n1=q-p+1; n2=r-q; if((left=(int)malloc((n1+1)sizeof(int)))==NULL) { perror("malloc error"); exit(1); } if((right=(int)malloc((n2+1)*sizeof(int)))==NULL) { perror("malloc error"); exit(1); } for(i=0;i<n1;i++){ left[i]= (1) ; } left[i]=MAX; for(i=0; i<n2; i++){ right[i]=arr[q+i+1]; } right[i]=MAX; i=0; j=0; for(k=p; k<=r ; k++) { if((2)) { arr[k]=right[j] ; j++; }else { arr[k]=left[i]; i++; } } } void mergeSort(int arr[],int begin,int end){ int mid; if( (3) ){ mid= (begin+end)/2 ; mergeSort(arr,begin,mid) ; mergeSort(arr,mid+1,end) ; (4); } }

参考答案:

【问题2】 (5)分治、(6)O(n)

解析(AI 生成):

算法先递归地把序列一分为二分别排序,再合并有序子序列,属典型分治策略,故(5)填分治。合并需要与原序列等长的辅助数组暂存结果,虽递归深度为对数级,但辅助空间按需分配,总量与元素个数同阶,故空间复杂度为O(n);时间为O(nlogn)。

[材料型]问答题


74. 【问题3】(1分) 两个长度分别为n1和n2的已经排好序的子数组进行归并,根据上述C代码,则元素之间比较次数为(7)。

材料: 试题四 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 p,q,r:一个子数组的位置从p到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临耐变量 【C代码】 #include #include #define MAX 65536 void merge(int arr[],int p,int q,int r) { int *left, right; int n1,n2,i,j,k; n1=q-p+1; n2=r-q; if((left=(int)malloc((n1+1)sizeof(int)))==NULL) { perror("malloc error"); exit(1); } if((right=(int)malloc((n2+1)*sizeof(int)))==NULL) { perror("malloc error"); exit(1); } for(i=0;i<n1;i++){ left[i]= (1) ; } left[i]=MAX; for(i=0; i<n2; i++){ right[i]=arr[q+i+1]; } right[i]=MAX; i=0; j=0; for(k=p; k<=r ; k++) { if((2)) { arr[k]=right[j] ; j++; }else { arr[k]=left[i]; i++; } } } void mergeSort(int arr[],int begin,int end){ int mid; if( (3) ){ mid= (begin+end)/2 ; mergeSort(arr,begin,mid) ; mergeSort(arr,mid+1,end) ; (4); } }

参考答案:

【问题3】 (7)n1+n2

解析(AI 生成):

归并两段有序子数组时采用逐元素比较取小者输出,每输出一个元素对应一次比较,两段元素总数为n1+n2,故比较次数为n1+n2,与元素总数同阶,属线性级开销。理解“比较一次输出一个”即可直接得出,无需推导具体常数。

[材料型]问答题


75. 试题六 阅读下列说明和JAVA代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 命令模式的类图如下,请填写代码到对应的填空内。 图片 Command模式的类图 【Java代码】 public interface Command { (1); } public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { (2); } public void execute() { receiver.action(); } } public class Receiver { public void action() { System.out.println("Executing the command."); } } public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } public class Client { public static void main(String[] args) { // 创建接收者 (3) ; // 创建具体命令,并将接收者注入 Command command = new ConcreteCommand(receiver); // 创建调用者,并将命令注入 (4) ; // 执行命令 (5) ; } }

参考答案:

(1) void execute() (2)this.receiver = receiver (3)Receiver receiver = new Receiver() (4)Invoker invoker = new Invoker(command) (5) invoker.executeCommand()

解析(AI 生成):

命令模式把请求封装成对象,使请求者与执行者解耦。Command只声明execute(),故(1)填void execute()。具体命令持有接收者,构造时用this.receiver绑定,即(2)。客户端先建接收者,再包装成命令交给Invoker,调用executeCommand()即触发action()。

问答题


76. 试题五(共15分,每空3分) 阅读下列说明和C++代码,回答下列问题。 【说明】 在软件系统中,通常都会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图 5-1 所示的类图。Memento 包含了要被恢复的状态。Originator创建并在 Memento 中存储状态。Caretaker 负责从 Memento 中恢复状态。 图片 【C++代码】 #include #include #include using namespace std; class Memento { private: string state; public: Memento(string state) { this->state = state; } string getState() { return state; } }; class Originator { private: string state; public: void setState(string state) { this->state = state; } string getState() { return state; } Memento saveStateToMemento() { return (1); } void getStateFromMemento(Memento Memento) { state = (2); } }; class CareTaker { private: vector mementoList; public: void (3) { mementoList.push_back(state); } Memento (4) { return mementoList[index]; } }; int main(void) { Originator* originator = new Originator(); CareTaker* careTaker = new CareTaker(); originator->setState("State #1"); originator->setState("State #2"); careTaker->add((5)); originator->setState("State #3"); careTaker->add(originator->saveStateToMemento()); originator->setState("State #4"); cout << "Current State:" << "+" << originator->getState() << endl; Memento menento = careTaker->get(0); originator->getStateFromMemento(menento); cout << "First saved State:" << originator->getState() << endl; originator->getStateFromMemento(careTaker->get(1)); cout << "second save State" << "+" << originator->getState() << endl;return 0; }

材料: 试题五(共15分,每空3分) 阅读下列说明和C++代码,回答下列问题。 【说明】 在软件系统中,通常都会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图 5-1 所示的类图。Memcnto 包含了要被恢复的状态。Originator创建并在 Memento 中存储状态。Caretaker 负责从 Memento 中恢复状态。

参考答案:

(1)Memento(state) (2)Memento.getState() (3)add(Memento state) (4)get(int index) (5)originator->saveStateToMemento()

解析(AI 生成):

备忘录模式把状态封装成对象交由负责人保管,以便撤销。Originator保存状态时用当前state构造备忘录返回,即(1)Memento(state);恢复时取getState()赋回state,即(2)。Caretaker用vector管理,存入用add(Memento state)、取出用get(int index)。

问答题


77. import java.util.*; class Memento { private String state; public Memento(String state){ this.state=state; } public String getState(){ return state; } } class Originator{ private String state; public void setState(String state){ this.state=state; } public String getState(){ return state; } public Memento saveStateToMemento( ){ return (1); } public void getStateFromMemento (Memento Memento){ state =(2); } } class CareTaker{ private List mementoList= new ArrayList(); public (3){ mementoList.add(state); } public (4){ return mementoList.get(index); } } class MementoPaneDems{ public static void main(String[] args) { Originator originator =new Originator(); CareTaker careTaker=new CareTaker(); originator.setState("State #1"); originator.setState("State #2"); careTaker.add((5)); originator.setState("State #3"); careTaker.add( originator.saveStateToMemento() ); originator.setState("State #4"); System.out.println("CurrentState"+originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("Frist saved State"+originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State"+originator.getState()); } }

参考答案:

(1)new Memento(state) (2)Memento.getState() (3)void add(Memento state) (4)Memento get(int index) (5)originator.saveStateToMemento()

解析(AI 生成):

备忘录模式把状态封装成对象交由负责人保管,以便撤销。Java用new创建备忘录,即(1)new Memento(state);恢复时调用Memento.getState(),即(2)。Caretaker以List保存,add(Memento state)追加、Memento get(int index)按索引取回,构成(3)(4)。

问答题


78. 【问题1】(5分) 使用说明中的词语,给出图1-1中的实体E1~E5的名称。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要功能如下: (1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。 (2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。 (3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送给库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修的机械问题。 (4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。 (5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。 现采用结构化方法对巴士维修系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 图片

参考答案:

【参考答案】 E1:巴士司机 E2:机械师 E3:会计 E4:主管 E5:库存管理系统

解析(AI 生成):

外部实体是系统之外的数据来源或去向,按说明中的岗位职责判定:巴士司机提交车辆使用与故障信息,机械师完成维修,会计核算成本,主管审批,库存管理系统提供部件库存数据。作答必须沿用说明原文词语,不得自造名称,也不要把数据存储误当实体。

[材料型]问答题


79. 【问题2】(4分) 使用说明中的词语,给出图2中的数据存储D1~D4的名称。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要功能如下: (1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。 (2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。 (3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送给库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修的机械问题。 (4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。 (5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。 现采用结构化方法对巴士维修系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 图片

参考答案:

【参考答案】 D1:巴士列表文件,,,,D2:维修记录文件,,,,D3:部件清单,,,,D4:人事档案

解析(AI 生成):

数据存储是各加工之间共享的数据集合,按流入流出的数据内容命名:车辆基本信息存巴士列表文件,历次维修情况存维修记录文件,部件出入库与库存存部件清单,人员岗位信息存人事档案。命名须与说明用词一致,并注意同一数据存储可被多个加工读写。

[材料型]问答题


80. 【问题3】(4分) 说明图1-2中所存在的问题。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要功能如下: (1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。 (2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。 (3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送给库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修的机械问题。 (4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。 (5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。 现采用结构化方法对巴士维修系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 图片

参考答案:

【参考答案】 缺失以下数据流: (1)名称:待维修机械问题;起点:D2;终点:3完成维修。 (2)名称:实际所用部件;起点:D3;终点:5计算总成本。

解析(AI 生成):

数据流图要求每个加工既有输入又有输出,数据存储也不能被凭空读取。图1-2中“完成维修”缺少来自维修记录文件的待维修机械问题,“计算总成本”缺少来自部件清单的实际所用部件,形成有输出无输入的加工,故问题在于缺失这两条数据流。

[材料型]问答题


81. 【问题4】(2分) 根据说明和图中术语,采用补充数据流的方式,改正图1-2中的问题。要求给出所补充数据流的名称、起点和终点。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要功能如下: (1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。 (2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。 (3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送给库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修的机械问题。 (4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。 (5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。 现采用结构化方法对巴士维修系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片 图片

参考答案:

【参考答案】 补充以下数据流: (1)名称:待维修机械问题;起点:D2;终点:3完成维修。 (2)名称:实际所用部件;起点:D3;终点:5计算总成本。

解析(AI 生成):

改正方式是补画缺失的数据流而非新增加工:由数据存储D2引出待维修机械问题指向加工3完成维修;由D3引出实际所用部件指向加工5计算总成本。答题须写全名称、起点、终点,方向由数据来源指向使用者,且不得与图中已有数据流重名。

[材料型]问答题


82. 【问题1】(5分) 补充图中的联系和联系的类型。

材料: 试题二(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某家电销售电子商务公司拟开发一套信息管理系统,以方便对公司的员工、家电销售、家电厂商和客户等进行管理。 【需求分析】 (1)系统需要维护电子商务公司的员工信息、客户信息、家电信息和家电厂商信息等,员工信息主要包括:工号、姓名、性别、岗位、身份证号、电话、住址,其中岗位包括部门经理和客服等,客户信息主要包括:客户ID、姓名、身份证号、电话、住址、账户余额。家电信息主要包括:家电条码、家电名称、价格、出厂日期、所属商,家电厂商信息包括:厂商ID、厂商名称、电话、法人代表信息、厂址。 (2)电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电,每个家电厂商只能由一名部门经理负责。 (3)客户通过浏览电子商务公司网站查询家电信息,与客服沟通获得优惠后,在线购买。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。 图片 【逻辑结构设计】 根据概念模型设计阶段完成的实体联系图,得出如下关系模式[不完整] 客户(客户ID、姓名、身份证号、电话、住址、账户余额) 员工(工号、姓名、性别、岗位、身份证号、电话、住址) 家电(家电条码、家电名称、价格、出厂日期、(1)) 家电厂商(厂商ID、厂商名称、电话、法人代表信息、厂址、(2)) 购买(订购单号、(3)、金额)

参考答案:

图片

解析(AI 生成):

先确定参与联系的实体,再按业务规则判定类型:一个实体对应多个用1:n,多对多用m:n,一一对应用1:1。联系名取动词或动宾短语,画在两实体之间并标注基数;若联系自身带属性(如日期、数量),应挂在联系上而不是并入某一实体。

[材料型]问答题


83. 【问题2】(5分) 根据题干中的图,将逻辑结构设计阶段生成的关系模式中的空(1)—(3)补充完整,用下画线指出“家电”、“家电厂商”和“购买”关系模式的主键。

材料: 试题二(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某家电销售电子商务公司拟开发一套信息管理系统,以方便对公司的员工、家电销售、家电厂商和客户等进行管理。 【需求分析】 (1)系统需要维护电子商务公司的员工信息、客户信息、家电信息和家电厂商信息等,员工信息主要包括:工号、姓名、性别、岗位、身份证号、电话、住址,其中岗位包括部门经理和客服等,客户信息主要包括:客户ID、姓名、身份证号、电话、住址、账户余额。家电信息主要包括:家电条码、家电名称、价格、出厂日期、所属商,家电厂商信息包括:厂商ID、厂商名称、电话、法人代表信息、厂址。 (2)电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电,每个家电厂商只能由一名部门经理负责。 (3)客户通过浏览电子商务公司网站查询家电信息,与客服沟通获得优惠后,在线购买。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。 图片 【逻辑结构设计】 根据概念模型设计阶段完成的实体联系图,得出如下关系模式[不完整] 客户(客户ID、姓名、身份证号、电话、住址、账户余额) 员工(工号、姓名、性别、岗位、身份证号、电话、住址) 家电(家电条码、家电名称、价格、出厂日期、(1)) 家电厂商(厂商ID、厂商名称、电话、法人代表信息、厂址、(2)) 购买(订购单号、(3)、金额)

参考答案:

【参考答案】 (1)厂商ID。 (2)工号。 (3)家电条码,客户ID,工号。 家电关系的主键:家电条码。 家电厂商关系的主键:厂商ID。 购买关系的主键:订购单号。

解析(AI 生成):

关系模式转换时,1:n联系把1端主键作为外键放入n端:家电引用厂商ID,客户经理用工作号标识。m:n联系须独立成表,故购买关系含家电条码、客户ID、工号三个外键,其自身主键为订购单号。主键加下划线,外键须与参照表主键同名同域。

[材料型]问答题


84. 【问题3】(5分) 电子商务公司的主营业务是销售各类家电,对账户有余额的客户,还可以联合第二方基金公司提供理财服务,为此设立客户经理岗位。客户通过电子商务公司的客户经理和基金公司的基金经理进行理财,每名客户只有一名客户经理和一名基金经理负责,客户经理和基金经理均可负责多名客户。请根据该要求,对题干图进行修改,画出修改后的实体间联系和联系的类型。

材料: 试题二(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某家电销售电子商务公司拟开发一套信息管理系统,以方便对公司的员工、家电销售、家电厂商和客户等进行管理。 【需求分析】 (1)系统需要维护电子商务公司的员工信息、客户信息、家电信息和家电厂商信息等,员工信息主要包括:工号、姓名、性别、岗位、身份证号、电话、住址,其中岗位包括部门经理和客服等,客户信息主要包括:客户ID、姓名、身份证号、电话、住址、账户余额。家电信息主要包括:家电条码、家电名称、价格、出厂日期、所属商,家电厂商信息包括:厂商ID、厂商名称、电话、法人代表信息、厂址。 (2)电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电,每个家电厂商只能由一名部门经理负责。 (3)客户通过浏览电子商务公司网站查询家电信息,与客服沟通获得优惠后,在线购买。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。 图片 【逻辑结构设计】 根据概念模型设计阶段完成的实体联系图,得出如下关系模式[不完整] 客户(客户ID、姓名、身份证号、电话、住址、账户余额) 员工(工号、姓名、性别、岗位、身份证号、电话、住址) 家电(家电条码、家电名称、价格、出厂日期、(1)) 家电厂商(厂商ID、厂商名称、电话、法人代表信息、厂址、(2)) 购买(订购单号、(3)、金额)

参考答案:

图片

解析(AI 生成):

新增客户经理、基金经理两个实体,分别与客户建立联系。因每名客户只有一名客户经理和一名基金经理,而一名经理可负责多名客户,故两个联系都是1:n,1端在经理、n端在客户。若理财签约需记录日期等,应作为联系属性挂在联系上,并标注联系名与基数。

[材料型]问答题


85. 【问题1】(5分) 根据说明中的描述,以及图3-1和图3-2,给出图3-1中C1~C4处所对应的类名(类名使用图3-1和图3-2中给出的英文词汇)。

材料: 试题三(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作,功能需求均使用用例进行描述,其中用例“借书(Check Out 800ks)”的详细描述如下。 参与者:读者<Patron> 典型事件流: 1.输入读者ID: 2.确认该读者能够借阅图书,并记录读者ID; 3.输入所要借阅的图书ID; 4.根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录; 5.通知读者图书归还时间; 重复步骤3~5,直到读者结束借阅图书。 备选事件流: 2a.若读者不能借阅图书,说明读者违反了图书馆的借书制度(例如,没有支付借书费用等)。 ① 告知读者不能借阅,并说明拒绝借阅的原因; ② 本用例结束。 4a.读者要借阅的书无法外借。 ① 告知读者本书无法借阅; ② 回到步骤3。 【说明】 图书的归还时间与读者身份有关。如果读者是教师,图书可以借阅一年:如果是学生,则只能借阅3个月,读者ID中包含读者身份信息,现采用面向对象方法开发该系统,得到如图3-1所示的系统类模型(部分),以及如图3-2所示的系统操作:“checkOut(bookID). (借书)“通信图”(或协作图)。 图片 图片

参考答案:

【参考答案】 C1:Patron C2:Book C3:Catalog C4:CheckoutSessionController

解析(AI 生成):

按类图职责与图中英文词汇对应:借阅者Patron,图书Book,目录Catalog,协调结账会话的边界类CheckoutSessionController。依据是关联与继承:Patron与Catalog交互查询,Catalog聚合Book,控制器接收请求并调度实体,类名须与图中词汇完全一致。

[材料型]问答题


86. 【问题2】(5分) 根据说明中的描述,以及图1和图2,给出图2中M1~M4处所对应的方法名(方法名使用图1和图2中给出的英文词汇)。

材料: 试题三(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作,功能需求均使用用例进行描述,其中用例“借书(Check Out 800ks)”的详细描述如下。 参与者:读者<Patron> 典型事件流: 1.输入读者ID: 2.确认该读者能够借阅图书,并记录读者ID; 3.输入所要借阅的图书ID; 4.根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录; 5.通知读者图书归还时间; 重复步骤3~5,直到读者结束借阅图书。 备选事件流: 2a.若读者不能借阅图书,说明读者违反了图书馆的借书制度(例如,没有支付借书费用等)。 ① 告知读者不能借阅,并说明拒绝借阅的原因; ② 本用例结束。 4a.读者要借阅的书无法外借。 ① 告知读者本书无法借阅; ② 回到步骤3。 【说明】 图书的归还时间与读者身份有关。如果读者是教师,图书可以借阅一年:如果是学生,则只能借阅3个月,读者ID中包含读者身份信息,现采用面向对象方法开发该系统,得到如图3-1所示的系统类模型(部分),以及如图3-2所示的系统操作:“checkOut(bookID). (借书)“通信图”(或协作图)。 图片 图片

参考答案:

【参考答案】 M1:getForCheckOut M2:isFaculty() M3:circle date() M4:recordBookLoan

解析(AI 生成):

借书流程的消息顺序决定方法归属:getForCheckOut取待借图书,isFaculty()判读者身份,circleDate()算借阅期限,recordBookLoan登记借书记录。方法名取图中已有英文词汇,并与各类职责对应。

[材料型]问答题


87. 【问题3】(5分) 用例“借书”的备选事件流4a中,根据借书制度来判定读者能否借阅图书,随着图书馆借书制度的不断完善,需要根据图书馆的实际运行情况来调整具体使用哪些制度,为满足这一要求,在原有类设计的基础上,可以采用何种设计模式?简要说明原因。

材料: 试题三(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作,功能需求均使用用例进行描述,其中用例“借书(Check Out 800ks)”的详细描述如下。 参与者:读者<Patron> 典型事件流: 1.输入读者ID: 2.确认该读者能够借阅图书,并记录读者ID; 3.输入所要借阅的图书ID; 4.根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录; 5.通知读者图书归还时间; 重复步骤3~5,直到读者结束借阅图书。 备选事件流: 2a.若读者不能借阅图书,说明读者违反了图书馆的借书制度(例如,没有支付借书费用等)。 ① 告知读者不能借阅,并说明拒绝借阅的原因; ② 本用例结束。 4a.读者要借阅的书无法外借。 ① 告知读者本书无法借阅; ② 回到步骤3。 【说明】 图书的归还时间与读者身份有关。如果读者是教师,图书可以借阅一年:如果是学生,则只能借阅3个月,读者ID中包含读者身份信息,现采用面向对象方法开发该系统,得到如图3-1所示的系统类模型(部分),以及如图3-2所示的系统操作:“checkOut(bookID). (借书)“通信图”(或协作图)。 图片 图片

参考答案:

【参考答案】 应采用策略模式。策略模式的优势在于,可以灵活地添加对同一问题的不同处理方案,这与题目要求非常吻合。

解析(AI 生成):

借书制度的判定规则会随实际运行不断调整,若把判定逻辑硬编码在借书流程里,每次变更都要改动源代码。策略模式把每种制度封装成实现同一接口的独立策略类,可相互替换,客户端只依赖抽象策略,新增或调整制度时不必修改原有结构,符合开闭原则。

[材料型]问答题


88. 【问题1】 根据以上说明和C代码,填充1—4。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序 的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 P,q,r:一个子数组的位置从P到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临时变量 【C代码】 图片

参考答案:

【参考答案】 k<=r arr[k]=right[j] Begin<end mergeSort(arr,mid+1,end)

解析(AI 生成):

归并排序先划分后合并:k是写回下标,循环条件k<=r;右侧元素较小时arr[k]=right[j];区间至少含两个元素才递归,条件Begin<end;右半段调用mergeSort(arr,mid+1,end)。

[材料型]问答题


89. 【问题2】 根据题干说明和以上C代码,算法采用了(5)算法设计策略。 分析时间复杂度时,列出其递归式位(6),解出渐进时间复杂度为(7)(用O符号表示)。空间复杂度为(8)(用O符号表示)。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序 的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 P,q,r:一个子数组的位置从P到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临时变量 【C代码】 图片

参考答案:

【参考答案】 (5)分治、(6)T(n)=2T(n/2)+O(n)、(7)O(nlogn)、(8)O(n)

解析(AI 生成):

归并排序递归划分再合并,属分治法。每层合并需线性扫描,递归式T(n)=2T(n/2)+O(n),解得O(nlogn)。合并借助与原数组等长的辅助数组,空间复杂度为O(n)。

[材料型]问答题


90. 【问题3】 两个长度分别为n1和n2的已经排好序的子数组进行归并,根据上述C代码,则元素之间比较次数为(9)。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序 的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 P,q,r:一个子数组的位置从P到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临时变量 【C代码】 图片

参考答案:

【参考答案】 n1+n2

解析(AI 生成):

归并两个已排好序的子数组时,每比较一次就有一个元素被放入结果数组,指针只前进不回退,直到某一段取完。最坏情况下每个元素都参与一次比较,比较次数为n1+n2,与两段长度之和同阶,而非乘积。

[材料型]问答题


91. 【C++代码】 #include #include using namespace std; class Observer { public: virtual void update(float temp, float humidity, float cleanness)=0; }; class Subject { public: virtual void registerObserver(Observer* o) = 0; //注册对主题感兴趣的观察者 virtual void removeObserver(Observer* o) = 0; //删除观察者 virtual void notifyObservers() = 0;//当主题发生变化时通知观察者 }; class EnvironmentData : public (1) { private: vector<Observer*> observers; float temperature, humidity, cleanness; public: void registerObserver(Observer* o) { observers.push_back(o); } void removeObserver(Observer* o) { /* 代码省略 / } void notifyObservers() { for(vector<Observer*>::const_iterator it = observers.begin(); it != observers.end(); it++) { (2) ; } } void measurementsChanged() { (3) ; } void setMeasurements(float temperature, float humidity, float cleanness) { this->temperature = temperature; this->humidity = humidity; this->cleanness = cleanness; (4) ; } }; class CurrentConditionsDisplay : public (5) { private: float temperature, humidity, cleanness; Subject envData; public: CurrentConditionsDisplay(Subject* envData) { this->envData = envData; this->envData->registerObserver(this); } void update(float temperature, float humidity, float cleanness) {this-> temperature = temperature; this->humidity = humidity; this->cleanness = cleanness; display(); } void display() { /* 代码省略 / } }; int main() { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay* currentDisplay = new CurrentConditionsDisplay (envData); envData->setMeasurements(80, 65, 30.4f); return 0; }

材料: 试题五(15分) 阅读下列说明和C++代码,回答问题,将答案填入相应横线处。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如图5-1所示。 图片

参考答案:

【参考答案】 (1)Subject (2)(*it)->update(temperature,humidity,cleanness) (3)notifyObservers() (4)measurementsChanged() (5)Observer()

解析(AI 生成):

EnvironmentData继承Subject;通知时遍历容器,用(*it)->update推送最新数据;数据变化后调notifyObservers(),measurementsChanged()为触发入口,(5)填Observer()。

[材料型]问答题


92. 【Java代码】 import java.util.; interface Observer { public void update(float temp, float humidity, float cleanness); } interface Subject { public void registerObserver(Observer o); //注册对主题感兴趣的观察者 public void removeObserver(Observer o); //删除观察者 public void notifyObservers(); //当主题发生变化时通知观察者 } class EnvironmentData implements (1) { private ArrayList observers; private float temperature, humidity, cleanness; public EnvironmentData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { / 代码省略 / } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); (2) ; } } public void measurementsChanged() { (3) ; } public void setMeasurements(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; (4) ; } } class CurrentConditionsDisplay implements (5) { private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData) { this.envData = envData; envData.registerObserver(this); } public void update(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; display(); } public void display() {/ 代码省略 */ } } class EnvironmentMonitor{ public static void main(String[] args) { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay (envData); envData.setMeasurements(80, 65, 30.4f); } }

材料: 试题六(15分) 阅读下列说明和Java代码,回答问题,将答案填入相应横线处。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如图6-1所示。 图片

参考答案:

【参考答案】 (1)Subject (2)observer.update(temperature,humidity,cleanness) (3)notifyObservers() (4)measurementsChanged() (5)Observer

解析(AI 生成):

实现Subject接口;通知时取出观察者转型为Observer,调用update推送数据;变化后调notifyObservers(),measurementsChanged()为触发,(5)填Observer。

[材料型]问答题


93. 【问题1】(5分) 根据说明中的词语,给出图1中的实体E1~E2的名称。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某大型比萨加工和销售商为了有效管理生产和销售情况,欲开发一比萨信息系统,其主要功能如下。 (1) 销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的比萨、期望的交付日期等信息。 (2) 生产控制。根据销售订单以及库存的比萨数量,制定比萨生产计划(包括生产哪些比萨、生产顺序和生产量等),并将其保存在生产计划表中。 (3) 生产。根据生产计划和配方表中的比萨配方,向库存发出原材料申领单,将制作好的比萨的信息存入库存表中,以便及时进行交付。 (4) 采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。 (5) 运送。根据销售订单将比萨交付给客户,并记录在交付记录表中。 (6) 财务管理。在比萨交付后,为客户开具费用清单,收款并出具收据:依据完成的采购订单给供应商支付原材料费用并出具支付细节;将收款和支付记录存入收支记录表中。 (7) 存储。检查库存的原材料、比萨和未完成订单,确定所需原材料。 现采用结构化方法对比萨信息系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

E1:客户;E2:供应商

解析(AI 生成):

顶层数据流图中,E1向系统提交订单并接收发货信息,是客户;E2接收采购订单并供应原材料,是供应商。判断外部实体看数据流的源和宿:位于系统边界之外、与系统交换数据的人、组织或外部系统即为实体,名称直接取自说明中的词语。

[材料型]问答题


94. 【问题2】(5分) 根据说明中的词语,给出图2中的数据存储D1~D5的名称。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某大型比萨加工和销售商为了有效管理生产和销售情况,欲开发一比萨信息系统,其主要功能如下。 (1) 销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的比萨、期望的交付日期等信息。 (2) 生产控制。根据销售订单以及库存的比萨数量,制定比萨生产计划(包括生产哪些比萨、生产顺序和生产量等),并将其保存在生产计划表中。 (3) 生产。根据生产计划和配方表中的比萨配方,向库存发出原材料申领单,将制作好的比萨的信息存入库存表中,以便及时进行交付。 (4) 采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。 (5) 运送。根据销售订单将比萨交付给客户,并记录在交付记录表中。 (6) 财务管理。在比萨交付后,为客户开具费用清单,收款并出具收据:依据完成的采购订单给供应商支付原材料费用并出具支付细节;将收款和支付记录存入收支记录表中。 (7) 存储。检查库存的原材料、比萨和未完成订单,确定所需原材料。 现采用结构化方法对比萨信息系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

D1:销售订单表;D2:库存表;D3:生产计划表;D4:配方表;D5:采购订单表

解析(AI 生成):

数据存储按业务单据命名:D1销售订单表、D2库存表、D3生产计划表、D4配方表、D5采购订单表。依据是流入流出该存储的数据流内容,名称取说明中的业务名词。

[材料型]问答题


95. 【问题3】(5分) 根据说明中的词语,补充图2中缺失的数据流及其起点和终点。

材料: 试题一(15分) 阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。 【说明】 某大型比萨加工和销售商为了有效管理生产和销售情况,欲开发一比萨信息系统,其主要功能如下。 (1) 销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的比萨、期望的交付日期等信息。 (2) 生产控制。根据销售订单以及库存的比萨数量,制定比萨生产计划(包括生产哪些比萨、生产顺序和生产量等),并将其保存在生产计划表中。 (3) 生产。根据生产计划和配方表中的比萨配方,向库存发出原材料申领单,将制作好的比萨的信息存入库存表中,以便及时进行交付。 (4) 采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。 (5) 运送。根据销售订单将比萨交付给客户,并记录在交付记录表中。 (6) 财务管理。在比萨交付后,为客户开具费用清单,收款并出具收据:依据完成的采购订单给供应商支付原材料费用并出具支付细节;将收款和支付记录存入收支记录表中。 (7) 存储。检查库存的原材料、比萨和未完成订单,确定所需原材料。 现采用结构化方法对比萨信息系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。 图片 图片

参考答案:

数据流名称:支付细节;起点:财务管理;终点:E2 数据流名称:销售订单;起点:销售订单表;终点:5运送 数据流名称:生产计划;起点:D3;终点:3生产 数据流名称:库存量;起点:D2;终点:4采购 数据流名称:原材料数量;起点:4采购;终点:D2 数据流名称:未完成订单;起点:销售订单表;终点:7存储。

解析(AI 生成):

按加工缺口补数据流:财务管理送支付细节给E2;销售订单表向运送提供销售订单;D3向生产提供生产计划;D2向采购提供库存量,采购把原材料数量写回D2;销售订单表向存储送未完成订单。

[材料型]问答题


96. 【问题1】(6分) 根据表3-1中所标记的候选设计类,请按照其类别将编号C1~C12分别填入表3-2中的(a)、(b)和(c)处。

材料: 试题三(15分) 阅读下列系统设计说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某玩具公司正在开发一套电动玩具在线销售系统,用于向注册会员提供端对端的玩具定制和销售服务。在系统设计阶段,“创建新订单(New Order)”的设计用例详细描述如表3-1所示,候选设计类分类如表3-2所示,并根据该用例设计出部分类图如图3-1所示。 图片 (续表) 图片 表3-2 候选设计类分类 图片 图片 在订单处理的过程中,会员可以点击“取消订单”取消该订单。如果支付失败,该订单将被标记为挂起状态,可后续重新支付,如果挂起超时30分钟未支付,系统将自动取消该订单。订单支付成功后,系统判断订单类型: (1)对于常规订单,标记为备货状态,订单信息发送到货运部,完成打包后交付快递发货; (2)对于定制订单,会自动进入定制状态,定制完成后交付快递发货。会员在系统中点击“收货”按钮变为收货状态,结束整个订单的处理流程。根据订单处理过程所设计的状态图如图3-2所示。 图片

参考答案:

(a):C2、C4、C5、C7、C11 (b):C3、C8、C10 (c):C1、C6、C9、C12

解析(AI 生成):

按职责归类:描述业务数据、需持久保存者为实体类;与用户或外部系统交互的界面为边界类;协调流程、承担业务控制者为控制类。据此把C2、C4、C5、C7、C11归入(a),C3、C8、C10归入(b),C1、C6、C9、C12归入(c)。

[材料型]问答题


97. 【问题1】(8分) 根据说明和C代码,填充C代码中的空(1)~(4)。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 计算一个整数数组a的最长递增子序列长度的方法描述如下: 假设数组a的长度为n,用数组b的元素b[i]记录以a[i](0%E2%89%A4i%EF%BC%9Cn)为结尾元素的最长递增子序列的长度为 图片 ;其中b[i]满足最优子结构,可递归定义为: 图片 【C代码】 下面是算法的C语言实现。 (1)常量和变量说明 a:长度为n的整数数组,待求其最长递增子序列 b:长度为n的数组,b[i]记录以a[i](0%E2%89%A4i%3Cn)为结尾元素的最长递增子序列的长度,其中0≤i<n len:最长递增子序列的长度 i, j:循环变量 temp:临时变量 (2)C程序 图片

参考答案:

(1)b[0]=1 (2)j<i (3)a[j]<=a[i] (4)b[i]=len+1

解析(AI 生成):

求最长递增子序列:b[0]=1赋初值;内层j从0到i-1,条件j<i;仅当a[j]<=a[i]才可接在其后;取最大长度后b[i]=len+1。四空对应初值、循环边界、可接条件与长度赋值。

[材料型]问答题


98. 【问题2】(4分) 根据说明和C代码,算法采用了 (5) 设计策略,时间复杂度为 (6) (用O符号表示)。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 计算一个整数数组a的最长递增子序列长度的方法描述如下: 假设数组a的长度为n,用数组b的元素b[i]记录以a[i](0%E2%89%A4i%EF%BC%9Cn)为结尾元素的最长递增子序列的长度为 图片 ;其中b[i]满足最优子结构,可递归定义为: 图片 【C代码】 下面是算法的C语言实现。 (1)常量和变量说明 a:长度为n的整数数组,待求其最长递增子序列 b:长度为n的数组,b[i]记录以a[i](0%E2%89%A4i%3Cn)为结尾元素的最长递增子序列的长度,其中0≤i<n len:最长递增子序列的长度 i, j:循环变量 temp:临时变量 (2)C程序 图片

参考答案:

(5)动态规划法 (6) 图片

解析(AI 生成):

算法用b[i]记录以各元素结尾的最长递增子序列长度,由前向后递推,属于动态规划法。外层i走n步,内层j最多比较i次,总比较约n(n-1)/2次,时间复杂度O(n²);只用一个长度为n的数组,空间复杂度O(n)。

[材料型]问答题


99. 【问题3】(5分) 已知数组a={3,10,5,15,6,8},据说明和C代码,给出数组b的元素值。

材料: 试题四(15分) 阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。 【说明】 计算一个整数数组a的最长递增子序列长度的方法描述如下: 假设数组a的长度为n,用数组b的元素b[i]记录以a[i](0%E2%89%A4i%EF%BC%9Cn)为结尾元素的最长递增子序列的长度为 图片 ;其中b[i]满足最优子结构,可递归定义为: 图片 【C代码】 下面是算法的C语言实现。 (1)常量和变量说明 a:长度为n的整数数组,待求其最长递增子序列 b:长度为n的数组,b[i]记录以a[i](0%E2%89%A4i%3Cn)为结尾元素的最长递增子序列的长度,其中0≤i<n len:最长递增子序列的长度 i, j:循环变量 temp:临时变量 (2)C程序 图片

参考答案:

B={1,2,2,3,3,4}

解析(AI 生成):

逐个递推:3结尾只有自身得1;10接3得2;5接3得2;15接10或5得3;6接3或5得3;8接3、5、6得4。故b={1,2,2,3,3,4},各值即以对应元素结尾的最长递增子序列长度。

[材料型]问答题


100. 【问题2】(4分) 补充图2-1中的联系并指明其联系类型。联系名可为:联系1,联系2,…

材料: 试题二 阅读下列说明,回答问题1至问题4,将解答填入对应栏内。【说明】 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 1.对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括:客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括:车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表2-1所示。 图片 2.记录维修车辆的故障信息。包括:维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为:维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书。如表2-2所示。 图片 3.维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表2-3所示。 图片 4.客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,记录在委托书中。 根据需求阶段收集的信息,设计的实体联系图(图2-1)和关系模式(不完整)如下所示。图2-1中业务员和维修工是员工的子实体。 【概念结构设计】 图片 【逻辑结构设计】 客户( (5) ,折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书( (6) ,维修类型,作业分类,结算方式,进厂时间, 预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单( (7) ,工时) 员工( (8) ,工种,员工类型,级别)

参考答案:

图片

解析(AI 生成):

联系从说明中的动词找:客户提交委托书、委托书包含维修项目、业务员受理委托、维修工执行维修。再按一端能否对应多个实例判定类型,如客户与委托书为1:n、委托书与维修项目为m:n,在图上画出菱形联系并标注两端基数。

[材料型]问答题


101. 【问题3】(4分) 根据图2-1和说明,将逻辑结构设计阶段生成的关系模式中的空(5)~(8)补充完整。

材料: 试题二 阅读下列说明,回答问题1至问题4,将解答填入对应栏内。【说明】 某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 1.对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括:客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括:车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表2-1所示。 图片 2.记录维修车辆的故障信息。包括:维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为:维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书。如表2-2所示。 图片 3.维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表2-3所示。 图片 4.客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,记录在委托书中。 根据需求阶段收集的信息,设计的实体联系图(图2-1)和关系模式(不完整)如下所示。图2-1中业务员和维修工是员工的子实体。 【概念结构设计】 图片 【逻辑结构设计】 客户( (5) ,折扣率,联系人,联系电话) 车辆(车牌号,客户编号,车型,颜色,车辆类别) 委托书( (6) ,维修类型,作业分类,结算方式,进厂时间, 预计完工时间,登记日期,故障描述,总费用) 维修项目(维修项目编号,维修项目,单价) 派工单( (7) ,工时) 员工( (8) ,工种,员工类型,级别)

参考答案:

(5)客户编号,客户名称,客户性质 (6)委托书编号,客户编号,车牌号,业务员编号 或:委托书编号,车牌号,业务员编号 (7)委托书编号,维修工编号,维修项目编号 (8)员工编号,员工姓名

解析(AI 生成):

实体转关系、属性列全;1:n联系把一方主键并入多方作外键;m:n联系单独建关系,主键为两端主键组合。故(5)客户属性,(6)委托书编号、车牌号、业务员编号,(7)委托书编号、维修工编号、维修项目编号,(8)员工编号与姓名。

[材料型]问答题


102. 试题一 某电商平台需对电子产品、服装等多种商品进行快速复制,现使用原型模式设计商品体系,通过统一接口实现不同类型商品的克隆,客户端无需关心具体商品类型。 【C++】 #include #include #include using namespace std; class Product{ protected: int price; string productName; public: (1)= 0; }; class Dianzichanpin : public Product{//电子产品类 private: int productNum; int sock; public: Dianzichanpin(int p,string PName,int s,int pNum):sock(s),productNum(pNum){ this->price = p; this->productName = PName; } Dianzichanpin(const Dianzichanpin & cp) { this->price = cp.price; this->productName = cp.productName; this->sock = cp.sock; this->productNum = cp.productNum; } Productclone(){ return (2); }; }; class Fuzhuang : public Product{//服装类 private: int productNum; int sock; public: Fuzhuang(int p,string PName,int s,int pNum):sock(s),productNum(pNum){ this->price = p; this->productName = PName; } Fuzhuang(const Fuzhuang & cp) { this->price = cp.price; this->productName = cp.productName; this->sock = cp.sock; this->productNum = cp.productNum; } Productclone(){ return (3); }; }; int main() { Dianzichanpin * dian = new Dianzichanpin(4999,"华为",50,1001); Product* clonedian = (4); Fuzhuang * Fu = new Fuzhuang(1099,"巴黎世家",51,2001); Product* clonefu = (5); return 0; }

材料: 试题一 某电商平台需对电子产品、服装等多种商品进行快速复制,现使用原型模式设计商品体系,通过统一接口实现不同类型商品的克隆,客户端无需关心具体商品类型。 【C++】 #include #include #include using namespace std; class Product{ protected: int price; string productName; public: (1)= 0; }; class Dianzichanpin : public Product{//电子产品类 private: int productNum; int sock; public: Dianzichanpin(int p,string PName,int s,int pNum):sock(s),productNum(pNum){ this->price = p; this->productName = PName; } Dianzichanpin(const Dianzichanpin & cp) { this->price = cp.price; this->productName = cp.productName; this->sock = cp.sock; this->productNum = cp.productNum; } Productclone(){ return (2); }; }; class Fuzhuang : public Product{//服装类 private: int productNum; int sock; public: Fuzhuang(int p,string PName,int s,int pNum):sock(s),productNum(pNum){ this->price = p; this->productName = PName; } Fuzhuang(const Fuzhuang & cp) { this->price = cp.price; this->productName = cp.productName; this->sock = cp.sock; this->productNum = cp.productNum; } Productclone(){ return (3); }; }; int main() { Dianzichanpin * dian = new Dianzichanpin(4999,"华为",50,1001); Product* clonedian = (4); Fuzhuang * Fu = new Fuzhuang(1099,"巴黎世家",51,2001); Product* clonefu = (5); return 0; }

参考答案:

(1) virtual Product* clone() = 0 (2) new Dianzichanpin(*this) (3) new Fuzhuang(*this) (4) dian->clone() (5) Fu->clone()

解析:

空(1),这里需要声明一个纯虚函数,作为原型模式的核心接口。virtual Product* clone() = 0 表示基类 Product 不提供 clone 的实现,强制每个派生类必须自己实现如何复制自己。virtual 保证通过基类指针调用时能正确触发多态,Product* 作为返回类型让不同派生类的副本都能用统一的基类指针接收,= 0 表示这是纯虚函数,Product 因此成为抽象类,不能直接实例化。

空(2)Dianzichanpin 类的 clone() 需要返回当前对象的一个副本。new Dianzichanpin(*this) 利用已有的复制构造函数来完成复制:this 取出当前对象本身,传给复制构造函数,在堆上生成一个新的 Dianzichanpin 对象并返回其地址。返回类型是 Product,而 new Dianzichanpin(...) 会自动向上转型为基类指针,类型完全匹配。这就是原型模式中"自我复制"的标准写法。

空(3)与空(2)逻辑完全相同,只是类名换成 Fuzhuang。return new Fuzhuang(*this); 调用 Fuzhuang 的复制构造函数,用当前对象 *this 初始化一个新对象,在堆上分配内存并返回基类指针。每个派生类的 clone() 都返回自己类型的新实例,但通过基类指针统一管理,这正是多态的体现。

空(4)dian 是 Dianzichanpin* 类型的指针,调用其 clone() 成员函数用 -> 运算符。dian->clone() 会因为 clone() 是虚函数而动态绑定到 Dianzichanpin::clone(),返回一个指向新 Dianzichanpin 副本的 Product* 指针,赋值给 Product* clonedian 正好类型匹配。这里体现的是:客户端只需要知道基类接口,不需要知道具体是哪个派生类。

空(5)与空(4)同理,Fu 是 Fuzhuang* 类型,Fu->clone() 虚函数调用会绑定到 Fuzhuang::clone(),返回指向新 Fuzhuang 副本的 Product* 指针。注意原题此处变量名写成了 clonedian,与第(4)空重复会导致编译错误,实际应改为其他名字如 clonefu,但填空的内容就是 Fu->clone(),考察的是通过基类指针统一调用派生类复制方法的能力。

问答题


103. 试题二 某电商平台需对电子产品、服装等多种商品进行快速复制,现使用原型模式设计商品体系,通过统一接口实现不同类型商品的克隆,客户端无需关心具体商品类型。 【java】 abstract class Product { protected int price; protected String productName; public ____(1); } class Dianzichanpin extends Product { private int productNum; private int sock; public Dianzichanpin(int p, String PName, int s, int pNum) { this.sock = s; this.productNum = pNum; this.price = p; this.productName = PName; } public Dianzichanpin(Dianzichanpin cp) { this.price = cp.price; this.productName = cp.productName; this.sock = cp.sock; this.productNum = cp.productNum; } public Product clone() { return (2); } } class Fuzhuang extends Product { private int productNum; private int sock; public Fuzhuang(int p, String PName, int s, int pNum) { this.sock = s; this.productNum = pNum; this.price = p; this.productName = PName; } public Fuzhuang(Fuzhuang cp) { this.price = cp.price; this.productName = cp.productName; this.sock = cp.sock; this.productNum = cp.productNum; } public Product clone() { return (3)_; } } public class Main { public static void main(String[] args) { Dianzichanpin dian = new Dianzichanpin(4999, "华为", 50, 1001); Product clonedian = (4) ; Fuzhuang Fu = new Fuzhuang(1099, "巴黎世家", 51, 2001); Product clonefu = _(5); } }

参考答案:

(1) abstract Product clone();(2) new Dianzichanpin(this) (3) new Fuzhuang(this) (4) dian.clone() (5) Fu.clone()

解析:

空(1)Java中用abstract关键字代替C++的= 0来声明抽象方法。abstract Product clone();表示Product是抽象类,clone()没有实现,强制每个子类必须重写。Java中所有非private、非static、非final的方法默认就是虚函数,所以不需要写virtual关键字,这是Java和C++在多态实现上的核心区别。

空(2)clone()方法需要返回当前对象的一个副本。new Dianzichanpin(this)中的this就是当前对象的引用,传给复制构造函数,在堆上创建一个新的Dianzichanpin对象。Java没有指针,不需要解引用操作,也不需要->运算符,直接用.调用方法,new出来的对象自动向上转型为Product类型。

空(3)与空(2)完全相同的逻辑,只是类名换成Fuzhuang。return new Fuzhuang(this);调用Fuzhuang的复制构造函数完成深拷贝,返回的引用自动转型为Product,这就是原型模式中每个子类负责复制自己的标准Java写法。

空(4)dian是Dianzichanpin类型的引用,调用clone()用.运算符。dian.clone()由于方法重写的多态机制,实际执行的是Dianzichanpin类中的clone(),返回一个Product类型的引用,赋值给Product clonedian完全匹配。Java的多态是运行时动态绑定,不需要virtual关键字修饰。

空(5)同理,Fu.clone()调用Fuzhuang类的clone()方法,返回Product类型引用。原题此处变量名写成了clonedian与第(4)空重复,Java中变量名重复会直接编译报错,实际应改为clonefu,但填空内容就是Fu.clone(),考察的是通过基类引用统一调用不同子类克隆方法的原型模式核心思想。

问答题


104. 试题五(15分) 阅读下列说明和C++代码,补全程序中空格处的代码。 【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示: 图片 为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图5-1所示。 图片 其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。 【C++代码】 #include using namespace std; class FlyBehavior{ public:virtual void fly()=0; }; class QuackBehavior{ public:virtual void quack() = 0; }; class FlyWithWings:public FlyBehavior{ public:void fly(){cout<< “使用翅膀飞行 ! ” <<endl; } }; class FlyNoWay:public FlyBehavior{ public:void fly(){ cout<< “不能飞行!”<<endl;} }; class Quack:public QuackBehavior{ public:void quack(){ cout<<“发出\‘嘎嘎\’声 !”<<endl; } }; class Squeak:public QuackBehavior{ public:void quack(){cout<<“发出空气与橡皮摩擦声!”<<endl; } }; class QuackNoWay:public QuackBehavior{ public:void quack (){ cout<<“不能发声 !”<<endl; } }; class Duck{ protected: FlyBehavior* (1) ; QuackBehavior* (2) ; public: void fly(){ (3) ; } void quack(){ (4) ;); virtual void display()=0; }; class RubberDuck:public Duck{ public: RubberDuck(){ flyBehavior=new (5) ; quackBehavior=new Squeak(); } void display(){/此处省略显示橡皮鸭的代码/ } }; //其他代码省略

参考答案:

(1)fiyBehavior (2)quackBehavior (3)flyBehavior->fly() (4)quackBehavior->quack() (5)FlyNoWay()

解析(AI 生成):

鸭子把飞行、发声委托给行为类,持有flyBehavior与quackBehavior成员,(1)(2)填二者;两方法分别调用flyBehavior->fly()与quackBehavior->quack();不能飞者用FlyNoWay()。

问答题


105. 试题五(15分) 阅读下列说明和 C++代码,将应填入(n)处的字句写在答题区的对应栏内。 【说明】 生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 5-1 所示为其类图。 图片 【C++代码】 #include #include using namespace std; class Product { private: string partA, partB; public: Product() { } void setPartA(const string& s) { partA = s; } void setPartB(const string& s) { partB = s; } // 其余代码省略 }; class Builder { public: (1); virtual void buildPartB() = 0; (2); }; class ConcreteBuilder1 : public Builder { private: Product* product; public: ConcreteBuilder1() { product = new Product(); } void buildPartA() { (3)("Component A"); } void buildPartB() { (4)("Component B"); } Product* getResult() { return product; } // 其余代码省略 }; class ConcreteBuilder2 : public Builder { /* 代码省略 / }; class Director { private: Builder builder; public: Director(Builder* pBuilder) { builder = pBuilder; } void construct() { (5); builder->buildPartB(); Product* p = builder->getResult(); // 其余代码省略 } // 其余代码省略 }; int main() { Director* director1 = new Director(new ConcreteBuilder1()); director1->construct(); delete director1; return 0; }

材料: 试题五(15分) 阅读下列说明和 C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 5-1 所示为其类图。 图片 【C++代码】 #include #include using namespace std; class Product { private: string partA, partB; public: Product() { } void setPartA(const string& s) { partA = s; } void setPartB(const string& s) { partB = s; } // 其余代码省略 }; class Builder { public: (1); virtual void buildPartB() = 0; (2); }; class ConcreteBuilder1 : public Builder { private: Product* product; public: ConcreteBuilder1() { product = new Product(); } void buildPartA() { (3)("Component A"); } void buildPartB() { (4)("Component B"); } Product* getResult() { return product; } // 其余代码省略 }; class ConcreteBuilder2 : public Builder { /* 代码省略 / }; class Director { private: Builder builder; public: Director(Builder* pBuilder) { builder = pBuilder; } void construct() { (5); builder->buildPartB(); Product* p = builder->getResult(); // 其余代码省略 } // 其余代码省略 }; int main() { Director* director1 = new Director(new ConcreteBuilder1()); director1->construct(); delete director1; return 0; }

参考答案:

(1)virtual void buildPartA() = 0 (2) virtual Product * getResult() = 0 (3)product->setPartA (4)product->setPartB (5) builder->buildPartA();

解析(AI 生成):

(1)virtual void buildPartA()=0,(2)virtual Product* getResult()=0;product->setPartA、setPartB装配;指挥者调builder->buildPartA()。

问答题


106. 试题六(15分) 阅读下列说明和Java代码,将应填入(n)处的字句写在答题区的对应栏内。 【说明】 生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图6-1所示为其类图。 【Java代码】 import java.util.*; class Product { private String partA; private String partB; public Product() {} public void setPartA(String s) { partA = s; } public void setPartB(String s) { partB = s; } } interface Builder { public (1) ; public void buildPartB(); public (2) ; } class ConcreteBuilder1 implements Builder { private Product product; public ConcreteBuilder1() { product = new Product(); } public void buildPartA() { (3) ("Component A"); } public void buildPartB() { (4) ("Component B"); } public Product getResult() { return product;} } class ConcreteBuilder2 implements Builder { // 代码省略 } class Director { private Builder builder; public Director(Builder builder) {this.builder = builder; } public void construct() { (5) ; builder.buildPartB(); Product p=builder.getResult(); // 代码省略 } } class Test { public static void main(String[] args) { Director director1 = new Director(new ConcreteBuilder1()); director1.construct(); } }

参考答案:

(1)void buildPartA() (2)Product getResult() (3)product.setPartA (4)product.setPartB (5)builder.buildPartA();

解析(AI 生成):

Builder声明(1)void buildPartA(),(2)Product getResult();用product.setPartA、setPartB装配;Director调builder.buildPartA()。

问答题


107. 【问题3】(5分) 若快递驿站还兼有代缴水电费业务,请增加新的“水电费缴费记录”实体,并给出客户和水电费缴费记录之间的“缴纳”联系,对图1-1进行补充。“水电费缴费记录”实体包括编号、客户手机号码、缴费类型、金额和时间,请给出“水电费缴费记录”的关系模式,并说明其完整性约束。

材料: 试题二 某小区快递驿站代为收发各家快递公司的包裹,为规范包裹收发流程,提升效率,需要开发一个信息系统。请根据下述需求描述完成该系统的数据库设计。 【需求描述】 (1)记录快递公司和快递员的信息。快递公司信息包括公司名称、地址和一个电话;快递员信息包括姓名、手机号码和所属公司名称。一个快递公司可以有若干快递员,一个快递员只能属于一家快递公司。 (2)记录客户信息,客户信息包括姓名、手机号码和客户等级。驿站对客户进行等级评定,等级高的客户在驿站投递包裹有相应的优惠。 (3)记录包裹信息,便于快速查找和管理。包裹信息包括包裹编号、包裹到达驿站时间、客户手机号码和快递员手机号码。快递驿站每个月根据收发的包裹数量,与各快递公司结算代收发的费用。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示 图片 【逻辑结构设计】 根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整): 快递公司(公司名称,地址,电话) 快递员(姓名,快递员手机号码, (a) ) 客户(姓名,客户手机号码,客户等级) 包裹(编号,到达时间, (b) ,快递员手机号码)

参考答案:

图片 水电费缴费记录(编号,客户手机号码,缴费类型,金额,时间),编号为主键;客户手机号码为外键

解析(AI 生成):

新增实体后,客户与水电费缴费记录为一对多“缴纳”联系,缴费记录中客户手机号码作为外键引用客户。关系模式为水电费缴费记录(编号,客户手机号码,缴费类型,金额,时间),编号唯一标识记录作主键,客户手机号码为外键,各属性取非空值。

[材料型]问答题


108. 试题五 阅读以下说明和C++代码,填补代码中的空缺,将解答填入答题区的对应栏。 【说明】 在股票交易中,股票代理根据客户发出的股票操作指示进行股票的买卖操作。其类图如下图所示,相应的C++代码附后。 图片 类图 【C++代码】 #include #include #include using namespace std; class Stock { private: string name; int quantity; public: Stock(string name,int quantity) {this->name=name; this->quantity =quantity;} void buy() {cout<<"[买进]股票名称:"<<name<<",数量:"<<quantity<< endl;} void sell() {cout<<"[卖出]股票名称:"<<name<<",数量:"<<quantity <<endl;} }; class Order{ public: virtual void execute()=0; }; class BuyStock:(1) { private: Stock* stock; public: BuyStock(Stock* stock){(2)__ =stock; } void execute(){ stock一>buy(); } }; //类SellStock的实现与BuyStock类似,此处略 class Broker{ private: Vector<Order*> orderList; public: void takeOrder((3) order){ orderList.push_back(order);} void placeOrders() { for(int i=0;i<orderList.size(); i++){(4) ->execute();} orderList.clear(); } }; class StockCommand{ public: void main(){ Stock* aStock=new Stock("股票A",10); StockbStock=new Stock("股票B",20); OrderbuyStockOrder=new BuyStock(aStock); Order* sellStockOrder=new SellStock(bStock); Broker* broker=new Broker(); broker->takeOrder(buyStockOrder); broker->takeOrder(sellStockOrder); broker-> (5); } }; int main(){ StockCommand* stockCommand=new StockCommand(); stockCommand->main(); delete stockCommand; }

参考答案:

(1)public Order(2) this->stock 或(this).stock (3) Order (4)orderList[i] 或 *(orderList+i) (5) placeOrders()

解析(AI 生成):

BuyStock 继承 Order 并实现 execute,故(1)public Order;同名成员用 this->stock;(3)Order* 支撑多态;(4)orderList[i];(5)placeOrders()。

问答题


109. 试题六(15分) 阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某软件系统中,已设计并实现了用于显示地址信息的类Address(如图6-1所示),现要求提供基于Dutch语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言的接口,决定采用适配器(Adapter)模式实现该要求,得到如图6-1所示的类图。 图片 图片 图6-1 适配器模式类图 【Java代码】 import java.util.*; Class Address{ public void street() { //实现代码省略 } public void zip() { //实现代码省略 } public void city() { //实现代码省略 } ∥其他成员省略 } class DutchAddress{ public void straat() { //实现代码省略 } public void postcode() { //实现代码省略 } public void plaats() { //实现代码省略 } //其他成员省略 } class DutchAddressAdapter extends DutchAddress { private (1) ; public DutchAddressAdapter (Address addr){ address= addr; } public void straat() { (2) ; } public void postcode() { (3) ; } public void plaats(){ (4) ; } //其他成员省略 } class Test { public static void main(String[] args) { Address addr= new Address(); (5) ; System.out.println("\n The DutchAddress\n"); testDutch(addrAdapter); } Static void testDutch(DutchAddress addr){ addr.straat(); addr.postcode(); addr.plaats(); } }

参考答案:

参考答案: (1)Address address; (2)address.street(); (3)address.zip(); (4)address.city(); (5)DutchAddress addrAdapter=new DutchAddressAdaptor(addr);

解析:

参考答案: (1)Address address; (2)address.street(); (3)address.zip(); (4)address.city(); (5)DutchAddress addrAdapter=new DutchAddressAdaptor(addr);

编程题


110. 试题五(每空3分) 阅读下列说明和C++代码,回答下列问题。 【说明】 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server和Access两种数据库以及系统中的数据库表Department为例,其类图如图5所示。 图片 【C++代码】 #include using namespace std; class Department{/代码省略/}; class IDepartment{ public: (1)=0; (2)=0; }; class SqlserverDepartment: (3){ public: void Insert(Department* department){ cout<<"Insert a record into Department in SQL Server!\n"; //其余代码省略 } Department GetDepartment(int id){ } }; class AccessDepartment: public IDepartment { public: void Insert(Department* department){ cout<<"Insert a record into Department in ACCESS!\n"; //其余代码省略 } Department GetDepartment(int id){ /代码省略/ } }; (4){ public: _(5)___=0; }; class SqlServerFactory: public IFactory{ public: IDepartment* CreateDepartment() {return new SqlserverDepartment(); } }; class AccessFactory:public IFactory{ public: IDepartment* CreateDepartment() { return new AccessDepartment() ; } //其余代码省略 };

材料: 试题五(每空3分) 阅读下列说明和C++代码,回答下列问题。 【说明】 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server和Access两种数据库以及系统中的数据库表Department为例,其类图如图5所示。 图片 【C++代码】 #include using namespace std; class Department{/代码省略/}; class IDepartment{ public: (1)=0; (2)=0; }; class SqlserverDepartment: (3){ public: void Insert(Department* department){ cout<<"Insert a record into Department in SQL Server!\n"; //其余代码省略 } Department GetDepartment(int id){ } }; class AccessDepartment: public IDepartment { public: void Insert(Department* department){ cout<<"Insert a record into Department in ACCESS!\n"; //其余代码省略 } Department GetDepartment(int id){ /代码省略/ } }; (4){ public: _(5)___=0; }; class SqlServerFactory: public IFactory{ public: IDepartment* CreateDepartment() {return new SqlserverDepartment(); } }; class AccessFactory:public IFactory{ public: IDepartment* CreateDepartment() { return new AccessDepartment() ; } //其余代码省略 };

参考答案:

(1)virtual void Insert(Department* department) (2)virtual Department GetDepartment(int id) (3)public IDepartment (4)class IFactory (5)virtual IDepartment* CreateDepartment()

解析(AI 生成):

接口用纯虚函数声明 Insert 与 GetDepartment;(3)public IDepartment;(4)class IFactory;(5)virtual IDepartment* CreateDepartment()。

编程题


111. 试题六(每空3分) 阅读下列说明和Java代码,回答下列问题。 【说明】 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SOLServer和Access两种数据库以及系统中的数据库表Department为例,其类图如图6所示。 图片 【Java代码】 import java.util.*; class Department{ /代码省略 / } interface IDepartment{ (1); (2); } class SqlserverDepartment _(3)___{ public void Insert(Department department){ System.out.println("Insert a record into Department in SQL Server!"); //其余代码省略 } public Department GetDepartment(int id){ } } class AccessDepartment implements IDepartment { public Void Insert(Department department){ System.out.println("Insert a record into Department in ACCESS!"); //其余代码省略 } public Department GetDepartment(int id){ } } _(4){ (5)_; } class SqlServerFactory implements IFactory{ public IDepartment CreateDepartment(){ return new SqlserverDepartment(); } //其余代码省略 } class AccessFactory implements IFactory{ public Department CreateDepartment(){ return new AccessDepartment(); } //其余代码省略 }

参考答案:

(1)void Insert(Department department) (2)Department GetDepartment(int id) (3)implements IDepartment (4)interface IFactory (5)IDepartment CreateDepartment()

解析(AI 生成):

IDepartment 声明 Insert 与 GetDepartment;(3)implements IDepartment;(4)interface IFactory;(5)IDepartment CreateDepartment()。

编程题