您好,欢迎来到暴趣科技网。
搜索
您的当前位置:首页软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷56(

软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷56(

来源:暴趣科技网


软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷

56 (题后含答案及解析)

题型有:1. 必答题 2. 选答题

必答题(共4道大题,每道大题15分)

阅读下列说明,回答问题1~问题4。【说明】 某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客,其格式见表6所示。 对于这样一个销售业务管理系统,分别给出了以下两种关系数据库的设计(下划线表示主关键字) 设计一: 顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone) 收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话 phone) 商品Merchandise(商品代码Mno,商品名称Mname,价格price) Invoice(号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno,商品代码 Mno,单价unitpfice,数量amount) 设计二: 顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone) 收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话 phone) 商品Memhandise(商品代码Mno,商品名称Mname,价格price) Ivoice(号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno) 明细Invoicedetail(号码Ino,商品代码Mno,单价unitprice,数量amount)

1. 设计一的关系模式Invoice最高满足第几范式?为什么?设计一和设计二哪个更加合理?为什么?

正确答案:设计一中Invoice最高满足第一范式。 根据题意可得出以下函数依赖: Ino→Sno,Cno,Idate 而关系Invoice的主码是Ino和Mno。非主属性Sno、Cno和Idate并非完全依赖于主码,因此关系Invoice不满足第二范式,最高满足第一范式。 设计二更加合理。因为设计二解决了设计一中由于非主属性不完全依赖于主码而造成的数据冗余等问题。

2. 根据设计二中关系模式,以下SQL语句是用于“建立2005年1月期间每张的号,交易日期,交易商品件数和交易总金额的视图”的不完整语句,请填补其中的空缺。 CREATE VIEW Invoice -total(1) SELECT Invoice. ino, ldate,(2),(3) FROM Invoice, lnvoicedetail WHERE(4)AND ldate BETWEEN ‘2005-01-01’AND ‘2005-01-31’ GROUPBY(5);

正确答案:(1)AS(2)SUM(amount)(3)SUM(unitpnce * amount)(4)Invoice. Ino=Invoicedetail. Ino(5)Invoice. Ino, Idate或Invoicedetail. Ino. Idate

3. 根据设计二中关系模式,以下SQL语句是用于“查询从未售出的商品信息”的不完整语句,请填补其中的空缺。 SELECT Mno, Mname, price FROM Merchandise(1) WHERE(2)(SELECT(3) FROM lnvoicedetail

WHERE A. Mno=lnvoicedetail. Mno);

正确答案:(1)A和AS A (2)NOTEXISTS (3)*

4. 设计二中关系Merchandise中由属性price表示商品价格,关系lnvoicedetail中的属性 unitprice也表示商品价格。两个是否有必要同时存在?为什么?

正确答案:有必要。Merchandise中由属性price表示的是商品的当前价格,超市中的价格是有可能变动的,而关系Invoicedetail中的属性 unitprice表示的是在开具时该商品的单价。

解析:设计一中根据题意可得出以下函数依赖: Ino→Sno,Cno,ldate 而关系Invoice的主码是Ino和Mno。非主属性Sno、Cno和Idate并非完全依赖于主码,因此关系Invoice不满足第二范式,最高满足第一范式。 关系Invoice的设计的不合理在于该关系中将的单值属性(号码 Ino ,交易日期Idate,顾客代码Cno,收银员代码Sno)和多值属性(商品代码 Mno ,单价unitprice,数量amount)混合在一个关系中,造成关系Invoice的冗余异常、修改异常和删除异常。而设计二则将设计一中关系Invoice分解,使得的单值属性和多值属性分开,避免了异常。因此,设计二明显比设计一要好。 问题2是要建立2005年1月期间每张的号,交易日期,交易商品件数和交易总金额的视图。 首先建立视图的格式为CREATE VIEW<视图名>AS<视图定义>,因此(1)空的答案为AS。 本查询是从Invoice和Invoicedetail两个关系中查询,两关系的连接条件是两关系的Ino相等,因此(4)空的答案是Invoice. Ino=Invoice- detail.Ino。 统计每张的信息需要按将数据分组,也就是按号Ino分组,但因为查询关系Invoice和Invoicedetail都有属性Ino。为了避免二义性,所以分组属性是Invoice. Ino或者是Invoieedetail. Ino。因为在包含聚合运算的Select子句中,只有在Group By子句中出现的属性才能在SELECT子句中以非聚合形式出现,而SELECT子句中有非聚合形式的属性Idate出现,所以(5)空的答案是Invoice. Ino. Idate或Invoicedetail. Ino. Idate。 需要查询的是每张的交易商品件数和交易总金额。交易商品件数是商品数量的总和,因此(2)空的答案是SUM(amount)。交易总金额是每条交易商品明细中每条记录商品金额的总和,每条记录商品金额是unitprice*amount,因此(3)空的答案是SUM(unitprice*a- mount)。 问题3是查询从未售出的商品信息。 SQL语句中有两种格式为表或视图取别名:“表名AS别名”或“表名 别名”。由题中可以看出Merchandise的别名是A,因此填空(1)的答案是A或者AS A。 要查询“从未出售”的商品,也就是要查询的商品在交易记录中不存在,因此(2)空的答案是NOT EXISTS。 Merchandise中由属性price表示的是商品的当前价格,超市中的价格是有可能变动的,而关系Invoicedetail中的属性unitprice表示的是在开具时该商品的单价。如果缺少其中任意一个,将导致商品单价不能进行调整,否则,当商品的单价发生变化时,销售历史中的商品价格就随着发生变化。

