软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷8 (题后含答案及解析)
题型有:1. 必答题
必答题(共4道大题,每道大题15分)
【说明】 某直达列车车票预售系统接受顾客的订票、取票和售票处工作人员的查询业务。 1.顾客为了提前订票,可向系统提供个人信息及其预订购的车次及日期,系统根据个人信息是否齐全以及车次是否正确来判断订票单是否合格。对于合格的订票单系统,如果相应的车次有剩余票,则记录顾客个人信息以及订票信息,并向顾客提供取票单。 2.到了可以取票的时间,顾客向系统提供取票单,在检查单据合格的情况下,系统向顾客提供火车票。 3.售票处的工作人员可以利用系统查询各车次车票的售票情况。 该直达列车车票预售系统的分层数据流图中部分数据流和文件的组成如下: 文件: 火车时刻表=车次+开车时间+到站时间+起始站+终点站+上铺票价+下铺票价 订票信息表=车次+车票日期+旅客身份证号+座位号+是否领票 旅客信息表=旅客身份证号+姓名+性别+ 座位表=车次+座位号 数据流: 订票单=旅客姓名+性别+身份证号++车次十车票日期 车票=车次+起始站生终点站+开车日期+开车时间+座位号+票价假定顶层图是正确的,“火车时刻表”和“座位表”文件已由其他系统生成。
1. 指出哪张图的哪个文件可以不必画出。
正确答案:0层图中文件“座位表”是局部数据文件,不必画出。
解析:“不必画出”是指在数据流图中,只画流程图中各加工之间的公共数据文件,隐藏某加工的局部数据文件,这个规则只是为了使整个数据流图的层次结构更科学、更清晰,不过画出“不必画出的数据文件”对数据流图不会造成理解错误。在0层图中有文件“火车时刻表”、“订票信息表”、“旅客信息表”和“座位表”,其中“座位表”是加工1“顾客订票”的局部数据文件,所以不必画出。
2. 指出数据流图4-1和数据流图4-2中错误的数据流。
正确答案:(1)数据流图4-1中从加工“1.1检查订票单”到文件“列车时刻表”的数据流。(2)数据流图4-1中从文件“旅客信息表”到加工“1.3填写取票单”的数据流。(3)数据流图4-2中从加工“2.1查取票单”到文件“旅客信息表”的数据流。
解析:本题是出错误的数据流。解决这种问题的关键是父图与子图的平衡,即子图的输入
输出数据流与父图相应的加工的输入输出数据必须一致。 从0层图中可以看到对于加工1“顾客订票”,有到文件“旅客信息表”的输出流,从文件“列车时刻表”得到的输入流,以及与文件“订票信息表”的输入输出流。而加工l子图中只有从加工1.1到文件“列车时刻表”的数据流,与父图不一致,因此是错误的,应该为从文件“列车时刻表”到加工1.1的数据流。同理,从文件“旅客信息表”到加工1.3的数据流也与父图不一致,应该改为从加工1.3到文件“旅客信息表”的数据流。 0层图中加工2“顾客取票”中存在从文件“旅客信息表”到加工2的数据流,而加工 2子图中从加上2.1到文件“旅客信息表”的数据流是与0层图相悖的,因此也是错误的。应该改成从文件“旅客信息表”到加工2.1“检查信息表”的数据流。
3. 根据题中说明和数据流图分析,“查询处理”是否可以查询出剩余票的信息?为什么?
正确答案:不可以。从0层图中可以看出,加工3“查询处理”仅有从文件“订票信息表”的输入流,而从说明中的文件组成可以看出,订票信息表仅记录了旅客订票和取票的信息,不能知道总的座位数,因此加工3能查询已订购和已售出的车票情况,而不能查询出剩余票的情况。
解析:每个加工的功能要从提供给该加工的文件的信息量决定。从0层图中可以看出,加工3“查询处理”仅有从文件“订票信息表”的输入流,而从说明中的文件组成可以看出,订票信息表仅记录了旅客订票和取票的信息,不能知道总的座位数,因此加上3能查询己订购和已售出的车票情况,而不能查询出剩余票的情况。要向查询出剩余票的情况,需要利用文件“座位表”来了解车次座位的总的情况,再利用文件“订票信息表”的已订和已售车票信息共同得出剩余票信息。
【算法说明】 下面是一段插入排序的程序,将R[k+1]插入到k]的适当位置。 R[0]=R[k+1]; j=k; while(R[j]>R[0]) { R[j+1]=R[j]; j- -; } R[j+1]=R[0];【测试用例设计】 (while循环次数为0、1、2次)
4. 指出算法的流程图中(1)~(3)处的内容。
正确答案:(1)F(2)R[j+1]=R[0](3)T
5. 指出测试用例设计中(4)~(9)处的内容。
正确答案:(4)①③(5)①②②③(6)①②②③(7)><(8) 1(9) 3
解析:本题考查用路径覆盖方法为算法设计足够的测试用例,属于基本概念的送分题。这类题拿分的关键是考生平时对于理论的理解和临场的细心。
对文法G[S]:S→a|∧|(T);T→T,S|S:回答问题1~问题3。
6. 对文法G进行改写,然后对每个非终结符写出不带回溯的递归子程序。
正确答案:改写文法为:(0)S→d(1)S→∧(2)S→(T)(3)T→SN(4)N→,SN(5)N→ε 非终结符 FIRST集 FOLLOW集 S {a,∧,(} {#,,,}} T {a,∧,(} {}}… N {,,ε}. {}}… 对左部为N的产生式可知: FIRST(→,SN);{,} FIRST(→ε):{ε} FOLLOW(N)={}}
7. 经改写后的文法是否是LL(入串(a,a)#的分析过程为: 栈 当前输入符 剩余输入符 所用产生式 (STACK) (CUR CHAR) (1NOUT STRING) (OPERATION) #S( a,a)#..... #)T(( a,a)#... S→(T) #)T a ,a)#... . #)NSa ,a)#... T→SN #)Naa ,a)..S→a #)N ,a)#.... #)NS, ,a)#... N→,SN #)NSa )#.... #)Naa )#... S→a #)N ) #.... #)) #... N→ε ## 可见输入串(a,a)#是文法的句子。
阅读下列程序和控制流图,将应填入(n)的字句写在答题纸的对应栏内。 【程序】 下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度+ int GetMax (int n, int datalist[]) { int k=0; for (int j=1;j<n;j++) if (datalist[j] > datalist[k]) k=j;retum k;
9. 该程序的控制流图中A~E分别是什么?
正确答案:(1)j<n(2)return k;(3)datalist[j]>datalist[k](4)k=j;(5)j++;
10. 计算控制流图的McCabe环路复杂性。
正确答案:McCabe环路复杂性为3。
11. 用基本路径覆盖法给出测试路径。
正确答案:测试路径: Path1:①→③ Path2:①→②→④→⑥→... Path3:①→②→⑤→⑥→…
12. 为各测试路径设计测试用例。
正确答案:测试用例: Path1:取n=1,datalist[0]=1, 预期结果:k=0 Path2:取n=2,datalist[0]=1,datalist[1]=0, 预期结果:k=O Path3:取n=2,datalist[0]=0,datalist[1]=1, 预期结果:k=1
解析:本题考查对软件测试概念和过程的理解,结合具体实例运用各种测试技术,学会测试用例设计、软件测试与程序调试的方法。软件测试是为了发现错误而执行程序的过程,其目的在于以最少的时间和人力系统地出软件中潜在的各种错误和缺陷。根据2004新大纲和最近两次软件设计师考试的真题,不难发现各类系统分析理论的实例化考核比例逐渐升温,只要读者平时对这部分知识的实例多分析、多思考,这部分分数其实不难拿到。
13. 阅读下列程序说明和C程序,将应填入(n)处的字句写在答卷纸的对应栏内。 【程序说明】 该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。 【程序】 #include <stdio.h> void strmerge(char *a,char *b,char *c) //将字符串a,b合并到字符串c { char t,*w; W=c; whil
e( (1) ) { //到字符串a,b当前字符中较小的字符 if(*a<*b) { t=-*a,(2) } else if(*a>*b) { t=*b;(3) } else //字符串a,b 当前字符相等 { t=-*a; a-H-; b-H-; } if( (4) ) //开始,可直接赋值 *w=t; else if(t!=*w) //如果a,b中较小的当前字符与c中当前字符不相等,才赋值(5) } if(*a!=‘\O’) //如果字符串a还没有结束,则将a的剩余部分赋给c while(*a!=‘\0’) if(*a!=*w) { *(++w)=*a; a++; } else(6) if(*b!=“,’\0’) //如果字符串b 还没有结束,则将 b 的剩余部分赋给 c while(*b !=‘\0’) if(*b!=*w) { *(++w)=*b; b++;} else b++;(7) } void strsort(char *s) //将字符串 s 中的字符排序 { int i,j,n; char t,*w; w=s; for(n=O;*w!=‘\O’;n++) //得到字符串长度 n w++; for(i=O;i<n-1;i++) //对字符串 s 进行排序,按字母先后顺序 forO=i+ 1 ;j<n;j++) if( (8) { t=s[i]; s[i]=s[j]; (9) } } void mainO { char s1 [100],s2[100],s3[100]; prinff(“\nlPlease input the first string:”); scanfC(“% s”,s1 ); prinff(“\nPlease input the second string:”); scanf(“%s”,s2); strsort(s1); //将字符串s1 排序 strson(s2); //将字符串 s2 排序 prinff(“%s\n’,s1); printfC % sW’,s2); s3[0]=‘\O’; //字符串 s3 的第一个字符先置’\0’结束标志(10); //将s1和s2合并,按照字母顺序排列, prinff(“%s”,s3); }
正确答案:(1)(*a!=‘\0\)&&(*b!=‘\0’)(2)a++(3)b++(4)*w==‘\0’(5)*(++w)=t(6)a++(7)*(++w)=‘\0’(8)s[i]>s[j](9)s[j]=t(10)strmerge(s1,s2,s3)
解析:根据题意,对字符串的处理分为三步:第一步是从键盘上输入两个字符串:第二步是将两个字符串分别排序;第三步是将字符串合并;第四步是显示处理结果。 第一步和第四步容易实现,关键是第二步和第三步的处理,下面分别加以说明。 字符串排序是指将一个字符串中各个字符按照ASCII码值的大小排序。例如,字符串“Beijing”由小到大的排序结果应该是:”Bejiign”。排序算法很多,第二个例子,我们就要介绍快速排序算法。在这里使用简单的冒泡排序算法:即将字符串中的每一个字符一个个进行比较,出最小的字符,然后再在剩下的字符中最小的字符。例如,字符“Beijing”的排序过程如下: 第一次将字符“Beijing”中的每一个字符:’B’、’e’、’i’、’j’、’i’、’n’、’g’进行比较,到最小的字符’B’。 第二次在剩下的字符’e’、’i’、’j’、’n’、’g’中,到最小的字符’e’。 第三次在剩下的字符while语句的ns流程图’i’、’j’、’i’、’n’、’g’中,到最小的字符’j’。 第三步是合并字符串,合并后的字符串仍然由小到大排序。由于待合并的两个字符串已经排好序。假定两个排好序的字符串分别为A和B,合并后的字符串为巴要使待合并后的字符串仍然由小到大排序,可采取下述步骤: 1.从前往后取A中的字符,并按从前往后的顺序与B中的字符比较,若A中的字符较小,则将该字符
存入C,并移到A的下一个字符,继续与B中的字符比较。 2.若A中的字符较大,则将B中的字符存入C,并移到B的下一个字符,继续与A中的字符比较。 3.若A与B中的字符相等,则将A或B中的字符存入C并将A和B均移到下一个字符。 4.若A或B字符串到达末尾,则将B或A的剩余部分加到字符串C中。 需要注意的是:A、B和C三个字符串均可以用字符数组来表示,C数组的长度不能小于A、B两数组的长度之和。另外,判别字符串是否结尾的方法是:从A或B中取出的字符是否为’\0’,所有字符串都是以’\0’结尾的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论