1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 63及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答问题 1至问题 4,将解答填入答题纸的对应栏内。【说明】图 31描述某超市销售数据的部分处理流程。超市中有若干台收款机和若干名收款员。这里,我们把一个收款员开始使用一台收款机到离开这台收款机称为该收款员的一次作业。作业开始时,收款员先在收款机上输入收款员号和作业前金额。作业前金额是为了销售时的找零而在作业前预先放入钱柜的金额数。作业结束时,收款员要打开钱柜,取走全部 现金,并把这些现金的金额数 (称为作业后金额 )输入收款机。当作业前金额 +本次
2、作业售货总金额一本次作业退货总金额 作业后金额时,表示这次作业存在金额差错。本流程图已作简化,并作以下假定;该超市只有现金交易 (不用信用卡和礼券 );一个收款员因某种原因 (如吃饭 )在一天中可以有多个作业;销售方式只有售货和退货两种。整个超市分成若干部门 (如食品部、服装部 ),系统按部门统计一个月中各类货物的销售数量和金额,最后根据月销售计划文件分析各部门完成销售计划的情况。系统还统计每个收款员的差错情况和退货情况。图中处理 4和处理 8每月的 最后一天执行一次 (营业结束后 ),其他处理每天执行一次。图中部分数据、文件的记录格式如下:日销售数据:收款机号 +收款员号 +作业前金额 +(
3、售货标记 l退货标记 )+货号 +数量 +单价 +金额 )+作业后金额日销售文件记录: (作业开始标记 +收款机号 +收款员号 +作业前金额 ) (售货标记退货标记 )+货号 +数量 +金额 ) (作业结束标记 +收款机号 +收款员号 +作业后金额 )部门日销售文件记录:部门号 +(售货标记退货标记 )+货号 +数量 +金额部门月销售计划文件记录:部门号 +月计划金额收款员差错月报:月份 +收款员号 +差错作业数 +差 错总金额收款员退货月报:月份 +收款员号 +退货次数 +退货总金额其中 w表示w重复出现多次; a b表示 a或 b; a+b表示 a与 b。【图 31】1 分别写出收款员日销
4、售文件、商品文件、部门日销售汇总文件至少应包含哪些数据项。 2 “处理 1”能检查出日销售数据中的哪些错误。 3 处理 4对收款员月销售文件作何种操作。 4 【说明】 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数 m表示为: m=ak10k-2+ak一 110k-3+a310+a 2其中 a1保存该长整数的位数, a0保存该长整数的符号: 0表示正数、 1表示负数。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。 intcmp(int*LA, int*LB
5、); *比较长整数 LA与 LB的绝对值大小 * *若 LA绝对值较大返回正值, LA较小返回负值,相等则返回 0* intADD(int*LA, int*LB, int*LC) *计算长整数 LA与 LB的和,结果存储于 LC中 * *注意:正数与负数的和相当于正数与负数绝对值的差 * *数据有误返回 0,正常返回 1* if(LA=NULL LB=NULL l I LC=NULL)return0; int*pA, *pB, i, N, carry, flag; flag=LA0 +LB0; switch(flag) *根据参与运算的两个数的符号进行不同的操作 * case 0: case
6、2: LC0=LA0; *LA与 LB同号,结果符号与 LA(LB)相同 * pA=LA; pB=LB; (1) ; break; case 1: *LA与 LB异号 * *比较两者的绝对值大小,结果符号与较大者相同 * flag=(2) ; if(flag0)( *LA较大 * LC0=LA0; pA=LA; pB=LB; ) else if(flagLB1?LA1 : LB1; for(i=0; i=pA1)( *LA计算完毕 * carry+=flag*pBi+2; else if(i=pB1)( *LB计算完毕 * carry+=pAi+2; else carry+=pAi+2+fla
7、g*pBi+2; LCi+2=carry 1 0; carry =10; if(4) *需要借位,针对减法 * LCi+2+=10; carry一一; *for* if(5( *最高进位,针对加法 * LCi+2=carry; i+; if(LCi+1=0)i一一; *若最高位为零,针对减法 * LC1=i; return 1; ; *ADD* 4 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。【说明】公司 IT部门决定 开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三
8、个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中 “下一位 ”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统 ,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊 (有唯一期刊流水号 )产生一份
9、传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类以及类之间的关系用 UML类图表示,图 11是该系统的类图的一部分,图 1-2描述了成功传递期刊的序列图。【图 1一 1】【图 1 2】5 根据题意,给出类 “传阅记录 ”的主要属性。 6 根据题意,将图 12中的 (1) (5)处补充完整。 7 同一种期刊分不同的期,所以有多本同一种期刊。 “传阅名单 ”只需每一种期刊一份,还是应该每本期刊一份,为什么 ? 7 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。【说明】某学校的教学系统描述如下:学生信息包括:学号 (Sno)
10、、姓名 (Sname)、性别(Ssex)、年龄 (Sage)、入学年份 (Syear)、主修专业 (Smajor),其中学号是入学时唯一编定的。教师信息包括:教工号 (Tno)、姓名 (Tname)、性别 (Tsex)、年龄 (Tage)、职称 (Ttitle),其中教工号是唯一编定的。课程信息包括:课程号 (Cno)、课程名称(Cname)、学时 (Cperiod)、学分 (Ccredit),其中课程号是唯一编定的。每个专业每个年级只有一个班级,这样班级就可用入学年份标识。每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一
11、位教师教授,否则这门课程就视为不存在。每位学生可以同时选修多门不同的课程,一门课程至少要有 10位学生选修,否则就取消这门课程的开设。注意:选 修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩 (Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。图2 1是经分析得到的 ER图。【图 2 1】8 根据题意,给出联系的属性。实体间的联系有 “一对一 ”、 “一对多 ”和 “多对多 ”,指出各联系分别属于哪一种。 9 按照 “有关模式名 (属性,属性, )” 的格式,将此 E-R图转换为 5个关系模式,
12、指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。 10 若用 Student表存储学生信息, Teacher表存储教师信息, Course表存储课程信息, Study表存储学生选修课程情况。教务处想要 “查询 2006年入学的计算机专业(CS)的学生中平均成绩在 85分以上的学生信息 ”。请将以下 SQL语句补充完整。注:用对应英文表示。 SEL,ECT*FROM studerlt wHERE smajor= “cs”AND syear= “2006” AND (1) (SELECT Sn0 FROM Study GROUp BY SnO HAVING (2) 二、选答题(
13、共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 11 阅读下列函数说明和 C+代码,将应填入 (n)处的字句写在答题纸对应栏内。【说明】对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器 (Iterator)。模式以下程序模拟将书籍 (B00k)放到书架 (B00kShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器 Iterator实现。 图 5 1显示了各个类间的关系。以下是 C+语言实现,能够正确编译通过。【图 5
14、一 1】【 C+代码】 templateclass Iteratorpublic: virtual bool hasNext() =0; (2) obj ect*next() =0; ; class B00k省略具体方法和属性 ; class BookShelf(private: vectorbooks: public: BookShelf()( B00k* getBookAt(int index) returnb00ksindex; int getLength() return books size(); template class BookShelfIterator : public (
15、3) BookShel f *bookShel f: BookShelfIterator(BookShelf *bookShelf)( this一 bookShelf=b00kShelf: bool hasNext()判断是否还有下一个元素 if(indexgetLength() object*next() 取得下一个元素 return bookShel f一 getBookAt(index+); B00kShelf bookShel f: 将书籍上架,省略代码 rterator*it=new Book ShelfIterator( (4) ); while(5)遍历书架,输出书名 b00k=
16、 (Book*)it一 next(); *访问元素 * 12 阅读以下说明和 Java代码,将应填入 (n)处的字句写在答题纸对应栏内。【说明】对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过 递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器 (Iterator)。模式以下程序模拟将书籍 (Book)放到书架 (Bookshelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器 Iterator实现。图 61显示了各个类间的关系。以下是 JAVA语言实现,能够正确编译通过。【图 61】【 Java代码】 Iterator java文件 public
17、interface 工 terator publ ic abstractboolean hasNext(); public abstract object next(); Aggregate java文件 publ ic interface Aggregate publ ic abstract Iterator iterator(); Book java public class Book 省略具体方法和属性 Bookshel fIterator java文件 publ ic class BookShelfIterator (1) Iterator f private BookShelf bo
18、okShel f: private int index: publie BookShel fIterator(BookShelfbookShel f) this bookShel f=b00kShelf: this index=0: public boolean hasNext()判断是否还有下一个元素 if(index 13 阅读以下函数说明和 c代码,将应填入 (n)处的字句写在答题纸对应栏内。【说明】对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象 化、一般化的结果就称为迭代器 (Iterator)。模式以下程序模拟将书籍 (Book)放到
19、书架 (BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器 Iterator实现。图 71显示了各个类间的关系。以下是 JAVA语言实现,能够正确编译通过。【图 7一 1】【 C代码】 typedef bool (*fun1)(); typedef (1) (*fun2)(); constint Book_MAX=10;最大书本数 struct Bookchar name3 0; ; struct Bookshelf(书架 struct Book booksBooKMAX; intindex;书架上最后一本书的下标加 1,即下一本书的下标,如 0表示有 0本书
20、;struct Book*getB00kAt(struct BookShelf *BS, int index)从书架 BS上取得下标为 index的书只有当下标大于等于 0且不大于当前书架上的最后一本书对应的下标,才取书成功;否则失败,返同NuLL if(index: 0& (2) ) return&BS一 booksindex; return NULL: bool appendBook(struct BookShelf *BS, struct Book book) i f(BS一 indexbooksBS一 index+ =book; return true: return false: i
21、nt getLength(struct BookShelf*bookShelf) return bookShelf一 index: structIterator迭代器 fun1 hasNext;判断是否还有下一个元素 fun2 next;取得下一个元素 ; struct BookshelfIterator(书架迭代器 intindex: struct BookShelf*bookShelf: )bookShelfIterator=0, NULL); bool BshasNext()判断是否还有下一本书 i f(bookShel fIterator index name); 软件水平考试(中级)
22、软件设计师下午(应用技术)试题模拟试卷 63答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 收款员日销售文件:收款员号 +差错作业数 +差错金 额 +退货次数 +退货金额 商品文件:货号 +部门号 +单价 部门日销售汇总文件:部门号 +货号 +销售数量 +销售总金额 【试题解析】 从流程图可以看出,商品文件和日销售数据通过处理 l生成错误清单、日销售文件和部门日销售文件,日销售文件和部门日销售文件是两个处理流程的输出数据,所以商品文件既要为生成日销售文件和部门曰销售文件提供相应的数据,又要提供对日销售数据的错误检查处理的要求。商品文件应该是记录有关商品的一些信息,为
23、了与日销售数据进行文件关联,应该有一个关联数据项。在日销售数据中与商品有关的数据项是货号, 且货号在系统中多处使用,因此货号可以作为商品文件记录的主键。处理 1生成的部门日销售文件中除部门以外,其余的数据可以从日销售文件分析生成,所以商品文件中有部门数据项,即商品必须唯一从属于某个部门。另外,处理 l还要对日销售数据进行差错检查,数量、单价与金额 3个数据间应满足:单价 数量 =金额,因此商品文件中应包含单价。综上,商品文件至少应包含以下数据项:货号、部门号、单价。处理 3是将收款员目销售文件合并到收款员月销售文件中,这说明两者在格式上基本相同,题中并没有明确说明两者的记录格式,只能通过分析收
24、款员月销售文件 的流向来确定其包含的数据项。处理 4对收款员月销售文件进行处理后生成收款员差错月报和收款员退货月报,在收款员月销售文件中体现差错和退货两个方面的信息才能统计生成所需的报表,根据试题给定的这两个报表的数据记录格式,合并其中的数据项可以确定收款员月销售文件应包含的数据项:收款员号、差错作业数、差错金额、退货次数、退货金额。注意名称作适当修改,报表是统计信息。至于月份信息,对收款员月销售义件来讲是一个冗余数据项,收款员月销售文件中的数据是一个月的销售数据。综上得,收款员日销售文件至少应包含以下数据项:收款员号、差错 作业数、差错金额、退货次数、退货金额。部门日销售汇总文件是处理 6按
25、部门统计生成的,通过分析流程很难确定,需要通过试题说明综合考虑。“系统按部门统计一个月中各类货物的销售数量和金额,最后根据月销售计划文件分析各部门完成销售计划的情况。 ”综合分析可得,部门日销售汇总文件的数据项为:部门、货号、销售量、销售金额。 2 【正确答案】 存在非法字符或非法数据 (如金额小于 0)数量 单价 金额 货号 (或单价 )与商品文件中的货号 (或单价 )不一致 【试题解析】 处理 1的输入数据有商品文件和日销售数据,因此可以检查 出的错误如下:存在非法字符或非法数据 (如金额小于 0)、数量 单价 金额、货号 (或单价 )与商品文件中的货号 (或单价 )不一致。 3 【正确答
26、案】 删除其中的所有记录或初始化 【试题解析】 处理 4对收款员月销售文件进行处理后生成收款员差错月报和收款员退货月报,同时也生成了收款员月销售文件,所以对收款员月销售文件所作的操作应为:删除其中的所有记录或初始化。 4 【正确答案】 (1)flag=1 (2)cmp(LA, LB) (3)carry=0 (4)LCi+285 【试题解析】 SELECTALLIDISTINCT, . FROM, WHERE GROUPBYHAVING ORDERBYAsc1DESC 子句顺序为 SELECT、 FROM、 WHERE、 GROUPBY、 HAVING、ORDERBY,但 SELECT和 FRO
27、M是必须的, HAvING子句只能与 GROUPBY搭配起来使用。子查询的语意应为 “按学号分组、平均分大于 85的学生的学号 ”,可得空 (1)应填 SnoIN,空 (2)应填 AVG(Grade)85。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答, 如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 11 【正确答案】 (1)Object (2)virtual (3)Iterator (4)&bookShelf (5)it一 hasNext() 【试题解析】 Iterator是模板类,空 (1)应该填某个类名,其方法 next()的返回类型是 O
28、bject,而 Object没有定义,故空 (1)应填 Object。从 next()方法末尾的 “=0”可知,该方法为纯虚函数,故空 (2)应填 virtual。 BookShelflterator类 继承自Iterator类,要注意的是模板类基类的写法,空 (3)应填 Iterator。根据构造函数 BookShelfIterator(BookShelf*bookShelf)可得,空 (4)应填 &bookShelf,注意地址符,因形参是 BookShelf指针。 while循环是遍历书架,输出书名,循环条件是 “还有下一记录 (书 )”,故空 (5)应填 it一 hasNext0。注意指
29、针写法。 12 【正确答案】 (1)implements (2)this (3)iterator() (4)it hasNext() (5)next() 【试题解析】 Iterator是接口类,空 (1)应该填 implements。根据构造函数BookShel terator(BoOkShelfb00kShelf)可得,空 (2)应填 this,即自身引用。空 (3)是取得迭代器实例, BookShel蹼中方法 iterator0是返回 Iterator接口,故空 (3)应填 iterator0。 while循环是遍历书架,输出书名,循环条件是 “还有下一一记录(书 )”,故空 (4)应填
30、it hasNext0。注意指针写法。空 (5)是取得书实 例, BookShelf类中方法 next()是返回 Object类实例,取得下一本书,故空 (5)应填 next()。 13 【正确答案】 (1)structBook* (2)indexindex (3)bookShelflterator index+ (4)&bookShelf (5)iterator hasNext() 【试题解析】 空 (1)是某个函数类型定义,先看空 (2),根据注释,此处应填下标index“不大于当前书架上的最后一本书对应的下标 ”,而结构体 BookShelf的字段index是表示 “书架上最后一本书的下
31、标加 1,即下一本书的下标,如 0表示有 0本书 ”,故空 (2)应填: indexindex。继续看空 (3),根据注释函数 BSnext0的功能是 “取得下一本书,并将 index加 1,以便下一次正确访问 ”,而函数getBookAt(BS, index)是 “从书架 BS上取得下标为 index的书 ”,因此空 (3)应填欲取书的下标,应为 bookShelfIterator index,故空 (3)应填bookShelflterator index+。书架迭代器 BookShelflteratorqh的字段 bookShelf是 structBookShelf*类型的,因此空 (4)应填 &bookshelf,注意取地址符。 while循环是遍历书架,输出书名,循环条件是 “还有下一记录 (书 )”,故空 (5)应填iterator hasNext()。现在再来看空 (1),由迭代器 Iterator中字段 next的定义:fun2next;以及赋值语句 iterator next=BSnext;可得, fun2应该定义了与BSnext函数同参数的函数指针,函数指针的定义原型为:函数返回类型函数指针变量名 (参数列表 ),又知 函数 BSnext的定义为 structBook*BSnext(),故空 (1)应填structBook*。