软件设计师 - 专业技术中级资格 - 计算机类
最新试题
试题一(共15分)    阅读以下说明和图,回答问题1至问题3.将解答填入答题纸的对应栏内。【说明】    某时装邮购提供商拟开发订单处理系统,用于处理客户通过电话、传真、邮件或Web站点所下订单。其主要功能如下:    (1)增加客户记录。将新客户信息添加到客户文件,并分配一个客户号以备后续使用。    (2)查询商品信息。接收客户提交商品信息请求,从商品文件中查询商品的价格和可订购数量等商品信息,返回给客户。    (3)增加订单记录。根据客户的订购请求及该客户记录的相关信息,产生订单并添加到订单文件中。    (4)产生配货单。根据订单记录产生配货单,并将配货单发送给仓库进行备货;备好货后,发送备货就绪通知。如果现货不足,则需向供应商订货。    (5)准备发货单。从订单文件中获取订单记录,从客户文件中获取客户记录,并产生发货单。    (6)发货。当收到仓库发送的备货就绪通知后,根据发货单给客户发货;产生装运单并发送给客户。    (7)创建客户账单。根据订单文件中的订单记录和客户文件中的客户记录,产生并发送客户账单,同时更新商品文件中的商品数量和订单文件中的订单状态。    (8)产生应收账户。根据客户记录和订单文件中的订单信息,产生并发送给财务部门应收账户报表。    现采用结构化方法对订单处理系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示0层数据流图。    【问题1】(3分)    使用说明中的词语,给出图1-1中的实体E1~E3的名称。【问题2)(3分)    使用说明中的词语,给出图1-2中的数据存储D1~D3的名称。【问题3】(9分)    (1)给出图1-2中处理(加工)P1和P2的名称及其相应的输入、输出流。(2)除加工P1和P2的输入输出流外,图1-2还缺失了1条数据流,请给出其起点和终点。         注:名称使用说明中的词汇,起点和终点均使用图1-2中的符号或词汇。[15分]
2022-06-13
试题二(共15分)    阅读以下说明,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】    某公司拟开发一套小区物业收费管理系统。初步的需求分析结果如下:  (1)业主信息主要包括:业主编号,姓名,房号,房屋面积,工作单位,联系电话等。房号可唯一标识一条业主信息,且一个房号仅对应一套房屋;一个业主可以有一套或多套的房屋。  (2)部门信息主要包括:部门号,部门名称,部门负责人,部门电话等;一个员工只能属于一个部门,一个部门只有一位负责人。  (3)员工信息主要包括:员工号,姓名,出生年月,性别,住址,联系电话,所在部门号,职务和密码等。根据职务不同员工可以有不同的权限,职务为“经理”的员工具有更改(添加、删除和修改)员工表中本部门员工信息的操作权限;职务为“收费”的员工只具有收费的操作权限。  (4)收费信息包括:房号,业主编号,收费日期,收费类型,数量,收费金额,员工号等。收费类型包括物业费、卫生费、水费和电费,并按月收取,收费标准如表2-1所示。其中:物业费=房屋面积(平方米)×每平米单价,卫生费=套房数量(套)×每套庆单价,水费=用水数量(吨)×每吨水单价,电费=用电数量(度)X每度电单价。    (5)收费完毕应为业主生成收费单,收费单示例如表2-2所示   【概念模型设计】    根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。图2-1中收费员和经理是员工的子实体。   【逻辑结构设计】    根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整);    业主((1),姓名,房屋面积,工作单位,联系电话)    员工((2),姓名,出生年月,性别,住址,联系电话,职务,密码)    部门((3),部门名称,部门电话)    权限(职务,操作权限)    收费标准(4)    收费信息((5),收费类型,收费金额,员工号)【问题1】(8分)    根据图2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(5)补充完整,然后给出各关系模式的主键和外键。【问题2】(5分)    填写图2-1中(a)~(f)处联系的类型(注:一方用1表示,多方用m或n或*表示),并补充完整图2-1中的实体、联系和联系的类型。【问题3】(2分)    业主关系属于第几范式?请说明存在的问题。[15分]
2022-06-13
试题三(共15分)    阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】    某网上药店允许顾客凭借医生开具的处方,通过网络在该药店购买处方上的药品。该网上药店的基本功能描述如下:    (1)注册。顾客在买药之前,必须先在网上药店注册。注册过程中需填写顾客资料以及付款方式(信用卡或者支付宝账户)。此外顾客必须与药店签订一份授权协议书,授权药店可以向其医生确认处方的真伪。    (2)登录。已经注册的顾客可以登录到网上药房购买药品。如果是没有注册的顾客,系统将拒绝其登录。    (3)录入及提交处方。登录成功后,顾客按照“处方录入界面”显示的信息,填写开具处方的医生的信息以及处方上的药品信息。填写完成后,提交该处方。    (4)验证处方。对于已经提交的处方(系统将其状态设置为“处方已提交”),其验证过程为:      ①核实医生信息。如果医生信息不正确,该处方的状态被设置为“医生信息无效”,并取消这个处方的购买请求;如果医生信息是正确的,系统给该医生发送处方确认请求,并将处方状态修改为“审核中”。      ②如果医生回复处方无效,系统取消处方,并将处方状态设置为“无效处方”。如果医生没有在7天内给出确认答复,系统也会取消处方,并将处方状态设置为“无法审核”。      ③如果医生在7天内给出了确认答复,该处方的状态被修改为“准许付款”。系统取消所有未通过验证的处方,并自动发送一封电子邮件给顾客,通知顾客处方被取消以及取消的原因。    (5)对于通过验证的处方,系统自动计算药品的价格并邮寄药品给己经付款的顾客。该网上药店采用面向对象方法开发,使用UML进行建模。系统的类图如图3-1所示。   【问题1】(8分)    根据说明中的描述,给出图3-1中缺少的C1~C5所对应的类名以及(1)~(6)处所对应的多重度。【问题2】(4分)图3-2给出了“处方”的部分状态图。根据说明中的描述,给出图3-2中缺少的S l ~S4所对应的状态名以及(7)~(10)处所对应的迁移(transition)名。   【问题3】(3分)    图3-1中的符号“   ”和“   ”在UML中分别表示类和对象之间的哪两种关系?两者之间的区别是什么?[15分]
2022-06-13
试题四(共15分)    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】    堆数据结构定义如下:对于n个元素的关键字序列{al,a2,…,an},当且仅当满足下列关系时称其为堆。       在一个堆中,若堆顶元素为最大元素,则称为大顶堆;若堆顶元素为最小元素,则称为小顶堆。堆常用完全二叉树表示,图4-1是一个大顶堆的例子。       堆数据结构常用于优先队列中,以维护由一组元素构成的集合。对应于两类堆结构,优先队列也有最大优先队列和最小优先队列,其中最大优先队列采用大顶堆,最小优先队列采用小顶堆。以下考虑最大优先队列。    假设现已建好大顶堆A,且已经实现了调整堆的函数heapify(A,n,index)。    下面将C代码中需要完善的三个函数说明如下:    (1) heapMaximum(A):返回大顶堆A中的最大元素。    (2) heapExtractMax(A):去掉并返回大顶堆A的最大元素,将最后一个元素“提前”到堆顶位置,并将剩余元素调整成大顶堆。    (3) maxHeaplnsert(A, key):把元素key插入到大顶堆A的最后位置,再将A调整成大顶堆。    优先队列采用顺序存储方式,其存储结构定义如下:    #define PARENT(i) i/2    typedef struct array{        int *int  array;/ /优先队列的存储空间首地址      int array size;能//优先队列的长度      int capacity; //优先队列存储空间的容量    }ARRAY;【C代码】(1)函数heapMaximum    int heapMaximum(ARRAY *A){return(1);}(2)函数heapExtractMax    int heapExtractMax(ARRAY *A){          int max;        max=A->int_ array[0];            (2);        A->array_size一;      heapify(A,A->array_size,0);//将剩余元素调整成大顶堆          return max;    }(3)函数maxHeaplnsert    int maxHeaplnsert(ARRAY *A,int key){        int i,*p;        if (A->array-size==A->capacity){//存储空间的容量不够时扩充空间            p=(int*)realloc(A->int array, A->capacity *2*sizeof(int));            if(!p) return-1:            A->int _array=P;            A->capacity=2*A->capacity;        }        A->array_size++:        i=(3);        while(i>0&&(4){            A->int _array[i]=A->int_ array[PARENT(i)];            i=PARENT(i);        }            (5);          return 0;      }【问题1】(10分)    根据以上说明和c代码,填充c代码中的空(1)~(5)。【问题2】(3分)    根据以上c代码,函数heapMaximum, heapExtractMax和maxHeaplnsert的时间复杂度的紧致上界分别为(6)、(7)和(8)(用O符号表示)。【问题3】(2分)    若将元素10插入到堆A=(15,13,9,5,12,8,7,4,0,6,2,1)中,调用maxHeaplnsert函数进行操作,则新插入的元素在堆A中第(9)个位置(从1开始)。[15分]
2022-06-13
试题五(共15分)    阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】    某公司的组织结构图如图5-1所示,现采用组合(Composition)设计模式来构造该公司的组织结构,得到如图5-2所示的类图。       其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。【C++代码】#include <iostream>#include <list>#include <string>using namespace std;class Company{//抽象类protected:    string name;public:    Company(string name){(1)=name;}        (2);//增加子公司、办事处或部门        (3);//删除子公司、办事处或部门};class ConcreteCompany:public Company{private:    list< (4)>children;//存储子公司、办事处或部门public:  ConcreteCompany(string name):Company(name){}  void Add(Company* c){(5) .push back(c);}  void Delete(Company* c){(6).remove(c);}};class HRDepartment:public Company{public:  HRDepartment(string name):Company(name){}//其它代码省略};class FinanceDepartment:public Company{public:  FinanceDepartment(string name):Company(name){}//其它代码省略};void main(){  ConcreteCompany *root=new ComcreteCompany(“北京总公司”,);  root->Add(new HRDepartment(“总公司人力资源部”)):  root->Add(new FinanceDepartment(“总公司财务部”));  ConcreteCompany *comp=new ConcreteCompany(“上海分公司”);  comp->Add(new HRDepartment(“上海分公司人力资源部”));  comp->Add(new FinanceDepartment(“上海分公司财务部”));        (7);  ConcreteCompany *compl=new ConcreteCompany(“南京办事处”,):  comp l->Add(new HRDepartment(“南京办事处人力资源部”));  comp l->Add(new FinanceDepartment(“南京办事处财务部”)):      (8);//其它代码省略}[15分]
2022-06-13
试题六(共15分)    阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某公司的组织结构图如图6-1所示,现采用组合(Composition)设计模式来设计,得到如图6-2所示的类图。         其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。【Java代码】import java.util.*:(1) Company{  protected String name;  public Company(String name){(2)=name:}  public abstract void Add(Company c);//增加子公司、办事处或部门  public abstract void Delete(Company c);//删除子公司、办事处或部门}class ConcreteCompany extends Company{  private List< (3) > children=new ArrayList< (4) >();                                            //存储子公司、办事处或部门  public ConcreteCompany(String name){super(name);}  public void Add(Company c){(5) .add(c);}  public void Delete(Company c){(6).remove(c);}}class HRDepartment extends Company{    public HRDepartment(String name){super(name);}    //其它代码省略}class FinanceDepartment extends Company{    public FinanceDepartment(String name){super(name);}    //其它代码省略}public class Test{    public static void main(String[] args){    ConcreteCompany root=new ConcreteCompany(“北京总公司”):    root.Add(new HRDepartment(“总公司人力资源部”)):    root.Add(new FinanceDepartment(“总公司财务部”)):    ConcreteCompany comp=new ConcreteCompany(“上海分公司”):    comp.Add(new HRDepartment(“上海分公司人力资源部”));    comp.Add(new FinanceDepartment(“上海分公司财务部”));          (7);    ConcreteCompany comp =new ConcreteCompany(“南京办事处”);    compl.Add(new HRDepartment(“南京办事处人力资源部”)):    compl.Add(new FinanceDepartment(“南京办事处财务部”):          (8);//其它代码省略    }}[15分]
2022-06-13
试题一(共15分)阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。 【说明】某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下:(1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。(2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。(3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确, 返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作), 若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。(4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。(5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。   现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。   【问题 1】(3分)使用说明中的词语,给出图1-1中的实体E1~E3的名称。【问题 2】(3分)使用说明中的词语,给出图1-2中的数据存储D1~D3的名称。【问题3】(6分)给出图1-2中加工P的名称及其输入、输出流。除加工P的输入与输出流外,图1-2还缺失了两条数据流,请给出这两条数据流的起点和终点。   注:名称使用说明中的词汇,起点和终点均使用图1-2中的符号或词汇。【问题4】(3分)在绘制数据流图时,需要注意加工的绘制。请给出三种在绘制加工的输入、输出时可能出现的错误。[15分]
2022-06-13
试题二(共15分)阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】某学校拟开发一套实验管理系统,对各课程的实验安排情况进行管理。【需求分析】一个实验室可进行多种类型不同的实验。由于实验室和实验员资源有限,需根据学生人数分批次安排实验室和实验员。一门课程可以为多个班级开设,每个班级每学期可以开设多门课程。一门课程的一种实验可以根据人数、实验室的可容纳人数和实验类型,分批次开设在多个实验室的不同时间段。一个实验室的一次实验可以分配多个实验员负责辅导实验,实验员给出学生的每次实验成绩。(1)课程信息包括:课程编号、课程名称、实验学时、授课学期和开课的班级等信息;实验信息记录该课程的实验进度信息,包括:实验名、实验类型、学时、安排周次等信息,如表2-1所示。表 2-1 课程及实验信息(2)以课程为单位制定实验安排计划信息,包括:实验地点,实验时间、实验员等信息,实验计划如表2-2所示。(3)由实验员给出每个学生每次实验的成绩,包括:实验名、学号、姓名、班级、实验成绩等信息,实验成绩如表2-3所示。   (4)学生的实验课程总成绩根据每次实验的成绩以及每次实验的难度来计算。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。   【逻辑结构设计】根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):课程(课程编号,课程名称,授课院系,实验学时) 班级(班级号,专业,所属系) 开课情况(    (1)      ,授课学期)实验(  (2)    ,实验类型,难度,学时,安排周次)实验计划(    (3)    ,实验时间,人数) 实验员(      (4)      ,级别) 实验室(实验室编号,地点,开放时间,可容纳人数,实验类型)学生(      (5)      ,姓名,年龄,性别)实验成绩(      (6)        ,实验成绩,评分实验员)【问题1】(6分)补充图2-1中的联系和联系的类型。【问题2】(6分)根据图2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(6)补充完整并用下划线指出这六个关系模式的主键。【问题3】(3分)如果需要记录课程的授课教师,新增加“授课教师”实体。请对图2-1进行修改,画出修改后的实体间联系和联系的类型。[15分]
2022-06-13
试题三(共15分)阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】某运输公司决定为新的售票机开发车票销售的控制软件。图3-1给出了售票机的面板示意图以及相关的控制部件。   售票机相关部件的作用如下所述:(1)目的地键盘用来输入行程目的地的代码(例如,200表示总站)。(2)乘客可以通过车票键盘选择车票种类(单程票、多次往返票和座席种类)。(3)继续/取消键盘上的取消按钮用于取消购票过程,继续按钮允许乘客连续购买多张票。(4)显示屏显示所有的系统输出和用户提示信息。(5)插卡口接受MCard(现金卡),硬币口和纸币槽接受现金。(6)打印机用于输出车票。假设乘客总是支付恰好需要的金额而无需找零,售票机的维护工作(取回现金、放入空白车票等)由服务技术人员完成。系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和类图分别如图3-2和图3-3所示。   【问题1】(5分)根据说明中的描述,给出图3-2中A1和A2所对应的参与者,U1所对应的用例,以及(1)、(2)处所对应的关系。【问题2】(7分)根据说明中的描述,给出图3-3中缺少的C1~C4所对应的类名以及(3)~(6)处所对应的多重度。【问题3】(3分)图3-3中的类图设计采用了中介者(Mediator)设计模式,请说明该模式的内涵。[15分]
2022-06-13
试题四(共15分)阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】对有向图进行拓扑排序的方法是:(1)初始时拓扑序列为空;(2)任意选择一个入度为0的顶点,将其放入拓扑序列中,同时从图中删除该顶点以及从该顶点出发的弧;(3)重复(2),直到不存在入度为0的顶点为止(若所有顶点都进入拓扑序列则完成拓扑排序,否则由于有向图中存在回路无法完成拓扑排序)。函数int* TopSort(LinkedDigraph G)的功能是对有向图G中的顶点进行拓扑排序,返回拓扑序列中的顶点编号序列,若不能完成拓扑排序,则返回空指针。其中,图G中的顶点从1开始依次编号,顶点序列为v1,v2,…,vn,图G采用邻接表示,其数据类型定义如下:#define MAXVNUM 50                      /*最大顶点数*/typedef struct ArcNode{                    /*表结点类型*/int adjvex;                          /*邻接顶点编号*/struct ArcNode *nextarc;            /*指示下一个邻接顶点*/}ArcNode;typedef struct AdjList{              /*头结点类型*/char vdata;                        /*顶点的数据信息*/ArcNode *firstarc;                  /*指向邻接表的第一个表结点*/}AdjList;typedef struct LinkedDigraph{              /*图的类型*/int n;                              /*图中顶点个数*/AdjList Vhead[MAXVNUM];                /*所有顶点的头结点数组*/}LinkedDigraph;例如,某有向图G如图4-1所示,其邻接表如图4-2所示。   【C代码】int *TopSort(LinkedDigraph G) {ArcNode *p;                            /*临时指针,指示表结点*/Queue Q; /*临时队列,保存入度为0的顶点编号*/int k = 0;                                    /*临时变量,用作数组元素的下标*/int j = 0, w = 0;                              /*临时变量,用作顶点编号*/int *topOrder, *inDegree;topOrder = (int *)malloc((G.n+1) * sizeof(int));  /*存储拓扑序列中的顶点编号*/inDegree = (int *)malloc((G.n+1) * sizeof(int));  /*存储图G中各顶点的入度*/if (!inDegree || !topOrder) return NULL;(1)  ;                                  /*构造一个空队列*/for ( j = 1; j <= G.n; j++ ) {                    /*初始化*/topOrder[j] = 0;      inDegree[j] = 0;}for (j = 1; j <= G.n; j++)                          /*求图G中各顶点的入度*/for( p = G.Vhead[j].firstarc; p; p = p->nextarc )inDegree[p-> adjvex] += 1;for (j = 1; j <= G.n; j++)                      /*将图G中入度为0的顶点保存在队列中*/if ( 0 == inDegree[j] ) EnQueue(&Q,j);while (!IsEmpty(Q)) {(2) ;                                /*队头顶点出队列并用w保存该顶点的编号*/topOrder[k++] = w;  /*将顶点w的所有邻接顶点的入度减1(模拟删除顶点w及从该顶点出发的弧的操作)*/for(p = G.Vhead[w].firstarc; p; p = p->nextarc) {(3)-= 1;if (0 ==(4)) EnQueue(&Q, p->adjvex);}/* for */}/* while */free(inDegree);if (  (5)  )return NULL;return topOrder;} /*TopSort*/【问题1】(9分)根据以上说明和C代码,填充C代码中的空(1)~(5)。【问题2】(2分)对于图4-1所示的有向图G,写出函数TopSort执行后得到的拓扑序列。若将函数TopSort中的队列改为栈,写出函数TopSort执行后得到的拓扑序列。【问题3】(4分)设某有向无环图的顶点个数为n、弧数为e,那么用邻接表存储该图时,实现上述拓扑排序算法的函数TopSort的时间复杂度是(6)。若有向图采用邻接矩阵表示(例如,图4-1所示有向图的邻接矩阵如图4-3所示),且将函数TopSort中有关邻接表的操作修改为针对邻接矩阵的操作,那么对于有n个顶点、e条弧的有向无环图,实现上述拓扑排序算法的时间复杂度是(7)。   [15分]
2022-06-13
试题五(共15分)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】 某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表5-1所示。   图5-1中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。【C++ 代码】 #include<iostream>using namespace std;class FlyBehavior {public : virtual void fly() = 0;};class SubSonicFly:public FlyBehavior{public: void fly(){ cout << "亚音速飞行!" << endl; }};class SuperSonicFly:public FlyBehavior{public: void fly(){ cout << "超音速飞行!" << endl; }};class TakeOffBehavior {public: virtual void takeOff() = 0;};class VerticalTakeOff:public TakeOffBehavior{public: void takeOff(){ cout << "垂直起飞!" << endl; }};class LongDistanceTakeOff:public TakeOffBehavior {public: void takeOff (){ cout << "长距离起飞!" << endl; }};class AirCraft{protected:(1)  ;(2)  ;public:void fly(){(3); }void takeOff() {(4); };};class Helicopter: public AirCraft {public:Helicopter (){flyBehavior = new(5);takeOffBehavior = new(6);}(7){if(!flyBehavior) delete flyBehavior;if(!takeOffBehavior) delete takeOffBehavior;}};//其它代码省略[15分]
2022-06-13
试题六(共15分)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】 某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表6-1所示。   图6-1中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。【Java 代码】interface FlyBehavior {public void fly();};class SubSonicFly implements FlyBehavior{public void fly(){ System.out.println("亚音速飞行!"); }};class SuperSonicFly implements FlyBehavior{public void fly(){ System.out.println("超音速飞行!" ); }};interface TakeOffBehavior {public void takeOff();};class VerticalTakeOff implements TakeOffBehavior {public void takeOff (){ System.out.println("垂直起飞!" ); }};class LongDistanceTakeOff implements TakeOffBehavior {public void takeOff(){ System.out.println("长距离起飞!"); }};abstract class AirCraft {protected  (1)  ;protected  (2)  ;public void fly(){  (3)  ; }public void takeOff() {  (4)  ; };};class Helicopter(5)AirCraft{public Helicopter (){flyBehavior = new  (6)  ;takeOffBehavior = new  (7)  ;}};//其它代码省略[15分]
2022-06-13
试题一【说明】    现准备为某银行开发一个信用卡管理系统CCMS,该系统的基本功能为:    1.信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS。如果信用卡申请被银行接受,CCMS将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封拒绝函。非信用卡客户收到确认函后成为信用卡客户。    2.信用卡激活。信用卡客户向CCMS提交激活请求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功激活。    3.信用卡客户信息管理。用卡客户的个人信息可以在CCMS中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。    4.交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在CCMS中。信用卡客户可以通过CCMS查询并核实其交易信息(包括信用卡交易记录及交易额)。    图1-1和图1-2分别给出了该系统的顶层数据流图和0层数据流图的初稿。【问题1】    根据【说明】,将图1-1中的E1-E3填充完整。【问题2】    图1-1中缺少三条数据流,根据【说明】,分别指出这三条数据流的起点和终点。(注:数据流的起点和终点均采用图中的符号和描述)【问题3】    图1-2中有两条数据流是错误的,请指出这两条数据流的名称,并改正。(注:数据流的起点和终点均采用图中的符号和描述)【问题4】    根据【说明】,将图1-2中P1~P4的处理名称填充完整。                            图1-1顶层数据流图                           图1-2  0层数据流图[15分]
2022-06-13
试题二【说明】    某公司拟开发一多用户电子邮件客户端系统,部分功能的初步需求分析结果如下:    (1)邮件客户端系统支持多个用户,用户信息主要包括用户名和用户密码,且系统中的用户名不可重复。    (2)邮件帐号信息包括邮件地址及其相应的密码,一个用户可以拥有多个邮件地址(如userl@123.com)。    (3)一个用户可拥有一个地址薄,地址簿信息包括联系人编号、姓名、电话、单位地址、邮件地址1、邮件地址2,邮件地址3等信息。地址薄中一个联系人只能属于一个用户,且联系人编号唯一标识一个联系人。    (4)一个邮件帐号可以含有多封邮件,一封邮件可以含有多个附件。邮件主要包括邮件号、发件人地址、收件人地址、邮件状态、邮件主题、邮件内容、发送时间、接收时间。其中,邮件号在整个系统内唯一标识一封邮件,邮件状态有已接收、待发送、己发送和己删除4种,分别表示邮件是属于收件箱、发件箱、已发送箱和废件箱。一封邮件可以发送给多个用户。附件信息主要包括附件号、附件文件名、附件大小。一个附件只属于一封邮件,附件号仅在一封邮件内唯一。【问题1】    根据以上说明设计的E-R图如图2-1所示,请指出地址簿与用户、电子邮件帐号与邮件、邮件与附件之间的联系类型。                        图2-1 电子邮件客户端系统E-R图【问题2】      该邮件客户端系统的主要关系模式如下,请填补(a)~(c)的空缺部分。    用户(用户名,用户密码)    地址簿( (a) ,联系人编号,姓名,电话,单位地址,邮件地址1,邮件地址2,邮件地址3)    邮件账号(邮件地址,邮件密码,用户名)    邮件( (b) ,收件人地址,邮件状态,邮件主题,邮件内容,发送时间,接收时间)    附件( (c) ,附件号,附件文件名,附件大小)【问题3】    (1)请指出【问题2】中给出的地址簿、邮件和附件关系模式的主键,如果关系模式存在外键请指出。    (2)附件属于弱实体吗?请用50字以内的文字说明原因。[15分]
2022-06-13
试题三(共15分)    阅读下列说明和UML图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】    某企业为了方便员工用餐,餐厅开发了一个订餐系统(COS:Cafeteria Ordering System),企业员工可通过企业内联网使用该系统。    企业的任何员工都可以查看菜单和今日特价。    系统的顾客是注册到系统的员工,可以订餐(如果未登录,需先登录)、注册工资支付、预约规律的订餐,在特殊情况下可以覆盖预订。    餐厅员工是特殊顾客,可以进行备餐、生成付费请求和请求送餐,其中对于注册工资支付的顾客生成付费请求并发送给工资系统。    菜单管理员是餐厅特定员工,可以管理菜单。    送餐员可以打印送餐说明,记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。    顾客订餐过程如下:    1.顾客请求查看菜单;    2.系统显示菜单和今日特价;    3.顾客选菜;    4.系统显示订单和价格;    5.顾客确认订单;    6.系统显示可送餐时间;    7.顾客指定送餐时间、地点和支付方式;    8.系统确认接受订单,然后发送Email给顾客以确认订餐,同时发送相关订餐信息通  知给餐厅员工。    系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和一次订餐的活动图初稿分别如图3-1和图3-2所示。   【问题1】(2分)    根据【说明】中的描述,给出图3-1中A1和A2所对应的参与者。【问题2】(8分)    根据【说明】中的描述,给出图3-1中缺少的四个用例及其所对应的参与者。【问题3】(4分)    根据【说明】中的描述,给出图3-2中(1)~(4)处对应的活动名称或图形符号。【问题4】(1分)    指出图3-1中员工和顾客之间是什么关系,并解释该关系的内涵。[15分]
2022-06-13
试题四(共15分)    阅读下列说明,回答问题1至问题2,将解答填入答题纸的对应栏内。【说明】     0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,和wi为非负数),背包容量为W(W为非负数),选择其中一些物品装入背包,使装入背包物品的总价值最大,即     ,且总重量不超过背包容量,即    ,其中,xi∈{0,1},xi=0表示第i个物品不放入背包,xi=1表示第i个物品  放入背包。【问题1】(8分)    用回溯法求解此0-1背包问题,请填充下面伪代码中(1)~(4)处空缺。    回溯法是一种系统的搜索方法。在确定解空间后,回溯法从根结点开始,按照深度优先策略遍历解空间树,搜索满足约束条件的解。对每一个当前结点,若扩展该结点己经不满足约束条件,则不再继续扩展。为了进一步提高算法的搜索效率,往往需要设计一个限界函数,判断并剪枝那些即使扩展了也不能得到最优解的结点。现在假设已经设计了BOUND(v,w,k,W)函数,其中v, w, k和W分别表示当前已经获得的价值、当前背包的重量、己经确定是否选择的物品数和背包的总容量。对应于搜索树中的某个结点,该函数值表示确定了部分物品是否选择之后,对剩下的物品在满足约束条件的前提下进行选择可能获得的最大价值,若该价值小于等于当前已经得到的最优解,则该结点无需再扩展。    下面给出0-1背包问题的回溯算法伪代码。    函数参数说明如下:    W:背包容量;n:物品个数;w:重量数组;v:价值数组;fw:获得最大价值时背包的重量;fp:背包获得的最大价值;X:问题的最优解。    变量说明如下:    cw:当前的背包重量;cp:当前获得的价值;k:当前考虑的物品编号;Y:当前已获得的部分解。    BKNAP(W,n,w,v,fw,fp,X)    1 cw ← cp ← 0    2  (1)      3 fp ← -1    4 while true    5    while k≤n and cw+w[k] ≤W do    6                  (2)      7                cp ← cp+v[k]    8                Y[k] ← 1    9                k ← k+1    10    if k>n then    11        if fp<cp then    12            fp ← cp    13            fw ← ew    14            k ← n    15            X ← Y    16    else Y(k) ← 0    17    while BOUND(cp,cw,k,W) ≤fp do    18        while k≠0 and Y(k) ≠1 do    19              (3)      20        if k=0 then return    21        Y[k]←0    22        cw ← cw ← w[k]    23        cp ← cp ← v[k]    24      (4)  【问题2】(7分)    考虑表4-1的实例,假设有3个物品,背包容量为22。图4-1中是根据上述算法构造的搜索树,其中结点的编号表示了搜索树生成的顺序,边上的数字1/0分别表示选择/不选择对应物品。除了根结点之外,每个左孩子结点旁边的上下两个数字分别表示当前背包的重量和已获得的价值,右孩子结点旁边的数字表示扩展了该结点后最多可能获得的价值。为获得最优解,应该选择物品 (5) ,获得的价值为 (6) 。              对于表4-1的实例,若采用穷举法搜索整个解空间,则搜索树的结点数为 (7) ,而用了上述回溯法,搜索树的结点数为 (8) 。   [15分]
2022-06-13
试题五(共15分)    阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】    现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如5-1所示:    【C++代码】#include <list>#include <iostream>#include <string>using namespace std;class AbstractFile{protected:    string name;  //文件或目录名称public:    void printName(){cout<<name;}  //打印文件或目录名称    virtual void addChild(AbstractFile *file)=0;  //给一个目录增加子目录或文件}    virtual void removeChild(AbstractFile *file)=0;  //删除一个目录的子目录或文件    virtual list<AbstractFile*> *getChildren()=0;  //获得一个目录的子目录或文件  };class ..file:public AbstractFile{public:    File(string name) { (1) = name;}    void addChild(AbstractFile *file){return;}    void removeChild(AbstractFile *file){return;}    (2) getChildren(){return (3) ;}};class Folder :public AbstractFile{private:    list <AbstractFile*> childList:  //存储子目录或文件public:    Folder(string name){ (4) name;}    void addChild(AbstractFile*file){childList.push_back(file);}    void removeChild(AbstractFile*file){childList.remove(file);}    list<AbstractFile*>*getChildren(){return (5) ;}};void main(){    //构造一个树形的文件/目录结构    AbstractFile *rootFolder=new Folder("c:\\ ");    AbstractFile*compositeFolder=new Folder("composite");    AbstractFile *windowsFolder=new Folder("windows");    AbstractFile*file=new File("TestCompositejava");    rootFolder->addChild(compositeFolder);    rootFolder->addChild(windowsFolder);    compositeFolder->addChild(file);}[15分]
2022-06-13
试题六(共15分)    阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】    现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如6-1所示:    【Java代码】import Java.util.ArrayList;import java.util.List;  (1) class AbstractFile{    protected String name;    public void printName(){System.out.println(name);}    public abstract boolean addChild(AbstractFile file);    public abstract boolean removeChild(AbstractF ile file);    public abstract List<AbstractFile> getChildren();}class File extends AbstractFile{    public File(String name){this.name=name;}    public boolean addChild(AbstractFile file){return false;}    public boolean removeChild(AbstractFile file){return false;}    public List<AbstractFile> getChildren(){return  (2) ;}}class Folder extends AbstractFile{    private List <AbslractFile> childList;    public Folder(String name){          this.name=name;        this.childList=new ArrayList<AbstractFile>();      }    public boolean addChild(AbstractFile file) { return childList.add(file);}    public boolean removeChild(AbstractFile file){return childList.remove(file);}    public (3) <AbstractFile> getChildren(){return (4) ;}}public class Client{    public static void main(String[] args){        //构造一个树形的文件/目录结构        AbstractFile rootFolder= new Folder("c:\\ ");        AbstractFile compositeFolder=new Folder("composite");        AbstractFile windowsFolder=new Folder("windows");        AbstractFile file=new File("TestComposite.java");        rootFolder.addChild(compositeFolder) ;        rootFolder.addChild(windowsFolder);        compositeFolder.addChild(file) ;        //打印目录文件树        printTree(rootFolder);    }    private static void printTree(AbslractFile ifile){        ifile.printName();        List <AbslractFile> children=ifile.getChildreno:        if(children==null) return;        for (AbstractFile ..file:children) {                (5) ;          }    }}该程序运行后输出结果为:c:\compositeTestComposite.javaWindows[15分]
2022-06-13
试题七(共15分)    阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】    现有n(n<1000)节火车车厢,顺序编号为1,2,3,…,n,按编号连续依次从A方向的铁轨驶入,从B方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到A方向的铁轨上;一旦车厢驶入B方向铁轨就不能再回到车站,如图7-1所示,其中Station为栈结构,初始为空且最多能停放1000节车厢。        下面的C程序判断能否从B方向驶出预先指定的车厢序列,程序中使用了栈类型STACK,关于栈基本操作的函数原型说明如下:    void InitStack(STACK *s):初始化栈。    void Push (STACK *s,int e):将一个整数压栈,栈中元素数目增1。    void Pop (STACK *s):栈顶元素出栈,栈中元素数目减1。    int Top (STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。    int IsEmpty (STACK s):若是空栈则返回1,否则返回0。【C程序】#include<stdio.h>/*此处为栈类型及其基本操作的定义,省略*/  int main(){      STACK station;      int state[1000];      int n;              /*车厢数*/      int begin, i, j, maxNo; /*maxNo为A端正待入栈的车厢编号*/      printf("请输入车厢数:");      scanf("%d",&n);      printf(“请输入需要判断的车厢编号序列(以空格分隔):”);      if(n<1)return-1;      for (i=0; i<n; i++)  /*读入需要驶出的车厢编号序列,存入数组state[]*/        scanf("%d",&state[i]);      (1) ;          /*初始化栈*/      maxNo=1;      for(i=0; i<n; ){  /*检查输出序列中的每个车厢号state[i]是否能从栈中获取*/        if( (2) ){    /*当栈不为空时*/            if (state[i]=Top(station)) {    /*栈顶车厢号等于被检查车厢号*/                printf("%d",Top(station));                Pop(&station);i++;              }                  else                if ( (3) ) {                      printf(“error\n”);                        return 1;                  }                  else{                        begin= (4) ;                        for(j=begin+l;j <=state [i];j++){                            Push(&station, j);                          }                      }          }        else{  /*当栈为空时*/                  begin=maxNo;                for(j=begin; j<=state[i];j++) {                      Push(&station, j);                  }                  maxNo= (5) ;        }    }    printf("OK");    return 0;}[15分]
2022-06-13
试题一    阅读下列说明,回答问题1和问题2,将解答填入答题纸的对应栏内。    【说明】    假设某大型商业企业由商品配送中心和连锁超市组成,其中商品配送中心包括采购、财务、配送等部门。为实现高效管理,设计了商品配送中心信息管理系统,其主要功能描述如下:    1. 系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件。    2. 在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处理发送配送通知;否则,向采购部门发出缺货通知。    3.  配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件。    4.  采购部门接到缺货通知后,与供货商洽谈,进行商品采购处理,合格商品入库,并记录采购清单至采购清单记录文件、向配送处理发出配送通知,同时通知财务部门给供货商支付货款。    该系统采用结构化方法进行开发,得到待修改的数据流图(如图1-1所示)。     【问题1】(8 分)     使用【说明】中的词语,给出图 1-1中外部实体 E1至E4 的名称和数据存储 D1至D4的名称。    【问题2】(7分)    图 1-1 中存在四处错误数据流,请指出各自的起点和终点;若将上述四条错误数据流删除,为保证数据流图的正确性,应补充三条数据流,请给出所补充数据流的起点和终点。(起点和终点请采用数据流图1-1中的符号或名称)   [15分]
2022-06-13