1、中级软件设计师下午试题-5 及答案解析(总分:105.00,做题时间:90 分钟)一、B试题一/B(总题数:2,分数:14.00)1.问题 1 通过该程序的算法用等价类设计测试用例,检查逻辑覆盖标准。(分数:7.00)填空项 1:_2.问题 2 用边界值分析法设计测试用例,检查逻辑覆盖标准。(分数:7.00)填空项 1:_二、B试题二/B(总题数:4,分数:16.00)3.问题 1 若这三个事务允许并行执行,则请列举出有多少可能的正确结果。(分数:4.00)填空项 1:_4.问题 2 各个事务的内部结构如下所示。若事务不施加任何锁,则有多少可能的调度。 T1: R1 ( Get A into
2、t1 ;t1: = t1 + 1 ); U1 ( Update A from t1 ); T2: R2 ( Get A into t2 ;t2: = t2 * 2); U2 ( Update A from t2); T3:1t3 ( Get A into t3; display t3 ); U3 ( Update A from 1 );(分数:4.00)填空项 1:_5.问题 3 能否产生“正确”结果但不可串行化的调度?(分数:4.00)填空项 1:_6.问题 4 若这三个事务都遵守两段锁协议,那么是否存在事实上可串行化但又不能形成的调度?(分数:4.00)填空项 1:_三、B试题三/B(总题
3、数:1,分数:15.00)7.说明 假设二叉树采用连接存储结构进行存储,root 指向根接点,p 所指结点为任一给定的结点,编写一个求从根结点到 p所指结点之间路径的函数。 void path (root, p) btree * root, * p; Btree *stackm0, *s; int tagm0, top =0, i, find =0; s =root; do while (s ! = NULL) stack top = s; tagtop =0; (U (1) /U) if (top 0) (U (2) /U) if (tagtop = =1) if(U (3) /U) for
4、 (i=1; i =top; i+ + printf (“%d“ ,stacki- data); find=1; else top - -; if(U (4) /U) p=p- right; (U (5) /U) while (find (s! = NULL (分数:15.00)填空项 1:_四、B试题四/B(总题数:1,分数:15.00)8.说明 计算下列源代码的 McCabe环数,画出控制流程图并用罗马数字标出区域。 read x,y,z; type =“scalene”; if (x= =y or x = = z or y= = z)type =“isosceles ”; if (x =
5、 = y and x = = z) type =“equilateral”; if (x= y+ z Or y= x+20rz=x+ y) type= “not a triangle”;if (x=0 or y= 0 or z =0) type =“bad inputs”; print type;(分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)9.说明 从键盘输入一个字符 ch,输出该字符在文本文件 input.txt 的每一行中出现的次数。(必须调用函数鳋统计 ch的出现次数,函数 ff (str,ch)的功能是统计并返回字符 ch在字符串 str 中出现的次数。)。
6、例如:如果文件 input. txt 中存放了下列数据: every 121 I am a student 运行程序,并输入 e后,输出: 2 0 1 int ff( char * str, char ch) int count =0; while (U (1) /U) if( *str= =ch) count+; str +; return count; # include stdio. h # include stdlib. h void main( ) char ch, c, s 80; int k; FILE *fp; if(U (2) /U) printf( “打不开文件!n”);
7、return; ch = getchar( ); k=0; while( ! feof(fp) ) c = fgete(fp); ifU (3) /U sk+ =c; else sk= “; printf ( “%dn“ ,ff(s, ch) ); k=0; U (4) /U printf( “% dn“, ff( s, ch ) ); (分数:15.00)填空项 1:_六、B试题六/B(总题数:1,分数:15.00)10.说明 编写一个字符界面的 Java Application 程序,接受用户输入的 10个整数,并输出这 10个整数的最大值和最小值。 import java. io. *
8、; public class abc public static void main(String args ) int i, n = 10 , max = 0 , min = 0 , temp = 0; try BufferedReader br = new BufferedReader( new InputStreamReader( System. in) ); U(1) /U); catch ( IOException e ) ; for(i = 2 ;i = n; i + ) try BufferedReader br = new BufferedReader( new InputSt
9、reamReader (System. in) ); temp = Integer. parselnt(br. readLine( ) ); if ( temp max )U (2) /U if (temp min)U (3) /U catch ( IOExeeption e ) ; System. out. println( “max =“ + max + “/nmin =“ + min); (分数:15.00)填空项 1:_七、B试题七/B(总题数:1,分数:15.00)11.说明 设计一个计时程序。该程序用户界面由一个文本框(text 1),两个按钮命令按钮 1 (Command 1)按
10、钮、命令按钮(Command 2)组成。程序运行后,用户按开始按钮,则开始计时,文本框中显示秒数,按停止按钮,则计时停止。单击窗口则退出。 Option Explicit Dim I Private Sub Command1 _ Click( ) i=0 Timer1. Interval = 1000 U (1) /U End Sub Private Sub Command2_ Click( ) Timer1. Enabled = False End sub Private Sub Form Click( U (2) /U End Sub Private Sub Form _Load( ) T
11、imer1. Enabled = False U (3) /U End Sub Private Sub Timer1 _ Timer( ) i=i+1 U (4) /U End Sub(分数:15.00)填空项 1:_中级软件设计师下午试题-5 答案解析(总分:105.00,做题时间:90 分钟)一、B试题一/B(总题数:2,分数:14.00)1.问题 1 通过该程序的算法用等价类设计测试用例,检查逻辑覆盖标准。(分数:7.00)填空项 1:_ (正确答案:划分等价类并编号,见下表:)解析:等价类表 输入数据 合理等价类 不合理等价类A,B,C 1正整数2有非正整数3某两面三刀个数相加小于或等
12、于剩余的数4有非数字字符5三力相等6只有两边相等7三边不相等(2)为合理设计等价类测试用例,对于表中对应的四个合理等价类,用三个测试用例覆盖,见下表:合理等价类设计测试用例表 测试数据 期望结果 覆盖范围3,4,5 输出“一般三角形” 1,73,3,3 输出“等边三角形” 1,53,3,2 输出“等腰三角形” 1,6(3)为每个不合理等价类设计一个侧试用例,见下表:不合理等价类测试用例表 测试数据 期望结果 覆盖范围3,4,5 输入无效 23,3,6 输入无效 3A,B,C 输入无效 4试题一解答要点 本题属于软件测试中测试用例的设计,分为白盒技术和黑盒技术。等价类划分是将输人数据域按有效的或
13、无效的划分成若干个等价类,测试每个等价类的代表值就等于对该类其他值的测试。步骤如下;1)按程序的功能说明,找出一个个输入条件,将每个输入条件划分成两个或多个等价类,将其列表。2)确定测试用例。根据已划分的等价类,按以下步骤设计测试用例:为每一个等价类编号没计一个测试用例,使其尽可能多地覆盖尚未被覆盖过的合理等价类,重复此步,直到所有合理等价类被测试用例覆盖。设计一个测试用例,使其只覆盖一个不合理等价类。重复这一步,直到所有不合理等价类被测试用例覆盖。边界值分析不是从一个等价类中任选一个例子作为代表,而是将测试边界情况作为重点目标,选取正好等于,刚刚大于或刚刚小于边界值的测试数据。因为实践经验表
14、明,程序往往在处理边界情况时发生错误。其基本思想是列出程序中可能发生错误的情况,根据这些情况选择测试用例。逻辑覆盖是白盒技术,它追求程序内部的逻辑覆盖程度,要设计使覆盖程度较高的或覆盖最优代表性的路径的测试用例。2.问题 2 用边界值分析法设计测试用例,检查逻辑覆盖标准。(分数:7.00)填空项 1:_ (正确答案:用边界值法设计测试用例,见下表:)解析:边界值法设计测试用例表 输入等价类 测试用例说明 测试数据 期望结果输入值全部是数字1个正整数1个不是正整数全是正整数且两个数之和等于第三个数全是正整数且两个数之和小于第三个数A,B,CA,B,C3,4,ok3,3,63,3,7输入无效输入无
15、效输入无效输入无效输入无效三边相等 3,3,3 输出“等腰三角形”两边相等A=B,ACA=C,ABA=C,BA 3,3,25,3,55,3,3输出“等腰三角形”三边不等 3,4,5 输入“一般三角形”二、B试题二/B(总题数:4,分数:16.00)3.问题 1 若这三个事务允许并行执行,则请列举出有多少可能的正确结果。(分数:4.00)填空项 1:_ (正确答案:问题 1 有 6种可能的正确结果,相应的 6个串行调度是:)解析:T1-T2-T3:A=1 T1-T3-T2:A=2 T2-T1-T3:A=1 T2-T3-T1:A=2 T3-T1-T2:A=4 T3-T2-T1:A=3 试题二 解答
16、要点 在并行系统环境下,事务并发操作的调度的可串行性的标准如下: 调度结果的正确:保持数据库的一致状态。几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行的执行它们时的结果相同。可串行性是并行事务正确性的唯一准则。 因此,若有 3个事务并行执行时,可能的正确结果与 3个事务串行执行的结果应该相同。由于 3个事务串行执行有 6种可执行方案,因此有 6种可能的正确结果。若事务不施加任何锁,数据项则可以同时被读写。假设 Ri,Rj,Rk 分别表示三种检索操作R1,R2,R3,顺序无关紧要;类似地,Up,Uq,Ur 分别表示更新操作 U1, U2,U3,顺序也无关紧要。但事务内部操作顺序是固定
17、的。因此,可能的调度是: Ri-Rj -Rk-Up-Uq-Ur:3*2*1*3*2*1=36 Ri-Rj-Up -Rk- Uq-Ur:3* 2* 2*1*2*1=24 Ri-Rj-Up-Uq-Rk-Ur:3*2*2*1*1*1=12 Ri-Up-Rj-Rk-Uq-Ur:3*1*2*1*2*1=12 Ri-Up-Rj-Uq-Rk-Ur:3*1*2*1*1*1=6 由此可见,总共有 90种可能的调度。本例能够产生“正确”结构但不可串行化的调度。例如:调度 R1- R2-R3-U3-U2-U1得到的结果与 6个可能的串行调度中的两个相同。这样,对于给定的初始值。恰好是“正确的”。但必须清楚这个正确只
18、是巧合,完全是因为初始值恰好为。才得到的,对其他的初始值则未必如此。例如,考虑初始值为 10而非 0的情况,上面给出的调度 R1- R2-R3-U3-U2-U1就不能得到正确的结果。因此,该调度是不可串行的。调度 R1-R3 -U1-U3-R2-U2是可串行的(等价于串行调度 T1-T3-T2),但在 T1,T2 和 T3都遵守两段锁协议时不能出现。因为在这一协议下,操作 R3会代表事务 T3在 A上获得 s锁;这样事务 T1中的操作 U1就无法在该锁释放前进行,且直到 T3结束时才会发生。事实上,事务 T3和 T1在操作 U3到达时将发生死锁。4.问题 2 各个事务的内部结构如下所示。若事务
19、不施加任何锁,则有多少可能的调度。 T1: R1 ( Get A into t1 ;t1: = t1 + 1 ); U1 ( Update A from t1 ); T2: R2 ( Get A into t2 ;t2: = t2 * 2); U2 ( Update A from t2); T3:1t3 ( Get A into t3; display t3 ); U3 ( Update A from 1 );(分数:4.00)填空项 1:_ (正确答案:总共有 90种可能的调度。)解析:5.问题 3 能否产生“正确”结果但不可串行化的调度?(分数:4.00)填空项 1:_ (正确答案:能够产
20、生。)解析:6.问题 4 若这三个事务都遵守两段锁协议,那么是否存在事实上可串行化但又不能形成的调度?(分数:4.00)填空项 1:_ (正确答案:存在。)解析:三、B试题三/B(总题数:1,分数:15.00)7.说明 假设二叉树采用连接存储结构进行存储,root 指向根接点,p 所指结点为任一给定的结点,编写一个求从根结点到 p所指结点之间路径的函数。 void path (root, p) btree * root, * p; Btree *stackm0, *s; int tagm0, top =0, i, find =0; s =root; do while (s ! = NULL)
21、stack top = s; tagtop =0; (U (1) /U) if (top 0) (U (2) /U) if (tagtop = =1) if(U (3) /U) for (i=1; i =top; i+ + printf (“%d“ ,stacki- data); find=1; else top - -; if(U (4) /U) p=p- right; (U (5) /U) while (find (s! = NULL (分数:15.00)填空项 1:_ (正确答案:s=s-left;)解析:(2)s=stack top; (3)(s=p) (4)(top0 while (
22、U (1) /U) if( *str= =ch) count+; str +; return count; # include stdio. h # include stdlib. h void main( ) char ch, c, s 80; int k; FILE *fp; if(U (2) /U) printf( “打不开文件!n”); return; ch = getchar( ); k=0; while( ! feof(fp) ) c = fgete(fp); ifU (3) /U sk+ =c; else sk= “; printf ( “%dn“ ,ff(s, ch) ); k
23、=0; U (4) /U printf( “% dn“, ff( s, ch ) ); (分数:15.00)填空项 1:_ (正确答案:( *str))解析:(fp = fopen( :input. txt“ ,“r“ ) ) = = NULL (c! =n) sk =;六、B试题六/B(总题数:1,分数:15.00)10.说明 编写一个字符界面的 Java Application 程序,接受用户输入的 10个整数,并输出这 10个整数的最大值和最小值。 import java. io. * ; public class abc public static void main(String a
24、rgs ) int i, n = 10 , max = 0 , min = 0 , temp = 0; try BufferedReader br = new BufferedReader( new InputStreamReader( System. in) ); U(1) /U); catch ( IOException e ) ; for(i = 2 ;i = n; i + ) try BufferedReader br = new BufferedReader( new InputStreamReader (System. in) ); temp = Integer. parselnt
25、(br. readLine( ) ); if ( temp max )U (2) /U if (temp min)U (3) /U catch ( IOExeeption e ) ; System. out. println( “max =“ + max + “/nmin =“ + min); (分数:15.00)填空项 1:_ (正确答案:max = rain = Integer. parselnt (br. readLine( ) ))解析:max = temp; rain = temp;七、B试题七/B(总题数:1,分数:15.00)11.说明 设计一个计时程序。该程序用户界面由一个文本
26、框(text 1),两个按钮命令按钮 1 (Command 1)按钮、命令按钮(Command 2)组成。程序运行后,用户按开始按钮,则开始计时,文本框中显示秒数,按停止按钮,则计时停止。单击窗口则退出。 Option Explicit Dim I Private Sub Command1 _ Click( ) i=0 Timer1. Interval = 1000 U (1) /U End Sub Private Sub Command2_ Click( ) Timer1. Enabled = False End sub Private Sub Form Click( U (2) /U End Sub Private Sub Form _Load( ) Timer1. Enabled = False U (3) /U End Sub Private Sub Timer1 _ Timer( ) i=i+1 U (4) /U End Sub(分数:15.00)填空项 1:_ (正确答案:Timer1. Enabled = True)解析:Unload Me Text1. Text = 0 Text1. Text = i