1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 17及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读下列说明和数据流图,回答问题 1-问题 3。 【说明】 某医院收费系统的主要功能是收取病人门诊的各项费用。系统的收费功能分为 3个方面:病历收费、挂号收费和根据处方单内容收取检查或药物费用。 1病人初次来该医院看病,首先购买病历,记录病人基本情况。 2病人看病前要挂号。根据病人的病历和门诊部门(内科、外科等 ),系统提供相应的挂号单和处方单,并收取费用。 3病人根据处方单进行进一 步检查或取药前需交纳各项费用。系统首先根据病人基本情况检查处方单中病历号是否正确,记
2、录合格的处方单,并提供收据。 4所有收费都必须依据定价表中的定价来计算,且所有收费都必须写入收费记录中。 医院收费系统的顶层图如图 2所示;医院收费系统的第 0层 DFD图如图 3所示。其中,加工 1的细化图如图 4所示,加工 2的细化图如图 5所示。 假定顶层图是正确的, “定价表 ”文件已由其他系统生成。1 指出哪张图的哪些文件可以不必画出。 2 数据流图 4中缺少 2条数据流,请直接在图中添加。 3 数据流图 5中缺少 4条数据 流,请直接在图中添加。 4 阅读以下说明和流程图,回答问题 1和问题 2。 【说明】 某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定
3、数量时,向供应商发出采购单;当某配件的库存量大于或等于定购粮食,或者收到供应商的送货单并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。该供销系统的分层数据流图中部分数据流和文件的组成如下: 文件 配件库存配件号 +配件名 +规格 +数量 +允许的最低库存量 数据流 订货单配件号 +配件名 +规格 +数量 +顾客名 +地址 提货单订货单 +金额 采购单配件号 +配件名 +规格 +数量 +供应商名 +地址 送货单配件号 +配件名 +规格 +数量 +金额 假定顶层图 (如图 6所示 )是正确的, “供应商 ”文件已由其他系统生成。4 指出哪张图中的哪些文件可不必画出。
4、5 指出在哪些图中遗漏了哪些数据流。回答时使用如下形式之一: (1)XX图中遗漏了 XX加工 (或文件 )流向 XX加工 (或文件 )的 XX数据流; (2)XX图中 XX加工遗漏了 XX输入 (或输出 )数据流。 6 有下列关于运动会管理系统的 ER图,如图 10所示。图中矩形表示实体,圆表示属性,双圆表示关键字 属性,菱形表示实体之间的关系。假定已通过下列 SQL语言建立了基本表。 CREATE TABLE ATHLETE ANAME CHAR(20), ASEX CHAR(1), ATEAM CHAR(20); CREATE TABLE |TEM (INO CHAR(6)NOT NULL
5、, INAME CHAR(20), ITIME CHAR(12), IPLACE CHAR(20); CREATE TABLE GAMES (ANO CHAR(6)NOTNULL, INO CHAR(6)NOT NULL, SCORRE CHAR(10); 为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。 【 E-R图】【问题】 填充下列 SQL程序1 4中的 (1) (7),使它们分别完成相应的功能: 程序 1:统计参加比赛时男运动员人数。 SELECT (1) FROM ATHLETE WHERE ASEX=M; 程序 2:查 100872号运动员参
6、加的所有项目及其比赛时间和地点。 SELECT ITEM, INO, IN A ME, ITIME, IPLACE FROM GAMES, ITEM WHERE (2); AND (3); 程序 3:查参加 100035项目的所有运动员名单。 SELECT ANO, ANAME, ATEAM FROM ATHLETE WHERE (4); (SELECT (4) (5) FROM GAMES WHERE GAMES ANO=ATHLETE.ANO AND INO=100035); 程序 4:建立运动员成绩视图。 (6) ATHLETE-SCORE AS SELECT ATHLETE, ANO,
7、 ANAME, ATEAM, INAME,SCORE FORM (7) WHERE ATHLETE.ANO=GAMES. ANO AND GAMES.INO=ITEM.INO; 7 读下列程序说明和 C程序,将应填入 (n)处。 【程序说明】 该程序定义了两个子函数 strsort和 strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串 s1和 s2,然后调用 strsort函数对它们分别排序,然后调用 strmerge函数将s1和 s2合并,将合并后的字符串赋给字符串 s3,最后输出字符串 s3。 【程序】 #incl
8、ude stdio.h void strmerge(char, a, char *b, char *c) /将字符串 a, b合并到字符串 c中 char t, *w; w=c; while(1) /找到字符串 a, b当前字符中较小的字符 if(*a *b) t= *a; (2); else if (*a *b) t= *b; (3); else /字符串 a, b当前字符相等 t= *a; a+; b+; if(4) /开始,可直接赋值 *w=t; else if(t!=*w) /如果 a, b中较小的当前字符与 c中当前字符不相等,才赋值 (5); if(*a!=0) /如果字符串 a还
9、没有结束,则将 a的剩余部分赋给 C while(*a!=0) if(*a!=*w) *(+w)=*a; a+; else (6); if(*6!=0) /如果字符串 b还没有结束,则将 b的剩余部分赋给 c while(*b!=0) if(*b! = *w) *(+w)=*b; b+; else b+; (7); void strsort(char*s) /将字符串 S中的字符排序 int i, j, n; char t, *w; W=S; for(n=0; *w!=0; n+) /得到字符串长度 n w+; for(i=0; i n-1; i+) /对字符串 s进行排序,按字母先后顺序 f
10、or(j=i+1; j n; j+) if(8) t=si; si=sj; (9); void main() char s1100, s2100, s3100; printf(“nPlease, input the first string: “); scanf(“%s“, s1); printf(“nPlease input the second string: “); scanf(“%s“, s2); strsort(s1); /将字符串 s1排序 strsort(s2); /将字符串 s2排序 printf(“%sn“, s1); printf(“%sn“, s2); s30=0; /字
11、符串 s3的第一个字符先置 0结束标志 (10) /将 s1和 s2合并,按照字母顺序排列, /且要删去相同字符,存入 s3中 printf(“%s“, s3); 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 8 阅读下列程序说明,将应填入 (n)处的字句写在答卷 纸的对应栏内。 【程序说明】 对于一个公司的雇员来说,无非有 3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如管理人员除
12、有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。 3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人 员类又从管理人员类中派生。 下面的程序 1完成上述各个类的定义,并建立了 3个雇员 (一个普通雇员、一个管理人员和一个主管 )的档案,并打印出各自的工资表。将 “程序 1”中的成员函数定义为内联函数, pay成员函数定义为虚函数,重新完成上述要求。 【程序 1】 /普通雇员类 class Employee public: Employ
13、ee(char*theName, float thePayRate); char * getName()const; float getPayRate()const; float pay(float hoursWorked)const: protected: char*name; /雇员名称 float payRate; /薪水等级 ; Employee: Employee(char * theName, float thePayRate) name=theName; payRate=thePayRate; char*Employee: getName()const return name;
14、float Employee: getPayRate()const return payRate; float Employee: pay(float hoursWorked)const return hoursWorked * payRate; /管理人员类 Class Manager: public Employee public: /isSalaried付薪方式: true付薪固定工资, false按小时付薪 Manager(char * theName, float thePayRate, bool isSalaried); bool getSalaried()const; float
15、 pay(float hoursWorked)const; protected: bool Salaried; ; Manager:Manager(Char*theName, float thePayRate, bool isSalaried) :Employee(theName, thePayRate) salaried=isSalaried; bool Manager: getSalaried() const return Salaried; float Manager: pay(float hoursWorked)const if(salaried) return payRate; /*
16、else*/ return Employee: pay(hoursWorked); /主管人员类 class Supervisor: public Employee public: Supervisor(Char*theName, float thePayRate, float theBouns): Employee(theName, thePayRate, (1), bouns(theBouns) float getBouns()constreturn bouns; float pay(float hoursWorked)const return (2) protected: float b
17、ouns; #include“ iostream.h“ void main() Employee e(“Jack“, 50.00); Manager m(“Tom“, 8000.00, true); Supervior s(“Tanya“, 8000.00, 8000.00); cout “Name: “ e.getName() endl; cout “Pay: “ e.pay(80) endl; /设每月工作 80小时 tout “Nabe: “ m.getName() end,; cout “Pay: “ m.pay(40) endl; cout “Nabe: “ s.getName()
18、endl; cout “Pay: “ s.pay(40) endl; /参数 40在这里不起作用 【程序 2】 #include “employee.h“ /普通雇员类 class Employee public: /构造函数 Employee(String theName, float thePayRate): name(theNabe), payRate(thePayRate) /取雇员姓名 String getNabe() constreturnname; /取雇员薪水等级 float getPayRate()constreturn payRate; /计算雇员薪水 virtual fl
19、oat pay(float hoursWorked)const return (3); protected: String name; /雇员 名称 float payRate; /薪水等级 ; /管理人员类 /继承普通雇员类 class Manager: public Employee public: /构造函数 /isSalaried标识管理人员类的付薪方式 /true按阶段付薪 (固定工资 ) /false按小时付薪 Manager(String theName, float thePayRate, bool isSalaned): Employee(theName, thePayRat
20、e), Salaried(isSalarled) /取付薪方式 bool getSalarled()constreturn salaried; /计算薪水 virtual float pay(float (4)const; protected: bool Salaried; ; float Manager: pay(float hoursWorked)const if(salaried) /固定付薪方式 return payRate; else /按小时付薪 return (5); /主管人员类 class Supervisor: (6) public: /构造函数 Supervisor(St
21、ring theName, float thePayRate, float theBouns): Manager(theName, thePayRate, true), bouns(theBouns) /取奖金数额 float getBouns()constreturn bouns; /计算薪水 virtual float pay(float hoursWorked)const retum payRate+bouns; (7) float bouns; #include “employee.h“ #include“jostream.h“ void main() (8)* ep3; ep0=ne
22、w Employee(“Jack“, “50.00“); ep1=Flew Manager(“Tom“, “8000.00“, true); ep2=new Superwor(“Tanya“, “8000.00“, “8000.00“); for(int i=0; i 3; i+) cout “Name: “ (9) endl; cout “Pay: “ (10) endl; /设每月工作 80小时 9 下面是一个 Applet程序,其功能是在绘图区域中通过鼠标的移动来绘制直线,并且有清除绘图区域按钮,用来清除已经绘制的图像。 程序运行结果如图 5所示。 import java.awt.*;
23、import java.applet.*; /* applet code=ex6_7. class width=800 height=400 /applet */ public class ex6_7 extends Applet private Button btn; private boolean bDraw,bClear; private int upX, upY, downX, downY; public void int() setLayout(null); bClear=false; bDraw=false; btn=new Button(“clear“); btn.reshape
24、(250, 150, 70, 30); add(btn); public void paint (Graphics g) if(bClear) g.clearRect(0, 0, getSize(). width, getSize(). height); (1); if(bDraw) g.drawLine(2); bDraw=false; public void update (Graphics g) (3); public boolean mouseDown(Event event, int x, int y) downX=x; downY=y; return true; public bo
25、olean mouseup(Event event, int X, int y) upX = x; upY =y; (4); repaint(); return true; public boolean action(Event event,Object object) if(5) bClear=true; repaint(); return true; ex6_7. html HTML HEAD TITLE ex6_7 /TITLE /HEAD BODY appletcode=“ ex6_7. class“ width=800 height=400 /applet /BODY /HTML 软
26、件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 17答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 医院收费系统的 0层图中 “处方记录 ” 2 【正确答案】 1 “1.1检查病人信息 ”的 “不合格病人信息 ”输出数据流。 2 “1.2计算费用 ”的 “收据 ”输出数据流。 3 【正确答案】 1从 “病人基本情况 ”到 “3.1检查处方单 ”的数据流 。 2从 “3.2记录处方 ”到 “处方记录 ”的数据流。 3从 “定价表 ”到 “3.3制作收据 ”的数据流。 4从 “3.3制作收据 ”到 “收费记录 ”的数据流。 【试题解析】 在 0层图中有。层图中
27、 “处方记录 ”是加工 3“处方收费 ”的局部数据文件,所以不必画出。 找出缺少的数据流的一个关键是父图与子图的平衡,即子图的输入输出数据流与父图相应的加工的输入输出数据必须一致。 从 0层图中可以看到对于加工广病历收费 ”有输入流 “病人信息 ”,输出流,不合格病人信息 ”, “病历 ”和 “收据 ”。而加工 1子图中却只有 “病人信 息 ”和 “病历 ”,所以一定缺少 2条输出流 “不合格病人信息 ”和 “收据 ”。病人信息是否合格是在加工1.1“检查病人信息 ”中处理,因此加工 1.1出一条输出流 “合格病人信息 ”外,还缺少一条输出流 “不合格病人信息 ”。对合格的病人信息,加工 1.
28、2计算收费后,理应提供收据给病人,所以另一条缺少的数据流是 “1.2计算费用 ”的 “收据 ”输出数据流。 根据说明 “系统首先根据病人基本情况检查处方单中病历号是否正确 ”,因此,在加工 3.1“检查处方单 ”中,需读人病人基本情况,所以缺少从 “病人基本情况 ”到“3.1检查处方单 ”的数据流 。然后系统 “记录合格的处方单 ”,所以加工 3.2“记录处方 ”中需讲处方的内容记录到文件 “处方记录 ”中,因此缺少从 “3.2记录处方 ”到 “处方记录 ”的数据流。加工 3.3“制作收据 ”中需根据文件 “定价表 ”的各项目或药品的价格来计算所需收取的费用,因此图中还缺少从 “定价表 ”到
29、“3.3制作收据 ”的数据流。最后收费的记录需写入文件 “收费记录 ”中,所以缺少的第 4条数据流是从 “3.3制作收据 ”到 “收费记录 ”的数据流。 4 【正确答案】 0层图中的 “采购清单 ”多余,应去掉。采购只需有采购请求就可以。 5 【正确答案】 加工 1子图中遗漏了 “配件库存 ”文件到 1.3加工的数据流。加工 1子图中 1.4加工遗漏了 “提货单 ”输出数据流。加工 1子图中 1.5加工遗漏了 “到货通知 ”输入数据流。加工 2子图中 2.3加工遗漏了 “采购请求 ”输入数据流。 6 【正确答案】 (1)COUNT(*)(若答 COUNT或 COUNT,得 2分 ) (2)GA
30、MES.INO=IFEM.INO (3)GAMES.ANO=100872(注: (2)、 (3)可互换、无前缀得 1分 ) (4)EXISTS (5)*或 ANO或 INO或 SCORE或后 3个列名的任意组合 (6)CREATEVIEW (7)ATHLETE, ITEM, GAMES(3项可交换。 ) 注: (4)、 (5)也可为 (4)ANOIN (5)ANO 【试题解析】 本题是关于系数据库标准语言 SQL(Structured Query Language)语言的题目,由题目中给出的 ER图可知 3个表中, ATH- LETE和ITEM是基本表,表 ATHETE的主键是运动员编号 AN
31、O,表 I-TEM的主键是项目编号 INO,表 GAMES是一个视图,以 ANO、 INO为外键。 程序 1统计参加比赛的男运动员人数,也就是 表 ATHLETE中, AEX=M的记录的个数,所以要用到库函数 COUNT(*)。这里要注意的是 COUNT与 COUNT(*)区别, COUNT的功能是对一列中的值计算个数,而 COUNT(*)才是计算数据库中记录的个数。所以填空 的答案为 “COUNT(*)”。 程序的 2统计 100872号运动员参加的所有项目及比赛时间和地点,所以SELECT后面的内容是项目编号 ITEM.INO、项目名称 INAME时间 ITIME及地点 IPLACE。统计
32、涉及比赛表 GAMES和项目表 ITEM,所以 FROM后面的内容为 GAMES、 ITEM。本题考的是连接查询,所谓连接查询指的是涉及两个以上的表的查询。由于是统计 100872号运动员参加的所有项目及比赛时间和地点,所以查询条件中必然有 GAMES.INO=100872(程序中引用到字段时,若字段名在各个表中是惟一的,则可以把字段名前的表名去掉,否则,应当加上表名作为前缀,以免引起混淆 )。由于 GAMES表中只有比赛的成绩,那些关于项目的数据必须从项目表 ITEM中取得,所以还应该有两个表之间的关联,即 GAMES.INO=TYEM.INO。所以填空 和 可交换,不影响查询结果。 程序
33、3要求查参加 100035项目的所有运动员名单。分析查询表达式,必首先查询 GAMES表,找出参加 100035项目的那些运动员的编号 ANO,即GAMES.ANO=ATHLETE.ANO AND INO=100035,然后再根据查询到的运动员号 ANO从 ATHLETE表中抽取运动员的数据。所以填空 的答案为 “EXISTS”或“ANOIN”,填空 的答案为 “ANO”。 程序 4要求建立运动员成绩视图。建立视图的命令为 CREATE- VIEW,所以填空 的答案一定是 “CREATEVIEW”。建立的是运动员 成绩视图,那么一定涉及运动员情况、运动员参加的项情况和该项目的成绩,所以要用到
34、ATHLETE、ITEM和 GAMES这 3个表,因此 FROM子句后为 ATHLETE、 GAMES、ITEM, 3个表可以是任意次序,不影响结果。 7 【正确答案】 (1)(*a!=0)&(*b! =0)(2)a+ (3)b +(4)*w=0(5)*(+w)=t(6)a+ (7)*(+w)=0(8)si sj(9)sj=t (10)strmerge(s1, s2, s3) 【试题解析 】 根据题意,对字符串的处理分为三步:第一步是从键盘上输入两个字符串;第二步是将两个字符串分别排序;第三步是将字符串合并;第四步是显示处理结果。 第一步和第四步容易实现,关键是第二步和第三步的处理,下面分别加
35、以说明。 字符串排序是指将一个字符串中各个字符按照 ASCII码值的大小排序。例如,字符串 “Beijing”由小到大的排序结果应该是: “Bejiign”;排序算法很多,第二个例子,我们就要介绍快速排序算法。在这里使用简单的冒泡排序算法:即将字符串中的每一个字符一个个进行比较,找出最小的字符,然 后再在剩下的字符中找最小的字符。例如,字符 “Beijing”的排序过程如下: 第一次将字符 “Beijing”中的每一个字符: B、 e、 i、 j、 i、 n、 g进行比较,找到最小的字符 B。 第二次在剩下的字符 e、 i、 j、 i、 n、 g中,找到最小的字符 e。 第三次在剩下的字符 j
36、、 i、 n、 s中,找到最小的字符 j。 第三步是合并字符串,合并后的字符串仍然由小到大排序。由于待合并的两个字符串已经排好序。假定两个排好序的字符 串分别为 A和 B,合并后的字符串为C,要使待合并后的字符串仍然由小到大排序,可采取下述步骤: 1从前往后取 A中的字符,并按从前往后的顺序与 B中的字符比较,若 A中的字符较小,则将该字符存入 C,并移到 A的下一个字符,继续与 B中的字符比较。 2若 A中的字符较大,则将 B中的字符存入 C,并移到 B的下一个字符,继续与 A中的字符比较。 3若 A与 B中的字符相等,则将 A或 B中的字符存入 C,并将 A和 B均移到下一个字符。 4若
37、A或 B字符串到达末尾,则将 B或 A的剩余部分加到字符串 C中。 需要注 意的是: A、 B和 C三个字符串均可以用字符数组来表示, C数组的长度不能小于 A、 B两数组的长度之和。另外,判别字符串是否结尾的方法是:从 A或 B中取出的字符是否为 0,所有字符串都是以 0结尾的。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 8 【正确答案】 (1)true(2)payRate+bouns(3)hoursWorked*payRate (4)hoursWorked (5)hoursWorked*pay
38、Rate(6)public Manager(7)protected: (8)Employee (9)epi- getName()(10)epi- pay(80) 【试题解析】 (1)普通雇员类是所有类的基类,描述了雇员的一些基本信息,管理人员类从普通雇员类中派生,管理人员的付薪方式与普通雇员可能相同,所以该类添加了一个成员变量标识,并覆盖了基类的 pay ()函数。主管类从管理人员类中派生,主管人员是管理人员的一种,他们不仅支付固定薪水,而且还有奖金。所以在主管类中添加了 bonus成员,保存他们的奖 金数额,并覆盖了管理人员类的 pay()函数重新计算工资。 (2)程序中建立了 3个雇员 (
39、一个普通雇员、一个管理人员和一个主管 )的档案,并打印出各自的工资表。事实上,将 3种雇员分开处理会很繁琐,如果能够把他们看作同一种类型,都看成雇员类 (他们本来都是雇员 )统一处理,但在计算工资时再调用各自的 Pay()函数,那程序会简单得多。这就需要利用多态特性,只要将 Pay()函数定义成虚函数,便可以实现了。 9 【正确答案】 (1)bClear=false(2)downX, downY, upX, upY (3)paint(g)(4)bDraw=true(5)event.target=btn 【试题解析】 本题主要考查 Applet的图形绘制,鼠标事件处理和用户界面的相关知识点以及会
40、使用 boolean类型的变量控制程序的流程。解题关键是,熟悉Applet的图形绘制,会用 Graphics类的基本绘图方法,例如 drawLine()方法;熟悉鼠标事件处理,并能与图形绘制和用户界面设计相结合做简单的综合应用;掌握一定的程序流程的控制思想。本题中,主要的思想是首先判断用户将鼠标按下与放开的坐标位置,然后使用 drawLine()方法绘制由鼠标按下点到放开点的直线。注意不要将 drawLine()方法的几个参数颠倒,要明白此方法的几个参数的确切含义。将 bDraw变量的值设为 false,这导致程序在调用 paint()方法时不能进入g.drawLine语句,应改为 true。最后要明确 clear是 btn对象显示在用户界面的名称,而不能作为对象来与 event.target做比较,因此应改为 btn,这在调试时就会出现变量无法解析的错误;符号 =这里要确定点击 btn事件发生才能做清除,否则不能达到预期效果。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1