软件设计师第二期模考试卷(案例分析)
发布时间:2024-11-15 09:11:59浏览次数:02023 下半年软件设计师第二期模考试卷(案例分析)1、阅读下列说明和图,回答问题 1 至问题 3。【说明】某城市的各国家公园周边建造了许多供游客租用的小木屋和营地,为此,该城市设置了一个中心售票处和若干个区域售票处。游客若想租用小木屋或营地,必须前往中心售票处进行预定并用现金支付全额费用。所有的预定操作全部由售票处的工作人员手工完成。现欲开发一信息系统,实现小木屋和营地的预定及管理功能,以取代手工操作。该系统的主要功能描述如下:1.管理预定申请。游客可以前往任何一个售票处提出预定申请。系统对来自各个售票处的预定申请进行统一管理。2.预定。预定操作包含登记游客预定信息、计算租赁费用、付费等步骤。3.支付管理。游客付费时可以选择现金和信用卡付款两种方式。使用信用卡支付可以享受 3%的折扣,现金支付没有折扣。4.游客取消预定。预定成功之后,游客可以在任何时间取消预定,但需支付赔偿金,剩余部分则退还给游客。赔偿金的计算规则是,在预定入住时间之前的 48 小时内取消,支付租赁费用 10%的赔偿金;在预定入住时间之后取消,则支付租赁费用 50%的赔偿金。5.自动取消预定。如果遇到恶劣天气(如暴雨、山洪等),系统会自动取消所有的预定,发布取消预定消息,全额退款。6.信息查询。售票处工作人员查询小木屋和营地的预定情况和使用情况,以判断是否能够批准游客的预定申请。现采用面向对象方法开发上述系统,得到如表 3-1 所示的用例列表和表 3-2 所示的类列表。对应的用例图和类图分别如图 3-1 和 3-2 所示。 表 3-1 表 3-2 类列表
class CashContext {private: CashSuper *cs;public: CashContext(int type) { switch(type) { case NORMAL: //正常收费 ( 2 ) ; break; case CASH_RETURN: //满 300 返 100 ( 3 ) ; break; case CASH_DISCOUNT: //打八折 ( 4 ) ; break; }}double GetResult(double money) { ( 5 ) ; }};//此处略去 main()函数试题答案:(1)virtual double acceptCash(double money) = 0(2)cs = new CashNormal()(3)cs = new CashReturn(300,100)(4)cs = new CashDiscount(0.8)(5)return cs->acceptCash(money)6、 阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在对应栏内。【说明】 某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满 300 返 100)等等。现采用策略(Strategy)模式实现该要求,得到如图 6-1所示的类图。 图 6-1 策略模式类图问题内容:【Java 代码】import java.util.*;enum TYPE { NORMAL, CASH_DISCOUNT, CASH_RETURN};interface CashSuper { public ( 1 ) ;}class CashNormal implements CashSuper{ // 正常收费子类 public double acceptCash(double money){
return money; }}class CashDiscount implements CashSuper { private double moneyDiscount; // 折扣率 public CashDiscount(double moneyDiscount) { this moneyDiscount = moneyDiscount; } public double acceptCash(double money) { return money* moneyDiscount; }}class CashReturn implements CashSuper { // 满额返利 private double moneyCondition; private double moneyReturn; public CashReturn(double moneyCondition, double moneyReturn) { this.moneyCondition =moneyCondition; // 满额数额 this.moneyReturn =moneyReturn; // 返利数额 } public double acceptCash(double money) { double result = money; if(money >= moneyCondition ) result=money-Math.floor(money/moneyCondition ) * moneyReturn; return result; }}class CashContext_{ private CashSuper cs; private TYPE t; public CashContext(TYPE t) { switch(t){ case NORMAL: // 正常收费 ( 2 ) ; break; case CASH_DISCOUNT: // 打 8 折 ( 3 ) ; break; case CASH_RETURN: // 满 300 返 100 ( 4 ) ; break; } } public double GetResult(double money) { ( 5 ) ; } //此处略去 main()函数}试题答案:(1)double acceptCash(double money) (2)cs = new CashNormal()(3)cs = new CashDiscount(0.8)(4)cs = new CashReturn(300,100)(5)return cs.acceptCash(money)
图 3-1 用例图问题内容:【问题 1】(6 分) 根据说明中的描述与表 3-1,给出图 3-1 中 UC1~UC6 处所对应的用例名称。【问题 2】 (7 分) 根据说明中的描述与表 3-2,给出图 3-2 中 C1~C7 处所对应的类名。【问题 3】(2 分)对于某些需求量非常大的小木屋或营地,说明中功能 4 的赔偿金计算规则,不足以弥补取消预定所带来的损失。如果要根据预定的时段以及所预定场地的需求量,设计不同层次的赔偿金计算规则,需要对图 3-2 进行怎样的修改?(请用文字说明)试题答案:
【问题 1】UC1: CheckAvailability UC2: MakeReservation UC3: GetDiscount UC4: MangeCashPaymentUC5: ManageCrCardPayment UC6: CalcuateRefund注:4 和 5 可以互换【问题 2】C1 NationaIPark C2: RateC3: TicketingOfficer C4: PaymentC5: Discount C6: CasbPaymentC7: CreditCardPayment注:6 和 7 可以互换【问题 3】解答 1:增加一个新的类.该类与类 Reservationltem 之间有关联关系。或解答 2:修改 Rate 类.使其具有计算赔偿金的功能。回答出其中一种修改方式即可。2、阅读以下说明和数据流图,回答问题 1 至问题 4。【说明】 现准备为某银行开发一个信用卡管理系统 CCMS,该系统的基本功能为: 1.信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交 CCMS。如果信用卡申请被银行接受,CCMS 将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封拒绝函。非信用卡客户收到确认函后成为信用卡客户。 2.信用卡激活。信用卡客户向 CCMS 提交激活请求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS 将激活通知发送给客户,告知客户其信用卡是否被成功激活。 3.信用卡客户信息管理。信用卡客户的个人信息可以在 CCMS 中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。 4.交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在 CCMS 中。信用卡客户可以通过 CCMS 查询并核实其交易信息(包括信用卡交易记录及交易额)。 图 1-1 和图 1-2 分别给出了该系统的顶层数据流图和 0 层数据流图的初稿。 图 1-1 顶层数据流图
图 1-2 0 层数据流图问题内容:【问题 1】(3 分) 根据【说明】,将图 1-1 中的 E1~E3 填充完整。【问题 2】(3 分) 图 1-1 中缺少三条数据流,根据【说明】,分别指出这三条数据流的起点和终点。(注:数据流的起点和终点均采用图中的符号和描述)【问题 3】(5 分) 图 1-2 中有两条数据流是错误的,请指出这两条数据流的名称,并改正。(注:数据流的起点和终点均采用图中的符号和描述)【问题 4】(4 分) 根据【说明】,将图 1-2 中 P1~P4 的处理名称填充完整。 图 1-1 顶层数据流图
图 1-2 0层数据流图试题答案:【问题 1】(3 分) E1:非信用卡客户(1 分) E2:信用卡客户 (1 分) E3:银行(1 分)【问题 2】(3 分) 注:每条数据流的起点和终点全部答对方可给 1 分【问题 3】(5 分)错误的数据流注:每个名称各 0.5 分改正后的数据流:
注:每条数据流的名称、起点和终点全部答对方可给 2 分【问题 4】(4 分)P1:交易信息查询 P2:客户信息管理P3:信用卡激活 P4:信用卡申请3、回答问题 1 至问题 4【说明】某汽车维修公司为了便于管理车辆的维修情况,拟开发一套汽车维修管理系统,请根据下述需求描述完成该系统的数据库设计。【需求描述】(1)客户信息包括:客户号、客户名、客户性质、折扣率、联系人、联系电话。客户性质有个人或单位。客户号唯一标识客户关系中的每一个元组。(2)车辆信息包括:车牌号、车型、颜色和车辆类别。一个客户至少有一辆车,一辆车只属于一个客户。(3)员工信息包括:员工号、员工名、岗位、电话、家庭住址。其中,员工号唯一标识员工关系中的每一个元组。岗位有业务员、维修工、主管。业务员根据车辆的故障情况填写维修单。(4)部门信息包括:部门号、名称、主管和电话,其中部门号唯一确定部门关系的每一个元组。每个部门只有一名主管,但每个部门有多名员工,每名员工只属于一个部门。(5)维修单信息包括:维修单号、车牌号、维修内容、工时。维修单号唯一标识维修单关系中的每一个元组。一个维修工可接多张维修单,但一张维修单只对应一个维修工。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示【逻辑结构设计】根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):客户(客户号,客户名,(a),折扣率,联系人,联系电话)车辆(车牌号,(b),车型,颜色,车辆类别)员工(员工号,员工名,岗位,(c),电话,家庭住址)部门(部门号,名称,主管,电话)维修单(维修单号,(d),维修内容,工时)问题内容:【问题 1】(6 分)根据问题描述,补充 3 个联系,完善图 2-1 的实体联系图。联系名可用联系 1、联系 2 和联系 3 代替,
联系的类型为 1:1、1:n 和 m:n(或 1:1、1:*和*.*)。【问题 2】(4 分)根据题意,将关系模式中的空(a)~(d)的属性补充完整,并填入答题纸对应的位置上。【问题 3】(2 分)分别给出车辆关系和维修单关系的主键与外键。【问题 4】(3 分)如果一张维修单涉及多项维修内容,需要多个维修工来处理,那么哪个联系类型会发生何种变化?你认为应该如何解决这一问题?试题答案:【问题 1】(6 分)联系 1:客户和车辆:1:n联系 2:部门和员工:1:n联系 3:维修工和维修单:1:n【问题 2】(4 分)a:客户性质 b:客户号 c:部门号 d:车牌号,员工号【问题 3】(2 分)车辆关系的主键:车牌号 外键:客户号维修单关系的主键:维修单号 外键:车牌号,员工号【问题 4】(3 分)维修工和维修单之间的联系类型会发生变化,从 1:n 变成 m:n。对应的需要增加维修关系,m:n 关系不能归并,需要将其单独加入一个联系中,将维修单的属性员工号(维修工)删掉,新建一个关系模式维修。维修(员工号(维修工),维修单号,维修地点,维修时间)4、【说明】设某一机器由 n 个部件组成,每一个部件都可以从 m 个不同的供应商处购得。供应商 j 供应的部件 i 具有重量 wij和价格 cij。设计一个算法,求解总价格不超过上限 cc 的最小重量的机器组成。采用回溯法来求解该问题:首先定义解空间。解空间由长度为 n 的向量组成,其中每个分量取值来自集合{1,2,…,m},将解空间用树形结构表示。接着从根结点开始,以深度优先的方式搜索整个解空间。从根结点开始,根结点成为活结点,同时也成为当前的扩展结点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新结点。判断当前的机器价格(c11)是否超过上限(cc),重量(w11)是否比当前已知的解(最小重量)大,若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,根结点不再是扩展结点。继续向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新结点。同样判断当前的机器价格(c11+c21)是否超过上限(cc),重量(w11+w21)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,原来的结点不再是扩展结点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活结点为止。 问题内容:【C 代码】下面是该算法的 C 语言实现。(1)变量说明n:机器的部件数m:供应商数cc:价格上限w[][]:二维数组,w[i][j]表示第 j 个供应商供应的第 i 个部件的重量c[][]:二维数组,c[i][j]表示第 j 个供应商供应的第 i 个部件的价格bestW:满足价格上限约束条件的最小机器重量
bestC:最小重量机器的价格bestX[]:最优解,一维数组,bestX[i]表示第 i 个部件来自哪个供应商cw:搜索过程中机器的重量cp:搜索过程中机器的价格x[]:搜索过程中产生的解,x[i]表示第 i 个部件来自哪个供应商i:当前考虑的部件,从 0 到 n - 1j:循环变量(2)函数 backtrackint n = 3;int m = 3;int cc = 4;int w[3][3] = {{1,2,3},{3,2,1},{2,2,2}};int c[3][3] = {{1,2,3},{3,2,1},{2,2,2}};int bestW = 8;int bestC = 0;int bestX[3] = {0,0,0};int cw = 0;int cp = 0;int x[3] = {0,0,0};int backtrack(int i){ int j = 0; int found = 0; if(i > n - 1){ /*得到问题解*/ bestW = cw; bestC = cp; for(j = 0; j < n; j++){ (1) ; }return 1; } if(cp <= cc){ /*有解*/ found = 1; } for(j = 0; (2) ; j++){ /*第 i 个部件从第 j 个供应商购买*/(3) ; cw = cw + w[i][j]; cp = cp + c[i][j];if(cp <= cc && (4) ){ /*深度搜索,扩展当前结点*/ if(backtrack(i + 1)){ found = 1; } } /*回溯*/ cw = cw - w[i][j]; (5) ; } return found;} 试题答案:(1)bestX[j] = x[j](2)j < m(3)x[i] = j(4)cw < bestW
(5)cp = cp - c[i][j] 5、阅读下列说明和 C++代码,将应填入 (n) 处的字句写在对应栏内。【说明】 某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满 300 返 100)等等。现采用策略(Strategy)模式实现该要求,得到如图 5-1 所示的类图。 图 5-1 策略模式类图问题内容:【C++代码】#include <iostream>using namespace std;enum TYPE{NORMAL, CASH_DISCOUNT, CASH_RETURN};class CashSuper{public: ( 1 ) ;};class CashNormal : public CashSuper { //正常收费子类public: double acceptCash(double money) { retum money; }}; class CashDiscount : public CashSuper {private: double moneyDiscount; // 折扣率public: CashDiscount(double discount) { moneyDiscount= discount; } double acceptCash(double money) { retum money * moneyDiscount; }};class CashRetum : public CashSuper { // 满额返利private: double moneyCondition; // 满额数额 double moneyReturn; // 返利数额public: CashRetnm(double motieyCondition, double moneyReturn) { this->moneyCondition=moneyCondition; this->moneyReturn=moneyReturn; } double acceptCash(double money) { double result = money; if(money>=moneyCondition) result=money-(int)(money/moneyCondition ) * moneyReturn; return result ; }};