1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 21及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读以下说明和数据流图,回答问题 1 3问题。 说明 研究生招生系统旨在用计算机对学校的研究生招生事务进行管理。研究生招生可分为报名阶段、考试阶段和录取阶段。招生报考前,招生处要进行考前准备工作,如统计招生导师、考试科目以及制定报考专业标准代码等。招生导师信息包括导师的姓名、性别、年龄、出生年月、所从事专业和研究方向以及所在系别。考试科目包含科目代码、科目的名称以及报考本科目的考试 人数。在报名阶段,考生向招生处提交报名数据表,研究生系统根据考生的报考数据确定考生准考
2、生号,并通知考生考试日期。在考试阶段,考试结束后,考生成绩录入研究生招生系统,考生可以从研究生招生系统中获取自己的考试成绩。在录取阶段,研究生招生系统根据考生的报考数据、考试成绩、外校调剂考生信息以及往年保留资格记录文件,确定录取数据,并形成录取文件。系统统计并记录相关招生信息,以供查询。对被录取的考生发放录取通知书,对需要保留资格的考生记录其信息,以供下年度招生使用。招生处可以从研究生招生系统中获得录取数据和招生情况的统 计信息,以供咨询。 数据流图 11-1为研究生招生系统顶层图,数据流图 11-2为研究生招生系统第 0层 DFD图,数据流图11-3为加工 3的细化图。 数据流图 11-1
3、1 数据流图 11-2中有 3条数据流 ,请根据说明中的术语给出这三条数据流名称,并指出起点和终点。 2 数据流图 11-3中还依赖于哪个文件 ?请指出文件名称,并指出与其有关的数据流的起点和终点。 3 请补齐下列数据字典条目: 导师 =_ 考试科目 =_ 4 阅读以下说明和表,回答问题 1 3问题。 说明 在学校中,存在以下关系: (a)一个系有若干学生,但一个学生只能在一个系; (b)一个学生可以选修多门课程,每门课程有若干学生选修; (c)每个学生所学的每门课程都有一个成绩。 该校在学生信息管理数据库设计了三个基本表,分别为表一、表二、表三。 (a)表一:学生信息表 STUDENT(ST
4、ID, NAME, AGE, DEPTNO), 其中, STID表示学号, NAME表示学生姓名, AGE表示年龄, DEPTNO表示系号。 (b)表二:课程表 COURSE(COID, NAME),其中, COID表示课程号, NAME表示课程名。 (c)表三:成绩表 SCORE(SCID, COID, GRADE),其中, SCID表示学号,COID表示课程号, GRADE表示成绩,成绩为空时表示这学期正在上的课程。 4 根据要求将 SQL语句补充完整。 (1)查询各系的学生数 SELECT(1), COUNT(*)(2) GROUP BY DEPTNO; (2)更改课程号为 C601的课
5、程名为 “大学物理 ” UPDATE(3)SET(4) (3)基于学生信息表,建立一个计算机系 (系编号为 D01)的学生视图。写出命令。 CREATE OR REPLACE VIEW V_STUDENT AS(5) 5 数据库设计的需求分析阶段和概念结构设计阶段的主要任务分别是什么 ?这两个阶段标志性的成果有哪些 ? 6 阅读下列函数说明和 C代码,填入 (n)处字句,并回答相应问题。 说明 背包问题就是有不同价值、不同重量的物品 n件,求从这 n件物品中选取 一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。 背包问题是一个典型的 NP完全难题。对
6、该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。 常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到 limitweight,这时的物品就是 limit weight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为图 11-4。 仔细阅读程序说明和 C程序流
7、程图及源码,回答问题 1和问题 2。 流程图 11-4 程序说明 struct Thing:物品结构 typedef struct Bag:背包结构类型 input ( ):将物品按序号依次存入数组函数 inbag ( ):物品按物价比入包函数 init ( ):初始化函数 sort ( ):对物品 按价格重量比排序函数 outbag ( ):取出包中 weiht最大的物品函数 print ( ):最佳方案输出函数 C程序 #define N 255 struct Thing double weight; double value; double dens; thingN; typedef s
8、tmct Bag Thing thing N; double weighttmp; double sumvalue; bag,best; inbag ( ) do bag.thingi=thingi (1) (2) i+; while ( (3) ) init ( ) for (inti=0; i N; i+) input (thingi.weight, thing i.value) thing i.dens=thingi.value/thing i.weight; ; main ( ) init ( ); sort ( ); inbag ( ); do best=bag; /把包中物品放入暂
9、存数组 outbag ( ); /取出包中 weight最大的物品 (4) while ( (5) print (best); /输出 temp因为是最佳方案 6 根据程序说明及流程图、部分 C源码,充分理解算法思想,填入 (n)处。 7 求解 “背包问题 ”常用的方法有哪几种 ?各有什么样的特点 ? 8 阅读下列函数说明和 C代码,填入 (n)处。 说明 以下 C语言程序实现了生成从里到外是连续的自然数排列的回旋矩阵,矩阵形式如下: 7 6 5 16 8 1 4 15 9 2 3 14 10 11 12 13 程序的变量说明如下: x1:矩阵上边界; x2:矩阵下边界; y1:矩阵左边界;
10、y2:矩阵右边界; s:数组元素升降标记, s等于 1为升, s等于 -1为降; a:存放矩阵元素的数组。 仔细阅读 C语言程序源码,将 (n)处的语句补充完整。 (注:每处仅一个语句 ) C程序 #include stdio.h void main ( ) const int N=20; int i=0,j=0,aNN,n; int m,x1,x2,y1,y2,s; while (1) Printf (“ninput matrix row N( N =2): “); scanf (“%d“, printf (“n“); if (n =2) break; m=n*n; x1=0; y1=0;
11、x2=n; y2=n; if(n%2=0) j=n-1; y2=n-1; s=1; else i=n-1; y1=1; s=-1; while (1) if (s=1) for (i; i x2; i+) aij=m-; i-; j-; (1) for (j;j =y1;j-) aij=m-; j+; i-; y1+; (2) else for (i;i =x1;i-) aij=m-; i+; j+; (3) for (j;j y2;j+) (4) (5) i+; (6) S=i; if (m 1) break; for (i=O;i n; i+) for (j=O;j n;j+) print
12、f (“%6d“,aij); printf (“n“); printf (“n“); 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 9 阅读以下说明和 C+码,填入 (n)处。 说明 下面代码实现类 A、 B、 C、 D的继承定义和应用。仔细阅读 代码 5-1,在 (n)处写出正确的运行结果。 代码 5-1 #include iostream.h class A public: int a; A (int v1): a(v1) /构造函数 void disp ( ) cout “a in class
13、A=“ a endl; ; class B: virtual public A public: int b; B (int v1,int v2): A(v1),b v2) /构造函数 void disp ( ) cout “a in class B=“ a endl cout “b in class B=“ b endl; ; class C: virtual public A public: int c; C (int v1,int v2): A(v1) ,c(v2) /构造函数 void disp ( ) cout “a in class C=“ a endl; cout “c in cl
14、ass C=“ c endl; ; class D: public B, public C public: int d; D (int v1,int v2,int v3,int v4 ): A(v1) ,B(v1,v2) ,C(v1,v3),d(v4) /构造函数 void disp ( ) cout “a=“ a endl; cout “b=“ b endl; cout “c=“ c endl; cout “d=“ d endl; ; void main( ) D demo (10,20,30,40); demo.disp ( ); 运行结果 a=(1) b=(2) c=(3) d=(4)
15、10 阅读以下说明和 JAVA 2代码,填入 (n)处。 说明 以下 JAVA程序设计了类 CSet,使用同一个名称 (set)的 method来传入数据。仔细阅读 代码 6-1)、 代码 6-2和 代码 6-3和相关注释,将程序补充完整。 代码 6-1 import java.io.*; class CSet private int width; private int height; (1) public void set(String color) col=color; /(a)可输入长方形的颜色 public void set (iht w, int h) width=w; /(b)可
16、输入长方形的宽和高 height=h; public void set (String color, int w, int h) col=color; /(c)可输入长方形的颜色、宽和高 width=w; height=h; public void show ( ) System.out.println (“n长方形的颜色为 : “+col); System.out.println (“n长方形宽为 : “+width+“ 长方形高为 : “+height“); 代码 6-2 public class hw8_3 public static void main (String args) th
17、rows IOException intw, h; /声明宽、长变量,并给予赋值 String color, k; CSet rect1; rect1=new CSet ( ); System.out.print (“n请输入颜色 : “); color=input ( ); System.out.print (“请输入宽度 : “); k=input ( ); w=Integer.parseInt (k); System.out.print (“请输入高度 : “); k=input( ); h=Integer.parseInt (k); (2)/设置长方形的颜色 (3)/设置长方形的宽、高
18、 rectl.show ( ); (4)/设置长方形的颜色和宽、高 rectl.show ( ); 代码 6-3 public static String input( ) throws IOException/输入函数 String str; BufferedReader buf; (5) str=buf.readLine ( ) return str; 11 阅读以下说明和 Visual Basic代码,填入 (n)处。 说明 在一些财务软件中,经常需要将阿拉伯数字的账目转化为汉语习惯中的金额计数方法,例如: “3.45”转化为 “叁元四角五分 ”; “3.4”转化为 “叁元四角 ”; “
19、3.40”转化为 “叁元四角零分 ”; “3.456”转化为 “叁元四角五分 ”; “345.00”转化为 “叁百四十五元零角零分 ”; “345”转化为 “叁百四十五元 ”; 以下 Visual Basic代码实现了小写金额转换为大写金额。界面如图 10-9所示。结合实际例子说明 ,仔细阅读下面代码,将 (n)代码补充完整。 代码 7-1 Begin VB.FormForm1 Caption = “小写金额转换为大写金额 “ /.窗体描述 (略 ) Begin VB.CommandButton Command1 Caption = “退出 “ /.窗体描述 (略 ) End Begin VB
20、.TextBox Text2 /.窗体描述 (略 ) End Begin VB.TextBox Text1 Enabled = 0 False / 窗体描述 (略 ) End Begin VB.Labe1 Labe12 Caption = “转换为大写金额 “ /.窗体描述 (略 ) End Begin VB.Labe1 Labe11 Caphon = “请输入数字 “ /.窗体描述 (略 ) End End 代码 7-2 Private Function setdata (num As Integer) As String 数字转换 Select CaSe num Case 0 setdat
21、a=“零 “ Case 1 Setdata=“壹 “ Case 2 Setdata=“贰 “ Case 3 Setdata=“叁 “ Case4 Setdata=“肆 “ Case 5 Setdata=“伍 “ Case 6 Setdata=“陆 “ Case 7 Setdata=“柒 “ Case 8 Setdata=“捌 “ Case 9 Setdata=“玖 “ End Select End Function Private Function chang (aaa As Integer) As String 位数转换 Select CaSe aaa Case 1 chang=“ Case
22、 2 chang=“十 “ Case 3 chang=“百 “ Case 4 chang=“千 “ Case 5 chang=“万 “ Case 6 chang=“十 “ Case 7 chang=“百 “ Case 8 chang=“千 “ Case 9 chang=“亿 “ Case 10 chang=“十 “ End Select End Function 代码 7-3 Private Sub Text2_Change ( ) 小写转大写 Dim i As Integer Dim j As Integer Dim myint As Integer Dim myint1 As Intege
23、r Dim mydoub As Double Dim mystr As String Dim mystr1 As String Dim mystr2 As String Dim mystr3 As String Dim mystr4 As String Dim money As Long Dim money1 As Integer Dim money2 As Long mystr=Text2.Text myint=InStr (mystr, “.“) If myint=0 Then mystr=Text2.Text Else mystr3=Right(Text2.Text, Len (Text
24、2.Text ) - myint) If mystr3 “Then 转换小数位 mystr4=Left(mystr3, 1) mystr3=Right(mystr3, Len(mystr3 ) - 1) If mystr4 “0“Then (1) End If If mystr3 “Then mystr4=Left(mystr3, 1) (2) End If End If mystr=Left(Text2.Text,myint - 1) End If j=Len(mystr) For i=1 To Len(mystr,i) money2=Left(mystr,i) money1=Right(m
25、oney2,1) If money1=0 Then Ifj=5 Then (3) Else (4) End If Else (5) End If j=j-1 Next i Text1.Text=mystr1 (5)SELECT*FROM STUDENT WHERE DEPTNO=D01; 5 【正确答案】 需求分析阶段的主要任务是需求收集和分析,该阶段得到数据字典和数据流图。概念结构设计阶段主要任务为对用户需求的综合、归纳与抽象,在该阶段形成概念模型,用 E-R图表示。 【试题解析】 根据 说明 部分以及数据查询要求,可以回答问题 1。由于 SQL语言的查询要求题干已经明确给出,相对来说容易解
26、答,例如 “查询各系的学生数 ”,则第一项空缺应为系号,第二项空缺则缺少关键字 “FROM”以及查询的目标“STUDENT”。其余各项亦可根据题干要求完 成。问题 2是对基本概念的考查。最近几次软件设计师考试中,经常会出现这种问答性的概念题,考生要有所注意。 6 【正确答案】 (1)bag.weighttmp=bag.weighttmp+thingi.weight; (2)bag.sumvalue=bag.sumvalue+thingi.value; (3)bag.weighttmp =weightlimit (4)inbag( ); (5)best.sumvalue bag.sumvalue
27、 7 【正确答案】 “背包问题 ”求解方法主要是一些启 发式算法,如贪婪算法、递归算法等。应用递归算法的目的是穷举所有可能的解,从中选出最佳解。这种解法实际上是穷举了所有的可能,只是加了一些限制。如果所求的数据很大,这种算法的效率就不是很高,甚至是不可实现的。贪婪法不用穷举且速度快,但用贪婪法却不一定能找到最优解。由于贪婪法所得到的解与最优解存在很大的差距,当要求较高时,就会成为贪婪法致命的且无法挽救的缺陷。 【试题解析】 本题考查的是考生对流程图的阅读能力。本题涉及的算法是背包问题。背包问题求解方法很多,考生首先要理解本题中的新方法,然后对照流程图阅读代 码。 (1)处应该为物品总重量; (
28、2)处应该为物品总价值; (3)处应该为直到达到极限重量 limit weight; (4)处应该为继续装物品; (5)处应该为比较当前结果与备份结果。问题 2同样是考查有关基本概念的问题。根据软件设计师考试的趋势,本套题设计上有意识地增加了概念考查部分,希望考生能够加强对基本概念的理解与训练。 8 【正确答案】 (1)x2-; (2)s=-1; (3)x1+; (4)aij=m-; (5)j-; (6)y2-; 【试题解析】 自然数排列的回旋矩阵是一个经典 程序设计题目。本题中生成的是一个从里到外是连续的自然数排列的回旋矩阵。仔细阅读代码,能够发现 (1)处应该为矩阵下边界递减; (2)处应
29、该为数组元素递减状态,即为降; (3)处应该为矩阵上边界递增; (4)处应该为存放矩阵元素的数组中的数据递减; (5)处应该为数组元素的列序号递减,即 j-; (6)矩阵右边界递减。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 9 【正确答案】 (1)10 (2)20 (3)30 (4)40 【试题解析】 本题考查考生对 C+语言中 Class定义中继承关系的理解与掌握程度。考生如果理解了 A、 B、 C、 D间的继承关系,并不需要过多的推算,就能得出结果。 10 【正确答案】 (1)pfivate
30、 String col; (2)rectl.set(color); (3)rectl.set(w,h); (4)rectl.set(color,w,h); (5)buf=new BufferedReader(new InputStreamReader(System.in); 【试题解析】 程序中定 义了类 CSet,使用同一个名称 (set)的 method来传入数据。本题需要考生仔细阅读代码,因为代码中有的变量是在后来出现的,而前边又没有定义,那么肯定需要在空缺处定义。另外,有些语句逻辑上没有先后关系,但填空时需要按顺序填写,因为有注释区分。本题并不难,但代码长。设计此题的目的希望考生又较强
31、的阅读代码能力,因为只有读完了全部代码,才可以明白前面的空缺应该填写什么。 11 【正确答案】 (1)mystr2=mystr2+setdata(Val(mystr4)+“角 “ (2)mystr2=mystr2+setdata(Val(mystr4)+“分 “ (3)If Right(mystr1,1) “万 “Then mystr1=mystr1&“万 “ (4)I fRight(mystr1,1) “零 “And Right(money,j) 0 Then mystr1=mystr1&“零 “ (5)mystr1=mystr1 & setdata(money1)+chang(j) 【试题解析】 本题设计了将阿拉伯数字的帐目转化为汉语习惯上的金额计数的小程序。 (1)实现小数部分的 .“角 ”转化。 (2)实现小 数部分的 “分 ”转化。 (3)、 (4)、 (5)实现了整数部分转化。