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

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

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

【试题一】

【说明】某现代农业种植基地为进一步提升农作物种植过程的智能化,欲开发智慧农业平台,集管理和销售于一体,该平台的主要功能有:
1.信息维护。农业专家对农作物、环境等监测数据的监控处理规则进行维护。
2.数据采集。获取传感器上传的农作物长势、土壤墒情、气候等连续监测数据,解析后将监测信息进行数据处理、可视化和存储等操作。
3.数据处理。对实时监测信息根据监控处理规则进行监测分析,将分析结果进行可视化并进行存储、远程控制对历史监测信息进行综合统计和预测,将预测信息进行可视化和存储
4.远程控制。根据监控处理规则对分析结果进行判定,依据判定结果自动对控制器进行远程控制。平台也可以根据农业人员提供的控制信息对控制器进行远程控制。
5.可视化。实时向农业人员展示监测信息,实时给农业专家展示统计分析结果和预测信息或根据农业专家请求进行展示。
现采用结构化方法对智慧农业平台进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。

 【问题1】(4分)
使用说明中的词语,给出图1-1中的实体E1~E4的名称。
【问题2】(4分)
使用说明中的词语,给出图1-2中的数据存储D1~D4的名称。
【问题3】 (4分)
根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。
【问题4】(3分)
根据说明,“数据处理”可以分解为哪些子加工?进一步进行分解时,需要注意哪三种常见的错误?
 

参考答案:
【问题1】(4分)
E1:传感器;E2:农业专家;E3:农业人员;E4:控制器


【问题2】(4分)
D1:监控处理规则文件 D2:监测信息表D3:分析结果文件 D4:预测信息表


【问题3】 (4分)
起点D1,终点P4,监控规则
起点E2,终点P5,根据请求进行展示
起点D3,终点P5,分析结果
起点D3,终点P5,预测信息


【问题4】(3分)
数据处理加工分为:数据分析,可视化与存储;
黑洞、奇迹、灰洞
 

【试题二】

【说明】
某汽车维修公司为了便于管理车辆的维修情况,拟开发一套汽车维修管理系统,请根据下述需求描述完成该系统的数据库设计。

【需求描述】
(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分)

【问题2】(4分)
a:客户性质
b:客户号
c:部门号
d:车牌号,员工号

【问题3】(2分)
车辆关系的主键:车牌号 外键:客户号
维修单关系的主键:维修单号 外键:车牌号,员工号

【问题4】(3分)
维修工和维修单之间的联系类型会发生变化,从1:n变成m:n。
对应的需要增加维修关系,m:n关系不能归并,需要将其单独加入一个联系中,将维修单的属性员工号(维修工)删掉,新建一个关系模式维修。
维修(员工号(维修工),维修单号,维修地点,维修时间)

【试题三】

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某游戏公司欲开发一款吃金币游戏。游戏的背景为一种回廊式迷宫(Maze),在迷宫的不同位置上设置有墙。迷宫中有两种类型的机器人(Robots):小精灵(PacMan)和幽灵(Ghost)。游戏的目的就是控制小精灵在迷宫内游走,吞吃迷宫路径上的金币,且不能被幽灵抓到。幽灵在迷宫中游走,并会吃掉遇到的小精灵。机器人游走时,以单位距离的倍数计算游走路径的长度。当迷宫中至少存在一个小精灵和一个幽灵时,游戏开始。
机器人上有两种传感器,使机器人具有一定的感知能力。这两种传感器分别是:
(1)前向传感器(FrontSensor),探测在机器人当前位置的左边、右边和前方是否有墙(机器人遇到墙时,必须改变游走方向)。机器人根据前向传感器的探测结果,决定朝哪个方向运动。
(2)近距离传感器(ProxiSesor),探测在机器人的视线范围内(正前方)是否存在隐藏的金币或幽灵。近距离传感器并不报告探测到的对象是否正在移动以及朝哪个方向移动。但是如果近距离传感器的连续两次探测结果表明被探测对象处于不同的位置,则可以推导出该对象在移动。
另外,每个机器人都设置有一个计时器(Timer),用于支持执行预先定义好的定时事件。
机器人的动作包括:原地向左或向右旋转90°;向前或向后移动。
建立迷宫:用户可以使用编辑器(Editor) 编写迷宫文件,建立用户自定义的迷宫。将迷宫文件导入游戏系统建立用户自定义的迷宫。
现采用面对对象分析与设计方法开发该游戏,得到如图3-1所示的用例图以及图3-2所示的初始类图。

 

【问题1】(3分)
根据说明中的描述,给出图3-1中U1~U3所对应的用例名。
【问题2】(4分)
图3-1中用例U1~U3分别与哪个(哪些)用例之间有关系,是何种关系?
【问题3】(8分)
根据说明中的描述,给出图3-2中C1~C8所对应的类名。

参考答案:
【问题1】(3分)
U1 编写迷宫文件;
U2 导入迷宫文件;
U3 设置计时器

【问题2】(4分)
U1和U2与建立迷宫用例是包含关系;
U3与操作机器人是包含关系

