1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 46及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和数据流图,回答问题 1至问题 3,将解答填入对应栏内。 说明 某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。 以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层 数据流图是正确的。图 1-1是顶层数据流图,图 1-2是第0层数据流图,图 1-3是
2、第 1层数据流图,其中 (A)是加工 1的子图, (B)是加工 2的子图。 图 1-1 图 1-2 图 1-3 数据字典 (1)数据流条目 订货单 =配件号 +配件名 +规格 +数量 +顾客名 +地址 提货单 =订货单 +金额 采货单 =配件号 +配件名 +规格 +数量 +供应商名 +地址 送货单 =配件号 +配件名 +规格 +数量 +金额 (2)文件说明 文件名:配件库存 组成: 配件号 +配件名 +规格 +数量 +允许的最低库存量 1 根据题意,图 1-2中哪个 文件可不必画出。 2 根据题意,指出图 1-3(A)中缺失的数据流的名称,并指出该数据流的起点和终点。 3 根据题意,指出图 1
3、-3(B)中缺失的数据流的名称,并指出该数据流的起点和终点。 3 阅读下列说明和 E-R图,回答问题 1至问题 3,将解答填入对应栏内。 说明 某学校的教学系统描述如下: 学生信息包括:学号 (SNo)、姓名 (Sname)、性别(Sex)、年龄 (Age)、入学年份 (Year)、主修专业 (Major),其中学号是入学时唯一编定的。 课程信息包括:课程号 (CNo)、课程名称 (CName)、学时 (Period)、学分(Credit),其中课程号是唯一编定的。 一个学生可选多门课,每个学生选每门课有一个成绩。图 2-1是经分析得到的 E-R图。 图 2-1 4 设基本表: Student
4、(SNo, SName, Sex, Age, Year, Major), Course(CNo,Cname, Period, Credit), Grade(SNo, CNo, Grade)通过如下 SQL语句建立,请在SQL语句空缺处填入正确的内容。 CREATE TABLE Student(SNO CHAR(6)NOT NULL, SName CHAR(20), Sex CHAR(1), Age INTEGER, Year CHAR(4), Major CHAR(20), (1) ); CREATE TABLE Course(CNo CHAR(6)NOT NULL, CName CHAR(2
5、0), Period INTEGER, Credit INTEGER, (2) ); CREATE TABLE Grade(SNo CHAR(6)NOT NULL, CNo CHAR(6)NOT NULL, Grade REAL, (3) , (4) , (5) ); 4 (1) 5 (2) 6 (3) 7 (4) 8 (5) 9 若另有表 Teach(CName, TName)存储教师任课情况, Tname表示教师名。用SQL创建一个含有学号、姓名、课程名、成绩、任课教师名的 “主修专业为计算机CS”的学生成绩视图,并要求进行修改、插入操作时保证该视图只有计算机系的学生。请在 SQL语句空缺
6、处填入正确的内容。 CREATE VIEW SG (1) SELECT Student.SNo,SName,Grade,Course.CName,TName FROM Student,Grade,Teach, WHERE (2) AND (3) AND Major=cs, (4); 9 (1) 10 (2) 11 (3) 12 (4) 13 如下的 SQL语句是用于查询 “每个学生的选修课程数、总成绩、平均成绩 ”的不完整语句,请在空缺处填入正确的内容。 SELECT Student.SNo, (1), SUM(Grade),AVG(Grade) FROM Student,Grade WHER
7、E Student.SNo=Grade.SNo, GROUP BY (2); 13 (1) 14 (2) 14 阅读下列说明和图,回答问题 1至问题 2,将解答填入对应栏内。 说明 银行的自动柜员机 (ATM)的功能描述如下: (1)金融卡与信用卡识别:包含伪卡识别以及密码验证; (2)主菜单项:这是一台 ATM最主要的人机界面,提供各项功能给客户,具体有:提款、转帐、更改密码以及存款; (3)结束操作:客户执行完 “菜单项 ”的功能后,可以选择 “打印单据 ”或 “不打印单据 ”,选好后 就结束此次交易。 注意, ATM除了能处理本行的银行卡外,其他银行的银行卡也应该能处理,通过 “金融中心
8、 ”与其他银行主机进行数据交换。另外,为了方便, ATM还提供快捷提款,并提供代交费功能 (代交费是以转帐的方式处理的 )。 该系统采用面向对象方法开发,系统中的类以及类之间的关系用 UML类图表示。 15 图 3-1是该系统的用例图,根据题意,用题中所述术语指出图 3-1中参与者 A、B分别是什么,用例 C、 D分别是什么。 图 3-1 16 ATM机有如下状态:空闲、银行卡验证、业务选择等待、取款金 额输入、密码修改、出钞、单据打印。 ATM机一般处于空闲状态,当有客户插入银行卡,则进行银行卡验证,若银行卡无效则结束服务,否则进入业务选择等待。业务有取款、修改密码等,也可以选择退出结束服务
9、, ATM返回空闲状态。选择取款业务后,等待取款金额输入,确认后判断余额是否足够,若余额不足,则给出提示信息,并进入业务选择等待;若余额充足,则出钞,若客户需要打印单据则进入单据打印状态,否则返回业务选择等待。选择任意一个业务后,可以取消返回业务选择等待。图 3-2描述了 ATM状态的转变情况。 图 3-2 请指出判定 A、 转换 B及状态 C分别是什么。 16 阅读下列说明和图,回答问题 1到问题 3,将解答填入对应栏内。 说明 操作系统中,死锁 (Deadlock)是指多个进程在运行的过程中因争夺资源而造成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 面对死
10、锁问题有两个解决方案:预防死锁和避免死锁。 预防死锁是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或多个,以此来预防死锁的发生。预防死锁由于较易实现,已被广 泛应用,但由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量的降低。 避免死锁同样是属于事先预防的策略,但它无须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。 银行家算法 (Bankers algorithm)是 Dijkstra于 1965年提出的一个经典的避免死锁的算法。形象地描述银行
11、发放贷款不能使有限可用资金匮乏而导致整个银行无法运转的思路,也就是说每次请求贷款,银行要考虑他能否凭着贷款完成项 目,并还清贷款使银行运转正常。令 Request(i)是进程 P(i)请求向量,如果 Request(i)j=k则进程 P(i)希望请韵类资源 k个。具体算法步骤如下: (1)如果 Request(i) Need(i)则出错 (请求量超过申报的最大量 ),否则转到 (2); (2)如果 Request(i) Available则 P(i)等待,否则转 (3); (3)系统对 P(i)所请求的资源实施试探分配,并更改数据结构中的数值; (4)Available=Available-R
12、equest(i); A1location(i) =Allocation(i) +Request(i); Need(i)=Need(i)-Request(i); (5)执行安全性算法,如果是安全的,则承认试分配,否则废除试分配,让进程P(i)继续等待。 所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次运行完成,这种进程序列 P1, P2, , Pn)就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。 17 简述 产生死锁的四个必要条件。 18 设系统中有三种类型的资源 (A, B, C)和五个进程 (PO, P1
13、, P2, P3, P4),某时刻的资源分配状态如图 4-1所示。给出该时刻存在的一个安全序列。 图 4-1 19 若系统中有同类资源 16个,有 4个进程共享该资源。已知 P1、 P2、 P3、 P4所需总资源分别是 8、 5、 9、 6。各进程请求资源次序为 (序号,进程,申请量 ): (1,P1, 6)、 (2, P2, 4)、 (3, P3, 5)、 (4, P4, 1)、 (5, P1, 1)、 (6, P2, 1)。若用银行家算法为它们分配资源,分析每一步请 求以后,各个进程还需的资源数以及系统所剩资源数,并指出系统是否安全。注,当某序号的申请导致系统不安全时,跳过该请求 (拒绝该
14、请求 )继续往下判断,相当于将该进程阻塞。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 19 阅读下列函数说明和 C+代码,将应填入 (n)处的字句写在对应栏内。 说明 在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了 Decorator(修饰 )模式。 SalesOrder对象使用一个 SalesTicket对象打印销售票据,先打印销售票据内容,然后再打印脚注。图 5-1显示了各个类间的关系。以下是 C+语言实现,能够正确编译通过
15、。 图 5-1 C+代码 class Component public: (1) void prtTicket()=0; ; class SalesTicket: public Component public: void prtTicket() cout “Sales Ticket!“ endl; ; class Decorator: public Component public: virtual void prtTicket(); Decorator(Component *myC); private: (2) myComp; ; Decorator:Decorator(Component
16、 *myC) myComp=myC; void Decorator: prtTicket() myComp- prtTicket(); class Footer: public Decorator public: Footer(Component *myC); void prtTicket(); void prtFooter(); ; Footer:Footer(Component *myC): (3) void Footer: prtFooter() cout “Footer“endl; void Footer: prtTicket() (4) ; prtFooter(); class Sa
17、lesOrder public: void prtTicket(); ; void SalesOrder: prtTicket() Component *myST; myST=new Footer( (5) ); myST- prtTicket(); 20 (1) 21 (2) 22 (3) 23 (4) 24 (5) 24 阅读以下说明和 Jrdva代码,将应填入 (n)处的字句写在对应栏内。 说明 在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了 Decorator(修 饰 )模式。 SalesOrder对象使用一个 Sa
18、lesTicket对象打印销售票据。图 6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。 图 6-1 Java代码 /Component.java文件 public (1) class Component abstract publ ic void prtTicket(); /salesTicket.java文件 public class SalesTicket extends Component public void prtTicket() /Sales ticket printing code here System.out.printin(“SalesTicket
19、“); /Decorator.java文件 publ ic abstract class Decorator extends Component public void prtTicket() if(myComp!=null)myComp.prtTicket(); private (2) myComp; public Decorator(Component myC) myComp=myC; /Footer.java文件 public class Footer extends Decorator public Footer(Component myC) (3); public void prtT
20、icket() (4); prtFooter(); publ ic void prtFooter() /place printing footer code here System.out.println(“Footer“); /salesorder.java文件 public class SalesOrder void prtTicket() Component myST; myST=new Footer( (5) ); /Print Ticket with footers as needed myST.prtTicket(); 25 (1) 26 (2) 27 (3) 28 (4) 29
21、(5) 29 阅读以下说明和 C代码,将应填入 (n)处的字句写在对应栏内。 说明 函数combine(a, b, c)是计算两个整数的组合数。由于计算结果可能超出 10ng整型的可表示范围,故采用数组方式存储,例如: k位长整数 m用数组 c存储结构如下:m=ck10k-1+ck-110k-2+c210+c1 ,利用 c0存储长整数 m的位数,即c0=k。数组的每个元素只存储长整数 m的一位数字,长整数运算时,产生的中间结果的某位数字可能会大于 9,这是就应该调用 format将其归整,使数组中的每 个元素始终只存储长整数的一位数字。 整数 a和 b(a b)的组合数为:,其中u1=a, u
22、2=a-1, , ub=a-b+1, d1=1, d2=2, , db=b。为了计算上述分式,先从 u1, u2, , ub中去掉 d1d2db 的因子,得到新的 u1, u2, , ub,然后再将它们相乘。 函数 #define NAXN 100 int gcd(int a, int b)/求两个整数 a和 b的最大公因子 if(a b) intC=a; a=b; b=c; for(inti=b; i =2; i-) if( (1) )return i; return 1; void format(int *a)/将长整数数组归整 int i; for(i=1; i a0|ai =10; i
23、+) if(i =a0) (2); ai+1+=ai/10; ai=ai%10; if(i a0) (3); void combine(int a, int b, int *C) int i, J, k, x; int dMAXN, uMAXN; k=0; for(i=a; i =a-b+1; i-)u+k=i; u0=b; for(i=1; i =b; i+)di=i; for(i=1; i =u0; i+)/从 u中各元素去掉 d中整数的因子 for(j=1; j =b;j+) x=gcd(ui, dj); /计算最大公约数 ui/=X; dj/=x; (4); C1=1; /长整数 c初
24、始化 for(i=1; i =u0; i+)(/将 u中各整数相乘,存于长整数 c中 if(ui!=1) for(j=1; j =c0; j+) Cj=(5); format(C); /将长整数 c归整 30 (1) 31 (2) 32 (3) 33 (4) 34 (5) 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 46答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 采购订单 【试题解析】 分层数据流图中,只涉及单个加工的文件不必画出,可在子图中再画。依此标准,图 1-2中文件 “采购订单 ”只与加工采购有关,故不必画出。 2 【正确答案】 起点:库
25、存配件,终点:确定顾客订单 起点:库存配件,终点:制作的销售及库存情况表 提货单,起点:更新库存,终点:顾客 到货通知,起点:采购,终点:缺到货对照 【试题解析】 分层数据流图时刻牢记父图与子图平衡原则。对这种数据流缺失题目,认真对照父图与予图就可得出答案。另外,还要注意与文件的交互,包括错误数据流大多也是出在此。 根据题述,图 1-3A是加工 1的细化图,加工 1在图 1-2中,认真对照其输入输出数据流。发现缺失数据流 “提货单 ”和 “到货通知 ”,进一步确定数据流的起点和终点。 “提货单 ”是输出数据流,起点应为 加工 “更新库存 ”,其终点自然是 “客户 ”; “到货通知 ”是输入数据
26、流,终点应为加工 “缺到货对照 ”,起点应为加工 “采购 ”。 另外,确定顾客订单时,需要检查库存配件,因此应有文件 “配件库存 ”到加工1.2的数据流。同理,也应有文件 “配件库存 ”到加工 1-4的数据流。 3 【正确答案】 采购单,起点:按供应商汇总,终点:供应商 采购请求,起点:销售,终点:计算配件增量 【试题解析】 同问题 2的分析,仔细对照父图与子图的输入输出数据流,并确认与文件相关的数据流。 4 【正确答案】 PRIMARYKEY(SNo) 5 【正确答案】 PRIMARY KEY(Cno) 6 【正确答案】 PRIMARY KEY(SNo, CNo) 7 【正确答案】 FORE
27、IGN KEY(SNo)REFERENCES Student(SNo) 8 【正确答案】 FOREIGN KEY(CNo)REFERENCES Course(CNo) 【试题解析】 空 (1)处应该是完整性约束条件。在此为声明主键,据题述 Student表的主键应该是 SNo,故空 (1)应填 PRIMARY KEY(SNo)。同理, Course表的主键为 CNo,故空 (2)应填 PRIMARY KEY(CNo), Grade表的主键为 (Sno,CNo),故空 (3)应填 PRIMARY KEY(Sno,CNo)。 Grade表的主键 (Sno, CNo)中, SNo是 Student表
28、的主键, CNo是 Course表的主键,这样,两者就是 Grade表的外健,空 (4)、 (5)是用来声明外健的,分别填(4)FOREIGN KEY(SNo)REFERENCES Student(SNo), (5)FOREIGN KEY(CNo)REFERENCES Course(CNo),顺序可以颠倒。 9 【正确答案】 AS 10 【正确答案】 Student.SNo=Grade.Sno 11 【正确答案】 Course.CName=Teach.Cname 12 【正确答案】 WITH CHECK OPTION 【试题解析】 创建视图: CREATE VIEW视图名 (列表名 ) AS
29、SELECT查询子句 WITH CHECK OPTION 易得空 (1)为 AS。空 (2)、空 (3)处的条件应为学生和成绩中的学号相同,教师和课程中的教师名相同。 为了保证 “进行修改、 插入操作时保证该视图只有计算机系的学生 ”,需要声明为WITH CHECKOPTION,此即空 (4)内容。 13 【正确答案】 COUNT(Grade.CNo) 14 【正确答案】 Student.Sno 【试题解析】 该 SQL语句是用于查询 “每个学生的选修课程数、总成绩、平均成绩 ”,显然空 (1)应为课程数,对应函数应为 COUNT(Grade.CNo),应该按照学号分组,故空 (2)应填 St
30、udent.Sno。 15 【正确答案】 A: “客户 ” B: “金融中心 ” C: “提款 ” D: “转账 ” 【试题解析】 图 3-1给出了系统用例图,用例图 (use case diagram)展现了一组用例、参与者 (actor)以及它们之间的关系。 易知参与者 A是 “客户 ”,参与者 B为 “金融中心 ”。 用例 “快捷提款 ”是 “提款 ”的扩展,因此用例 C是 “提款 ”;用例 “代交费 ”是 “转账 ”的扩展,因此用例 D是 “转账 ”。 16 【正确答案】 A: “金额是否足够 ” B: “银行卡无效 ” C: “打印单据 ” 【试题解析】 取款时,若金额不足,自然取款
31、失败,因此判定 A是判断 “金额是否 足够 ”。 当银行卡验证失败,服务结束, ATM机转入 “空闲 ”,故 B是 “银行卡无效 ”。 状态 C为 “打印单据 ”。 17 【正确答案】 死锁的发生必须具备四个必要条件: . 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内某资源只有一个进程占用; . 请求和保持条件:进程已经保持了至少一个资源但又提出了新的资源请求,若得不到满足则阻塞该进程,但其保持已获得的资源不释放; . 不剥夺条件:进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放; . 环路等待条件:在发生死锁时,必然存在一个进程一资源的环形链,即进程集合
32、 P1, P2, , Pn)中的 P1等待 P2占用的资源, P2等待 P3占用的资源, , Pn等待 P0占用的资源。 18 【正确答案】 P1, P3, P0, P4, P2 19 【正确答案】 (1, P1, 6)余资源 10。此时 P1还需 2, P2还需 5, P3还需 9,P4还需 6。系统存在安全序列: P1, P2, P3, P4,故系统安全。 (2, P2, 4)余资源 6。此时 P1还需 2, P2还需 1, P3还需 9, P4还需 6。系统存在安全序列 :P1, P2, P3, P4,故系统安全。 (3, P3, 5)余资源 1。此时 P1还需 2, P2还需 1, P
33、3还需 4, P4还需 6。系统存在安全序列: P2, P1, P3, P4,故系统安全。 (4, P4, 1)余资源 0。此时 P1还需 2, P2还需 1, P3还需 4, P4还需 5。系统不存在安全序列,故系统不安全。请求 (4, P4, 1)是不安全的,排除该请求,继续往后判断。 (5, P1, 1)余资源 0。此时 P1还需 1, P2还需 1, P3还需 4, P4还需 6。系统不存在安全序列,故系统不安全。请求 (5, P1, 1)是不安全的,排除该请求,继 续往后判断。 (6, P2, 1)余资源 0。此时 P1还需 2, P2还需 0, P3还需4, P4还需 6。 P2进
34、程资源已得到完全满足, P2完成后,资源释放。系统存在安全序列: P2, P1, P3, P4,故系统安全。至此, 6个进程均进行了是否分配资源判断。 【试题解析】 问题 1是概念性,问题 2是对系统安全的理解,问题 3就是银行家算法的一个具体实现,按照银行家算法的详细描述可得。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 20 【正确答案】 virtual 21 【正确答案】 Component* 22 【正确答案】 Decorator(myC) 23 【正确答案】 Decorator: prtT
35、icket() 24 【正确答案】 new SalesTicket() 【试题解析】 由函数 prtTicket()结尾的 “=0”易知,该函数是纯虚函数,须声明为virtual,故空 (1)应填 virtual。 由 Decorator构造函数以及类图可知, Decorator包含一个 Component对象引用,故空 (2)应填 Component*。注意是指针。 函数 Footer(Component *myC)是 Footer类的构造函数,故空 (3)处是对基类的构造,因此空 (3)应填 Decorator(myC)。 Footer类的 prtTicket()方法是先打印 “基本 ”票
36、据,再打印脚注。因此空 (4)是打印 “基本 ”票据, Footer类是 Decorator的子类,故应先调用基类的打印方法,在此应填 Decorator: prtTicket()。:为域作用符。 参照 Footer类的参照函数,空 (5)应为一 个 Component对象指针,这里是要打印带脚注的票据,故此处应填 new SalesTicket()。 25 【正确答案】 abstract 26 【正确答案】 Component 27 【正确答案】 super(myC) 28 【正确答案】 super.prtTicket() 29 【正确答案】 new SalesTicket() 【试题解析】
37、 方法 prtTicket()声明为 abstract,即是抽象方法,故 Component类应为抽象类,因此空 (1)应填 abstract。 由 Decorator构造函数以及类图可知, Decorator包含一个 Component对象引用,故空 (2)应填 Component。 函数 Footer(Component *myC)是 Footer类的构造函数,故空 (3)处是对基类的构造,因此空 (3)应填 super(myC)。 Footer类的 prtTicket0方法是先打印 “基本 ”票据,再打印脚注。因此空 (4)是打印 “基本 ”票据, Footer类是 Decorator的
38、子类,故应先调用基类的打印方法,在此应填 super.prtTicket()。 super是对基类的引用。 参照 Footer类的参照函数,空 (5)应为一个 Component对象指针,这里是要打印带脚注的票据,故此处应填 new SalesTicket()。 30 【正确答案】 a%i=0b%i-=0 31 【正确答案】 ai+1=0 32 【正确答案】 a0=i 33 【正确答案】 c0=1 34 【正确答案】 ui*cj 【试题解析】 函数 gcd()是用来求最大公约数的,从 “if(a b)”块的代码可知, a存储的是较大数,求最大公约数就从 b开始往下试探,当某个整数 i第一次既能
39、整除 a又能整除 b,则说明 i即为 a与 b的最大公约数。故空 (1)应填“a%i=0b%i=0”。 空 (2)是在条件 “i =a0”的情况下执行的,而 for循环条件是 “i, a0|ai10”,则必然意味着 “ai =10”,需要进位调整,而接下来的语句 “ai+1+=ai/10”暗示此时 ai+1需要赋初值 0。故空 (2)应填 “ai+1=0”。 执行到空 (3)调整已经结束,若 if条件 “i a0”成立意味着整数归整后,位数已经突破了原来的 a0,需要调整为当前的位数。故空 (3)应填 “a0=i”。 空 (4)是初始化长整数 c的,接下来的是乘法操作,因此初始化为 1,即 c1=1,显然应该将 c0也初始化为 1。故空 (4)应填 “c0=1”。 从注释知空 (5)所在的二重循环是将 u中的各整数相乘存入 c中,需要将 c的每一位与 u的每一位相乘,故空 (5)应填 “ui*cj”。