一、问答题
1、阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某房产中介连锁企业欲开发一个基于Web的房屋中介信息系统,以有效管理房源和客户,提高成交率。该系统的主要功能是:
1.房源采集与管理。系统自动采集外部网站的潜在房源信息,保存为潜在房源。由经纪人联系确认的潜在房源变为房源,并添加出售/出租房源的客户。由经纪人或客户登记的出售/出租房源,系统将其保存为房源。房源信息包括基本情况、配套设施、交易类型、委托方式、业主等。经纪人可以对房源进行更新等管理操作。
2.客户管理。求租/求购客户进行注册、更新,推送客户需求给经纪人,或由经纪人对求租/求购客户进行登记、更新。客户信息包括身份证号、姓名、手机号、需求情况、委托方式等。
3.房源推荐。根据客户的需求情况(求购/求租需求情况以及出售/出租房源信息),向已登录的客户推荐房源。
4.交易管理。经纪人对租售客户双方进行交易信息管理,包括订单提交和取消,设 置收取中介费比例。财务人员收取中介费之后,表示该订单已完成,系统更新订单状态和 房源状态,向客户和经纪人发送交易反馈。
5.信息查询。客户根据自身查询需求查询房屋供需信息。
现采用结构化方法对房屋中介信息系统进行分析与设计,获得如图1-1 所示的上下文数据流图和图1-2所示的0层数据流图。

【问题 1】 (4分)
使用说明中的词语,给出图1-1中的实体E1-E4的名称。
【问题 2】 (4分)
使用说明中的词语,给出图1-2中的数据存储Dl-D4的名称。
【问题 3】 (3 分)
根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。
【问题 4 】 (4 分)
根据说明中术语,给出图1-1中数据流"客户信息"、"房源信息"的组成。
参考答案:
【问题 1】 (4分)
答:E1客户E2经纪人E3财务人员E4外部网站
【问题 2】 (4分)
答:D1客户信息表/客户记录表D2潜在房源表mmm/mn
D3房源表 D4 订单记录表
【问题 3】 (3 分)

【问题 4 】 (4 分)
答:房源信息包括基本情况、配套设施、交易类型、委托方式、主业等。
客户信息包括身份证号、姓名、手机号、需求情况、委托方式等
解析:
<问题 1>根据说明中的描述,图1-1中的实体E1代表客户,E2代表经纪人,E3代表财务人员,E4代表外部网站。这些实体与系统中的不同角色和用户对应。
<问题 2>在图1-2的数据存储中,D1应为客户信息表或客户记录表,用于存储客户信息;D2应为潜在房源表,用于存储从外部网站采集的潜在房源信息;D3为房源表,用于存储已确认的房源信息;D4为订单记录表,用于存储交易相关的订单信息。
<问题 3>根据说明和图中术语,图1-2中缺失的数据流包括经纪人录入和更新房源信息的数据流,以及客户查询房源信息的数据流。这些数据流的起点和终点分别是相关的角色或功能与数据存储之间。
<问题 4>根据说明中的描述,图1-1中的数据流"客户信息"主要包括身份证号、姓名、手机号、需求情况、委托方式等;数据流"房源信息"主要包括基本情况、配套设施、交易类型、委托方式以及业主信息等。
2、阅读下列说明,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某集团公司拥有多个分公司,为了方便集团公司对分公司各项业务活动进行有效管 理,集团公司决定构建一个信息系统以满足公司的业务管理需求。
【需求分析】
1.分公司关系需要记录的信息包括分公司编号、名称、经理、联系地址和电话。分公司编号唯一标识分公司信息中的每一个元组。每个分公司只有一名经理,负责该分公司的管理工作。每个分公司设立仅为本分公司服务的多个业务部门,如研发部、财务部、采购部、销售部等。
2.部门关系需要记录的信息包括部门号、部门名称、主管号、电话和分公司编号。部门号唯一标识部门信息中的每一个元组。每个部门只有一名主管,负责部门的管理工作。每个部门有多名员工,每名员工只能隶属于一个部门。
3.员工关系需要记录的信息包括员工号、姓名、隶属部门、岗位、电话和基本工资。其中,员工号唯一标识员工信息中的每一个元组。岗位包括:经理、主管、研发员、业务员等。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如图2-1 所示:

