1、中级软件设计师下午试题-2 及答案解析(总分:104.00,做题时间:90 分钟)一、B试题一/B(总题数:3,分数:15.00)1. 问题 1利用存在的依赖关系构造一个图书馆的对象模型。 (分数:5.00)填空项 1:_2.问题 2 张三到图书馆借阅一本书,两个月后,他把这本逾期的书返还给图书馆。画出这个场景的时序图。(分数:5.00)填空项 1:_3.问题 3 画出上一问中使用的图书馆程序的层次结构图。(分数:5.00)填空项 1:_二、B试题二/B(总题数:2,分数:14.00)4.问题 1 试画出 ER 图,并在图上注明属性、联系类型、实体标识符;(分数:7.00)_5.问题 2 将
2、ER 图转换成关系模型,并说明主键和外键。(分数:7.00)_三、B试题三/B(总题数:1,分数:15.00)6.说明 编写一个函数根据用户输入的偶对(以输入。表示结束)建立其有向图的邻接表。一个图的邻接表存储结构定义如下: # include stdio. h # define MAXVEX 30 struct edgenode int adjvex; char info; struct edgenode * next; struct vexnode char data; struct edgenode * link; typedef struct vexnode adjlist MAXVE
3、X; 实现要求的函数如下: void creatadjlist ( adjlist g) int i, j, k; street vexnode * s; for( k=1; k =n; k+ +) U(1) /U g k.link = NULL; printf ( “输一个对:” ); scanf (“%d, %d“, whileU (2) /U U (3) /U s- adjvex =j; U (4) /U g i.link =s; U (5) /U (分数:15.00)填空项 1:_四、B试题四/B(总题数:1,分数:15.00)7.说明 请完成流程图以描述在数据 A(1)至 A(10)
4、中求最大数和次大数的程序的算法。并将此改成 PAD图。该算法的流程图如下图: (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)8.说明 利用 c+的各种控制语句编写一个万年历程序,要求:显示任何年份的日历,日历以月份顺序排列,每月以星期顺序排列,类似于一般挂历上的格式。本程序包含如下两个函数:Leap ()用于判定指定的年份是闰年,Week ()用于计算 year 年份的 1 月 1 日是星期几,其判定规则为: (1) 如果 year 年份为 1994 年,则为星期六。 (2) 如果 year 年份大于 1994 年,则星期值 weekno 按下列公式计算: differ
5、=(year-1994)*(365%6)+(year-1993)/4-(year-2001)/100+(year-2001)/400 date=6+differ%7 weekno=(date6)? date-7:date (3) 如果 year 年份小于 1994 年,则星期值 weekno 按下列公式计算: differ=(1994-year)*(365%7)+(1996-year)/4-(2001-year)/100+(2000-year)/400 weekno=6-dder%7 # include “iostream. h“ # include “iomanip. h“ int leap
6、(int n) if(U (1) /U) return 0 else return 1; int week( int year ) int a1, differ, date, weekno; if (year = = 1994) a1 =0; else if (year 1994) a1=1; else a1= -1; switch(a1) case 0: return 6; break; case 1: U (2) /U date = 6 + differ% 7; weekno = ( date 6) ? date - 7 date; return weekno; break; case -
7、 1: differ = ( 1994 - year) * (365%7) + (1996 - year)/4 - (2001 - year)/100 + (2000 - year)/400; weekno =6-differ%7; return weekno; break; void main( ) int i,year,m2,n,j; cout “Please input 某年数:”; cin year; if ( ! leap(year) ) U (3) /U; else m2 =28; int month 12: 31 ,m2,31,30,31,30,31,31,30,31,30,31
8、 ; U (4) /U for ( i=0; i12; i+ + ) cout end1 setw(4*n) “; for(j=1 ;j =month i ;j+ +) cout setw(4) j; n+ +; if(n =7) U (5) /U cout end1; (分数:15.00)填空项 1:_六、B试题六/B(总题数:1,分数:15.00)9.说明 打印输出 10 行杨晖三角形。形式如下: 杨晖三角形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56
9、 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 class yanghui public static void main (String args ) int i, j; U (1) /U int yanghui ; System. out. println( “杨晖三角形:” ); yanghui = new int yhleve1 ; for(i =0;i yanghui, length; i + + ) yanghuii = new int i + 1; U(2) /U for(U(3) /U) yanghui i 0 = 1; for(j = 1
10、;j yanghuii, length - 1 ;j + + ) yanghuii j = yanghuii - 1 j - 1 + yanghuii - 1 j; yanghuii yanghuii. length - 1 = 1; for ( i=0; i yanghui. length; i + + ) for(j =0;j yanghuii. length; j + + ) U (4) /U System. out. println( ); (分数:15.00)填空项 1:_七、B试题七/B(总题数:1,分数:15.00)10.说明 编写一工资调整程序。若基本工资大于等于 800 元,
11、工资增加 20%,若小于 800 元大于 600 元,则工资增加 15%,若小于 600 元则工资增加 10%。要求在文本框 Text1 中增加某职工的基本工资,单击“计算”按钮,在标签框 Label1 中输出增加后的工资。 Private Sub Command1_ Click( ) Dim x As Integer, y As Single U (1) /U Select Case x Case Is = 800 y=x*1.2 Case Is = 600 y=x, 1.5 U(2) /U y=x*1.1 U(3) /U Label1. Caption = y U (4) /U Priva
12、te Sub Command2_ Click() Unload Me End Sub(分数:15.00)填空项 1:_中级软件设计师下午试题-2 答案解析(总分:104.00,做题时间:90 分钟)一、B试题一/B(总题数:3,分数:15.00)1. 问题 1利用存在的依赖关系构造一个图书馆的对象模型。 (分数:5.00)填空项 1:_ (正确答案:问题 1)解析: 试题一 解答要点 本题中的图书馆有一个书和读者的聚合关系。即图书馆确实是由书和读者组成。书和副本之间的关系既不是集合关系也不是继承关系。对象“书”表示书的抽象,而副本为借出的实际书籍。读者和副本之间的关系称为“租借”。从副本的观点
13、来看,任务是“借出被登记”,而从读者的角度来看,任务是“借出登记”。多重性指出一个副本可以不进行借出登记,也可以只借给一个读者(01)。另一多重性(0*)指出一个读者每次可以具有 0 个、1 个或多个“借出登记”关系。 存在依赖关系定义如下:如果该较低类(子女)只在较高(双亲)类存在时存在并且较低(子女)类只与较高(双亲)类的一个实例相联系的话,就说一个类(双亲)可以与一个较低类(子女)相连关系。该关系和继承关系可以用来表示任何问题的领域。如题中的关系模式所示,除“租借”外的所有关系以及图书馆-书都满足存在依赖的要求。但不满足“租借”关系,因为一个副本对象可以存在于登记借阅它的凑者对象之前。不
14、过,可以建立一个确实满足 ED 关系的租借对象。对象“书”不能是图书馆的子女,因为书可存在特定的图书馆之前或之后。可以将“人员”增加到图中,以显示在“图书馆”上不属于存在-依赖的那部分读者。 时序图中,垂直的线代表类的实例。每条垂直线在顶部用类名、后跟一个冒号,最后为实例名来标记。水平箭头描述功能调用。箭头的尾部位于调用类的线上,箭头的头部位于被调用类的线上。功能名位于箭头上。垂直线上的宽方块给出被调用功能的执行时间。时序图比对象模型更接近设计阶段。这个图中使用的有些功能在对象模型中没有使用,而且图中调用的时序是由实际的设计所决定的。 层次结构图给出系统的调用结构。图中的每个框代表一项功能。层
15、次结构图通常在面向对象的开发中不使用,但它是用于理解系统的动态结构的一个非常有用的图。2.问题 2 张三到图书馆借阅一本书,两个月后,他把这本逾期的书返还给图书馆。画出这个场景的时序图。(分数:5.00)填空项 1:_ (正确答案:问题 2)解析:3.问题 3 画出上一问中使用的图书馆程序的层次结构图。(分数:5.00)填空项 1:_ (正确答案:问题 3)解析:二、B试题二/B(总题数:2,分数:14.00)4.问题 1 试画出 ER 图,并在图上注明属性、联系类型、实体标识符;(分数:7.00)_正确答案:()解析:ER 图如下图所示: 5.问题 2 将 ER 图转换成关系模型,并说明主键
16、和外键。(分数:7.00)_正确答案:()解析:根据转换规则,上面的 ER 图可以转换成 6 个关系模式: 仓库(U 仓库号 /U,仓库名,地址) 商品(U 商品号 /U,商品名,单价) 商店(U 商店号 /U;商店名,地址) 库存(U仓库号,商品号, /U日期, 库存量) 销售(U 商店号,商品号, /U月份, 月销售量) 供应(U 仓库号,商店号,商品号, /U月份, 月供应量)三、B试题三/B(总题数:1,分数:15.00)6.说明 编写一个函数根据用户输入的偶对(以输入。表示结束)建立其有向图的邻接表。一个图的邻接表存储结构定义如下: # include stdio. h # defi
17、ne MAXVEX 30 struct edgenode int adjvex; char info; struct edgenode * next; struct vexnode char data; struct edgenode * link; typedef struct vexnode adjlist MAXVEX; 实现要求的函数如下: void creatadjlist ( adjlist g) int i, j, k; street vexnode * s; for( k=1; k =n; k+ +) U(1) /U g k.link = NULL; printf ( “输一个
18、对:” ); scanf (“%d, %d“, whileU (2) /U U (3) /U s- adjvex =j; U (4) /U g i.link =s; U (5) /U (分数:15.00)填空项 1:_ (正确答案:(1) gk.data=k;)解析:(2) i! =0 (4) s- next = gi.link;(5) printf (“输入一个偶对:”);scanf (“%d, %d“, 解答要点 本题的算法思想是:先产生邻接表的 n 个头结点(其结点数值域从 1 到 n),然后接收用户输入的 (以其中之一为 0 结束标志),对于每条这样的边,申请一个邻接结点,并插入到 v
19、i 的单链表中,如此反复,直到将图中所有边处理完毕,则建立了该有向图的邻接表。四、B试题四/B(总题数:1,分数:15.00)7.说明 请完成流程图以描述在数据 A(1)至 A(10)中求最大数和次大数的程序的算法。并将此改成 PAD图。该算法的流程图如下图: (分数:15.00)_正确答案:()解析:(1)max2 =A(1) mex1 =A(2) (2)i =10 (3)max1 =A(i)1 max2 = max1 (4)i=i+1 PAD 图描述如下:五、B试题五/B(总题数:1,分数:15.00)8.说明 利用 c+的各种控制语句编写一个万年历程序,要求:显示任何年份的日历,日历以月
20、份顺序排列,每月以星期顺序排列,类似于一般挂历上的格式。本程序包含如下两个函数:Leap ()用于判定指定的年份是闰年,Week ()用于计算 year 年份的 1 月 1 日是星期几,其判定规则为: (1) 如果 year 年份为 1994 年,则为星期六。 (2) 如果 year 年份大于 1994 年,则星期值 weekno 按下列公式计算: differ=(year-1994)*(365%6)+(year-1993)/4-(year-2001)/100+(year-2001)/400 date=6+differ%7 weekno=(date6)? date-7:date (3) 如果
21、year 年份小于 1994 年,则星期值 weekno 按下列公式计算: differ=(1994-year)*(365%7)+(1996-year)/4-(2001-year)/100+(2000-year)/400 weekno=6-dder%7 # include “iostream. h“ # include “iomanip. h“ int leap(int n) if(U (1) /U) return 0 else return 1; int week( int year ) int a1, differ, date, weekno; if (year = = 1994) a1
22、=0; else if (year 1994) a1=1; else a1= -1; switch(a1) case 0: return 6; break; case 1: U (2) /U date = 6 + differ% 7; weekno = ( date 6) ? date - 7 date; return weekno; break; case - 1: differ = ( 1994 - year) * (365%7) + (1996 - year)/4 - (2001 - year)/100 + (2000 - year)/400; weekno =6-differ%7; r
23、eturn weekno; break; void main( ) int i,year,m2,n,j; cout “Please input 某年数:”; cin year; if ( ! leap(year) ) U (3) /U; else m2 =28; int month 12: 31 ,m2,31,30,31,30,31,31,30,31,30,31 ; U (4) /U for ( i=0; i12; i+ + ) cout end1 setw(4*n) “; for(j=1 ;j =month i ;j+ +) cout setw(4) j; n+ +; if(n =7) U
24、(5) /U cout end1; (分数:15.00)填空项 1:_ (正确答案:(n%100 = =0) (n%400 = =0))解析:differ= (year - 1994) * (365%6) + (year - 1993)/4 - (year-2001)/100 + (year-2001 )/400; m2 =29 n = week( year ); n=0;六、B试题六/B(总题数:1,分数:15.00)9.说明 打印输出 10 行杨晖三角形。形式如下: 杨晖三角形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 1
25、5 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 class yanghui public static void main (String args ) int i, j; U (1) /U int yanghui ; System. out. println( “杨晖三角形:” ); yanghui = new int yhleve1 ; for(i =0;i yanghui, length; i + + ) yanghuii = new int i + 1; U(2) /U for(U
26、(3) /U) yanghui i 0 = 1; for(j = 1 ;j yanghuii, length - 1 ;j + + ) yanghuii j = yanghuii - 1 j - 1 + yanghuii - 1 j; yanghuii yanghuii. length - 1 = 1; for ( i=0; i yanghui. length; i + + ) for(j =0;j yanghuii. length; j + + ) U (4) /U System. out. println( ); (分数:15.00)填空项 1:_ (正确答案:int yhleve1 =
27、10;)解析:yanghui 0 0 = 1; i=1; i yanghui, length; i + + System. out. print ( yanghui i j +“ “);七、B试题七/B(总题数:1,分数:15.00)10.说明 编写一工资调整程序。若基本工资大于等于 800 元,工资增加 20%,若小于 800 元大于 600 元,则工资增加 15%,若小于 600 元则工资增加 10%。要求在文本框 Text1 中增加某职工的基本工资,单击“计算”按钮,在标签框 Label1 中输出增加后的工资。 Private Sub Command1_ Click( ) Dim x As Integer, y As Single U (1) /U Select Case x Case Is = 800 y=x*1.2 Case Is = 600 y=x, 1.5 U(2) /U y=x*1.1 U(3) /U Label1. Caption = y U (4) /U Private Sub Command2_ Click() Unload Me End Sub(分数:15.00)填空项 1:_ (正确答案:x=Val (Text1, Text))解析:Case Else End Select End Sub