1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 47及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和数据流图,回答问题 1至问题 3,将解答填入对应栏内。 说明 下面给出的是某房产管理系统的一套分层数据流图。其功能描述如下: (1)系统随时根据住房送来的入住单更新住户基本信息文件; (2)每月初系统根据物业管理委员会提供的月附加费 (例如清洁费、保安费、大楼管理费等 )表和房租调整表,计算每家住户的月租费 (包括月附加费 ),向住户发出交费通知单。住户交费时,系统输入交费凭证 ,核对后输出收据给住户; (3)系统定期向物业管理委员会提供住房分配表和交费
2、清况表; (4)住户因分户或换房,在更新住户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分户或换房前的房租。 以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图 1-1是项层数据流图,图 1-2是第 0层数据流图,图 1-3是第 1层数据流图,其中 A是加工 1的细化图, B是加工 2的细化图。假定题中提供的顶层图是正确的,请回答下列问题。 图 1-1 图 1-2 图 1-3 1 指出图 1-2中的哪些文件可不必画出。 2 指出在哪些图中遗漏了哪些数据流。回答时请用如下形式之一: 1)图中遗漏了 加工 (或文件 )流向 加工 (或文件 )的
3、 数据流; 2)图中加工 遗漏了输入 (或输出 )数据流 。 3 指出图 1-3的 B中加工 2.3能检查出哪些不合格交费凭证。 3 阅读下列说明和 E-R图,回答问题 1至问题 3,将解答填入对应栏内。 说明 建立一个供应商零件数据库,数据库要满足如下要求: (1)供应商代码不能为空,且是值惟一的,供应商的名也是惟一 的。 (2)零件号不能为空,且值是惟一的,零件号不能为空。 (3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。 图 2-1是该系统的 E-R图。 图 2-1 4 根据 E-R图中给出的词汇,按照 “有关模式名 (属性,属性, )” 的格式,将此 E-R图转换为
4、3个关系模式,指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。 5 创建 S表时, SNo使用 CHAR(5)并且唯一, SName使用 CHAR(30), Status使用CHAR(8), City使用 CHAR(20)。请在下列用 于创建表 S的 SQL语句空缺处填入正确的内容。 CREATE TABLE S(SNo CHAR(5), SName CHAR(30), Status CHAR(8), City CHAR(20), _; 6 假定 SP表存储供应情况,如下的 SQL语句是用于查询 “产地为 Beijing、零件号为 P101的零件的所供应的总数 (包括所有供
5、应商 )”的不完整语句,请在空缺处填入正确的内容。 SELECT SUM(Qty) FROM SP WHERE PNo=”P101 (1) PNo (2) (SELECT PNo FROM (3) WHERE city=“Beijing“) (4) PNo; 6 (1) 7 (2) 8 (3) 9 (4) 9 阅读以下说明和程序流程图,将应填入 (n) 处的字句写在对应栏内。 说明 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数 m表示为: m=ak10k-2+ak-110k-3+a310+a2 其中 a1保存该长整数的位数, a0保存该长整数的符号: 0
6、表示正数、 1表示负数。注:数组下标从 0开始。 流程图 (图 4-1)用于计算长整数的加 (减 )法。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注,此处不考虑溢出情况,即数组足够大。这样在程序中引进两个指针 pA和 pB,分别指向绝对值较大者和较小者。而对绝对值相加 ,情况,让pA指向 LA, pB指向 LB,不区分绝对值大小。 pApB可用通式 pA+flag*pB来计算, flag为 +1时即对应 pA+pB, flag为 -1时即对应 pA-pB。需特别注意的是,对于相减,不够减时要进行借位,而当最高位借位后正好为
7、0时,结果的总位数应减1;对于加法,有最高进位时,结果的总位数应加 1。 流程图中涉及的函数说明如下: (1)cmp(int *LA, int *LB)函数,用于比较长整数 LA与 LB的绝对值大小,若 LA绝对值大于 LB绝对值则返回正值, LA绝对值小于 LB绝对值返回负值,相等则返回 0。 (2)max(int A, int B)函数,用于返回整数 A与 B中较大数。 另外, 对流程图中的写法进行约定: (1)“: =”表示赋值,如 “flag: =LA0+LB0”表示将“LA0+LB0”的结果赋给 flag,相当于 C中的赋值语句: “flag=LA0+LB0; ”;(2)“: ”表示
8、比较运算,如 “flag: 1”表示 flag与 1比较。 10 (1) 11 (2) 12 (3) 13 (4) 14 (5) 14 阅读下列函数说明和 C代码,将应填入 (n)处的字句写在对应栏内。 说明 HufTman树又称最优二叉树,是一类带权路径长 度最短的树,在编码中应用比较广泛。 构造最优二叉树的 Huffman算法如下: 根据给定的 n各权值 W1, w2, , wn)构成 n棵二叉树的集合 F=T1,T2, , Tn,其中每棵树 Ti中只有一个带权为 wi的根节点,其左右子树均空。 在 F中选取两棵根节点的权值较小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根节点的
9、权值为其左右予树根节点的权值之和。 从 F中删除这两棵树,同时将新得到的二叉树加入到 F中。 重复 ,直到 F中只剩一棵树为止。 函数中使 用的预定义符号如下: #define INT MAX 10000 #define ENCODING LENGTH 1000 typedef enum(none, left_child, right_child) Which; /*标记是左孩子还足右孩子 */ typedef char Elemtype; typedef struct TNode/Huffman树节点 Elemtype letter; int weight; /权 值 int parent;
10、 /父节点 Which sigh; char *code; /节点对应编码 HTNode, *HuffmanTree; int n; char coding50; /储存代码 函数 void Select(HuffmanTree HT, int end, int *sl, int *s2) /*在 0 END之间,找出最小和次小的两个节点序号,返吲 S1、 S2*/ int i; int min 1=INT_MAX; int min 2=INT_MAX; for(i=0; i =end; i+)/*找最小的节点序号 */ if( (1) ) (HTi.weight minl) *s1=i; m
11、in 1=HTi.weight; for(i=0; i =end; i+)/*找次小节点的序号 */ if(HTi.parent=0) ( (2) ) (min 2 HTi.weight) *s2=i; min 2=HTi.weight; void HuffmanTreeCreat(HuffmanTree HT)/*建立 HUFFMAN树 */ int i; int m=2*n-1; int s1, s2; for(i=n; i m; i+) Select( (3) ); HTs1.parent=i; HTs2.parent=i; HTs1.sigh=left child; HTs2.sigh
12、=right child; HTi weight=(4); void HuffmanTreeEncoding(char sen, HuffmanTree HT) /*将句子进行编码 */ int i=0; int j; while(seni != 0) for(j=0; j n; j+) if(HTj.letter=seni)(/*字母吻合则用代码取代 */ strcat(coding, (5) ); break; i+; if (Sen 1=32) i+; printf(“n%s“, coding); 15 (1) 16 (2) 17 (3) 18 (4) 19 (5) 二、选答题(共 3道
13、大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解 答有效。 19 阅读下列函数说明和 C+代码,将应填入 (n)处的字句写在对应栏内。 说明 在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能 (包括不用的功能 )都要全面初始化的话,会导致应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。 以下示例展示了 Proxy(代理 )模式, PrinterProxy类执行一些比较 “轻 ”的方法,需要真正执行 “重 ”的方法时才初始化 Print类。图 5-1显示了各
14、个类间的关系。 图 5-1 C+代 码 class Printable public: virtual void setPrinterName(string name)=0; virtual string getprinterName()=0; virtual void print(string name)=0; ; class Printer: public Printable private: string name; public: Printer(string name) cout “正在产生Printer的对象实例 “ endl; this name=name; void setPr
15、interName(string name) this- name=name; string getPrinterName() return name; void print(string msg) cout “=“ name “=“ endl; cout msg endl; ; class printerproxy : public (1) private: String name; Printer *real; public: PrinterProxy(string name) (2)=NULL; this- name=name; void setPrinterName(string na
16、me) if(3)real- setPrinterName(name); this-name=name; string getPrinterName() return name; void print(string msg) (4); real- print(msg); void realize() if(real=NULL)real=(5); ; 20 (1) 21 (2) 22 (3) 23 (4) 24 (5) 24 阅读以下说明和 Java代码,将应填入 (n)处的字句写在对应栏内。 说明 在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能 (连不用的功
17、能 )都要全面初始化的话,会连带影响到应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。 以下示例展示 了 Proxy(代理 )模式, PrinterProxy类执行一些比较 “轻 ”的方法 设置名称和取得名称,需要真正执行 “重 ”的方法 真正打印 时才初始 Print类。图 6-1显示了各个类间的关系。 图 6-1 Java代码 /Printable.Java publiC (1) Printable public abstract void setPrinterName(String name); public abstract String g
18、etprinterName(); public abstract void print(String string); /Printer.Java public class Printer implements Printable private String name; public Printer() System.out.println(“正在产生 Printer的对象实例 “); public Printer(String name) this.name=name; heavyJob(“正在产生 Printer的对象实例 (“+name+“)“); public void setPri
19、nterName(String name) this.name=name; public String getPrinterName() return name; public void print(String string) System.out.println(“=“ +name+“ =“); System.out.println(string); /PrinterProxy.Java public class PrinterProxy (2) Printable private String name; private Printer real; public PrinterProxy
20、() public PrinterProxy(String name) this.name=name; public gynchronized void setPrinterName(String name) if( (3) ) real.setPrinterName(name); this.name=name; public String getprinterName() return name; public void print(String string) (4); real.print(string); private synchronized void realize()/产生真正
21、的 Printer对象 if(real=null) real=(5); 25 (1) 26 (2) 27 (3) 28 (4) 29 (5) 29 阅读以下说明和 C代码,将应填入 (n)处的字句写在对应栏内。 说明 下面程序用来将打乱的单词还原为原来的次序,比如将 rty还原为 try。单词的原来次序存储于 wordlist.txt文件中,原则上可用穷举法 (rty对应的穷举为: rty、 ryt、try、 tyr、 ytr、 yrt),但考虑到破译速度,采用如下方法。 注意到单词列表中不存在组成字符完全相同的单词 (如 Hack12与 Hack21包含完全相同的字符 ),因此将单词中的字符
22、进行重组再进行比较,例如, try单词重组为rty(按 ASC 码顺序 ),这样不管打乱的单词是什么顺序,只要是由 r、 t、 y三个字母组成的均破译为 try,大大提高破译速度。程序中借助二叉排序树以进一步提高查找效率,二叉排序树左子树 (如果有 )上的节点对应的值均小于根节点的值,右子树 (如果有 )上的节点对应的值均大于根节点的值。 函数中使用的符号定义如下: #define NumberofWords 1275/单词总数 #define MaxLength 10/最长单词所含字符数 char WordListNumberofWordsMaxLength; /存储单词列表 int cmp
23、(Node *q, Node *p); /q与 p比较。 p小,返回负值; P大返回正值:相等,返回 0 typedef struct Node(/二叉树节点 char *eleLetters; /重组后的字符串 int index; /对应单词表中的下标 struct Node *lChiId, *rChiid; /左右子节点 Node; C代码 void reCompose(Node *p, char *temp) /重纰,亦即将 temp字符串中的字符升序排序,存储于 p节点中 /采用直接插入排序法 char c; strcpy(p- eleLetters, temp); / int l
24、en=strlen(temp); int i, j, k; for(i=0; i len 1; i+) k=i; for(j=i+1; j lan; j+) if(p- eleLettersj P- eleLettersk)k=J; if( (1) ) C=P- eleLettersi; P- eleLettersi=P- eleLettersk; P- eleLettersk=c; /if /for ; int find(Node root, char *temp) /在二叉排序树 root中查找与 temp匹配的单词。 /若匹配返回相应单词在 WordList中下标;若查找失败, 返回 -
25、1 Node *P, *q; int flag; P=(2); /临时存储 reCompose(p, temp); /将 temp重组 q=root; while(flag=(3) q !=NULL) if(flag 0)/搜索左子树 q=q- lChiid; else(/搜索右子树 q=q- rChild; /while if(flag=0)/找到匹配 的,保存下标 return (4); if( (5) )/查找失败 printf(“cant unscramble the following word: %s“, temp); return -1; ; 30 (1) 31 (2) 32 (
26、3) 33 (4) 34 (5) 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 47答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【 正确答案】 “房租文件 ”和 “交费文件 ” 【试题解析】 分层数据流图中,只涉及单个加工的文件不必画出,可在子图中再画。依此标准,图 1-2中文件 “房租文件 ”和 “交费文件 ”不必画出。 2 【正确答案】 加工 1子图中,遗漏了从住户基本信息文件到加工 1.1(入住单校验 )的数据流。 加工 1子图中,加工 1.6(制作住房分配报告 )遗漏了输出数据流:住房分配表。 加工 2子图中,加工 2.1(计算月租费 )遗漏了输入数据流
27、:月附加费表。 加工 2子图中,加工 2.4(制作收据 )遗漏了输出数据流:收据。 【试题解析】 分层数据流图时刻牢记父图与子图平衡原则。对这种数据流缺失题目,认真对照父图与子图就可得出答案。另外,还要注意与文件的交互,包括错误数据流大多也是出在此。 3 【正确答案】 交费凭证中有非法字符; 交费文件中不存在与之对应的交费凭证。 4 【正确答案】 (Sno, Sname, Status, City),主键为 SNo。 P(PNo, PName, Color, Weight, City),主键为 PNo。 SP(SNo, PNo, Status, Qty),主键为 (SNo, PNo)。 【试题
28、解析】 E-R模型向关系模型的转换应遵循如下原则: . 每个实体类型转换成一个关系模式。 . 一个 1:1的联系 (一对一联系 )可转换为一个关系模式,或与任意一段的关系模式合并。 . 一个 1:n的联系 (一对多联系 )可转换为一个关系模式,或与 n端的关系模式合并。 . 一个 n:m的联系 (多对多联系 )可转换为一个关系模式,两端关系的码及其联系的属性为该关系的属性,而关系的码为两端实体的码的组合。 . 三个或三个以上多对多的联系可转换为一个关系模式,诸关系的码及联系的属性为关 系的属性,而关系的码为各实体的码的组合。 . 具有相同码的关系可以合并。 根据题述易于判断供应商的主键为供应商
29、编号 SNo,零件的主键为零件编号PNo。 5 【正确答案】 PRIMARYKEY Sno 【试题解析】 创建表时往往需要声明主键、外键、非空、唯一等完整性约束条件,表 S中, SNo是主键,声明主键有两种实现手法: PRIMARY KEY(SNO),或者 NOT NULL、 UNIQUE,不同的是 NOT NULL是列级约束,必须在列名之后声明,而 PRIMARY KEY是表级约束。创 建表的完整 SQL语句如下: CREATE TABLE表名 (列名数据类型 列级完整性约束条件 ,列名数据类型 YON完整性约束条件 ,表级完整性约束条件 列级完整性约束条件有: NULL(空 )、 UNIQ
30、UE(取值唯一 )。 PRIMARY KEY(属性或属性组 )申明主码, FOREIGN KEY(属性或属性组 )申明外码。 故空 (1)应填 PRIMARY KEY SNo。 6 【正确答案】 AND 7 【正确答案】 IN 8 【正确答案 】 P 9 【正确答案】 GROUP BY 【试题解析】 查询 “产地为 Beijing、零件号为 P101的零件的所供应的总数 (包括所有供应商 )”是一个集函数查询,具体是求和 SUM,往往搭配 GROUP BY;查询条件有两个:产地是 Beijing、零件号是 P101;这样涉及到的表有: SP、 P。空(1)是连接两个查询条件的,在此两个条件是
31、“并且 ”关系,故空 (1)应填 AND,空 (4)应填 GROUP BY。 空 (2)引出的是一个子查询,可选的有: IN/NOT IN、 EXISTS/NOT EXISTS,首先排除 EXISTS/NOTEXISTS,根据语义,子查询是 “产地为 Beijing的零件号 ”,故空 (2)应填 IN。 包含产地和零件号属性的表自然是零件表 P,故空 (3)应填 P。 10 【正确答案】 flag: =1 11 【正确答案】 carry: =0 12 【正确答案】 carry: 0 13 【正确答案】 LCi+1: 0 14 【正确答案】 LCi+2: 0 【试题解析】 对这种题目,首先阅读说
32、明,从功能上了解程序的结构,把握整体框架,再仔细对照阅读流程图,且 勿先阅读流程图。 仔细阅读完说明,就知道整体框架了:先决定符号,再进行绝对值的加减,其中加减是用 flag来标识的。对于加法,要注意进位,特别是最高进位;对于减法,要注意借位,亦即负进位,在此不用考虑不够减情况,但仍要特别注意最高借位,当最高位正好为 0时,要把高位所有的 0去掉。 空 (1)很容易就得到答案,应为 flag: =1。 空 (2)以下就开始绝对值的加减了。此时 PA、 PB已正确赋值。 在计算过程中,进位是需要特别注意的,从下面的流程可知, Carry表示的就是进位,需要进行初始 化,故空 (2)应填 carr
33、ry: =0。 空 (3)以下是 i =N的情况,即对于计算结束,进行后期处理,此时就要考虑最高进位的问题。可得空 (3)应填 carry: 0,即判断最高进位是否为 O(对减法为负进位 )。 空 (4)是删除高位的 0,故应填 LCi+1: 0。 空 (5)处是具体进行加减法运算的。空 (5)处的条件主要是针对减法的,当不够减时需要借位,故空 (5)应填 LCi+2: 0。 15 【正确答案】 HTi.parent=0 16 【正确答案】 *s1 !=i 17 【 正确答案】 HT, i-1, s1, s2 18 【正确答案】 HTs1.weight+HTs2.weight 19 【正确答案
34、】 HTj.code 【试题解析】 根据算法说明的 可知是根据根节点权值选择,即只考察根节点,而根节点对应的 parent等于 0,故空 (1)应填 HTi.parent=0。此答案可由空 (2)处的 if条件容易得出。 至于空 (2),此处是找次小的,自然需要排除最小的, sl记录了最小树的下标,故填 *s1 !=i。 仔细参照 Select函数的定义, 容易得出空 (3)答案。应填 “HT, i-1, s1,s2”,要注意的是后两个参数需要传递地址,因形参是指针。 根据算法说明的 , “置新构造二又树的根节点的权值为其左右子树根节点的权值之和 ”,而此处 HTi的左右子树的根节点分别为 H
35、Ts1和 HTs2,所以空 (4)应填 HTs1.weight+HTs2.weight。 由注释 “字母吻合则用代码取代 ”可知,此处是将对应代码加到 coding中,而节点的 code字段存储了节点对应编码,故空 (5)应填 HTj.code。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 20 【正确答案】 Printable 21 【正确答案】 real 22 【正确答案】 real!=NULL 23 【正确答案】 realize() 24 【正确答案】 new Printer(name) 【试
36、题解析】 由类图可知 PrinterProxy类是 Printable的子类,因此应声明为继承自 Printable,故空 (1)应填 Printable。 real是一个 Printer对象指针,应该进行初始化,初始化工作是在构造函数中完成的,若不进行初始化的话, realize()方法将不可预期,故空 (2)应填 real。 real是一个指针,调用之前当然得先判断 real是否为空指针,只有不是空指针才能进行调用,否则将出现不可预期的结果,因此空 (3)应填 real!=NULL。 在执行打印时,需要保证已经正确生成了 real对象,否则打印将无法完成,这也正是 Proxy的核心所在,到
37、真正需要打印时,才生产 real对象,因此空 (4)应填realize()。 real是 Printer对象指针,空 (5)是生成一个 Printer对象,注意 Printer类的构造函数是 Printer(string name),故应填 new Printer(name)。 25 【正确答案】 interface 26 【正确答案】 implements 27 【正确答案】 real !=null 28 【正确答案】 realize() 29 【正确答案】 new Printer(name) 【试题解析】 在 Java中, interface和 abstract class均能包含抽象方法
38、, “类是用来继承的 (extends),接口是用来实现的 (implements)。 ”由类 Printer的声明可判知 Printable应为接口,故空 (1)应填 interface。 因 Printable是一个接口,故空 (2)应填 implements。该空比较简单。 real是一个引用,调用之前当然得先判断 real是否为空,只有不是空才能进行调用,否则将出现不可预期的结果,因此空 (3)应填 real !-NULL。 在执行打印时,需要保证已经正确生成了 real对象,否则 打印将无法完成,这也正是 Proxy的核心所在,到真正需要打印时,才生产 real对象,因此空 (4)应
39、填realize()。 real是 Printer对象引用,空 (5)是生成一个 Printer对象,注意 Printer类的构造函数是 Printer(string name),故应填 new Printer(name)。顺便说一下,生成 real对象时,进行 Treal是否为空的判断,并将方法 realize()声明为 synchronized,这是为了避免生成多个 real对象,有一个即可。 30 【正确答案】 k !=i 31 【正确答案】 (Node *)malloc(sizeof P) 32 【正确答案】 q- cmp(p) 33 【正确答案】 q- index 34 【正确答案】
40、 q=NULL 【试题解析】 该题涉及二叉排序树的应用、直接插入排序算法等。 空 (1)所在函数是直接插入排序的一个实现,理解了直接插入排序算法很容易得出答案,条件 (1)成立时,需要进行交换,故空 (1)应填 “k!=i”。 空 (2)比较简单, p声明为指针,在引用 (reCompse(p, temp)之前 需要申请空间,故空 (2)应填 “(Node *)malloc(sizeof P)”。 接下来在二叉排序上进行查找。 while循环体内只有两个分支,一个是 flag 0时继续往左子树搜索,另一个就是往右子树搜索,此时应该对应的是 flag 0。据此可判知, flag存储的是查找节点 p与当前节点 q之间的大小关系,显然是调用类Node的 cmp方法,故空 (3)应填 “cmp(q, p)”。注意,不能填成 “cmp(p, q)”,那样将不可能找到匹配的,因为该二叉排序树是左子树小于根节点,而 cmp(q, p)当p比 q小时返回负 值,搜索应往左子树继续。 空 (4)是找到匹配时返回,根据函数注释,函数 find的返回值是匹配单词在WordList数组中的下标,结构 Node的 index域正好存储的是下标。故空 (4)应填“q- index”。 空 (5)是查找失败的情况,对应条件为 “q=NULL”。故空 (5)应填 “q=NULL”。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1