【关系模式设计】
分公司(分公司编号,名称,(a),联系地址,电话)
部门(部门号,部门名称,(b),电话)
员工(员工号,姓名(c),电话,基本工资)
【问题 1】 (4分)
根据问题描述,补充4个联系,完善图 2-1的实体联系图。联系名可用联系1、联系2、
联系3和联系4代替,联系的类型为 1:1、1:n 和 m:n (或 1:1、1:*和*:*)。
【问题 2】(5分)
根据题意,将关系模式中的空 (a)-(c) 补充完整。
【问题 3】 (4 分)
给出"部门"和"员工"关系模式的主键和外键。
【问题 4】 (2 分)
假设集团公司要求系统能记录部门历任主管的任职时间和任职年限,那么是否需要在数据库设计时增设一个实体?为什么?
参考答案:
【问题 1】 (4分)
答:

【问题 2】(5分)
答:(a)经理
(b)主管号,分公司编号
(c)隶属部门,岗位
【问题 3】 (4 分)
答:
部门 主键:部门号 外键:分公司编号,主管号
员工 主键:员工号 外键:隶属部门
【问题 4】 (2 分)
答:不需要增加实体。
因为它可以直接归属到联系当中,他的联系可以直接写成关系模式,所以不需要增加实体。
解析:
根据题目描述和需求分析的说明,我们可以对每个问题进行详细的解答。对于问题一,根据题目给出的实体关系描述,我们可以补充完善实体联系图,明确各个实体之间的联系类型。对于问题二,根据题目的关系模式设计,我们可以补充完善关系模式中的空缺字段,确保关系模式能够完整反映题目的业务需求。对于问题三,我们可以根据关系模式的定义来确定关系模式的主键和外键,保证数据的唯一性和完整性。对于问题四,考虑到题目中的要求是关于部门主管的任职时间和任职年限的记录,这些信息可以直接在已有的部门关系中增加相应的字段来存储,无需增设新的实体。
3、阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。
【说明】
社交网络平台 (SNS) 的主要功能之一是建立在线群组,群组中的成员之间可以互相分享或挖掘兴趣和活动。每个群组包含标题、管理员以及成员列表等信息。
社交网络平台的用户可以自行选择加入某个群组。每个群组拥有一个主页,群组内的所有成员都可以查看主页上的内容。如果在群组的主页上发布或更新了信息,群组中的成员会自动接收到发布或更新后的信息。
用户可以加入一个群组也可以退出这个群组。用户退出群组后,不会再接收到该群组发布或更新的任何信息。
现采用面向对象方法对上述需求进行分析与设计,得到如表3-1所示的类列表和如图3-1所示的类图。

【问题1】(6分)
根据说明中的描述,给出图 3-1 中 Cl C3 所对应的类名。
【问题2】 (6分)
图 3-1 中采用了哪一种设计模式?说明该模式的意图及其适用场合。
【问题3】 (3分)
现在对上述社交网络平台提出了新的需求:一个群体可以作为另外一个群体中的成员,例如群体 A 加入群体 B 。那么,群体A 中的所有成员就自动成为群体 B 中的成员。
若要实现这个新需求,需要对图3-1进行哪些修改? (以文字方式描述)
参考答案:
【问题1】(6分)
答:
C1:SNSGroupC2:SNSUserC3:SNSAdmin(C2可以和C3互换位置)
【问题2】 (6分)
答:
采用了观察者模式。
改模式的意图当被观察者发生改变的时候会给观察者发送消息通知,让它们随之发生改变。
适用场合一般适用于一个被观察者改变时观察者也随之改变的场合。
【问题3】 (3分)
答:
可以在SNSSubject下面增加一个被观察者对象,然后它可以在观察者对象这里增加一个加入另外群体的一个方法,以实现接收被观察者发送的通知。
解析:
根据说明中的描述,C1代表群组,C2代表用户,C3代表管理员。这三个类分别对应社交网络平台中的群组、用户和管理员实体。
4、阅读下列说明和 C 代码,回答问题 1至问题 3,将解答写在答题纸的对应栏内。
【说明】