阅读以下说明,回答问题1~3,将解答填入对应的解答栏内。[说明] 下图是有关学生(student)和学习(study)信息的对象关联图。

5. 试解释这个对象联系图。

正确答案:对象student 包含身份证号,姓名,籍贯和学习(studies)等属性,对象study 包含课程名,成绩,求学地,大学以及学生(student )等属性。对象student 和 study 之间联系为1:N。基本表的创建,修改和撤销语句语法为: CREATE TABLE SQL 模式名. 基本表名(列名类型, 完整性约束,…);其中,完整性约束包括主键子句,检查子句和外键子句。

6. 试用ORDB的定义语言,定义这个数据库。

正确答案:CREATETYPE MyString char vaiying; CREATE TABLE student( sno integer, shame MyString, city MyString studies setoff( ref(study))); CREATETABLE study(cours

7. 使用ORDB的查询语言,分别写出下列查询的SELECT语句;1)检索每个学生的学习课程和成绩。2)检索至少有一门课程的求学地与籍贯在同一城市的学生的学号和姓名。

正确答案:1) SELECT A. sname, B. coursename, B. gradeFROM student as A, A. studies as B;2) SELECT A. sno, A. sname FROM student asA, A. student as B WHERE A. ciy = B. ciy

阅读以下说明和图,回答问题1和问题2,将答案写在答卷的对应栏内。【说明】 银行客户需要从ATM取100元,他向ATM的读卡机插卡,读卡机读取卡号,然后ATM屏幕初始化,ATM提示输入PIN(密码),客户输入PIN(123456),ATM打开他的账户,密码有效,因此ATM提示选择事务,客户选择取钱,ATM提示输入金额,客户输入100元, ATM验证账户上有足够的钱,就从账上减去100元,ATM吐出100元,并退出客户的卡。

8. 根据上面的描述,完成下述的时序图。

正确答案:1.插卡2.读卡号3.提示输入PIN4.输入PIN5.验证PIN6.选择事务(取钱)7.扣钱(100元)8.提供钱(100元)9.退卡

9. 比较时序图和协作图,说明区别和联系。

正确答案:时序图和协作图都可以用来描述系统对象之间的交互。时序图强调一组对象之间调用的时间顺序,协作图强调这组对象之间的关系。

解析:时序图用来描述对象间的交互行为。它注重消息的时间顺序,即消息的发送和接收的顺序。 时序图的图形组成成分为:对象、生存线、消息和对象激活期(本题中省略)。 试题中要求的就是完成消息,所以要根据消息的时间顺序,和消息发出与接收的对象。由于已经给出了详细明晰的动作过程描述,未完成的时序图中也标识出对象和部分消息,所以,应该比较容易地完成其它的消息。

