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

文章介绍了外卖订餐系统的功能模块,包括用户注册、餐品管理、订单处理等,并展示了结构化分析的上下文数据流图。同时,提到了疫苗接种信息系统的数据库设计和医院与被检测者的联系。此外,还讨论了人事部门地址簿管理系统的用例和类图,以及矩阵链乘问题的优化算法,最后通过Memento模式展示了软件撤销操作的实现。
摘要由CSDN通过智能技术生成

【试题一】

阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某公司欲开发一款外卖订餐系统,集多家外卖平台和商户为一体,为用户提供在线浏览餐品、订餐和配送等服务。该系统的主要功能是:
1.入驻管理。用户注册:商户申请入驻,设置按时间段接单数量阅值等。系统存储商户/用户信息。
2.餐品管理。商户对餐品的基本信息和优惠信息进行发布、修改、删除。系统存储相关信息。
3.订餐。用户浏览商户餐单,选择餐品及数量后提交订餐请求。系统存储订餐订单。
4.订单处理。收到订餐请求后,向外卖平台请求配送。外卖平台接到请求后发布配送单,由平台骑手接单,外卖平台根据是否有骑手接单返回接单状态。若外卖平台接单成功,系统给支付系统发送支付请求,接收支付状态。支付成功,更新订单状态为已接单,向商户发送订餐请求并由商户打印订单,用户发送订单状态:若支付失败,更新订单状态为下单失败,向外卖平台请求取消配送,向用户发送下单失败。若系统接到外卖平台返回接单失败或超时未返回接单状态,则更新订单状态为下单失败,向用户发送下单失败。
5.配送。商户备餐后,由骑手取餐配送给用户。送达后由用户扫描骑手出示的订单上的配送码后确认送达,订单状态更改为已送达,并发送给商户。
6.订单评价。用户可以对订单餐品、骑手配送服务进行评价,推送给对应的商户、所在外卖平台,商户和外卖平台对用户的评价进行回复。系统存储评价。现采用结构化方法对外卖订餐系统进行分析与设计,获得如图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分)
餐单 D3——>P3
餐单 P3——>E3
订餐请求 P3——>P4
更新订单状态 P4——>D2
配送码 P5——>E2

【问题4】(3分)

收到订餐请求后,向外卖平台请求配送。
外卖平台接到请求后发布配送单,由平台骑手接单。
IF(外卖平台接单成功) THEN
    系统给支付系统发送支付请求,接收支付状态;
    IF(支付成功) THEN
        更新订单状态为已接单;
        向商户发送订餐请求并由商户打印订单;
        给用户发送订单状态;
    ELSEIF //支付未成功
        更新订单状态为下单失败;
        向外卖平台请求取消配送;
        向用户发送下单失败;
    ENDIF
ELSE IF(系统接到外卖平台返回接单失败或超时未返回接单状态) THEN
    更新订单状态为下单失败
    向用户发送下单失败;
ENDIF

【试题二】

按照下列图表,填写答题纸的对应栏内。
[说明]
为了提高接种工作,提高效率,并未了抗击疫情提供疫苗接种数据支撑,需要开发一个信息系统,下述需求完成该系统的数据库设计。
(1)记录疫苗供应商的信息,包括供应商名称,地址和一个电话。
(2)记录接种医院的信息,包括医院名称、地址和一个电话。
(3)记录接种者个人信息,包括姓名、身份证号和一个电话。
(4)记录接种者疫苗接种信息,包括接种医院信息,被接种者信息,疫苗供应商名称和接种日期,为了提高免疫力,接种者可能需要进行多次疫苗接种,(每天最多接种一次,每次都可以在全市任意一家医院进行疫苗接种)。
【概念模型设计】
阶段的信息,设计的实体联系图(不完整)如图2-1所示。

 

图2-1 E-R图 

【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整)
供应商(供应商名称、地址、电话)医院(医院名称、地址、电话)
供货(供应商名称,(a),供货内容)被接种者(姓名、身份证号、电话)
接种(接种者身份证号,(b),医院名称、供应商名称)

[问题1](4分)
根据问题描述,补充图2-1的实体联系图(不增加新的实体)

[问题2](4分)
补充逻辑结构设计结果中的(a)(b)两处空缺,并标注主键和外健完整性约束。

[问题3](7分)
若医院还兼有核酸检测的业务,检测石可能需要进行多次植酸检测(每天最多检测一次),但每次都可以在全市任意一家医院进行检测。
请在图2-1中增加“被检测者”、实体及相应的属性。医院与被检测者之间的“检测”联系及必要的属性,并给出新增加的关系模式。
“被检测者”实体包括姓名、身份证号、地址和一个电话。“检测”联系需要包括检测日期和检测结果等。
 

参考答案:
【问题1】(4分)

 【问题2】(4分)

(a)医院名称
(b)接种时间

供货关系中,主键:供应商名称,医院名称   外键:供应商名称,医院名称。
接种关系中,主键:接种者身份证号,接种日期   外键:接种者身份证号,医院名称,供应商名称。
 

【问题3】(7分)

 

【试题三】

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
[说明]
某公司的人事部门拥有一个地址博(AddressBookSystem),管理系统(ddressBookSystem),用于管理公司所有员工的地址记录(PersonAddress)。员工的地址记录包括:姓名、住址、
城市、省份、邮政编码以及联系电话等等信息。