【问题3】(8分)
C1 机器人(Robots);
C2 计时器(Timer);
C3 小精灵(PacMan);
C4 幽灵(Ghost) ;
C5 传感器(Sensor) ;
C6 前向传感器(FrontSensor) ;
C7 近距离传感器(ProxiSesor);
C8 迷宫(Maze)

【试题四】(15分)

       生物学上通常采用编辑距离来定义两个物种DNA序列的相似性,从而刻画物种之间的进化关系。具体来说,编辑距离是指将一个字符串变换为另一个字符所需要的最小操作次数。操作有三种,分别为:插入一个字符、删除一个字符以及将一个字符修改为另一个字符。用字符数组str1和str2分别表示长度分别为len1和len2的字符串,定义二维数组d记录求解编辑距离的子问题最优解,则该二维数组可以递归定义为:

C代码

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

(1)常量和变更说明

  A,B:两个字符数组

  d:二维数组

  i,j:循环变量

  temp:临时变量

(2)C程序

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100

/*
A,B:两个字符数组
d:二维数组
i,j:循环变量
temp:临时变量
*/


char A[N]="CTGA";
char B[N]="ACGCTA";
int d[N][N];

int min(int a,int b){
	return a<b?a:b;
}

int editdistance(char *str1,int len1,char *str2,int len2){
	int i,j;
	int diff;
	int temp;
	for(i=0;i<len1;i++){
		d[i][0]=i;
	}
	for(j=0;j<=len2;j++){
		d[0][j]=j;//填空1 
	}
	for(i=1;i<=len1;i++){
		for(j=1;j<=len2;j++){
			if(str1[i-1]==str2[j-1]) //填空2
				d[i][j]=d[i-1][j-1];
			else{
				temp=min(d[i-1][j]+1,d[i][j-1]+1);
				d[i][j]=min(temp,d[i-1][j-1]+1);//填空3 
			} 
		}
	}
	return d[len1][len2];//填空4
}


int main(){
	int d=editdistance(A,strlen(A),B,strlen(B));
	//int d=editdistance(A,4,B,6);
	printf("%d",d);
	return 0;
}

问题1 (8分)

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

问题2 (4分)

根据说明和C代码,算法采用了( 5 )设计策略,时间复杂度为( 6 )(用O符号表示,两个字符串的长度分别用m和n表示)。

问题3 (3分)

已知两个字符串A="CTGA"和B="ACGCTA",根据说明和C代码,可得出这两个字符串的编辑距离为( 7 )。
 

试题六】(15分)

享元(flyweight)模式主要用于减少创建对象的数量,以降低内存占用,提高性能。现要开发一个网络围棋程序,允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序,得到如图6-1所示的类图。

 Java代码

package test_2021_2;
import java.util.*;

import static test_2021_2.PieceColor.WHITE;

enum PieceColor {BLACK, WHITE} // 棋子颜色

class PiecePos { // 棋子位置
    private int x;
    private int y;

    public PiecePos(int a, int b) {
        x = a;
        y = b;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

abstract class Piece { // 棋子定义
    protected PieceColor m_color; // 颜色
    protected PiecePos m_pos; // 位置

    public Piece(PieceColor color, PiecePos pos) {
        m_color = color;
        m_pos = pos;
    }

    public abstract void draw(); //填空1
}

class BlackPiece extends Piece {
    public BlackPiece(PieceColor color, PiecePos pos) {
        super(color, pos);
    }

    public void draw() {
        System.out.println("draw a black piece");
    }
}

class WhitePiece extends Piece {
    public WhitePiece(PieceColor color, PiecePos pos) {
        super(color, pos);
    }

    public void draw() {
        System.out.println("draw a white piece");
    }
}

class PieceBoard { // 棋盘上已有的棋子
    private static final ArrayList<Piece> m_arrayPiece = new ArrayList<>();//填空2
    private String m_blackName; // 黑方名称
    private String m_whiteName; // 白方名称

    public PieceBoard(String black, String white) {
        m_blackName = black;
        m_whiteName = white;
    }

    // 一步棋,在棋盘上放一颗棋子
    public void SetPiece(PieceColor color, PiecePos pos) {
        Piece piece = null;//填空3
        if (color == PieceColor.BLACK) { // 放黑子
            piece = new BlackPiece(color, pos); // 获取一颗黑子
            System.out.println(m_blackName + "在位置(" + pos.getX() + ","
                    + pos.getY() + ")");
            piece.draw();//填空4
        } else { // 放白子
            piece = new WhitePiece(color, pos); // 获取一颗白子
            System.out.println(m_whiteName + "在位置(" + pos.getX() + ","
                    + pos.getY() + ")");
            piece.draw();//填空5
        }
        m_arrayPiece.add(piece);
    }
}


public class PieceTest {
    public static void main(String[] args) {
        PiecePos piecePos=new PiecePos(3,4);
        PieceBoard pieceBoard = new PieceBoard("black","white");
        pieceBoard.SetPiece(WHITE ,piecePos);
    }
}
//输出结果:
//    white在位置(3,4)
//    draw a white piece

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值