2021年上半年软件设计师下午试题

参考:https://blog.csdn.net/xiaornshuo/article/details/117532044 

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

【试题一】停车系统的数据流图

某停车场运营方为了降低运营成本,减员增效,提供良好的停车体验,欲开发无人值守停车系统,该系统的主要功能是:

1.信息维护。管理人员对车位(总数、空余车位数等)计费规则等基础信息进行设置。

2.会员注册。车主提供手机号、车牌号等信息进行注册,提交充值信息(等级、绑定并授权支付系统进行充值或交费的支付账号)不同级别和充值额度享受不同停车折扣点。

3.车牌识别。当车辆进入停车场时,若有(空余车位数大于1), 自动识别车牌号后进行道闸控制,当车主开车离开停车场时,识别车牌号,计费成功后,请求道闸控制。

4.计费。更新车辆离场时间,根据计费规则计算出停车费用,若车主是会员,提示停车费用:若储存余额够本次停车费用,自动扣费,更新余额,若储值余额不足,自动使用授权缴费账号请求支付系统进行支付,获取支付状态。若非会员临时停车,提示停车费用,车主通过扫描费用信息中的支付码调用支付系统自助交费,获取支付状态。

5.道闸控制。根据道闸控制请求向道闸控制系统发送放行指令和接收道闸执行状态。若道闸执行状态为正常放行时,对入场车辆,将车牌号及其入场时间信息存入停车记录,修改空余车位数;对出场车辆更新停车状态,修改空余车位数。当因道闸重置系统出现问题(断网断电或是故障为抬杠等情况),而无法在规定的时间内接收到其返回的执行状态正常放行时,系统向管理人员发送异常告警信息,之后管理人员安排故障排查处理,确保车辆有序出入停车场。

    现采用结构化方法对无人值守停车系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。

【问题1】(5分)

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

【问题2】(3分)
使用说明中的词语,给出图1-2中的数据存储D1-D3的名称。

【问题3】(4分)
根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。

【问题4】(3分)
根据说明,采用结构化语言对“道闸控制”的加工逻辑进行描述。

参考答案
问题1
E1:车辆;E2:车主;E3:支付系统;E4:管理人员;E5:道闸控制系统

问题2
D1:停车记录表;D2:会员信息表;D3:基础信息表

问题3
计费规则信息 D3——>P3
道闸控制请求 P1——>P5
更新车位信息 P5——>D3
更新余额 P3——>D2

问题4

IF(道闸执行状态正常)
    IF(车辆入场) THEN 
        将车牌号及其入场时间信息存入停车记录,修改空余车位数
    ELSEIF(车辆出场) THEN 
        更新停车状态,修改空余车位数
    ENDIF 
ELSESIF(未在规定的时间内接收到其返回的执行状态正常放行) THEN 
    向管理人员发送异常告警信息
ENDIF 

【试题二】社区蔬菜团购网站的数据库设计

阅读下列说明,回答问题1至问题 3,将解答填入答题纸的对应栏内。

【说明】

某社区蔬菜团购网站,为规范商品收发流程,便于查询客户订单情况,需要开发个信息系统。请根据下述需求描述完成该系统的数据库设计。

【需求描述】

(1)记录蔬菜供应商的信息,包括供应商编号、地址和一个电话。

(2)记录社区团购点的信息,包括团购点编号、地址和一个电话。

(3)记录客户信息,包括客户姓名和一个电话。客户可以在不同的社区团购点下订单,不直接与蔬菜供应商发生联系。

(4)记录客户订单信息,包括订单编号、团购点编号客户电话,订单内容和日期。

【概念模型设计】

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

 图2-1实体联系图
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式∶
蔬菜供货商(供货商编号,地址,电话)
社区团购点(团购点编号,地址,电话)
供货(供货商编号,(a))
客户(姓名,客户电话)
订单(订单编号,团购点编号,(b),订单内容,日期)

问题内容∶
【问题1】(6分)
根据问题描述,补充图 1-1 的实体联系图

【问题2】(4分)
补充逻辑结构设计结果中的(a)、(b)两处空缺及完整性约束关系。  

【问题3】(5分)
若社区蔬菜团购网站还兼有代收快递的业务,请增加新的"快递"实体,并给出客户实体和快递实体之间的"收取'联系,对图1进行补充。"快递"关系模式包括快递编号、客户电话和日期。

