2019年下半年软件设计师下午真题试题(案例分析)及答案

2019年下半年软件设计师上午真题及答案解析

目录

1.二手车物流系统的数据流图

2. 技能培训管理系统的数据库设计

3.牙科诊所信息系统的用例图和类图

4.0-1背包问题

5.文件管理系统(Java)


1.二手车物流系统的数据流图

阅读下列说明和图,回答问题1至问题4。

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

 

问题:1.1   (3分)

使用说明中的词语,给出图1-1中的实体E1~E3的名称。

E1:帮买顾问;E2:车辆交易系统;E3:物流商。

问题:1.2   (5分)

使用说明中的词语,给出图1-2中的数据存储D1~D5的名称。

D1:线索信息表/线索信息存储;D2:订单信息表/订单信息存储;
D3:路线信息表/路线信息存储;D4:合约信息表/合约信息存储;
D5:物流商信息表。

问题:1.3   (4分)

根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。

数据名

起点

终点

物流信息

P5/寻找物流商

E2/车辆交易系统

新订单信息

D2/订单信息表

P5/寻找物流商

路线信息

D3/路线信息表

P5/寻找物流商

合约信息

D4/合约信息表

P5/寻找物流商

问题:1.4   (3分)

根据说明,采用结构化语言对“P5: 寻找物流商”的加工逻辑进行描述。

寻找物流商{
    WHILE(有新订单)
    DO{
        IF订单类型IN(‘保卖车’,’全国购’)
            THEN分配订单到竞拍体系;
        ELSE IF订单.路线符合固定路线或包车路线
                THEN 自动分配订单给合约物流商;
                ELSE分配订单到竞拍体系;
                ENDIF 
            ENDIF
        给承运的物流商发送信息;
        更新订单的物流信息;
        给车辆交易系统发送物流信息;
    } ENDDO
}
竞拍体系{
    WHILE(收到订单)
    DO{
        推送订单信息给有相关路线的物流商;
        物流商竞拍出价;
        最优报价物流商中标;
    }ENDDO
}

或
寻找物流商{
    WHILE(有新订单)
    DO{
        IF订单类型==’普通二手车’ AND订单.路线符合固定路线或包车路线
            THEN自动分配订单给合约物流商; 
            ELSE分配订单到竞拍体系;
        ENDIF
        给承运的物流商发送信息;
        更新订单的物流信息;
        给车辆交易系统发送物流信息;
    } ENDDO
}
竞拍体系{
    WHILE(收到订单)
    DO{
        推送订单信息给有相关路线的物流商;
        物流商竞拍出价;
        最优报价物流商中标;
    }ENDDO
}

2. 技能培训管理系统的数据库设计

公司拟开发新入职员工的技能培训管理系统以便使新员工快速胜任新岗位。

1.部门信息包括:部门号、名称、部门负责人、电话等,部门号唯一标识部门关系中的每一个元组,一个部门有多个员工,但一名员工只属于一个部门,每个部门只有一名负责人,负责部门工作。

2.员工信息包括员工号、姓名、部门号、岗位、基本工资、电话、家庭住址等,其中员工号是唯一标示员工关系中的每一个元组。岗位有新入职员工,培训师、部门负责人等不同岗位设置不同的基本工资,新入职员工要选择多门课程进行培训,并通过考试取得课程成绩,一名培训师可以讲授多门课程、一门课程可由多名培训师讲授。

3.课程信息包括课程号,课程名称、学时等;其中课程号唯一标识课程关系的每一个元组。

关系模式设计

部门(部门号,部门名,部门负责人,电话)

员工(员工号,姓名,部门号,d,电话,家庭住址)

课程(e,课程名称,学时)

讲授(课程号,培训师,培训地点)

培训(课程号,(f) )

根据需求阶段收集的信息,设计的实体联系图如图2-1所示

问题:2.1  

(1)补充图2 -1中的空(a) - (c)

(a)部门负责人;(b)培训师;(c)新入职员工

(2)图2-1中是否存在缺失联系,若存在,则说明所缺失的联系和联系类型