管理员可以完成对地址簿中地址记录的管理操作,包括:
(1)维护地址记录。根据司的人员变动情况,对地址记录进行添加、修改、删除等操作;
(2)排序。按照员工姓氏的字典顺序或邮政编码对址领中的所有记录。
(3)打印地址记录。以邮件标签的格式打印一个地址单独的地址簿。系统会记录管理为便于管理,管理员在系统中为公可的不同部门建立员对每个地址簿的修改操作,包括:
(1)创建地址簿。新建个地址簿并保存。
(2)打开地址簿。打开一一个已有的地址簿。
(3)修改地址簿。对打开的地址簿进行修改并保存
系统将提供一个GUI(图形用户界面)实现对地址簿的各种操作。
现采用面向对象方法分析并设计该地址簿管理系统,得到如图3-1所示的用例图和图3-2所示的类图。

 

[问题1](6分)
根据说明中的描述,给出图3-1中U1~U6所对应的用例名。

[问题2](5分)
根据说明中的描述,给出图3-2中类AdreskBook的主要属性和方法以及类PernoAdress的主要属性(可以使用说明中的文字)。

[问题3](4分)
根据说明中的描述以及图3-1所示的用例图,请简要说明entend和 include关系的含义是什么?
 

参考答案:
【问题1】(6分)
u1:按员工姓氏的字典顺序排序
u2:按邮政编码排序
u3:创建地址簿
u4:修改地址簿
u5:打开地址簿
u6:保存地址簿


【问题2】(5分)
AddressBook的属性包括:姓名、部门、住址、城市、省份、邮政编码以及联系电话。
AddressBook 的方法包括:添加、修改、删除地址记录,排序,打印地址记录。
PersonAddress的属性包括:姓名、住址、城市、省份、邮政编码以及联系电话。
personAddress的方法包括:创建地址簿,打开地址簿,修改地址簿。


【问题3】(4分)
包含( include)两个以上用例有共同功能,可分解到单独用例,形成包含依赖﹔执行基本用例时,每次都必须调用被包含的用例。;
扩展( extend)如果一个用例明显地混合了两种或两种以上的不同场景,即根据情况可能发生多种事情,则可以断定将这个用例分为一个主用例和一个或多个辅用例进行描述可能更加清晰。

【试题四】(共15分)

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

工程计算中经常要完成多个矩阵相乘的计算任务,对矩阵相乘进行以下说明。

(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bnxp需要m*n*p次乘法运算,即时间复杂度为O(m*n*p)。

(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵A1_{_{5*100}},A2_{_{100*8}},A3_{_{8*50}}三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50=6000次乘法运算,若按A1*(A2*A3)计算,则需要进行100*8*50+ 5*100*50=65000次乘法运算。

矩阵链乘问题可描述为:给定n个矩阵,矩阵Ai的维数为Pi-1×Pi其中i=1, 2,..., n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2**An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2**An两个子问题,则该最优解应该包含A1*A2**Ak的一个最优计算顺序和Ak+1*Ak+2**An的一个最优计算顺序。据此构造递归式:

其中,cost[i][j]表示Ai+1*Ai+2*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。

C代码算法实现,采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的语言实现:

(1)主要变量说明

n:矩阵数

seq:矩阵维数序列

cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*...*Aj+1的最优的计算代价

trace[][]:二维数组,长度为n*n,其中元素costcost
 

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

int cost[N][N];//元素cost[i][j]表示Ai+1*Ai+2*...*Aj+1的最优的计算代价
int trace[N][N];//trace[i][j]表示Ai+1*Ai+2*...*Aj+1的最优计算对应的划分位置,即k(2)函数cmm

int cmm1(int n, int seq[]) {
	//seq:矩阵维数序列
	int tempCost;
	int tempTrace;
	int i, j, k, p;
	int temp;
	for (i=0; i < n; i++) { 
  		cost[i][i] =0; 
	}
	for (p= 1; p < n; p++) {
		for (i= 0; i<n-p ; i++) {//填空1 
			j=i+p;	//填空2		
			tempCost=-1;
			for (k= i; k<j ; k++) {
				temp = cost[i][k]+cost[k+1][j]+seq[i]*seq[k+1]*seq[j+1];//填空3
				if (tempCost == -1 || tempCost > temp) {
				  tempCost = temp;
				  tempTrace=k;//填空4
				}
				cost[i][j] = tempCost;
				trace[i][j]=tempTrace;
			}
		}	
	}
	return cost[0][n - 1];
}


int main(){
	//A1为15*5,A2为5*10,A3为10*20,A4为20*25
	int seq[]={15,5,10,20,25};
	int cmm=cmm1(4,seq);
	printf("%d\n",cmm);
	return 0;
}

问题1(8分)

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

问题2(4分)

根据以上说明和C代码,该问题采用了( 5 )算法设计策略,时间复杂度为( 6 )(用O符号表示)。

问题3(3分)

考虑实例n=4,各个矩阵的维数为A1为15*5,A2为5*10,A3为10*20,A4为20*25,即维度序列为15,5,10,20和25。则根据上述C代码得到的一个最优计算顺序为( 7 )(用加括号方式表示计算顺序),所需要的乘法运算次数为( 8 )。 

试题六(共15分)

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

在软件系统中,通常会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图5-1所示的类图。Memento 包含了要被恢复的状态。Originator创建并在Memento中存储状态。Caretaker负责从Memento中恢复状态。

【JAVA代码】

package test_2022_1;
import java.util.*;

class Memento {
    private String state;
    public Memento (String state) {this.state=state;}
    public String getState() {return state; }

}

class Originator{
    private String state;
    public void setState (String state) {this.state=state; }
    public String getState() { return state; }
    public Memento saveStateToMemento() {
        return new Memento(state);//填空1
    }

    public void getStateFromMemento(Memento Memento){
        state = Memento.getState() ;//填空2
    }

}

class CareTaker {
    public void add(Memento state){
        mementoList.add(state);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }

}

class MementoPatternDemo{

    public static void main (String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());//填空5
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());//填空5
        originator.setState("State #4");
    }
}

public class MementoDemo{

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Catherinemin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值