参考答案

问题1

 问题2
a:团购点编号 b: 客户电话
供货关系主键:(团购点编号、供货商编号)  外键:团购点编号、供货商编号
订单关系主键: 订单编号 外键: 团购点编号、客户电话 

问题3

【试题三】线上抓药APP的用例图、类图

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
[说明]
某中医医院拟开发一套线上抓药APP,允许患者凭借该医院医生开具的处方线上抓药,并提供免费送药上门服务。该系统的主要功能描述如下:
(1)注册。患者扫描医院提供的二维码进行注册,注册过程中,患者需提供其病历号,系统根据病历号自动获取患者基本信息。
(2)登录。已注册的患者可以登录系统进行线上抓药,未注册的患者系统拒绝其登陆。
(3)确认处方。患者登录后,可以查看医生开具的所有处方。患者选择需要抓药的处方和数量(需要抓几副药), 同时说明是否需要煎制。选择取药方式:自行到店取药或者送药上门,若选择送药上门,患者需要提供提供收贷人姓名、联系方式和收货地址。系统自动计算本次抓药的费用,患者可以使用微信或支付宝等支付方式支付费用。支付成功之后,处方被发送给药师进行药品配制。
(4)处理处方。药师根据处方配置好药品。若患者要求煎制,药师对配置好的药品进煎制。煎制完成,药师将该处方设置为已完成。若患者选择的是自行取药,取药后确认已取药。
(5)药品派送。处方完成后,对于选择送药上门的患者,系统将给快递人员发送药品配送信息,等待快递人员取药:并给患者发送收货验证码。
(6)送药上门。快递人员将配制好的药品送到患者指定的收货地址。患者收货时,向快递人员出示收货验证码,快递人员使用该验证码确认药品已送到。
现采用面向对象分析与设计方法开发上述系统,得到如图3-1所示的用例图以及图3-2所示的类图

 

 [问题1] (7分)
根据说明中的描述,给出图3-1中A1~ A3所对应的参与者名称和U1 ~U4处所对应的用例名称。  

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

[问题3] (3分)
简要解释用例之间的include、extend 和generalize关系的内涵。

参考答案

问题1
A1:患者;A2:快递人员;A3:药师
U1:确认处方;U2:支付方式;U3:微信支付;U4:支付宝支付(U3、U4可以互换)

问题2
C1: 支付方式;C2:微信支付;C3: 支付宝支付;C4:处方;C5: 药品(C2、C3可以互换)
 

问题3

包含(include): 指在一个用例中会含有若干的小步骤(用例)。
UML用例图中用带箭头的虚线表示,并且在虚线上添加<<include>>,若用例A包含用例B,则箭头指向用例B。

扩展(extend):指在一个基础用例可能有的扩展的用例。比如登录用例有扩展注册用例。因为如果已经注册过,则直接登录,如果没有则跳转到注册用例。
UML用例图中用带箭头的虚线表示,并且在虚线上添加<<extend>>,若用例A中需要扩展用例B,则箭头指向用例A。

泛化(generalization): 泛化关系表示的是继承关系。比如:用例B继承用例A或者参与者B继承参与者A。
UML用例图中用带三角的实线表示,箭头指向被继承者。

【试题四】凸多边形

阅读下列说明和C代码,回答问题1和问题2,将解答填入答题纸的对应栏内。
[说明]
凸多边形是指多边形的任意两点的连线均落在多边形的边界或者内部。相邻的点连线落在多边形边上,称为边,不相邻的点连线落在多边形内部。称为弦。假设任意两点连线上均有权重,凸多边形最优三帮剂分问题定义为:求将凸多边形划分为不相交的三角形集合,且各三角形权重之和最小的剖分方案。每个三角形的权重为三条边权重之和
假设N个点的凸多边形点编号为V1,V2,……,VN,若在VK处将原凸多边形划分为一个三角V1VkVN,两个子多边形V1,V2,…,Vk和Vk,Vk+1,…VN,得到一个最优的剖分方案,则该最优剖分方案应该包含这两个子凸边形的最优剖分方案。用m[i][j]表示带你Vi-1,Vi,…Vj构成的凸多边形的最优剖分方案的权重,S[i][j]记录剖分该凸多边形的k值。则