存在缺失联系:员工与部门之间隶属关系,联系类型*:1。

(或,存在缺失联系:部门与员工之间隶属关系,联系类型1:*)。

问题:2.2   根据题意,将关系模式中的空(d) - (f) 补充完整

(d)岗位,基本工资;(e)课程号;(f)新入职员工/新入职员工工号,课程成绩

问题:2.3   员工关系模式的主键为(g) ,外键为(h) ,讲授关系模式的主键为(i) ,外键为(j)。

关系模式

主键

外键

员工关系

(g)员工号

(h)部门号

讲授关系

(i)(培训师,课程号)

(j)课程号、培训师

问题:2.4   员工关系是否存在传递依赖?用100字以内的文字说明理由。

存在传递函数依赖。

在员工关系中,员工的岗位有新入职员工,培训师,部门负责人,不同岗位设置不同的基本工资,即存在传递函数依赖,员工号→岗位,岗位→基本工资。

3.牙科诊所信息系统的用例图和类图

阅读下列说明和图,回答问题1至问题3。

【说明】
某牙科诊所拟开发一套信息系统, 用于管理病人的基本信息和就诊信息。 诊所工作人员包括:医护人员(DentalStaff) 接待员(Receptionist) 和办公人员(OfficeStaff) 等。系统主要功能需求描述如下:
1.记录病人基本信息(Maintain patient info)。初次就诊的病人, 接待员将病人基本信息录入系统。病人基本信息包括病人姓名、身份证号、出生日期、性别、首次就诊时间和最后一次就诊时间等。每位病人与其医保信息(MedicalInsurance)关联。
2.记录就诊信息(Record office visit info) 病人在诊所的每一次就诊,由接待员诊信息(Office Visit) 录入系统。就诊信息包括就诊时间、就诊费用、支付代码、病人支付费用和医保支付费用等。
3.记录治疗信息 (Record dental procedure) 病人在就诊时,可能需要接受多项治疗,每项治疗(Procedure)可能由多位医护人员为其服务。治疗信息包括:治疗项目名称、治疗项目描述、治疗的牙齿和费用等。治疗信息由每位参与治疗的医护人员分别向系统中录入
4.打印发票(Print invoices) 发票(Invoice) 办公人员打印。发票分为两种:给医保机构的发票(InsuranceInvoice) 和给病人的发票(PatientInvoice) 两种发票内容相同,只是支付的费用不同。当收到治疗费用后,办公人员在系统中更新支付状态(Enterpayment)
5.记录医护人员信息(Maintain dental staff info)办公人员将医护人员信息录入系统。医护人员信息包括姓名、职位、身份证号、家庭住址和联系电话等。
6.医护人员可以查询并打印其参与的治疗项目相关信息(Search and print procedureinfo)
现采用面向对象方法开发该系统,得到如图3-1所示的用例图和3-2所示的初始类图。

问题:3.1   (6分)

根据说明中的描述,给出图3-1中A1~A3所对应的参与者名称和U1~U3所对应的用例名称。

A1: Receptionist(接待员)

A2: DentalStaff(医护人员)

A3: OfficeStaff(办公人员)

U1:Maintainpatientinfo (记录病人基本信息)

U2:Recordofficevisitinfo (记录就诊信息)

U3: Print invoices(打印发票)

问题:3.2   (5分)

根据说明中的描述,给出图3-2中C1~C5所对应的类名。

C1: Patient Invoice

C2: InsuranceInvoice

C3: Invoice

C4: Procedure

C5:OfficeVisit

问题:3.3   (4分)

根据说明中的描述,给出图3-2中类C4、C5、Patient 和DentalStaff的必要属性。

C4:治疗项目名称、治疗项目描述、治疗的牙齿和费用、Office Visit、Dental Staff

C5:病人就诊时间和费用、支付代码、病人支付费用、医保支付费用、病人patient

Patient:姓名、身份证号、出生日期、性别等

DentalStaff:姓名、职位、身份证号、住址、联系电话、职工号

4.0-1背包问题

阅读下列说明和C代码,回答问题1至问题3。

