[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc

上传人:boatfragile160 文档编号:507367 上传时间:2018-11-29 格式:DOC 页数:20 大小:309KB
下载 相关 举报
[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc_第1页
第1页 / 共20页
[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc_第2页
第2页 / 共20页
[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc_第3页
第3页 / 共20页
[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc_第4页
第4页 / 共20页
[计算机类试卷]软件水平考试(初级)程序员下午(应用技术)模拟试卷22及答案与解析.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 22及答案与解析 1 阅读以下某客房管理系统的算法说明和程序流程图,根据要求回答问题 1至问题4。 【算法说明】 某商务交流中心共有 N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组 ROOM、 RANK、 NBED和 STATUS中。房间等级值为 1、 2或 3。房间的状态值为 0(空闲 )或 1(占用 )。客房是以房间 (不是床位 )为单位出租的。 程序流程图 (见图 2-11)所反映的算法是,根据几个散客的要求预订一间空房。程序的输入为:人数 M,房间等级要求尺 (R=0表示任意等级都可以 )。程序的输出为:所有可供

2、选择的房间号。1 在图 2-11所示的程序流程图中,若要某个房间 I被选中,则需要满足什么条件 ? 2 假设该商务交流中心当前各个房间的情况如表 2-14所示。当输入M=3, R=0时,该算法的输出是 (1)。当输入 M=2, R=1时,该算法的输出是 (2)。 3 如果等级为 r的房间每人每天的住宿费为 RATE(r),其中 RATE为数组,则为使该算法在输出每个候选的房间号 RM(J)后,再输出这批散客每天所需的总住宿费DAYRENT(J),在程序流程图 (见图 2-11)中 “ROOM(1)RM(J)”(b 所指向的方框中 )之后应增加的处理语句是 (3)。 4 如果限制该算法最多输出

3、K个可供选择的房间号,则在程序流程图 (见图 2-11)中“ N”(a所指向的判断框中 )应修改为 (4)。 5 阅读以下应用程序说明和 C程序,将 C程序段中 (1)(7)空缺处的语句填写完整。 说明 打保龄球是用一个滚球去打出 10个站立的柱,将柱击倒。一局分 10轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为 10轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚 球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下: 1) 若某一轮的第一次滚球击倒全部 10个柱,则本轮不再滚球 (若是第 1

4、0轮则还需另加两次滚球 )。该轮得分为本次倒柱数 (即 10)与以后两次滚球所击倒柱数之和。 2) 若某一轮的第一次滚球未击倒 10个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部 10个柱,则本轮不再滚球 (若是第 10轮则还需另加一次滚球 ),该轮得分为本次倒柱数 10与以后一次滚球所击倒柱数之和。 3) 若某一轮的两次滚球未击 倒全部 10个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。 总之,若一轮中一次滚球或两次滚球击倒 10个柱,则本轮得分是本轮首次滚球开始的连续 3次滚球击倒柱数之和 (其中有一次或两次不是本轮滚球 )。若一轮内二次滚球击倒柱数不足 10个

5、,则本轮得分即为这两次击倒柱数之和。表 3-15是打保龄球计分的某个实例说明。 以下 C程序 是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次输入一次滚球击倒的柱数,计算该轮得分和累计总分。为记录一轮内击倒 10柱,但还暂不能计算该轮得分和累计总分的情 况,程序引入变量 ok,用来记录当前已完成完整计算的轮次。程序每输入一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算。 C程序 #include stdio.h #define N 13 struct int n; /* 一轮内滚球次球 */ int f; /* 第一次击倒柱数 */ int s; /* 第一次击倒柱数

6、 */ int score; /* 本轮得分 */ int total; /* 至本轮累计总分 */ int m; /* 完成本轮得分计算,还需滚球次数 */ aN; int ok = 0; /* 已完成完整计算的轮次数 */ int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */ int d, j, k; static c=1; while (1) if(i = 10) printf(“ 输入第 %d轮的第 %d次滚球击倒柱数。 ( =%d)n“, i, n, max ); else printf(“ 输入附加的第 %d次滚球击倒柱数。 (

7、 =%d)n“, C+, max); scanf(“%d , if (d =0 printf(“ 不合理的击倒柱数,请重新输入。 n“) ) if (ok (1) ) /* 对以前未完成计算的轮次分别计算得分与累计总分 */ for(j = ok+1;(2); j+) aj.score += d; if (-aj.m = 0) aj.total = ( (3) ) + aj.score; ok =(4); return d; main ( ) int i, first, second, k; /* i表示轮次 */ for ( i = 1 ; ok 10 ; i+) ai.score = ai

8、.f = first = ball(i,1,10); if ( first = 10) ai.m = 2; ai.n = 1; if (first 10 if (first + second = 10) ai.m = 1; (6); if (i = 10 (7); printf( “各轮处 1次得分 “); for(k 1; k = 1; k+) printf(“%5d“, ak.f); printf(“n 各轮第 2次得分 “); for(k=1; k = i; k+) if (ak.n 2) printf(“ /“); else printf(“%5d“, ak.s); printf(“n

9、 各轮得分 “); for(k = 1; k = ok; k+) printf(“%5d“, ak.score); printf(“n 累计总分 “); for(k = 1; k = ok; k+) printf(“%5d“, ak.total); printf(“n“); 6 阅读以下应用程序说明和 C程序,将 C程序段中 (1)-(7)空缺处的语句填写完整。 说明 以下 C程序 所完成的功能是在 3X3方格中填入数字 1 N(N10)内的某 9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图 3-18所示。 图3-18 系统的

10、部分输出结果 33方格从第 1行左上角方格开始的序号分别为 0、 1、2,第 2行左边方格开始的序号分别为 3、 4、 5,第 3行左下角方格开始的序号分别为 6、 7、 8。以下 C程序 采用试探法,即从序号为 0的方格 (左上角 )开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格 寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为 8的方格 (右下角 )也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为 8的方格所填的整数,继续去找下一个解。 为了检查当前方格的填入整数的合理性, C程序引入二

11、维数组 checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。 C程序 #include stdio.h #define N 12 int a 9; /* 用于存储方格所填入的整数 */ int bN+1; int pos; checkMatrix3 = -1,0,-1,1,-1,0,-1,1,3,-1,2,4,-1,3,-1 4,6,-1, 5,7,-1; void write(int a) int i, j; for ( i = 0; i 3; i+) for ( j = 0; j 3; j+) printf(“%3d“,a3*i+j); printf(“n“); int i

12、sPrime(int m) int i; if (m = 2) return 1; if (m = 1 | m % 2 = 0) return 0; for (i = 3; i * i = m; ) if (m % i = O) return 0; i+ =2; return 1; int selectNum(int start) int j; for (j = start; j = N; j+) if (bj) return j; return 0; int check ( ) /* 检查填入 pos位置的整数是否 合理 */ int i, j; for (i = 0; (j =(1) =

13、0; i+) if (!isPrime(apos + aj) (2); (3); extend () /* 为下一方格找一个尚未使用过的整数 * / a(4) = selectNum(1); bapos = 0; void change() /* 为当前方格找下一个尚未使用过的整数 (找不到回溯 ) */ int j; while (pos = 0 if (pos 0) return; bapos = 1; apos = j; bj = 0; find ( ) int ok = 1; pos = 0; apos = 1; bapos = 0; de if (ok) if ( (7) ) wri

14、te (a); change( ); else extend( ); else change( ); ok = check(pos); while (pos =0); main( ) int i; for (i = 1; i =N; i+) bi = 1; find( ); 7 阅读以下技术说明和 C语言函数,将 C程序段中 (1)-(5)空缺处的语句填写完整。 说明 函数 DelA - InsB ( LinkedList La, LinkedList Lb, int key 1,int key 2,int len)的功能是,将线性表 A中关键码为 key 1的节点开始的 len个节点,按原顺

15、序移至线性表B中关键码为 key 2的节点之前。若移动成功,则 返回 0;否则返回 -1。 线性表的存储结构为带头节点的单链表, La为表 A的头指针, Lb为表 B的头指针。单链表节点的类型定义如下。 typedef struct node int key; struct node*next; *LinkedList; C程序 int DelA_InsB (LinkedLiSt La, LinkedList Lb, int key1,int key2,int len LinkedList p, q, S, prep, pres; int k; if (!La - next | !Lb - n

16、ext | len =0) return-l; p = La- next; prep = La; while (p p = p- next; if (!p) return -1; /* 表 A中不存在键值为 key1的节点 */ q = p; k = 1; while (q k+; if (!q) return -1; /* 表 A中不存在要被删除的 len个节点 */ S = Lb - next; (3); while (s s = e- next; if (!s) return -1; /* 表 B中不存在键值为 key2的节点 */ (4) q- next; /* 将表 A中的 len个

17、节点删除 */ q- next=(5) pres- next = p; /* 将 len个节点移至表 B */ return 0; 8 阅读以下应用说明及 Visual Basic程序代码,根据要求回答问题 1至问题 3。 【说明】 在 Visual Basic程序中,设计一个 “个人所得税计算器 ”,其应用程序的运行窗口如图 6-16所示。 窗口中的 3个文本框和两个按钮的名称分别为 Txt_salary、 Txt_base、 TxL_tax、 Cmd_compute和 Cmd_quit。 “个人所得税计算器 ”程序运行时,文本框 Txt_base中存放的是免税金额基数 (应扣除的基本费用

18、)。当用户在文本框 Txt_salary 中输入月收入 (工资或薪金 )并单击【计算】按钮 (Cmd_compute后, Txt_tax框中就显示计算所得的应纳税额。文本框 Txt_base和 Txt_tax在运行 时不接受用户输入, Txt_base的内容以灰色显示。 个人工资 (或薪金 )所得税是按照超额累进的税率来征收的,其计算方法如下:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算。目前的免税金额基数为 1 600元,税率如表 6-15所示。(注:本表所称全月应纳税所得额是指依照本法第六条的规定,以每月收入额减除费用

19、1600元后的余额或者减除附加减除费用后的余额 ) 设某个人的全月应纳税所得额为M(元 ),用下面的公式计算其应缴纳的个人所得税额 S(元 ): 若 0 M500,则S=M5%; 若 500 M2000,则 S=5005%+(M-500)10%; 若 2000 M5000,则 S=5005%+150010%+(M-2000)15%; 若 5000 M20000,则S=5005%+150010%+300015%+(M-5000)20%; 假设某程序员 2008年 5月份工资总额为 4700元,减去 1600元后,应纳税所得额为 3100元,其应缴纳的个人所得税额为 5005%+150010%+1

20、10015%=340元。 在开发过程中,需要编 写的程序代码如下。 【 Visual Bask程序】 Option Base 0 Private Sub Cmd compute-Click() Dim paylevel,taxPrate paylevel=Array(0,500,2000,5000,20000,40000,60000,80000,100000,1000001 taxPrate=Array(5,10,15,20,25,30,35,40,45) M=(1) S = 0 If (M 0) Then For j =1 To 9 If (2) Then s=s+(paylevel(j)-

21、paylevel(j-1)*taxPrate(j-1)/100 Else (3) Exit For End if Next j End if (4)=Str$(S) End Sub Private Sub Cmd_quit_Click() End End Sub Private Sub Form_Load() Txt_tax.Text = “ “ Txt_salary.Text = “ “ Txt_base.Text = 1600 Txt_tax.Locked = True Txt_base.Enabled =(5) End Sub 8 请根据【说明】信息和如图 6-16的显示效果,将【 Vi

22、sual Basic程序】中 (1) (5)空缺处的程序语句填写完整。 9 若要求在图 6-16窗口中,用户输入月工资 (或薪金收入 )后,直接按回车键或向下方向箭就能使焦点 (当前光标 )跳到应扣除的基本费用的输入文本框,而不用【 Tab】键进行切换。请将以下文本框 ht_salary的 KeyDown(按键 )事件过程中空缺的程序代码填写完整。 If KeyCode =13 Or KeyCode = 40 Then (6) End If 10 为使应用程序启动时所载入的窗口 (图 6-16)中具有背景图像 (取自用户自定义的某个图像文件 “C:userbackground.bmp”),并且

23、在程序运行时,当被遮的该窗口又重现时,其背景图像会自动重画。在开发如图 6-16所示窗体时,应对窗体属性对话框 (图 6-17)中哪些关键属性进行什么样的设置 ? 11 阅读以下应用说明、图和 C+代码,根据要求回答问题 1至问题 3。 说明 已知以下 C+程序运行时的 输出结果如下。 1:1 1:1 1:1 C+程序 01 #include iostream 02 using namespace std; 03 class Stock 04 protect: 05 (1) ; 06 Stock(int n, int pr=1) 07 shares = n; share_val=pr; 08

24、; 09 void Stock() ; 10 public: 11 /成员函数 12 void output() 13 (2) shares “:“ share_val endl; 14 15 private: 16 /成员变量 17 int shares; 18 int share_val; 19 ; 20 21 void main() 22 Stock a(1); a.output 23 Stock b; b.output 24 Stock c = Stock (); c.output 25 11 请根据 C+程序运行时的输出结果,将代码中 (1)、 (2)空缺处的内容补充完整。 12 类

25、 Stock的定义中有两处错误,请指出错误所在行号并给出该行修改后的完整结果。 13 指出该代码是否存在内存 泄漏。 14 阅读以下关于某绘图系统的技术说明、部分 UML类图及 Java程序,将 Java程序中 (1) (6)空缺处的语句填写完整。 【说明】 某绘图系统存在 Point、 Line和Square 3种图元,它们具有 Shape接口,图元的类图关系如图 5-12所示。 现要将 Circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle类,且完全满足系统新增的Circle图元所需的功能,但 XCircle不是由 Shape派生而来,它提供的接口不被系统直

26、接使用。【 Java代码 7-1】既使用了 XCircle又遵循了 Shape规定的接口,即避免了从头开发一个新的 Circle类,又可以不修改绘图系统中已经定义的接口。【 Java代码 7-2】根据用户指定的参数生成特定的图元实例,并对它进行显示操作。 该绘图系统定义的接口与 XCircle提供的显示接口及其功能如表 5-14所示。 【 Java代码 7-1】 class Circle (1) private (2) pxc; publiC Circle() pxc=new (3); public void dispiay() pxc. (4); 【 Java代码 7-2】 public c

27、lass Factory public (5) getShapeInstance(int type)(/生成特定类实例 Switch(type) case 0: return new Point(); case 1: return new Rectangle(); case 2: return new Line)(); case 3: return new Circle(); default: return null; ; publiC class App public static void main(String argv) if(argv. length !=1) System. out

28、. println(“error parameters!“); Return; int type=(new Integer(argv0). intValue(); Factory factory=new Factory(); Shap s; s=factory.(6) if(s=null) System. out. println(“Error get instance!“); Return; s. display(); return; 软件水平考试(初级)程序员下午(应用技术)模拟试卷 22答案与解析 1 【正确答案】 1)房间未被占用,即 STATUS(I)=0 2)房间的床铺要足够,即

29、NBED(I) =M 3)若客人要求特定的房间等级 R(R!=0),则 RANK(I) R,否则 RANK(I)的值不做考虑 【试题解析】 在程序流程图 (见图 2-11)中, I表示房间序号 (需注意不是房间的编号 )。当 I N时表示所有的房间都检查过了,若 STATUS(I)0,表示房间已被占用,则检查下一个房间;否则查看房间的床铺是否足够。着 NBED(I) M表示房间床铺不够,则检查下一个房间:若床铺足够,则需看客人对房间等级是否有要求。若 R!=0,表示客人对房间等级有要求,则检查 RANK(I)是否等于尺。若不等于,则检查下一个房间;若 RANK(I)=R或者 R=0,分别表示房

30、间等级满足要求和客人对房间等级无要求,则当前的房间 I满足所有的条件。接着可将房间 I的房间编号 ROOM(1)存放到 RM(J)中,然后检查下一个房间。 综合以上分析结果,某个房间 I要满足下列条件才可被选中: 1)房间未被占用,即 STATUS(I)=0: 2)房间的床铺要足够,即 NBED(I) =M; 3)若客人要求特定的房间等级 R(R!=0),则 RANK(I)=2R,否则 RANK(I)的值不做考虑。 2 【正确答案】 (1)1101 1202 1302 (2)1201 【试题解析】 当输入 M=3, R=0时,表示客人的人数 为 3,对房间的等级没有要求,因此,只要房间的床铺足

31、够且房间未被占用即可满足要求。换言之,在表 2-14中 NBED列中的值大于等于 3, STATUS列中的值为 0即可满足条件,因此输出的结果为: 1101 1202 1302。 当输入 M=2, R=1时,表示客人的人数为 2,要求房间的等级为 1级,因此,在房间的床铺足够且房间未被占用时,还要求房间的等级为 1级才可满足要求。换言之,表 2-14中 RANK列中的值等于 1, NBED列中的值大于等于 2, STATUS列中的值为 0即可满足条件,因此,输出的结果为: 1201。 3 【正确答案】 (3)RATE(RANK(I)*M- DAYRENT(J) 【试题解析】 结合常识可知,由于

32、房间的费用是根据房间的等级和房间所住客人的数量决定的,因此在等级为了的房间每人每天的住宿费为 RATE(r)的前提下,为使该算法在输出每个候选的房间号 RM(J)后,再输出这批散客每天所需的总住宿费 DAYRENT(J),在图 2-11中 “ROOM(1)RM(J)” 之后应增加的处理语句如下。 RATE(RANK(I)*MDAYRENT(J) 4 【正确答案】 (4)I, N|J=K,或其他等价形式 【试题解析】 如果要限制该算法最多输出 K个可供选择的房间号,则必须知道已经选择的房间的个数。由于变量 J的值代表了满足条件的房间数量,因此在图2-11中判断语句 “I N”应修改为: I N|

33、J=K。 5 【正确答案】 阅读题干说明和 C程序可知,该程序由主函数 main和函数 ball组成。其中,函数 ball的功能是输入每轮击倒的柱数并计算以前未完成计算的轮次的得分和累计总分。由于变量 i表示轮次,而变量 ok用来记录当前已完成完整计算的轮次,因此 (1)空缺处所填写的内容是 “i-1”。 根据 C程序中的注释信息可知, (2)空缺处所在的 for循环语句是计算以前未完成计算的轮次得分和累计总分,循环控制变量 j的值很显然应小于 i,所以 (2)空缺处所填入的内容是 “j i”。 如果结构体成员 m的值等于 0,则本轮滚球结束,应完成本轮得分计算,同时应累计总分。结构体成员 t

34、otal表示总分,由于它没有赋初值,当 j等于 1时应等于0,因此 (3)空缺处所填入的内容是 “j 1? aj-1.total:0”。计算完一轮的得分,变量 ok应加 1,故 (4)空缺处所填写的内容是 “ok+1”。 在主函数 main中, (5)空缺处所在的语句为计算第 2次滚球的得分,此时应加上第 1次滚球的得分,因此 (5)空缺处所填写的内容是 “ai.score+=ai.s”。 如果两次滚球数等于 10,则 m=1,而 n应加 1,故 (6)空缺处所填入的内容为“ai.n+”。 (7)空缺处所在的 if语句处理所给规则和记分方法的第 3种情况,即本轮不再滚球,该轮得分为这两次滚球击

35、倒的柱数之和,本次计算完毕,因此 (7)空缺处所填写的内容是为 “ok=i”。 6 【正确答案】 无论从程序规模还是从问题的复杂程度上看,这是一道有一 定难度的试题。解题时可以先分析题干说明,然后再从程序的结构入手。结合试题说明及在程序中的使用情况,可以确定以下各个变量的含义,以及各个函数的功能。 1) bN+1存储可选择的整数的状态,若其值为 1则表示未被选中,可以选;若其值为 0则表示已被选中,不可再选。 2) pos记录当前正在处理的方格的位置。 3) 数组 checkMatrix3中每个元素的含义是,每个非负整数表示在填入某个位置时需要检查的方格; “-1”表示一个方格的关联方格罗列结

36、束。 4) 在函数 find()中使用 了变量 ok,从语句 “ok=check()”,以及 “if(ok)”可知,该变量表示一次 check()的成功。 5) 从函数的内容上看,函数 write()是打印一个合理的填写方法。 6) 函数 isPrime()是判断一个整数是否为质数。 7) 函数 selectNum()是为当前方格选择 个整数,至于该整数是否合理,还有待函数 check()检查。 解题时,不妨再从函数 find()读起。 if ( (7) ) write(a); change(); 由题干说明中的关键信息 “直至序号为 8的方格也填入合理的整数后,就找到了一个解,将该解输出,并

37、调整序号为 8的方格所填整数,继续去找下一个解 ”可知, (7)空缺处所在的 if.else处理语句是上述自然描述语言的表达形式。 (7)空缺处所填写的内容就是判断当前填好的方格的位置是否为 8,因此可以填入 “pos=8”,也可以填写 “pop 7”,或者其他等价的语句形式。 对于函数 check(), 该函数是检查填入的整数是否合理,从 “(j= (1) ) =0”和“if(isPrime(apos+aj)”两个语句来看,变量 j在 (1)空缺处取得了方格 pos的一个相关位置的位置值。方格 pos的一个相关位置如何取得呢 ?可以通过取数组checkMatrix的一个元素来获取。获取时可以

38、通过变量 i来计数,使用“checkMatrixposi”来依次取得方格 pos的每一个相关位置的值,即 (1)空缺处所填写的内容是 “checkMatrixposi”。 由于函数 isPrime()在 m为质数时返回值为 1,否则返回值为 0,由此可以判断,(2)空缺处所在的语句是在检查到不合理的情况时的处理, 即对检查到不合理的情况时的返回处理。如果 (2)、 (3)空缺处所在的 for循环能够顺利结束,则说明检查结果是合理的,即该填写的内容是合理的。此时也应该进行返回处理,即 (3)空缺处所在的语句也是一个返回控制。由于函数 check()需要一个返回值以表明检查结果,其中,返回非 0的

39、值表示成功,否则即为失败 (这从函数 find()中 if(ok)与ok=check()两条语句也可以看出 ),因此 (2)空缺处所填写的内容是 “return0”或 “return j 0?1:0”, (3)空缺处所填写的内容是 “return 1”或 “return j 0?1:0”。 (4)空缺处所在的 extend()函数中,由于在调用该函数时指针 pos仍然指向当前方格,因此在为下一个方格 pos寻找尚未使用的整数时,首先必须是指针 pos加 1,使之指向下一个方格。另外, (4)空缺处之后有 “bapos=0”的操作,结合对函数selectNum()的理解可知,这是将已经选用过的整

40、数在 bN+1的相应响应位置 0。这也间接要求 (4)空缺处所进行的操作还必须改变 pos的值,因此, (4)空缺处所填写的内容是 “+pos”。 从函数 change()的整体结构可以看出,这是 个回溯处理过程。如果回溯到 “pos O”时,回溯处理过程就结束;否则选中 j为位置 pos的值。那么这个回溯过程是怎样实现的呢 ?函数 change()是通过 while循环来实现。 (5)空缺处是构造函数selectNum()的 start的值,由于在选 apos时已经从 1开始搜寻了, apos之前的值显然不必再搜寻了,且 apos也被证明不合适,因此 start的值只需从 apos+1开始,

41、即 (5)空缺处所填写的内容是 “apos+1”,而不是 “+apos”或者 “apos+”。 当函数 change()的 while循环条件成立时,需要进行回退处理。此时先前已经被选中的整数不再有效,应恢复 bN+1中相应位置的元素值,并将该元素值置 1(表示未被选中 )。考虑到需要修改 pos以适应下一次对换,因此 (6)空缺处所填写的内容是 “bapos-=1”,而不是 “bapos-1=1”。 7 【正确答案】 这是一道要求读者在单链表上实现元素的群插入、群删除操作的程序设计题。本题的解答思路如下。 本程序是在链表插入和删除单个节点的基础上进行扩展的,一次性插入多个节点和删 除多个节点

42、。元素的群插入或群删除操作是在只删除一个元素的基础上,通过增加一个寻找指定大小和指定数量节点的过程来实现的。其原理和插入、删除一个节点的运算是一致的。首先在链表 A中查找键值为 key1的节点。在程序中使用了如下的第 1个 while循环语句。 while (p k+; 第 2个 while循环是为了找到以键值为 key1的节点开始的 len个节点。若查找成功,指针吁将指向 len个节点中的最后一个节点。程序先将 q指向 p,变量 k是用来计算节点个数的计数器。而该循环的结束条件有两个。第 1个是 p的后面没有 len个节点。此时 q为空,所以 (2)空缺处所填写的语句是 “q=q- next

43、”或 “q=(*q).next”,使 q的指针往后移动。第 2个是 p的后面有 len个节点。此时 k=len,所以 (1) 空缺处所填写的语句是 “k len”。如果 p的后面有 len个节点,则 q指向第 len个节点,如图 3-22所示。图 3-22中的虚线表示省略了中间若干个节点。 图 3-22 链表示意图 1 同理,在链表 B中查找键值为 key2的节点,使用了如下的第3个 while循环语句。 S = Lb- next; (3) ; while (s & s- key !=key2) /* 查找表 B中键值为 key2的节点 */ pres =s; s=s- next; 以上的程序

44、中, s指向第 1个节点,然后进行循环。循环的结束条件有 2个:第 1个是 s为空,即说明从头到尾都没有找到键值为 key2的节点;第 2个是指针 s指向该节点,指针 pres指向;的直接前驱,即表示查找成功。但是,当第 1个节点的键值就是 key2时,根据循环条件,循环中的语句不执行,则 pres没有值。所以 (3)空缺处所填写的内容是“pres=Lb”,使指针 pres始终指向 s的前驱,如图 3-23所示 (图中的虚线表示省略了中间若干个节点 )。 图 3-23 链表示意图 2 最后将指针 p到 q的连续 len个节点从链表 A中删除,在链表 B中插入,如图 3-24所示。 图 3-24

45、 链表示意图 3 程序中使用的语句如下。 (4) q- next; /* 将表 A中的 len个节点删除 */ q- next= (5) pres- next=p; /* 将 len个节点移至表 B */ 如果要把指针 p到 q的连续 len个节点从链表 A中删除,就要把指针 p的前驱 (prep)的 next指向指针 q的next,因此 (4)空缺处所填写的内容是 “prep- next”或 “(*prep).next”, 接下来将指针q的 next指向线性表 B中 s,把指针 s的前驱 (pres)的 next指向 p,即 (5)空缺处所填写的内容是 “s”(或 “pres- next”,

46、或 “(*pres).next”。 8 【正确答案】 (1)Val(Txt_salary.Text)-Val(Txt_base.Text) (2)M paylevelj (3)s=s+(M-paylevel(j-i)*taxPrate(j-1)/100 (4)Txt_tax.Text (5)False 【试题解析】 由题干关键信息 “个人所得税计算器程序运行时,文 本框 Txt_base中存放的是免税金额基数 (应扣除的基本费用 )。当用户在文本框 Txt_salary中输入月收入 (工资或薪金 )” 、 “以每月收入总额 (即 Val(Txt_salary.Text)减去免税金额基数 (即

47、Val(Txt_base.Text)后的余额作为该月的月应纳税所得额 ”和 “设某个人的全月应纳税所得额为 M(元 )”可知, M表示月应纳税所得额,因此 (1)空缺处应填入 “Val(Txt_salary.Text)-Val(Txt_base.Text)”。 由题干【说明】所给出的计算公式可以看出, 税金的计算是采用逐级累计的方式。而在【 Visual Basic程序】中,数组 paylevel存放的是各级别全月应纳税所得额基础数。如果一个职工的月应纳税所得额大于第 j级,则其第 j-1级收入的全额部分应按适用税率计算税额: (payleve(j)-paylevel(j-1)*taxPrate(j-1)/100。可见,(2)空缺处应判断月应纳税所得额是否超过了第 i级,因此 (2)空缺处所填写的判断条件是 “M paylevel(j)”。 如果一个职工的月应纳税所得额不大于第 i级 (没有到达第 i级 ),则其第 i-1级收入的实际超出部分采用适用税率计算税额: S=S+(M-paylevel(j-1)*taxPrate(j-1)/100,即 (3)空缺处所填写的内容是 “S=S+(M-paylevel(j-1)*taxPrate(j-1)/100”。然后执行 “Exit For”语句,结束个人所得税额 S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1