1、中级软件设计师下午试题-105 及答案解析(总分:-4.97,做题时间:90 分钟)一、试题一(总题数:1,分数:-1.00)【说明】某考务处理系统主要功能是考生管理和成绩管理:1对考生送来的报名表进行检查。2对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图 1-1 所示,第
2、 0 层图如图 12 所示,加工 2 子图如图 1-3 所示。【数据流图】(分数:-0.99)_二、试题二(总题数:1,分数:-1.00)【说明】设有关于银行借贷管理系统的 E-R 图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。为了答题的方便,图中的实体和属性同时给出了中英文说明,回答问题时只需写出英文名即可。(分数:-0.99)_三、试题三(总题数:1,分数:-1.00)1.阅读下列说明、流程图和算法,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】下面的流程图 15 用 N-S 盒图形式描述了数组 A 中的元素被划分的过程。其划分方法是:以数组中的第一
3、个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于 Ai,并且数组中下标小于 i 的元素的值均小于基准数,下标大于 i 的元素的值均大于基准数。设数组 A 的下界为 low,上界为 high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以 4 为基准数的划分过程如下:【流程图】(分数:-1.00)_四、试题四(总题数:1,分数:-1.00)【说明】一个图书馆信息管理系统的分析与建模。下面是某图书馆的有关介绍。图书馆雇有若干管理员,各自具有编码、姓名等属性。管理员可上岗,也可下岗。图书馆中备有若干图书,每本图书有书号、书
4、名、出版社、价格等属性。图书馆不定期地购买并注册新图书供读者借阅,也可将报废的旧书注销以停止借阅。图书馆可为众多读者提供服务。每个读者在借阅之前需注册姓名、性别、地址、Email 等内容。读者可在终端上查询。每个读者最多可同时借阅 5 本书。每本图书借期为 30 天;若有一本书超期,则不可再借其他图书。一本书超期一天罚款 0.1 元。若一本书超期 3 个月不归还,则发布通告。若读者的图书丢失,在罚款处理之前不能借书,每本报失的图书罚款该书价的 2 倍。注册新读者不受限制;在注销读者之前,该读者必须归还所有借阅的图书,或者报失并接受罚款。【用例图】【协作图】(分数:-0.99)_五、试题五(总题
5、数:1,分数:-1.00)2.【程序说明】定义一个多边形结构:struct polygon 实现以下内容:(1)建立该结构的链表:create 函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为 0 时,链表创建结束。(3)编写一个函数 disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。【程序】#include “iostxeam.
6、h“#include “iomanip. h“stmct polygonint n;int *x;int *y;polygon *next;void Push(polygon*newNode = new polygon;newNode-next= (1) ;newNode-x = new intn;newNode-y = new intn;newNode-n= (2) ;for(int i=0; i= (3) ; i+) cout“请输入多边形各顶点 x、y 坐标, 坐标值之间用空格分隔: “;cinnewNode-xinewNode-yi;(4) = head; /在 head 前不需要额外
7、的*head = newNode;polygon *create()polygon* head = NULL;polygon* tail;int n;cout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;cinn;if(n=O) return (5) ;Push(head, (6) );tail = head;cout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;cinn;while(n!=0)Push(tail-next, (7) ); / 在 tail-next 增加结点tail = tail-next; /advance tail to point to last
8、 nodecout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;cinn;remm head;void disp(polygon *head)inti, No=l;eoutsetw( 10)“x“setw(6)“y“endl;while(head !=NULL)cout“第“No“结点: “endl;for(i=0;i=head-n-1;i+)coutsetw(10)head-x i setw(6)head-yiendl;(8) ;he ad= (9) ;/Match while statementvoid del(polygon *head)polygon *p;while(he
9、ad!=NIILLp= (10) ;head=head-next;delete p-x;delete p-y;delete p;/Match while statementvoid main()polygon *head;head=create();disp(head);del(head);(分数:-1.00)_中级软件设计师下午试题-105 答案解析(总分:-4.97,做题时间:90 分钟)一、试题一(总题数:1,分数:-1.00)【说明】某考务处理系统主要功能是考生管理和成绩管理:1对考生送来的报名表进行检查。2对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。
10、3对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图 1-1 所示,第 0 层图如图 12 所示,加工 2 子图如图 1-3 所示。【数据流图】(分数:-0.99)_正确答案:(0 层图中的“试卷得分表”是局部文件,可不必画出。)解析:分析“不必画出”是指在某层数据流图中,只画流程图中各加工之间的公共数据文件,隐藏某加工的局部数据文件,这个规则只是为了使整
11、个数据流图的层次结构更科学、更清晰,不过画出“不必画山的数据文件”对数据流图不会造成理解错误。在。层图中有文件“考生名册”和“试卷得分表”,其中“试卷得分表”是加工 2“统计成绩”的局部数据文件,所以不必画出。_正确答案:(分类统计成绩中需要读入考生成绩,缺少从“考生名册”到“2.4 分类统计成绩”的数据流。(2)“2.1 检查成绩表”缺少输出数据流“错误成绩表”。(3)“2.2 审定合格者”缺少输入数据流“合格标准”。)解析:分析本题是要指出哪些图中遗漏了哪些数据流,这需要从两个方面进行考虑:一是父图与子图的平衡,即子图的输入、输出数据流与父图相应的加工的输入、输出数据必须一致。二是针对每个
12、加工至少要有一个输入和输出,反映次加工的数据来源和结果。数据流图 13 是加工 2“统计成绩”的子图,为了发现图中遗漏的数据流,首先要观察 0 层图中加工 2的输入、输出流。在 0 层图中,加工 2“统计成绩”有 2 个输入流“合格标准”和“成绩表”,4 个输出流“考生通知单”、“统计分析表”、“难度分析表”和“错误成绩表”。再看加工 2 子图中只有一个输入流“成绩表”,可见必然遗漏了一个输入流“合格标准”。根据题目说明提到的“对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者”,所以输入流“合格标准”应该是输入到加工 2.2“审定合格者”。加工 2 子图中只有 3 个输出流
13、“考尘通知单”、“统计分析表”和“难度分析表”,缺少数据流“错误成绩表”。加工 2.1“检查成绩表”的功能是检查成绩表是否合格,其中一个输出流是“正确成绩表”, 自然另一个是输出是“错误成绩表”。因此,第二个遗漏的数据流是“2.1 检查成绩表”的输出数据流“错误成绩表”。根据题目中提到的“根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表”这一说明,可以判断出加工 2.4“分类统计成绩”除了需要“试卷得分表”的输入流外,还需要考生信息,需要从文件“考生名册”中输入。_正确答案:(准考证号+姓名+课程名+成绩+合格/不合格标志(2)报名号+姓名+通
14、信地址+出生年份+文化程度+职业)解析:分析根据题目说明中提到的“填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生”,所以考生通知单应该包括考生的准考证号、姓名和最终合格/不合格标志,这种共同组成的含义由符号“+”来表示。同时因为考试可能有多门课程共同组成,所以,课程号和该课程的成绩也是必须的。其中的多门课程山符号“.”来表示重复。因此,考生通知单;准考证号+姓名+课程名+成绩+合格/不合格标志。根据题目说明中提到的“对合格的报名表编好准考证号码后将准考证送给考生”,在 0 层图中可以看到,加工 1“登记报名表”把考生信息写入文件“考生名册”中,可见
15、“考生名册”中的数据除“准考证号”外均从合格的报名表中得到。因此“报名表”至少需要山报名号、姓名、通信地址、出生年份、文化程度和职业组成。由数据字典定义式表示为:报名表报名号+姓名+通信地址+出生年份+文化程度和职业。二、试题二(总题数:1,分数:-1.00)【说明】设有关于银行借贷管理系统的 E-R 图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。为了答题的方便,图中的实体和属性同时给出了中英文说明,回答问题时只需写出英文名即可。(分数:-0.99)_正确答案:(Customer (idno, name, address, phone)Account (Ano.
16、balance, Bname)Bname reference Branch(Bname)Deposit (idno, Ano)idno reference Customer(idno)Ano reference Account(Ano)Branch (Bname. city)Loan (Lno, Bname, amount)Bname reference Branch(Bname)Borrow (idno, Lno)idno reference Customer(idno)Lno reference Loan(Lno)解析:分析将 E-R 模型转换为关系模型时,需要遵循的转换规则如下:1每个实
17、体集转换为一个关系。2一个一对一的联系可转换为一个关系模式,将两端关系的码及联系的属性均作为该关系的属性,任意一端的码作为该关系的码;也可将任意一端的码及联系的属性合并到另一端实体集所转换的关系模式中。3一个一对多联系可转换为一个关系模式,将两端关系的码及联系的属性均作为该关系的属性,“多”端的码作为该关系的码:也可将“一”端的码及联系的属性合并到“多”端实体集所转换的关系模式中。4一个多对多联系应转换为一个关系模式,两端的码及联系的属性为关系的属性,两端的码共同组合为该关系的码。3 个或 3 个以上多对多的联系应转换为一个关系,各关系的码及联系的属性为关系的属性,各端的码共同组合为该关系的码
18、。本题中的 E-R 图中有 4 个实体集、2 个多对多联系和 2 个一对多联系,根据上述 E-R 图转换关系模型的规则可以转换成 6 个关系。4 个实体集转换的 4 个关系(Customer、Account、Branch 和 Loan),对于一对多联系 B-L 和 B-A 则是将“一”端(关系 Branch)的码 Bname 加入到“多”端所转换的关系(Account 和 Loan)。此 4 个关系分别为:Customer(idno,name,address,phone)Account(Ano,balance,Bname)Branch(Bname,city,assets)Loan(Lno,Bn
19、ame,amount)4 个关系中,Account 和 Loan 的属性 Bname 均参照 Branch 的码 Bname,为外码。2 个多对多联系转换为 2 个关系,两端的码及联系的属性为关系的属性,两端的码共同组合为该关系的码。此 2 个关系分别为:Deposit(idnoAno)Borrow(idno,Lno)其中的 idno、Ano 和 Lno 分别参照 Customer 的 idno、Account 的 Ano 和 Loan 的 Lno。_正确答案:(Borrow. Lno =Loan.Lno(2) COUNT(distinct idno)=2)解析:分析本题是要查询在该银行中一笔
20、贷款贷给多个(至少 2 个)客户的所有贷款号和发放贷款的支行名称。Borrow表中记录着各贷款号和该贷款的客户,Loan 表中记录着各贷款号和发放该贷款的支行,要完成题目查询必须将 Borrow 和 Loan 联系起来,即需要两者的贷款号相等。所以填空(1)应该为 Borrow. Lno=Loan. Lno。“一笔贷款贷给多个客户”则需要按贷款号进行分组,只有客户个数至少两个的组才是满足查询要求的分组。对于分组的条件应该添加在 HAVING 子句中,个数的统计需利用 COUNT(idno)函数,因此填申(2)为COUNT(idno)=2。_正确答案:(这样的系统算不上分布式数据库系统。分布式数
21、据库系统并不是简单地把集中式数据库系统安装在不同场地,用网络连接起来实现的(这是分散的数据库系统),它是具有自己的性质和特征。分布式数据库系统具有以下特点:1数据的物理分布性。2数据的逻辑整体性。3数据的分布独立性。4场地的自治和协调。5数据的冗余及冗余透明性。虽然上述银行的数据库系统具有性质 1、3 以及 4 和 5 的一部分,但关键是没有数据的逻辑整体性和不同场地之间的协调性等,这恰恰是分布式数据库系统的关键所在。因此,上述银行数据库系统算不上分布式数据库系统。)解析:分析本题主要考查分布式数据库系统的必备条件。三、试题三(总题数:1,分数:-1.00)1.阅读下列说明、流程图和算法,将应
22、填入 (n) 处的字句写在答题纸的对应栏内。【说明】下面的流程图 15 用 N-S 盒图形式描述了数组 A 中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于 Ai,并且数组中下标小于 i 的元素的值均小于基准数,下标大于 i 的元素的值均大于基准数。设数组 A 的下界为 low,上界为 high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以 4 为基准数的划分过程如下:【流程图】(分数:-1.00)_正确答案:(j-(2) i+(3)Aipivot 或jpivot(
23、4)A,L,k-1 或 A,L,k(5)A,k+I,H 或 A,k,H)解析:分析题目考查快速排序算法。快速排序采用了一种分治的策略,通常称为分治法,其基本思想足:将原问题分解为若干个规模更小,但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快速排序的具体过程为:第一步,在待排序的 n 个记录中任取一个记录,以该记录的排序码为基准,将所有记录分成 2 组,第一组各记录的排序码都小于等于该排序码,第二组各记录的排序码都大十该排序码,并把该记录排在这 2 组中间,这个过程称为一次划分。第二步,采用同样的方法,对划分出来的 2 组元素分别进行快速排序,直到所有记
24、录都排到相应的位置为止。在进行一次划分时,若选定以第一个元素为基准,就可将第一个元素备份在变量 pivot中,如图中的第步所示。这样基准元素在数组中占据的位置就空闲出来了,因此下一步就从后向前扫描。如图中的第步所示,找到一个比基准元素小的元素时为止,将其前移,如图中的第步所示。然后再从前向后扫描,如图中的第步所示,找到一个比基准元素大的元素时为止,将其后移,如图中的第步所示。这样,从后向前扫描和从前向后扫描交替进行,直到扫描到同一个位置为止,如图中的第步所示。由题目中给出的流程图可知,以第一个元素作为基准数,并将 Alow备份至 pivot,i 用于从前向后扫描的位置指示器,其初值为 low,
25、j 用于从后往前扫描的位置指示器,其初值为 high。当 ij 时进行循环:1从后向前扫描数组 A,在 ij 的情况下,如果被扫描的元素 A 刚pivot,就继续向前扫描(j-);如果被扫描的元素 Ajpivot 就停止扫描,并将此元素的值赋给目前空闲着的 Ai。2这时,再从前向后扫描,在 ij 的情况下,如果被扫描的元素 A 刚pivot,就继续向后扫描(i+);如果被扫描的元素 Ajpivot 就停止扫描,并将此元素的值赋给目前空闲着的 Aj。3这时又接第(1)步,直到 ij 时退出循环。退出循环时,将 pivot 赋给当前的 Ai (Aipivot)。递归函数的目的是执行一系列调用,直到
26、到达某一点时递归终止。为了保证递归函数正常执行,应该遵守下面的规则:1每当一个递归函数被调用时,程序首先应该检查基本的条件是否满足,例如,某个参数的值等于 0,如果是这种情形,函数应停止递归。2每次当函数被递归调用时,传递给函数一个或多个参数,应该以某种方式变得“更简单”,即这些参数应该逐渐靠近上述基本条件。例如,一个正整数在每次递归调用时会逐渐变小,以至最终其值到达 0。本题中,递归函数 sort(iht A,int L int H)有 3 个参数,分别表示数组 A 及其下界和上界。根据流程图可知,这里的 L 相当于流程图中的 i,这里的 H 相当于流程图中的 j。因为 p()返回基准数所在
27、数组A 中的下标,也就是流程图中最后的“Aipivot”中的 i。根据快速排序算法,在第一趟排序后找出了基准数所在数组 A 中的下标,然后以该基准数为界 基准数在数组中的下标为 k),把数组 A 分成 2 组,分别是 AL,k-1和 Ak+l, H,最后对这 2 组中的元素再使用同样的方法进行快速排序。四、试题四(总题数:1,分数:-1.00)【说明】一个图书馆信息管理系统的分析与建模。下面是某图书馆的有关介绍。图书馆雇有若干管理员,各自具有编码、姓名等属性。管理员可上岗,也可下岗。图书馆中备有若干图书,每本图书有书号、书名、出版社、价格等属性。图书馆不定期地购买并注册新图书供读者借阅,也可将
28、报废的旧书注销以停止借阅。图书馆可为众多读者提供服务。每个读者在借阅之前需注册姓名、性别、地址、Email 等内容。读者可在终端上查询。每个读者最多可同时借阅 5 本书。每本图书借期为 30 天;若有一本书超期,则不可再借其他图书。一本书超期一天罚款 0.1 元。若一本书超期 3 个月不归还,则发布通告。若读者的图书丢失,在罚款处理之前不能借书,每本报失的图书罚款该书价的 2 倍。注册新读者不受限制;在注销读者之前,该读者必须归还所有借阅的图书,或者报失并接受罚款。【用例图】【协作图】(分数:-0.99)_正确答案:(return(还书)(2)outdate(超期)(3)Reader Regi
29、ster(读者注册)(4)Book Cancel ReSister(图书注销)解析:分析仔细阅读题目,可以发现“图书馆不定期地购买并注册新图书供读者借阅,也可将报废的旧书注销以停止借阅”,这句需求前半部分已经在用例图中显示出来,后半部分没有用例图说明,同时(4)处的前件是“图书登记”,可以得出(4)是 Book Cancel Register (图书注销)。同样道理,从题目说明中“每个读者在借阅之前需注册姓名、性别、地址、Email 等内容”,得到(3)处是 Reader Register(读者注册);从题目说明中“一本书超期一天罚款 0.1 元。若一本书超期三个月不归还,则发布通告”,得到(
30、2)处是outdate(超期),(1)处是 return(还书)。_正确答案:(01、(6)01)解析:分析在 UML 中重复度表示为一个整数范围 nm,整数 n 定义所连接的最少对象的数目,而 m 则为最多对象的数(当不知道确切的最大数时,最大数用*号表示)。例如,01 表示 01 个对象0*或者* 表示 0多个对象517 表示 517 个对象2 表示 2 个对象_正确答案:(全局的约束应用于一个链接角色,指定相应的实例是可见的,因为它是一个全局量。2局部的约束应用于一个链接角色,指定相应的实例是可见的,因为它是操作的局部变量。3参数应用于一个链接角色,指定相应的实例是可见的,因为它是某个操
31、作的参数。4自我应用于一个链接角色,指定对象可以向它自己发送消息。5投票应用于消息,限制一组返回的消息。投票约束指定从这组消息中以大多数投票的方式选出返回的值。6广播应用于消息,指定不能以某种顺序发出该消息。7创建影响对象生命,将在交互的执行中创建对象。8注销影响对象生命周期,对象将在一个交互的执行中被注销。9临时是影响对象生命周期的一个约束。临时的对象的创建和注销是在一个操作的同一执行中,它是创建和注销约束的结合。)解析:分析题目中的 9 个约束应用于交互。可以用顺序图从时间的角度来看交耳,也可以用协作图从空间的角度来看交互,或者还可以用活动图从工作的角度来看交互。在所有类型的交互图(顺序图
32、、协作图和活动图)中,消息、对象和链接是最重要的概念。对象是通过链接连接起来的(而不是关联),每个链接都有两个链接角色。当对象进行交互时,它们扮演角色(链接的角色),并且通过链接相互发送消息。五、试题五(总题数:1,分数:-1.00)2.【程序说明】定义一个多边形结构:struct polygon 实现以下内容:(1)建立该结构的链表:create 函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为 0 时,链表创建结束。(3)编写一个函数 disp,删除链表中的
33、所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。【程序】#include “iostxeam. h“#include “iomanip. h“stmct polygonint n;int *x;int *y;polygon *next;void Push(polygon*newNode = new polygon;newNode-next= (1) ;newNode-x = new intn;newNode-y = new intn;newNode-n= (2) ;for(int i
34、=0; i= (3) ; i+) cout“请输入多边形各顶点 x、y 坐标, 坐标值之间用空格分隔: “;cinnewNode-xinewNode-yi;(4) = head; /在 head 前不需要额外的*head = newNode;polygon *create()polygon* head = NULL;polygon* tail;int n;cout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;cinn;if(n=O) return (5) ;Push(head, (6) );tail = head;cout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;c
35、inn;while(n!=0)Push(tail-next, (7) ); / 在 tail-next 增加结点tail = tail-next; /advance tail to point to last nodecout“请输入多边形顶点的个数(顶点个数为 0 时结束): “;cinn;remm head;void disp(polygon *head)inti, No=l;eoutsetw( 10)“x“setw(6)“y“endl;while(head !=NULL)cout“第“No“结点: “endl;for(i=0;i=head-n-1;i+)coutsetw(10)head-
36、x i setw(6)head-yiendl;(8) ;he ad= (9) ;/Match while statementvoid del(polygon *head)polygon *p;while(head!=NIILLp= (10) ;head=head-next;delete p-x;delete p-y;delete p;/Match while statementvoid main()polygon *head;head=create();disp(head);del(head);(分数:-1.00)_正确答案:(NULL(2) n(3)n-1(4)newNode-next(5)head(6) n(7) h(8)NO+(9)head-next(10)head)解析:分析如果掌握了链表的创建、遍历和删除的方法,解决本题应该并不困难。要显示链表各结点的数据,就是要把各结点找到,然后把该结点的的每一个 x、y 坐标打印出来。不过,与普通的链表也有不同的地方:就是该链表的结点数据是指针。要在链表结点中存入数据,必须先动态分配存储数据的内存单元;要删除链表中的各个结点,必须先释放结点数据的内存单元,否则会造成内存泄露。