【问题 1】(8分)
根据题干说明,填充 C 代码中的空(1)-(4)。
【问题2】 (4分)
根据题干说明和 C 代码,算法采用的设计策略为(5)
算法的时间复杂度为(6),(用O表示)。
【问题 3】 (3 分〉
给定字符序列 ACCGGUAGU ,根据上述算法求得最大字符对数为(7)。
参考答案:
【问题 1】(8 分)
答:
(1)max=C[i][j-1]
(2)t=1
(3)isMatch(B[t],B[j])
(4)C[i][j-1]
【问题2】 (4分)
答:
(5)动态规划 (6)O(n3)
【问题 3】 (3 分〉
答:(7)4
解析:
问题 1:根据题目说明和提供的C代码片段,空(1)应该填写max的赋值语句,对应代码中的max记录当前最大字符对数;空(2)是初始化指针t的语句,对应代码中初始化指针t为1;空(3)是调用函数判断当前字符是否匹配的语句,对应代码中isMatch函数的调用;空(4)是更新当前位置的字符对数的语句,对应代码中C[i][j]的更新。
问题2:根据题目说明和C代码片段,算法采用的是动态规划的设计策略,通过状态转移方程来求解最大字符对数。算法的时间复杂度为O(n^3),因为算法中涉及到三层循环,即遍历字符串的每个字符,以及状态转移方程中的两个维度。
问题3:给定字符序列 ACCGGUAGU,根据算法,最大字符对数为4。因为在这个序列中,可以找到连续的字符对"CC"、“GG”、“UA”、“GU”,它们的个数都是最大的,都为4。
5、阅读下列说明和C++代码,回答问题,将解答填入答题纸的对应栏内。
【说明】
某航空公司的会员积分系统将其会员划分为:普卡 (Basic)、银卡(Silver)和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积 的里程数进行调整。描述会员等级调整的状态图如图 5-1 所示。现采用状态 (State) 模式实现上述场景,得到如图 5-2 所示的类图。

【问题1】(15分)
阅读上述说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
参考答案:
注意:原版的题目应该是Cbasic、CSilve。
(1) virtual double travel(int miles,FrequentFlyer* context)=0
(2)context->setState(context->Cbasic)
(3)context->setState(context->CSilve)
(4)context->setState(context->Cbasic)
(5)context->setState(context->CSilve)
解析:
根据题目描述和提供的类图,我们可以理解这是一个使用状态模式实现的航空公司会员积分系统。在状态模式中,每个会员等级(普卡、银卡、金卡)都是一个状态,而会员的累积里程和等级调整则是状态之间的转换。因此,我们需要根据这些信息进行填空。
对于第一个空,由于是纯虚函数,我们需要声明一个纯虚函数,该函数接受里程数和当前状态的指针作为参数,并返回double类型的结果,代表积分或者其他与里程相关的数值。因此填写为:virtual double travel(int miles,FrequentFlyer* context)=0;。
接下来的几个空都与状态转换有关。第二个空应该是将状态设置为普卡会员的操作,第三个空是将状态设置为银卡会员的操作。因此填写为:context->setState(context->Cbasic); 和 context->setState(context->CSilver);。这两个调用setState方法的地方分别表示将状态设置为普卡和银卡。
第四个空是关于旅行的操作,旅行后应该计算里程并更新状态。根据之前设置的纯虚函数,这里应该调用该函数进行里程的计算和状态的更新。因此填写为:context->travel(miles, context);。该函数会计算里程并可能更新会员的状态。
最后一个空再次设置为银卡状态,因此填写为:context->setState(context->CSilver);。这样,整个流程就完成了从非会员到普卡会员再到银卡会员的转换过程。
6、
阅读下列说明和 Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银卡(Silver)和金卡 (Gold)
三个等级。非会员 (NonMember)可以申请成为普卡会员。会员的等级根据其 一年内累积的里程数进行调整。描述会员等级调整的状态图如图 6-1 所示 。现采用状态 (State) 模式
实现上述场景,得到如图 6-2 所示的类图。


参考答案:
(1)abstract double travel(int miles,FrequentFlyer context)
(2)context.setState(new CSilver())
(3)context.setState(new C Gold ())
(4)context.setState(new CSilver())
(5)context.setState(new C Basic ())
解析:
首先,根据题目描述和提供的类图,我们知道这是一个使用状态模式实现的会员积分系统。状态模式主要用于将一个复杂系统的不同状态封装在不同的类中,通过状态转移来处理不同的业务逻辑。
对于第一个空,根据抽象类的定义和常见的设计模式实践,我们可以推测该方法是定义在不同状态类中的公共方法,用于计算旅行积分。方法的声明应该是抽象的,表示不同的状态类需要根据自己的业务逻辑实现该方法。因此填写为:abstract double travel(int miles,FrequentFlyer context)。
第二、三个空根据状态转换图,我们知道银卡会员的累积里程达到要求可以升级为金卡会员,所以填写 context.setState(new CGold())。注意此处类的命名应该是CGold,而不是C Gold。
第四个空,根据状态转换图,我们知道普卡会员降级应该转为非会员或者重新注册为普卡会员。具体的实现可能依赖于系统的具体需求,因此此处可以填写 context.setState(new CBasic()) 或 context.setState(new NonMember())。
最后一个空,根据状态转换图,我们知道所有会员注销应该转为非会员状态,所以填写 context.setState(new NonMember())。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!