其中:

Wj,i-1分别为该三角形三条边的权重。求解凸多边形的最优剖分方案,即求解最小剖分的权重及对应的三角形集。

[C代码]

[问题1] (8分)

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

        

[问题2] (7分)

根据说明和C代码,该算法采用的设计策略为(5),算法的时间复杂度为(6),空间复杂度为(7) (用0表示)。

#include<stdio.h>
#define N 6
//凸多边形规模
int m[N+1][N+1]; //m[i][j]表示多边形Vi-1到Vj最优三角剖分的权值
int S[N+1][N+1]; //S[i][j]记录多边形Vi-1 到Vj最优三角剖分的k值
int W[N+1][N+1]; //凸多边形的权重矩阵,在main函数中输入

/*三角形的权重a,b,c,三角形的顶点下标*/

int get_triangle_weight(int a,int b, int c){
	return W[a][b]+W[b][c]+W[c][a];//每个三角形的权重为三条边权重之和
}


/*求解最优值*/
void triangle_partition(){
    int i,r,k,j;
    int temp;
    /*初始化*/
    for(i=1;i<=N;i++){
        m[i][i]=0;
    }
    /*自底向上计算m,S*/
    for(r=2;r<=N;r++){//填空1    /*r为子问题规模*/ 
        for(i=1;k<=N-r+1;i++){
            int j=i+r-1; //填空2 
            m[i][j]= m[i][j]+m[i+1][j]+get_triangle_weight(i-1,i,j); /*k=j*/
            S[i][j]=i;
            for(k=j+1;k<j;k++){/*计算m[i][j]的最小代价*/
                temp=m[i][k]+m[k+1][j]+get_triangle_weight(i-1,k,j);
                if(temp<m[i][j]){//填空3  /*判断是否最小值*/ //temp
                    m[i][j]=temp;
                    S[i][j]=k;
                }
            }
        }
    }
}

/*输出剖分的三角形i,j:凸多边形的起始点下标*/
void print_triangle(int i,int j){
    if(i==j) return;
    print_triangle(i,S[i][j]);
    print_triangle(S[i][j]+1,j);//填空4 //s[i][j]+1,j
    printf("V%d- -V%d--V%d\n",i-1,S[i][j],j);
}


【试题六】层叠菜单(Java)

阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单 (如图6-1示例)中包含的可能是一个菜单项(直接对应某个功能),也可能是一个子菜单,现在采用组合(composite)设计模式实现层叠菜单,得到如图6-2所示的类图。

 JAVA代码

package test_2021_1;

import java.util.*;

abstract class MenuComponent{//构成层叠菜单的元素
        protected String name;//菜单项或子菜单名称 //填空1
        public void printName(){System.out.println(name);}
        public abstract boolean addMenuElement(MenuComponent element);//填空2
        public abstract boolean removeMenuElement(MenuComponent element);
        public abstract List<MenuComponent> getElement();//填空3
}

class MenuItem extends MenuComponent{
        public MenuItem(String name){this.name=name;}

        @Override
        public boolean addMenuElement(MenuComponent element) {
                return false;
        }

        @Override
        public boolean removeMenuElement(MenuComponent element) {
                return false;
        }

        public List<MenuComponent> getElement(){return null;}
}

class Menu extends MenuComponent{
        public ArrayList<MenuComponent> elementList;//填空4
        public Menu(String name){
                this.name=name;
                this.elementList = new ArrayList<MenuComponent>();
        }
        public boolean addMenuElement(MenuComponent element){
        return elementList.add(element);
        }
        public boolean removeMenuElement(MenuComponent element){
        return elementList.remove(element);
        }
        public List<MenuComponent> getElement(){return elementList;}
}


class CompositeTest{
        public static void main(String[] args){
                MenuComponent mainMenu = new Menu("Insert");
                MenuComponent subMenu = new Menu("Chart");
                MenuComponent element = new MenuItem("On This Sheet");
                mainMenu.addMenuElement(subMenu);//填空5
                printMenus(mainMenu);
        }

        private static void printMenus(MenuComponent ifile){
                ifile.printName();
                List<MenuComponent> children = ifile.getElement();

                if(children==null) return;
                for(MenuComponent element:children){
                        printMenus(element);
                }
        }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值