【说明】

0-1背包问题定义为:给定i个物品的价值v[1…i]、小重量w[1...i]和背包容量T,每个物品装到背包里或者不装到背包里。求最优的装包方案,使得所得到的价值最大。

0-1背包问题具有最优子结构性质。定义c[i][T]为最优装包方案所获得的最大价值,则可得到如下所示的递归式。

【c代码】

下面是算法的C语言实现。

(1)常量和变量说明

T: 背包容量

v[]:价值数组

w[]:重量数组

c[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值

(2) C程序

#include <stdio.h>
#include <math.h>
#define N 6
#define maxT 1000
int c[N][maxT]={0};

int Memoized_Knapsack(int v[N],int w[N],int T) {
    int i;
    int j;
    for(i=0; i<N; j++){
        for(j=0; j<=T; j++){
            c[i][f]= -1;
        }
    }
    return Calculate_Max_Value(v, w, N-1, T);
}

int Calculate_Max_Value(int v[N],int w[N], int i, int j){
    int temp =0;
    if (c[i][j]!=-1){
        return(1);
    }
    if (i==0||j==0){
        c[i][j]=0;
    }else{
        c[i][j]=Calculate_Max_Value(v, w, i-1, j);
        if( (2) ){
            temp=(3);
            if(c[i][j]<temp){
                (4);
            }
        }
    }
    return c [i][j];
}

问题:4.1   (8分)

根据说明和C代码,填充C代码中的空(1) ~ (4)。

(1)c[i][j]

(2)i>0&&j>=w[i]

(3)Calculate_Max_Value(v, w, i-1, j-w[i] ) + v[i]

(4)c[i][j]=temp

问题:4.2   (4分)

根据说明和C代码,算法采用了 (5) 设计策略。在求解过程中,采用了(6)

(自底向上或者自顶向下)的方式。

(5)动态规划

(6)自顶向下

问题:4.3   (3分)

若5项物品的价值数组和重量数组分别为v[]= {0,1,6,18,22,28}和w[]= {0,1,2,5,6,7}背包容量为T= 11,则获得的最大价值为 (7) 。

(7)40

5.文件管理系统(Java)

阅读下列说明和Java代码,将应填入(n) 处的字句写在答题纸的对应栏内。

【说明】

某文件管理系统中定义了类OfficeDoe和DocExplorer。当类OfficeDoe发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer) 设计模式来实现该需求,所设计的类图如图6-1所示。

【Java代码】

import java.util.*
interface Observer{//(2)
    public (1);
}

interface Subject{
    public void Attach(Observer obs);
    public void Detach(Observer obs);
    public void Notify();
    public void setStatus(int staus);
    public int getStatus();
}

class OfficeDoc implements Subject{
    private List< (2) > myObs;
    private String mySubjectName;
    private int m_status;

    public OfficeDoc (String name){
        mySubjectName=name;
        this.myObs=new Arraylist<Observer>();
        m_status=0;
    }
    public void Attach(Observer obs);{this.myObs.add(obs);}
    public void Detach(Observer obs);{this.myObs.remove(obs);}
    public void Notify(){
        for(Observer obs:this.myObs){
            (3);
        }
    }
    public void setStatus(int status;){
        m_status=status;
        System out.println("SetStatus Subject["+mySubjectName+"]status:"+status);
    }
    public int getStatus(){return m_status;}
}
class DocExplorer implements Observer{
    private String myObsName;
    public DocExplorer(String name, (4) sub){
        myObsName=name;
        sub (5);
    }
    public void update(){//(1)
        System.out.println("update observer["+myObsName+"]" ) ;
    }
]
class ObserverTest{
    public static void main(String []args) {
        System.out.println("Hello World!" ) ;
        Observer observerA=new DocExplorer("observerA",subjectA);
        subjectA.serStatus(1);
        subjectA.Notify();
    }
}

(1)void update();

(2)Observer;

(3)obs.update();

(4)Subject;

(5)Attach(this);

猜你喜欢

转载自blog.csdn.net/WHT869706733/article/details/124522033