1、第 8 章 软件设计师下午试题分析与解答试题一阅读下列说明和图,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。说明某公司欲开发招聘系统以提高招聘效率,其主要功能如下:(1)接受申请验证应聘者所提供的自身信息是否完整,是否说明了应聘职位,受理验证合格的申请,给应聘者发送致谢信息。(2)评估应聘者根据部门经理设置的职位要求,审查已经受理的申请;对未被录用的应聘者进行谢绝处理,将未被录用的应聘者信息存入未录用的应聘者表,并给其发送谢绝决策;对录用的应聘者进行职位安排评价,将评价结果存入评价结果表,并给其发送录用决策,发送录用职位和录用者信息给工资系统。现采用结构化方法对招聘系统进行分析与设计
2、,获得如图 1-1 所示的顶层数据流图、图 1-2 所示 0 层数据流图和图1-3 所示 1 层数据流图。问题 1使用说明中的术语,给出图中 E1E3 所对应的实体名称。答:E1:应聘者 E2: 部门经理 E3: 工资系统问题 2 使用说明中的术语,给出图中 D1D2 所对应的数据存储答:D1: 未录用的应聘者表 D2: 评价结果表问题 3使用说明和图中的术语,给出图 1-3 中加工 P1P3 的名称。答:P1:验证申请 P2: 审查申请 P3: 职位安排评价问题 4解释说明图 1-2 和图 1-3 是否保持平衡,若不平衡请按如下格式补充图 1-3 中数据流的名称以及数据流的起点或终点,使其平
3、衡(使用说明中的术语或图中符号)。答:数据流名称 起 点录用职位 P3 或 2.3 职位安排评价已受理的申请 1.2 受理申请谢绝决策 2.2 谢绝应聘者试题二阅读下列说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。说明某物流公司为了整合上游供应商与下游客户,缩短物流过程,降低产品库存,需要构建一个信息系统以方便管理其业务运作活动。需求分析结果(1)物流公司包含若干部门,部门信息包括部门号、部门名称、经理、电话和邮箱。一个部门可以有多名员工处理部门的日常事务,每名员工只能在一个部门工作。每个部门有一名经理,只需负责管理本部门的事务和人员。(2)员工信息包括员工号、姓名、职位、电话号
4、码和工资;其中,职位包括:经理、业务员等。业务员根据托运申请负责安排承运货物事宜,例如:装货时间、到达时间等。一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理。(3)客户信息包括客户号、单位名称、通信地址、所属省份、联系人、联系电话、银行账号,其中,客户号唯一标识客户信息的每一个元组。每当客户要进行货物托运时,先要提出货物托运申请。托运申请信息包括申请号、客户号、货物名称、数量、运费、出发地、目的地。其中,一个申请号对应唯一的一个托运申请;一个客户可以有多个货物托运申请,但一个托运申请对应唯一的一个客户号。概念模型设计根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)
5、如图 2-1 所示。关系模式设计部门(部门号,部门名称,经理,电话,邮箱)员工(员工号,姓名,职位,电话号码,工资, (a) 部门号 )客户( (b) ,单位名称,通信地址,所属省份,联系人,联系电话,银行账号)托运申请( (c) ,货物名称,数量,运费,出发地,目的地) 申请号、客户号、货物名称、数量、运费、出发地、目的地安排承运( (d) ,装货时间,到达时间,业务员)问题 1根据问题描述,补充四个联系、联系的类型,以及实体与子实体的联系,完善图 2-1 所示的实体联系图。答:n n 1 1n1 1 1问题 2根据实体联系图,将关系模式中的空(a)(d)补充完整。分别指出部门、员工和安排承
6、运关系模式的主键和外键。答:(1)a: 部门号 b: 客户号c: 申请号、客户号 d: 申请号托运申请客户员工部门处理申请安排管理业务员 经理(2)部门: 主键:部门号 外键:无员工: 主键:员工号 外键:部门号安排承运:主键:申请号 外键:无问题 3若系统新增需求描述如下:为了数据库信息的安全性,公司要求对数据库操作设置权限管理功能,当员工登录系统时,系统需要检查员工的权限。权限的设置人是部门经理。为满足上述需要,应如何修改(或补充)图 2-1 所示的实体联系图,请给出修改后的实体联系图和关系模式。答:1n n n 11 1 11 n 权限客户员工部门处理申请安排管理业务员 经理 设置托运申
7、请试题二分析本题考查数据库系统中实体联系模型(E-R 模型)和关系模式设计方面的应用知识。问题 1两个实体集之间的联系类型分为三类:一对一(1:1)联系、一对多(1:n)联系和多对多(m:n)联系。根据题意,每名员工只能在一个部门工作,所以部门和员工之间有一个 1:n 的“所属”联系;由于每个部门有一名经理,只需负责管理本部门的事务和人员,因此部门和经理之间有一个 1:1 的“管理”联系;由于一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理,故业务员和托运申请之间有一个 1:n 的“托运”联系;又由于一个客户可以有多个货物托运申请,但一个托运申请对应唯一的一个客户号,故客户和托
8、运申请之间有一个 1:n 的“申请”联系。根据上述分析,完善图 2-1 所示的实体联系图可参见参考答案。问题 2根据题意,部门和员工之间有一个 1:n 的“所属”联系需要将一端的码并入多端,故员工关系模式中的空(a)应填写部门号;在客户关系模式中,客户号为主键,故空(b)应填写客户号;在托运申请关系模式中,申请号、客户号为主键,故空(c)应填写申请号、客户号;又由于一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理,因此在安排承运关系模式中,申请号为主键,故空(d)应填写申请号。部门关系模式中的部门号为主键,经理为外键;因为经理来自员工关系。员工关系模式中的员工号为主键,部门号为
9、外键,因为部门号来自部门关系。安排承运关系模式中的申请号为主键,业务员为外键,因为业务员来自员工关系。问题 3根据题意,权限的设置人是部门经理,因此,需要建立一个权限关系模式,以及经理到权限之间的 1:n 的“设置”联系。修改后的实体联系图和关系模式参见参考答案。参考答案问题 1问题 2问题 3关系模式:权限(员工号,权限,设置人)或权限(员工号,权限,部门经理)(a) 部门号(b) 客户号(c) 申请号,客户号(d) 申请号部门主键:部门号外键:经理员工主键:员工号外键:部门号安排承运主键:申请号外键:业务员试题三阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。说明P
10、ay类 Card 的属性至少应包括 UnitPrice、ValidPeriod。参考答案问题 1U1:使用常规卡行驶 U2:使用单次卡行驶 (1):extend问题 2C1:RoadSegment C2:Trajectory C3:CardC4:RegularCard C5:PrepaidCard C6:MinitripCard(2)1 (3)13问题 3RoadSegment 的属性:DistanceTrajectory 的属性:Entry、Exit、DateOfEntryCard 的属性:UnitPrice、ValidPeriod试题四阅读下列说明和 C 代码,将应填入 (n) 处的字句写
11、在答题纸的对应栏内。说明设某一机器由 n 个部件组成,每一个部件都可以从 m 个不同的供应商处购得。供应商 j 供应的部件 i 具有重量 wij和价格 cij。设计一个算法,求解总价格不超过上限 cc 的最小重量的机器组成。采用回溯法来求解该问题:首先定义解空间。解空间由长度为 n 的向量组成,其中每个分量取值来自集合1,2,m),将解空间用树形结构表示。接着从根结点开始,以深度优先的方式搜索整个解空间。从根结点开始,根结点成为活结点,同时也成为当前的扩展结点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新结点。判断当前的机器价格(c 11)是否超过上限(cc),重量(w 11)是否
12、比当前已知的解(最小重量)大,若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,根结点不再是扩展结点。继续向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新结点。同样判断当前的机器价格(c 11+c21)是否超过上限(cc),重量(w 11+w21)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,原来的结点不再是扩展结点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活结点为止。C 代码下面是该算法的 C 语言实现。(1)变量说明n:机器的部件数m:供应商数cc
13、:价格上限w:二维数组,wij表示第 j 个供应商供应的第i 个部件的重量c:二维数组,cij表示第 j 个供应商供应的第i 个部件的价格bestW:满足价格上限约束条件的最小机器重量bestC:最小重量机器的价格bestX:最优解,一维数组,bestXi表示第 i 个部件来自哪个供应商cw:搜索过程中机器的重量cp:搜索过程中机器的价格x:搜索过程中产生的解,xi表示第 i 个部件来自哪个供应商i:当前考虑的部件,从 0 到 n-1j:循环变量(2)函数 backtrackint n=3;int m=3;int cc=4;int w33=1,2,3,3,2,1,2,2,2;int c33=1
14、,2,3,3,2,1,2,2,2;int bestW=8;int bestC=0;int bestX3=0,0,0;int cw=0;int cp=0;int x3=0,0,0;int backtrack (int i)int j=0;int found=0;if(in-1) /*得到问题解*/bestW=cw;bestC=cp;for(j=0; jn; j+)(1) ; /bestXj=xjreturn 1;if (cp=cc)(/*有解*/found=1;for(j=0; (2) ; j+) /j0投入 2 元钱有 2 元钱没有投币售出纸巾 纸巾售完按下取纸巾按钮纸巾数0SoldState
15、、SoldOutState、NoQuarterState 和HasQuarterState 分别对应图 5-1 中纸巾售卖机的 4 种状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。C+代码#include iostreamusing namespace std;/以下为类的定义部分 class TissueMachine; /类的提前引用 class State public: virtual void insertQuarter()=0; /投币 virtual void ejectQuarter()=0; /退币 virtual void turnCrank()=0; /按下“出纸巾”
16、按钮 virtual void dispense()=0; /出纸巾 ; /*类SoldOutState、NoQuarterState、HasQuarterState、SoldState 的定义省略,每个类中均定义了私有数据成员TissueMachine*tissueMachine;*/ class TissueMachine private: (1)*soldOutState,*noQuarterState,*hasQuarterState,*soldState,*state; /(1) Stateint count; /纸巾数 public: TissueMachine(int numbe
17、rs); void setState(State* state); State* getHasQuarterState(); State* getNoQuarterState(); State* getSoldState(); State* getSoldOutState(); int getCount(); /其余代码省略; /以下为类的实现部分 void NoQuarterState :insertQuarter() tissueMachine-setState( (2) ); /(2) tissueMachine-getHasQuarterState() void HasQuarterState :ejectQuarter()tissueMachine-setState( (3) ); / (3)tissueMachine-getNoQuarterState() void SoldState :dispense() if(tissueMachine-getCount()0) tissueMachine-setState( (4) ); ) /(4)tissueMachine-getNoQuarterState()else tissueMachine-setState( (5) ); ) /(5)tissueMachine- getSoldOutState() /其余代码省略