1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 16及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读下列说明和数据流图,回答问题 1问题 3。 【说明】 某考务处理系统主要功能是考生管理和成绩管理: 1对考生送来的报名表进行检查。 2对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。 3对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。 4填写考生通知单 (内容包含该考生的准考证号、姓名、各课程成绩及最终合格 /不合格标志 ),送 给考生。 5根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试
2、题难度分析,产生统计分析表。 考务处理系统的顶层图如图 1所示,第 0层图如图 2所示,加工 2子图如图 3所示。 【数据流图】1 指出哪张图的哪些文件可以不必画出。 2 数据流图 1口 3中缺少 3条数据流,请直接在图中添加。 3 根据系统功能和数据流图填充下列数据字典条目中的 (1)和 (2): 试题得分表准考证号 +课程名 +成绩 考生名册报名号 +准考证号 +姓名 +通信地址 +出生年份 +文化程度 +职业 考生通知单 =(1) 报名表 =(2) 4 阅读以下说明,回答问题。 【说明】 某公司要开发一个销售管理系统,该系统的主要功能是:处理客户和销售员送来的订单;工厂是根据订货安排生产
3、的,交出货物同时开出发票,收到客户付款后,根据发票存根进行应收款处理。每张订单由订单号,若干头信息和订单细节组成。一张订单可定购多种产品,工厂对大宗订货给予优惠。每种产品都规定了不同订货数量的折扣。 根据上述要求公司的销售部王经理写下了以下数据表结构: 客户: (客户号,客户名,地址,电话 ) 订单: (订单号,客户号,产品号,订货数,订货日期,交货日期,金额 ) 应收账款: (客户号,订单号,发票号,应收金额,支付日期,支付金额,当前余额 ) 产品描述: (产品号,产品名,单价,重量 ) 折扣规则: (产品号,订货量,折扣 ) 4 上表中带下划线的为主码。请为还没有确定主码或是主码不合理的数
4、据表选定最合适的主码。 5 上面的关系模式中还有不是第二范式的,请将其转为第二范式。并确定新数据表的主码。 6 阅读下列说明和 E-R图,回答问题 1 3。 【说明】 设有关于银行借贷管理系统的 E-R图 (如 图 4所示 )。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。为了答题的方便,图中的实体和属性同时给出了中英文说明,回答问题时只需写出英文名即可。6 根据 E-R图中给出的词汇,按照 “有关模式名 (属性 1,属性 2, )” 的格式,将此 E-R图转换为关系模式,并指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。要求其中的关系模式至少属于
5、第三范式。 7 如下的 SQL语言用于查询 “在该银行中一笔贷款贷给多个 (至少 2个 )客户的所有贷款号和发放贷款的支行名称 ”的不完整语句 ,请在空缺处填入正确的内容。 SELECT Borrow.Lno, Bname FROM Borrow, Loan WHERE(1) HAVING(2); 8 假设这个银行有若干个节点,每个节点运行一个数据库系统。假设这些节点之间惟一的交互式用电子方式相互传送款项,这样的系统是分布式数据库系统吗 ?为什么 ? 9 阅读下列程序说明,将在空缺处填入正确的内容。 【程序说明】 定义一个多边形结构: struct polygon实现以下内容: (1)建立该结
6、构的链表:create函 数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。 (2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为 0时,链表创建结束。 (3)编写一个函数 disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。 【程序】 #include “iomanip.h“ struct polygon int n; int* x; int *y; polygon * next; ;
7、void Push(polygon * & head, int n) polygon * newNOde=newpolygon; newNOde=newpo, Ygon; newNOde- next=(1); newNOde- x=new int n; newNOde- y=new intn; newNOde- n=(2); for(int i=0; i =(3); i+) cout “请输入多边形各顶点 x、 y坐标,坐标值之间用空格分隔: ”; cin newNOde- xi newNOde- yi; (4) head; /在 head前不需要额外的。 head newNOde; poly
8、gon * create() polygon * head=NULL; polygon * tail; int n; cout “请输入多边形顶点的个数 (顶点个数为 0时结束 ): ”; cin n; if(n=0)return (5); Push(head, (6); tail=head; cout “请输入多边形顶点的个数 (顶点个数为 0时结束 ): ”; cin n; while(n!=0) Push(tail- next, (7); /在 tail- next增加结点 tail tail- next; /advance tail to point to last node cout
9、 “请输入多边形顶点的个数 (顶点个数为 0时结束 ): ”; cin n; return head; void disp(polygon * head) int i, No=1; cout setw(10) “x“ setw(6) “y“ end1; while(head!=NULL) cout “第 ” No “结点 :” end1; for(i=0; i =head- n-1; i+) cout setw(10) head- xi setw(6) head- yi endl; (8); head=(9); /Match while statement void del(polygon *
10、 head) polygon * p; while(head!=NULL) p=(10); head=head- next; delete p- x; delete P- y; deletep; /Match while statement void main() polygon * head; head=create(); disp(head); del(head); 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 10 阅读下列程序说明和 C+代码,将应填入 (n)处。 【说明】 在类体中添加函数
11、move(double ax, double ay)的定义,使得点的坐标 x和 y分别移动 ax 和 ay个单位。 在类定义外完成重载的两个构造函数 CPosition()和 CPosition(double dx, double dy),其中前者为不带参数的构造函数,使 CPosition对象的默认值为 x=0, y=0,后者为带参数的构造函数,把数据成员 x和 y分别初始化为参数 dx和 dy的值。 完成函数 double distance(double bx, double by)的定义,该函数返回 *this和点(bx, by)的距离。 注意:除在指定的位置添加语句外,请不要改动程序中
12、的其他语句。 源程序文件 test5.cpp清单如下: #include iostream.h #include math.h class CPosition public: CPosition(); CPosition(double dx, double dy); double getx(); double gety(); (1) double distance(double bx, double by); private: double x; double y; ; (2) x=0; y=0; CPosition: CPosition(doub, e dx, doub, e dy) x=d
13、x; y=dy; double CPosition: getx() return x; double CPosition: gety() return y; double CPosition: distance(double bx, double by) (3) vold main() double a, b; cout “|nput x, y position of a point: “; cin a b; CPosition psA(a, b); cout “Input x, y position of another point: “; cin a b; cout “The distan
14、ce is“ psA.distance(a, b) end1; 11 【说明】 下面是一个 Applet程序,其功能是建立一个图形用户界面的窗口,包括一个文本显示区和一个按钮,点击按钮,可以在文本区已有的文本基础上追加显示 10条 “Welcome to China“信息,并且文本区由滚动条控制文本的上下滚动。 程序运行结果如图 4所示。 import javax.swing.*; import java.awt.*; import java.awt.event.*; /* appletcode=“ex5_6.class“ width=800 height=400 /applet */ pub
15、lic class ex5_6 extends JApplet JButton jb=new JButton(“Add Text“); JTextPane jtp=new JTextPane(); public void init() jb.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) for(int i =1; i 10; i+) (1)+“ Welcome to China!n“; ; Container cp=(2); cp.add(new JScrollPane(jtp
16、); cp.add(3); public static void main (String args) ex5_6 obj5_6=new ex5_6(); String str=obj5_6.getClass().toString(); if(str.indexOf(“class“)!=-1) str=str.Substring(6); JFrame frm=new JFrame(str); frm.addWindowListener(new (4) public void windowClosing(WindowEvent we) System.exit(0); ); (5).add(ex5
17、_6); frm.setSize(300, 400); frm.setVisble(true); ex5_6 htm| HTML HEAD TITLE ex5_6 /TITLE /HEAD BODY appletcode=“ex5_6.class“ Width=800 height=400 /applet /BODY /HTML 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 16答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 0层图中的 “试卷得分表 ”是局部文件,可不必画出。 2 【正确答案】 (1)分类统计成绩中需要读入考生成绩,缺少从 “考生名册
18、 ”到 “2.4分类统计成绩 ”的数据流。 (2)“2.1检查成绩表 ”缺少输出数据流 “错误成绩表 ”。 (3)“2.2审定合格者 ”缺少输入数据流 “合格标准 ”。 3 【正确答案】 (1)准考证号 +姓名 +课程名 +成绩 +合格 /不合格标志 (2)报名号 +姓名 +通信地址 +出生年份 +文化程度 +职业 【试题解析】 问题 1中 “不必画出 ”是指在某层数据流图中,只画流程图中各加工之间的公共数据文件,隐藏某加工的局部数据文件,这个规则只是为了使整个数据流图的层次结构更科学、更清晰,不过画出 “不必画出的数据文件 ”对数据流图不会造成理解错误。在 0层图中有文件 “考生名册 ”和
19、“试卷得分表 ”,其中 “试卷得分表 ”是加工 2“统计成绩 ”的局部数据文件,所以不必画出。 问题 2是要指出 哪些图中遗漏了哪些数据流,这需要从两个方面进行考虑: 一是父图与子图的平衡,即子图的输入、输出数据流与父图相应的加工的输入、输出数据必须一致。 二是针对每个加工至少要有一个输入和输出,反映次加工的数据来源和结果。 数据流图 1-3是加工 2“统计成绩 ”的子图,为了发现图中遗漏的数据流,首先要观察 0层图中加工 2的输入、输出流。在 0层图中,加工 2“统计成绩 ”有 2个输入流 “合格标准 ”和 “成绩表 ”, 4个输出流 “考生通知单 ”、 “统计分析表 ”、 “难度分析表 ”
20、和 “错误成绩表 ”。 再看加工 2子图中只有一 个输入流 “成绩表 ”,可见必然遗漏了一个输入流 “合格标准 ”。根据题目说明提到的 “对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者 ”,所以输入流 “合格标准 ”应该是输入到加工 2.2“审定合格者 ”。 加工 2子图中只有 3个输出流 “考生通知单 ”、 “统计分析表 ”和 “难度分析表 ”,缺少数据流 “错误成绩表 ”。加工 2.1“检查成绩表 ”的功能是检查成绩表是否合格,其中一个输出流是 “正确成绩表 ”,自然另一个是输出是 “错误成绩表 ”。因此,第二个遗漏的数据流是 “2.1检查成绩表 ”的输出数据流 “错
21、误成绩表 ”。 根据题目中提到的 “根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表 ”这一说明,可以判断出加工2.4“分类统计成绩 ”除了需要 “试卷得分表 ”的输入流外,还需要考生信息,需要从文件 “考生名册 ”中输入。 问题 3中根据题目说明中提到的 “填写考生通知单 (内容包含该考生的准考证号、姓名、各课程成绩及最终合格 /不合格标志 ),送给考生 ”,所以考生通知单应该包括考生的准考证号、姓名和最终合格 /不合格标志,这种共同组成的含义由符号 “+”来表示。同时因为考试可能有多门课 程共同组成,所以,课程号和该课程的成绩也是必须的。其
22、中的多门课程由符号 “” 来表示重复。因此,考生通知单 =准考证号 +姓名 +课程名 +成绩 +合格 /不合格标志。 根据题目说明中提到的 “对合格的报名表编好准考证号码后将准考证送给考生 ”,在 0层图中可以看到,加工 1“登记报名表 ”把考生信息写入文件 “考生名册 ”中,可见 “考生名册 ”中的数据除 “准考证号 ”外均从合格的报名表中得到。因此 “报名表 ”至少需要由报名号、姓名、通信地址、出生年份、文化程度和职业组成。由数据字典定义式表示为:报名表 =报名号 +姓名 +通信地址 +出生年份 +文化程度 +职业。 4 【正确答案】 客户: (客户号,客户名,地址,电话 ) 订单: (订
23、单号,客户号,产品号,订货数,订货日期,交货日期,金额 ) 应收账款: (客户号,发票号,发票号应收金额,支付日期,支付金额,当前余额 ) 产品描述: (产品号,产品名,单价,重量 ) 折扣规则: (产品号,订货量,折扣 ) 5 【正确答案】 将数据表:订单: (订单号,客户号,产品号,订货数,订货日期,交货日期,金额 ) 拆分为: 订单: (订单号,客户号,订货项数 (可有可无 ),订货日期,交货日期 ) 订单细则: (订单号,产 品号,订货数,金额 ) 【试题解析】 这一题主要考查考生对数据表的结构的设计能力。这一步在 MIS系统的开发中是至关重要的一步,因为数据表的结构是否合理直接影响到
24、整个系统的性能。 原题中的订单表,不符合第二范式,因为其中含有部分依赖关系 (订单号,产品号 )-订货日期, (订单号,产品号 )-交货日期, (由于一张订单有可能订了多种产品,但因为是同一订单所以这几种产品的订货日期,交货日期只要订单号就可以确定了 )。 6 【正确答案】 Customer(idno, name, address, phone) Account(Ano, balance, Bname) Bname reference Branch(Bname) Deposit(idno, Ano) idno reference Customer(idno) Ano reference Acc
25、ount(Ano) Branch(Bname, city) Loan(Lno, Bname, amount) Bname reference Branch( 7 【正确答案】 Borrow.Lno=Loan.Lno(2)COUNT(distinct idno) =2 8 【正确答案】 这样的系统算不上分布式数据库系统。分布式数据库系统并不是简单地把集中式数据库系统安装在不同场地,用网络连接起来实现的 (这是分散的数据库系统 ),它是具有自己的性质和特征。 分布式数据库系统具有以下特点: 1)数据的物理分布性; 2)数据的逻辑整体性; 3)数据的分布独立性; 4)场地的自治和协调; 5)数据的冗
26、余及冗余透明性。 虽然上述银行的数据库系统具有性质 1、 3以及 4和 5的一部分,但关键是没有数据的逻辑整体性和不同场地之间的协调 性等,这恰恰是分布式数据库系统的关键所在。因此,上述银行数据库系统 【试题解析】 本题中的 E-R图中有 4个实体集、 2个多对多联系和 2个一对多联系,根据上述 E-R图转换关系模型的规则可以转换成 6个关系。 4个实体集转换的 4个关系 (Customer、 Account、 Branch 和 Loan),对于一对多联系 B-L和 B-A则是将 “一 ”端 (关系 Branch)的码 Bname加入到 “多 ”端所转换的关系 (Account 和 Loan)
27、。此 4个关系分别为: Customer( idno , name, address, phone) Account( Ano , balance, Bname) Branch( Bname , city, assets) Loan( Lno, Bname, amount) 4个关系中, Account和 Loan 的属性 Bname均参照 Branch的码 Bname,为外码。 2个多对多联系转换为 2个关系,两端的码及联系的属性为关系的属性,两端的码共同组合为该关系的码。此 2个关系分别为: Deposit(idno, Ano) Borrow(idno, Lno) 其中的 idno、 An
28、o和 Lno分别参照 Customer的 idno、 Account的 Ano和 Loan的 Lno。 问题 2中是要查询在该银行中一笔贷款贷给多个 (至少 2个 )客户的所有贷款号和发放贷款的支行名称。 Borrow 表中记录着各贷款号和该贷款的客户, Loan表中记录着各贷款号和发放该贷款的支行,要完成题目查询必须将 Borrow 和 Loan联系起来,即需要两者的贷款号相等。所以填空 (1)应该为 Borrow.Lno=Loan.Lno。 “一笔贷款贷给多个客户 ”则需要按贷款号进行分组,只 有客户个数至少两个的组才是满足查询要求的分组。对于分组的条件应该添加在 HAVING子句中,个数
29、的统计需利用 COUNT(idno)函数,因此填空 (2)为 COUNT(idno) =2。 问题 3主要考查分布式数据库系统的必备条件。 9 【正确答案】 (1)NULL(2)n(3)n-1(4)newNode- next (5)head(6)n(7)n(8)No+(9)head- next (10)head 【试题解析】 如果掌握了链表的创建、遍历和删除的方法,解决本题应该并不困难。要显示链表各结点 的数据,就是要把各结点找到,然后把该结点的每一个 x、y坐标打印出来。不过,与普通的链表也有不同的地方:就是该链表的结点数据是指针。要在链表结点中存入数据,必须先动态分配存储数据的内存单元;要
30、删除链表中的各个结点,必须先释放结点数据的内存单元,否则会造成内存泄露。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 10 【正确答案】 (1)void move(double ax, double ay)x+=ax; y+ =ay; ; (2)CPosition: CPosition()(3)return sqrt(pow(x-bx, 2)+pow(y-by, 2); 【试题解析】 本题主要考查考生对于类的定义和重载构造函数的掌握情况。在 (3)中使用了基本的数学函数 sqrt(x)求 x的开方,
31、 pow(x, n)函数是求 x的 n 次方。 11 【正确答案】 (1)jtp.setText(jtp.getText()(2)getContentPane() (3)BorderLayout.SOUTH, jb (4)WindowsAdapter()(5)frm.getContentPane() 【试题解析】 本题主要考查 Applet和 swing结合进行图形用户界面设计的综合应用。解题关键是掌握 swing的基本构件 JTextPanel, JButton, JScrollPanel 的用法,掌握 BorderLayout 布局管理器的使用方法,以及熟练掌握最基本的对象概念。本题中, JTextPanel 的 2个基本的方法, set- Text()和 getText()的功能,熟悉这 2个功能,则很容易就能将错误改正;应该是通过 BorderLayout 布局管理器在窗口的最下方添加一个 JButton 对象,需要清楚程序中每个对象所对应的类。