2019年下半年软件设计师下午试题

文章涵盖了多个IT系统的设计问题,包括二手车物流系统的数据流分析,技能培训管理系统的数据库设计,牙科诊所信息系统的用例图和类图解析,以及0-1背包问题的算法实现和观察者模式在文件管理系统中的应用。这些内容展示了系统分析、设计和优化的不同层面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 可以看看我的总结篇:软考-软件设计师总结_软考软件设计_Catherinemin的博客-CSDN博客 

【试题一】

1.二手车物流系统的数据流图
阅读下列说明和图,回答问题1至问题4。

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

 

 问题:1.1   (3分)

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

问题:1.2   (5分)

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

问题:1.3   (4分)

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

问题:1.4   (3分)

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

参考答案:

问题1.1:

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

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

问题1.3:

发送物流信息:起点P5终点E2
新订单信息:起点D2终点P5
合约信息:起点D4终点P5
自动分配:起点P5终点E3
更新物流信息:起点P5终点D2
 

 问题1.4:

WHILE(有新订单){
	lF 订单.类型为"保卖车或全国购" 
		THEN 分配到竞拍体系
	ELSE IF 订单.路线为"固定路线和/或包车路线” 
		THEN 分配给合约物流商
	ELSE  //即不符合固定路线和包车
		分配到竞拍体系
	ENDIF
	ENDIF
	给承运的物流商发送物流消息
	更新订单的物流信息
	给车辆交易系统发送物流信息
}

WHILE(收到订单){
	订单信息推送给有相关路线的物流商
	物流商对订单进行竞拍出价
	最优报价的物流商中标
}

 【试题二】

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

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

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

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

关系模式设计

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

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

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

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

培训(课程号,(f) )

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

问题:2.1  

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

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


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


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


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

参考答案:

问题:2.1  
(1)a:部门负责人b:培训师c:新员工
(2)存在缺失数据流,部门和员工之间:1:m(一个部门对应多个员工)

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

问题:2.3
员工关系表:g:主键:员工号   h外健:部门号
讲授关系模式:i主健:课程号 培训师 培训地点  j外健:课程号

问题:2.4
存在传递依赖。员工号决定了岗位,岗位决定了基本工资。所以存在传递依赖。

【试题三】

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所对应的用例名称。

问题:3.2   (5分)
根据说明中的描述,给出图3-2中C1~C5所对应的类名。

问题:3.3   (4分)
根据说明中的描述,给出图3-2中类C4、C5、Patient 和DentalStaff的必要属性。

参考答案:
问题:3.1
A1: Receptionist(接待员)
A2: DentalStaff(医护人员)
A3: OfficeStaff(办公人员)
U1:Maintainpatientinfo (记录病人基本信息)
U2:Recordofficevisitinfo (记录就诊信息)
U3: Print invoices(打印发票)

问题:3.2
C1: Patient Invoice(病人发票)
C2: InsuranceInvoice(机构发票)
C3: Invoice(发票)
C4: Procedure(就诊信息)
C5:OfficeVisit(治疗)


问题:3.3 
C4:就诊时间、就诊费用、支付代码、病人支付费用和医保支付费用
C5:项目名称、项目描述、治疗的牙齿和费用
Patient:姓名、身份证号、出生日期、性别、首次就诊时间、最后就诊时间 等
DentalStaff:姓名、身份证号、出生日期、性别、首次就诊时间、最后就诊时间

【试题四】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

/*
变量说明
T:背包容量 
v[]:价值数组 
w[]:重量数组 
c[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值 
*/

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 c[i][j];//填空1
    }
    if (i==0||j==0){
        c[i][j]=0;
    }else{
        c[i][j]=Calculate_Max_Value(v, w, i-1, j);
        if(temp<c[i][j]){//填空2
            temp=c[i][j];//填空3
            if(c[i][j]<temp){
                c[i][j]=temp;//填空4
            }
        }
    }
    return c [i][j];
}

【问题1】(8分)

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

【问题2 】(4分)

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

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

【问题3】  (3分)

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

【试题五】文件管理系统(Java)

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

【说明】

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

 【Java代码】

package test_2019_2;

import java.util.*;

interface Observer{
    public void update(); //填空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<Observer> myObs;//填空2
    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){
            obs.update();//填空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, Subject sub) {//填空4
        myObsName = name;
        sub.Attach(this);//填空5
    }

    public void update() {
        System.out.println("update observer[" + myObsName + "]");
    }
}

public class ObserverTest {
    public static void main(String[] args) {
        System.out.println("Hello Wprld!");
        Subject subjectA=new Subject() {
            @Override
            public void Attach(Observer obs) {

            }

            @Override
            public void Detach(Observer obs) {

            }

            @Override
            public void Notify() {

            }

            @Override
            public void setStatus(int staus) {

            }

            @Override
            public int getStatus() {
                return 0;
            }
        };
        Observer observerA = new DocExplorer("observerA",subjectA);
        subjectA.setStatus(1);
        subjectA.Notify();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿月浑子の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值