阅读以下某建账软件的技术说明和数据流图,根据要求回答问题1~问题6。 [说明] 某商业银行已有一套基于客户机/服务器(C/S)模式的储蓄系统X和一套建账软件Y。建账软件Y主要用于将储蓄所手工处理的原始数据转换为系统X所需的数据格式。该建账软件具有以下功能。 (1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。 (2)初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。 (3)数据确认:当上述两套数据完全一致后,将其中任一套作为最终进入系统X的原始数据。 (4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。该建账软件需要打印的分户账清单样式如表3-8所示。(5)数据转换:将经过确认的数据转换为储蓄系统X需要的中间格式数据。 (6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。 该软件的数据流图如图3-17~图3-19所示,图中部分数据流数据文件的格式如下。 初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质 复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质 会计账目=储蓄所号+总户数+总余额 操作结果=初录操作结果+比对操作结果+复录操作结果

10. 不考虑数据确认处理(加工2),请指出图3-17~图3-19数据流图中可能存在的错误。

正确答案:这是一道要求考生掌握分层数据流图输入/输出平衡原则的分析题。本题的解答思路如下。 每个加工必须既有输入数据流,又有输出数据流。但一个加工的输入数据流不要与输出数据流同名。在整套数据流图中,每个数据存储必须既有读的数据流,也有写的数据流。但在某张子图中,可能只有读没有写,或者是只有写而没有读。 在数据流图(DFD)中,加工处理是对输入数据进行相关处理并生成输出数据的过程,因此,对于 DFD中的每个加工处理至少要有一个输入数据流和一个输出数据流。根据这一原则仔细检查图3-17~图 3-19可知,在建账软件第0层数据流图(见图3-18)中,数据确认处理(加工2)和数据清除处理(加工 6)只有输出数据流而没有输入数据,这是图3-18中存在的错误之处。由于题目中已说明“不考虑数据确认处理(加工2)”,因此,本试题的正确答案是“在建账软件第0层数据流图(图3-18)中,数据清除处理(加工6)没有输入数据流”。

11. 请使用[说明]中的词汇,给出数据确认处理所需的数据流,在图3-19建账软件第1层数据流图中的全部可选起点。

正确答案:这也是一道要求考生掌握分层数据流图输入/输出平衡原则的综合分析题。本题的解答思路如下。 在本试题说明中关于“数据确认”功能的描述——“数据确认:当上述两套数据(即初录员和复录员录入的数据)完全一致后,将其中任一套作为最终进入系统X的原始数据”中,“进入系统X”其对应于建账软件第0层数据流图(见图3-18)中“数据确认”处理。由此可知,在图3-19建账软件第1层数据流图中,无论是“初录数据”数据存储还是“复录数据”数据存储都可作为“数据确认”处理的数据源。

12. 请使用[说明]中数据字典条目定义形式,将以下(1)和(2)空缺处的内容填写完整。 初录数据=(1) 复录数据=(2)

正确答案:由题干中给出的关键信息“分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入……”和“初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致”可知,初录员录入的“初录数据”中应包含“初录分户账”和“一致性标志”,而复录员录入的“复录数据”中应包含“复录分户账”和“一致性标志”。然后将它们表达成[说明]中数据字典条目定义形式如下。 初录数据=初录分户账+一致性标志(或初录数据=手工分户账+一致性标志) 复录数据=复录分户账+一致性标志(或复录数据=手工分户账+一致性标志)

13. 请使用[说明]中数据字典条目定义形式,给出图3-18中的“手工分户账”数据流和图3-19中的“初录分户账”和“复录分户账”的关系。

正确答案:这是一道要求考生掌握分层数据流图中父图与子图平衡原则的综合分析题。本题的解答思路如下。 任何一个数据流子图必须与它上一层父图的某个加工相对应,即父图中某加工的输入/输出数据流必须与它的子图的输入/输出数据流在数量和名字上相同。但如果父图中的数据流是由子图中的几个数据流合并而成,即子图中组成这些数据流的数据项全体正好是父图中的这一个数据流,这种情况下也认为是平衡的。 在建账软件第0层数据流图(见图3-18)中,“手工分户账”数据流是“1录入比对”处理的输入数据流,而“1录入比对”处理包含了建账软件第1层数据流图(见图3-19)中的“1.1初录”处理、“1.2复录”处理和“1.3比对”处理。在图3-19中,“1.1初录”处理的输入数据流是“初录分户账”,“1.2复录”处理的输入数据流是“复录分户账”,因此,“手工分户账”数据流包含了“初录分户账”和“复录分户账”,将其表达成本试题[说明]所示例的数据字典条目定义形式如下。 手工分户账=初录分户账+复录分户账

14. 加工1(录入比对处理)除能够检查出初录数据和复录数据不一致之外,还应检测的错误有(3)。 A.显示器无法显示

B.输入的无效字符 C.输入数据的格式 D.输入数据的界限 E.打印机卡纸 F.重复录入同一账户 G.输入的半个汉字 H.汇总数据与会计账目不符

正确答案:由[问题3]要点解析可知,建账软件第0层数据流图(见图3-18)中“1录入比对”处理包含了第 1层数据流图(图3-19)中的“1.1初录”、“1.2复录”和“1.3比对”这3个处理。结合题干给出的关键信息“初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致”和常识可知,加工1(录入比对处理)除能够检查出初录数据和复录数据不一致之外,还应检测的错误有①输入的无效字符(如在“账号”数据项中输入了小数点、$和@等其他字符)、②输入数据的格式(如“账号”数据项规定每4位数字后加一位半角空格字符等)、③输入数据的界限(例如“开户日”的数值是否超过了当前日期等)、④输入的半个汉字(在某些运行环境中(或输入法)中可能存在这种情况)和⑤(初

录员/复录员)重复录入同一账户等。 由题干给出的关键信息“汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对……”可知,检查汇总数据和会计账目是否相符是在图3-18中处理“3汇总核对”所完成的功能;数据打印是在图3-18中处理“4打印清单”所完成的功能。同时根据常识可知,“1录入比对”处理通常未涉及检查“显示器无法显示”和“打印机卡纸”等硬件故障的功能。

15. 打印分户账清单(表3-8)时,必须以“(4)”作为关键字进行排序才能满足系统需求。 A.储蓄所

B.账号 C.开户日

D.户名 E.其他分户账数据 F.总户数和总余额

正确答案:仔细阅读分户账清单样式表(见表3-8)可知,表中数据是按照“储蓄所”这一数据字段进行分组的,每一分组中均通过“共XXXX户,总余额YYYYYYY.YY元”格式给出了储蓄所的统计数据。这就要求在数据查询/打印操作中,至少要按照“储蓄所”这一数据字段进行排序才能实现。在实际应用中,在软件实现时也可以按照“账号”和“开户日”等数据字段进行排序,但从表3-8数据格式中无法确定是否需要这些排序工作。

选答题(共3道大题,每道大题15分)从下列3道试题中任选1道解答,如果解答的试题数超过1道,则仅题号小的1道题解答有效。

16. 阅读以下说明和JAVA 2代码,将应填入(n)处的字句写在对应栏内。 [说明] 以下程序为类类型的变量应用实例,通过异常处理检验了类CCircle的变量的合法性,即参数半径应为非负值。仔细阅读代码和相关注释,将程序补充完整。 [JAVA代码] //定义自己的异常类 class CCircleException extends Exception { } // 定义类 CCircle class CCircle { private double radius; public void setRadius ( double r ) (1){if ( r<0 ) { (2)}else (3)} Public void show ( ) {System. out. println ( “area=“+3.14*radius*radius ); } } public class ciusample { public static void main ( String args[] ) {CCircle cir=new CCircle( );(4) { cir. setRadius ( -2.0 )}(5){ System. out. println ( e+” throwed” ) ;}cir. show( ) ; } }

正确答案:(1)throws CCircleException(2)throw new CCircleException( ); //抛出异常(3)radius=r;(4)try(5)catch(CCircleException e) //捕捉由setRadius( )抛出的异常

解析:本题主要考查JAVA语言中Class类型的变量应用。本段代码中对于类Ccircle的半径变量进行合法性检验,如果圆Ccircle的半径为负值,则抛出异常处理。

17. 阅读下列程序说明和C代码,将应填入(n)处。 【程序5说明】 著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜

色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。 程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。 【程序5】 #include<stdio.h> #define N 10 void output(int color[])/*输出一种着色方案*/ { int i; for(i=0;i<N;i++) printf(“%4d”,color[i]); printf(“\\n”); } int back (int * ip,int color[])/*回溯*/ { int c=4; while(c==4){ if(*ip<=0)return 0; --(*ip); c=(1); color[*ip]=-1; } return c; } /*检查区域i,对c种颜色的可用性*/ int colorOk(int i,int c,int [][N],int color[]} { int j; for(j=0;j<i;j++) if((2)) return 0; return 1; } /*为区域i选一种可着的颜色*/ int select (int i,int c,int adj[][N],int color[]) { int k; for(k=c;k<=4;k++) if(colorOK((3))) return k; return 0; } int coloring(int adj[][N])/*寻找各种着色方案*/ { int color[N],i,c,cnt; for(i=0;i<N;i++)color[i] =-1; i=c=0;cnt=0; while(1){ if((c=(4))==0){c=back(&i,color);if(c==0)return cnt; }else{(5);i++;if(i==N){output(color);++cnt;c=back(&i,color);}else c=0; } } } void main( ) { int adj[N][N]= {{0,1,0,1,1,1,1,1,1,1}, {1,0,1,1,0,1,1,1,1,0}, {0,1,0,1,0,1,1,0,1,1}, {1,1,1,0,1,1,0,0,1,1}, {1,0,0,1,0,1,0,0,0,0}, {1,1,1,1,1,0,1,0,0,1}, {1,1,1,0,0,1,0,0,1,0}, {1,1,0,0,0,0,0,0,1,1}, {1,1,1,1,0,0,1,1,0,1}, {1,0,1,1,0,1,0,1,1,0} }; printf(“共有%d组解.\\n”,coloring(adj)); }

正确答案:(1)color[*ip](2)adj[i][j]!=0 && color[j]==c(3)i,k,adj,color(4)select(i,c+1,adj,color)(5)color[i]=c

解析:(1)Back( )函数将color数组中紧邻*ip位置的,颜色值为 4的一个连续区域的元素赋值为-1。(2)colorOK( )判断区域i对其之前的所有区域是否可以着色c。该句是检查i的相邻区域是否已有颜色为c的。(3)这是colorOK的参数列表。Select为区域i选择一种颜色,使用colorok函数对各种颜色(值为c~4的一种,不一定是所有颜色)分别进行检查。(4)Coloring( )函数寻找各种着色方案。它先从区域0开始,检查颜色,并着色(着色的顺序总是从小色值的颜色开始的)。当发现某一区域无法着色时,就使用back( )函数,将该区域之前的一个连贯区域进行洗色(对应color数组中赋值为-1)并回溯,并从回溯后的位置,重新开始进行颜色检查和赋色,但使用的色值比该位置洗色前的颜色值更大。若所有区域均已着色,则输出该着色方案。然后,使用back函数,重新进行着色。当所有颜色方案均已找到后,函数结束。(5)该句对区域i赋颜色c。c为之前select函数所选出的可以用的颜色。

阅读以下说明和C++代码, [说明] 现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型

的画图程序”,将抽象部分与实现部分分离,使它们可以地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图6-1显示了各个类间的关系。 [图6-1] 这样,系统始终只处理3个对象:Shape对象、Drawingg对象、DP1或DP2对象。以下是C++语言实现,能够正确编译通过。 [C++代码] class DP1{ public: static void draw_a_line(double x1,double y1,double x2,double y2){ //省略具体实现 } }; class DP2{ public: static void drawline(double x1,double x2,double y1,double y2){ //省略具体实现 } }; class Drawing{ public: (1) void drawLine(double x1,double y1,double x2,double y2)=0; }; class V1Drawing:public Drawing{ public: void drawLine(double x1,double y1,double x2,double y2){ DP1::draw_a_line(x1,y1,x2,y2); } }; class V2Drawing:public Drawing{ public: void drawLine(double x1,double y1,double x2,double y2){ (2) } }; class Shape{ privatc: (3) dp; public: Shape(Drawing*dp); virtual void draw( )=0; void drawLine(double x1,double y1,double x2,double y2); }; Shape::Shape(Drawing*dp) { _dp=dp; } void Shape::drawLine(double x1,double y1,double x2,double y2) { //画一条直线 (4); } class Rectangle:public Shape{ privatc: double_x1,_y1,_x2,_y2; public: Rectangle(Drawing *dp,double x1,double y1, double x2,double y2); void draw( ); }; Rectangle::Rectangle(Drawing*dp,double x1,double y1,double x2,double y2) : (5) { _x1=x1;_y1=yl;_x2=x2;_y2=y2; } void Rectangle::draw( ) { //省略具体实现 }

18. (1)

正确答案:virtual

解析:由函数drawLine( )结尾的“=0”易知,空(1)应填virtual。

19. (2)

正确答案:DP2::drawline(x1,x2,y1,y2)

解析:是调用DP2系统的相应方法,可参照DP1的对应函数的函数体,但要注意参数不完全相同,应填DP2::drawline(x1,x2,y1,y2)。

20. (3)

正确答案:Drawing

解析:_dp属性是用来存储Drawing对象的,参照shape的构造函数可确认这一点,空(3)应填Drawing*。

21. (4)

正确答案:_dp->drawLine(x1,y1,x2,y2) 解析:Shape类的drawLine方法是通过调用Drawing对应的方法来实现所需要的功能,因此空(4)应填dp->drawLine(x1,y1,x2,y2)。

22. (5)

正确答案:Shape(dp)

解析:显然是基类构造函数,应填Shape(dp)。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务