1、计算机水平考试初级程序员 2006 年上半年下午真题及答案解析(总分:114.00,做题时间:90 分钟)1.B试题一/B 阅读以下说明和流程图,回答问题 1 至问题 3。 说明 信息处理过程中经常需要将图片或汉字点阵做旋转处理。一个矩阵以顺时针方向旋转 90后可以形成另一个矩阵,如下图所示: 流程图 2-1 描述了对 n*n 矩阵的某种处理。流程图 2-2 是将矩阵 A 顺时针旋转 90形成矩阵 B 的具体算法。 (分数:3.00)_2.问题 2 如果以下 3*3 矩阵沿顺时针方向旋转 90后所形成的矩阵就是原来的矩阵: (分数:3.00)_3.问题 3 在上述流程图 2-1 和图 2-2
2、的算法中, (1)矩阵 A 第 i 行第 j 列的元素 A(i,j)被复制到矩阵B 中的哪个位置? (2)A(i,j)后来又被复制到矩阵 C 中的哪个位置? (3)填补流程图 2-2 中的空缺。(分数:3.00)_二、B试题二/B(总题数:1,分数:15.00)4.C 语言函数 long change(int num) ind,m=num; long result mul; if (num=0|U (1) /U /*若 num 不大于 0 或 num 的位数大于 4,则返回-1*/ retum-1; mul=1; U(2) /U while(m0) d=m%10; m=U (3) /U; re
3、sult=result+(U (4) /U) *mul; mul=U (5) /U; return result; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)5.C 语言函数 bool Del_elem(STACK*s,char para_ch) STACK s_bgk; /*定义临时工作栈 s_bak,*/ char ch; bool tag=FALSE; U (1) /U /*初始化临时工作栈 s_bak*/ /*,将栈*s 中所有比para_ch 更接近栈顶的元素暂时存放在临时工作栈 s bak 中*/ while(!IsEmpty(*s) ch=U (2)
4、/U; /*取栈顶元素*/ Pop(s); if(chpara_ch) tag=TRUE; break; U (3) /U; /*将暂存于临时工作栈 s_bak 中的元素存回栈*s*/ while(U (4) /U) ch=Top(s_bak); U (5) /U Push(s,ch) return tag; (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)6.C 语言函数 intB_sDAYS+1; /*记录成本最小的生产计划,B_s0不用,DAYS 定义为天数*/ double find_a_plan(FILE *int) iht P_nmDAYS+1,acc_req
5、DAYS+1; int i,tag = 0,acc_qty = 0; double mincost = 1.0e20,cost_Produce,cost_Keep; for(i = 1;i = DAYS; i+) /*第 i 天时的累计零件需求量存入 acc rcqi */ acc_qty += datai.Qty_req; acc_reqi = acc qty; while (!feof(int) for(i = 1; i = DAYS; i+ )/*读入一个生产计划,第 i 天的产量存入 P_numi*/ if (!feof(inf) fseantinf,“%d“, tag = 0; co
6、st_Produce = 0; cost_Keep = 0; for(i = 1,U (1) /U;i = DAYS; i+) /*考查当前的生产计划*/ acc qty += P_numi; /* acc_qty 计录到第 i 天时的累计零件生产量*/ if (acc_qty acc_reqi) /*当前生产计划不能满足需求*/ tag = 1; break; /*if*/ cost_Produce += U(2) /U; /*计算当前生产计划的总需件价格*/ cost_Keep += (U (3) /U) * datai,Keeping_fee; /*for*/ if(U (4) /U)
7、/* 若当前生产计划不可行,则继续读取下一计划*/ continue; if(U (5) /U) /*记录成本更小的生产计划*/ mincost = costProduce + cost_Keep; for(i = 1; i =DAYS; i+) B_si = P numi; /*if*/ /*while*/ return mincost; (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)7.Vsual Basic 程序代码 Private Sub CmdSelect_Cliek() For i = O To List2.ListCount - 1 If Listl.Te
8、xt = List2.List(i) Then Exit Sub 不要重复选择 Next i List2.AddltemU (1) /U 在 List2 中增添 List1 中所选的项 End Sub Private Sub CrndSelAll_Click() List2.Clear 先删除List2 中的已有项 For i = 0 To U(2) /U 对 List1 中所有各项做循环处理 List2.Addltem U(3) /U 将该项增添到 List2 中 Next i End Sub Private Sub CmdDelete_Cliek() If List2.Listlndex
9、= O Then 如果 List2 中有选中的项, List2.Removeltem U (4) /U 则删除所选的项 End If End Sub Private Sub CmdDelAll_Cliek() U(5) /U End Sub(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)8.C+代码 (分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)9.DimU (2) /U 声明全局变量 Private Sub Form_Load() Scale(0,0)-(20,6) 定义窗体的坐标系统 End Sub Private Sub CmdStart_C
10、lick() x=0 MMC.DevkeType=WaveAudio 设置多媒体设备类型 MMC.FileName=两只蝴蝶.wav 确定声音文件名 MMCCornmand=Open 打开多媒体设备 MMCCommand=P1ay 启动声音的播放 Timer1.Enabled=True 打开定时器 End Sub Private Sub Timer1_Timer() Ifx20 Thenx=x-20 蝴蝶飞到右边界后再回到左边界 Image1.Left=x 动态调整蝴蝶框的位置 Imagel.Top=U (3) /U Image2.Len=x lmage2.Top= U(4) /U x=x+0
11、.1 确定蝴蝶下一步飞行位置 End Sub Private Sub CmdStop_Click() U (5) /U Image1.Left=0 蝴蝶位置初始化 Image1Top=2 Image2Left=0 Imagc2.Top=3 MMlC.Command=Stop 停止播放 MMCCommand=Ciosc 关闭多媒体设备 End Sub(分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)10.Java 代码 (分数:15.00)_计算机水平考试初级程序员 2006 年上半年下午真题答案解析(总分:114.00,做题时间:90 分钟)1.B试题一/B 阅读以下说明和
12、流程图,回答问题 1 至问题 3。 说明 信息处理过程中经常需要将图片或汉字点阵做旋转处理。一个矩阵以顺时针方向旋转 90后可以形成另一个矩阵,如下图所示: 流程图 2-1 描述了对 n*n 矩阵的某种处理。流程图 2-2 是将矩阵 A 顺时针旋转 90形成矩阵 B 的具体算法。 (分数:3.00)_正确答案:()解析: 分析 试题一 信息处理过程中经常需要将图片点阵或汉字点阵做旋转处理。这种方法可以简化为对 n*n 矩阵的旋转处理。其中,n 应该是一个变量,运行时由该程序模块外部导入具体的值。编程技术的一个基本要点就是对通用的情况找出规律,再按规律进行处理。 试题中给出了“按顺时针方向旋转9
13、0”的例子。在这种场合,用案例说明比叙述定义更为简单。人们也不难在案例的基础上推广理解。 对于问题 1,人们不难获得另一个案例: 对于问题 2,根据按顺时针方向旋转 90保持矩阵不变,可以逐步推断出一些元素的值: 对于问题 3,矩阵 A 按顺时针方向旋转 90得到矩阵 B,矩阵 B 按顺时针方向旋转 90得到矩阵 C。 矩阵 A 的第 1 行复制到矩阵 B 的第 n 列。 矩阵 A 的第 2 行复制到矩阵 B 的第 n-1 列。 矩阵 A 的第 3 行复制到矩阵 B 的第 n-2 列。 按照上述规律,矩阵 A 的第 i 行应复制到矩阵 B 的第 n-i+1 列。 A(i,j)是矩阵 A 的第
14、i 行第 j 列的元素,它应复制到矩阵 B 的第 n-i+1 列中,第j 行元素。即 A(i,j)B(j,n-i+1)。 矩阵 B 的第 1 行复制到矩阵 C 的第 n 列。 矩阵 B 的第 2 行复制到矩阵 C 的第 n-1 列。 按照上述规律,矩阵 B 的第 j 行应复制到矩阵 C 的第 n-j+1 列。 B(j,n-i+1)是矩阵 B 的第 j 行第 n-i+1 列的元素,它应复制到矩阵 C 的第 n-j+1 列中,第 n-i+l 行元素。即 B(j,n-i+1)C(n-i+l,n-j+1)。 反之,矩阵 B 的第 1 列来自矩阵 A 的第 n 行。 矩阵 B 的第 2 列来自矩阵 A
15、的第 n-1 行。 按照上述规律,矩阵 B 的第 j 列来自矩阵 A 的第 n-j+1 行。 B(i,j)是矩阵 B 的第 j 列中第 i 行元素,它来自矩阵 A 的第 n-j+1 行中第 i 列的元素,即 B(i,j)A(n-j+1,i)。 另一种更理性的方法是:在导出按顺时针方向旋转 90的变换 A(i,j)B(j,n-i+1) 后,就能通过推导再导出其他多次变换。可以将上述变换写成: A(x,y)B(u,v) 从而,B(j,n-i+1)可以直接变换到 C(n-i+l,n-j+1)。而且,可以直接导出 A(n-j+1),i)B(i,j)。2.问题 2 如果以下 3*3 矩阵沿顺时针方向旋转
16、 90后所形成的矩阵就是原来的矩阵: (分数:3.00)_正确答案:()解析:3.问题 3 在上述流程图 2-1 和图 2-2 的算法中, (1)矩阵 A 第 i 行第 j 列的元素 A(i,j)被复制到矩阵B 中的哪个位置? (2)A(i,j)后来又被复制到矩阵 C 中的哪个位置? (3)填补流程图 2-2 中的空缺。(分数:3.00)_正确答案:()解析:问题 3 (1)B(j,n-i+1),或矩阵 B 的第 j 行第 n-i+1 列 (2)C(n-i+l,n-j+1),或矩阵 C 的第 n-i+1 行第 n-j+1 列 (3)A(n-j+1,i)二、B试题二/B(总题数:1,分数:15.
17、00)4.C 语言函数 long change(int num) ind,m=num; long result mul; if (num=0|U (1) /U /*若 num 不大于 0 或 num 的位数大于 4,则返回-1*/ retum-1; mul=1; U(2) /U while(m0) d=m%10; m=U (3) /U; result=result+(U (4) /U) *mul; mul=U (5) /U; return result; (分数:15.00)_正确答案:()解析:num/100000,或 num9999,或 num=10000,或其等价形式 (2)result
18、=0 (3)m/10,或(m-d)/10,或其等价形式 (4)d*10 +d,或其等价形式 (5)mul*100,或其等价形式 分析试题二 本题考查简单运算的程序实现。对于这类题目,应将题干部分描述的运算过程理解透彻。 函数 change(int num)的功能是对四位以内(含四位)的十进制正整数 num 的每一位重复一次。显然,num 的位数大于 4 的直接表示是 num9999 或 nam10000,或 num/100000。 从题干部分给出的变换公式看,最后的结果是累加获得的,而且代码中用于保存累加结果的变量是 result,该变量的初值应为 0。所以空(2)处应填入“result=O”
19、。分析对 5234 的变化过程可知,首先取出个位,其次是十位上的数字,以此类推,并且将每次取出的数字 d 乘以 10 再加上该数字 d,因此空(4)处应填入“d*10 +d” 。显然 mul 的值以 100 进行累乘,因此空(5)处填入“mul*100“。由于跳出循环的条件为“m=0”,所以结合“d=m%10”可知,空(3)处应填入“m/10”。三、B试题三/B(总题数:1,分数:15.00)5.C 语言函数 bool Del_elem(STACK*s,char para_ch) STACK s_bgk; /*定义临时工作栈 s_bak,*/ char ch; bool tag=FALSE;
20、U (1) /U /*初始化临时工作栈 s_bak*/ /*,将栈*s 中所有比para_ch 更接近栈顶的元素暂时存放在临时工作栈 s bak 中*/ while(!IsEmpty(*s) ch=U (2) /U; /*取栈顶元素*/ Pop(s); if(chpara_ch) tag=TRUE; break; U (3) /U; /*将暂存于临时工作栈 s_bak 中的元素存回栈*s*/ while(U (4) /U) ch=Top(s_bak); U (5) /U Push(s,ch) return tag; (分数:15.00)_正确答案:()解析:InitStack( /*记录成本最
21、小的生产计划,B_s0不用,DAYS 定义为天数*/ double find_a_plan(FILE *int) iht P_nmDAYS+1,acc_reqDAYS+1; int i,tag = 0,acc_qty = 0; double mincost = 1.0e20,cost_Produce,cost_Keep; for(i = 1;i = DAYS; i+) /*第 i 天时的累计零件需求量存入 acc rcqi */ acc_qty += datai.Qty_req; acc_reqi = acc qty; while (!feof(int) for(i = 1; i = DAYS
22、; i+ )/*读入一个生产计划,第 i 天的产量存入 P_numi*/ if (!feof(inf) fseantinf,“%d“, tag = 0; cost_Produce = 0; cost_Keep = 0; for(i = 1,U (1) /U;i = DAYS; i+) /*考查当前的生产计划*/ acc qty += P_numi; /* acc_qty 计录到第 i 天时的累计零件生产量*/ if (acc_qty acc_reqi) /*当前生产计划不能满足需求*/ tag = 1; break; /*if*/ cost_Produce += U(2) /U; /*计算当前
23、生产计划的总需件价格*/ cost_Keep += (U (3) /U) * datai,Keeping_fee; /*for*/ if(U (4) /U) /* 若当前生产计划不可行,则继续读取下一计划*/ continue; if(U (5) /U) /*记录成本更小的生产计划*/ mincost = costProduce + cost_Keep; for(i = 1; i =DAYS; i+) B_si = P numi; /*if*/ /*while*/ return mincost; (分数:15.00)_正确答案:()解析:acc_qty=0 (2)P numi*dataiPri
24、ce,或其等价形式 (3)acc_qty-acc_reqi,或其等价形式 (4)tag,或 tag=1,或 tag!=0,或其等价形式 (5)cost_Produce+cost_Keepmincost 分析试题四 本题考查用 C 程序求解具有实际应用背景的问题。 对这类问题,一般在描述问题的背景时,会详细说明程序应实现的功能,并通过对示例数据的求解给出程序中对数据的处理过程。阅读这类程序时,应准确理解程序中定义的数据类型及其变量的作用,这是完善程序中空缺位置的关键所在。 从题目中可知,结构体数组 data是全局变量,分别用分量 Qty_req、Price 和 Keeping_fee 保存每天的
25、零件需求量、零件的单价及保管费用,也需要注意数组元素 data0不使用。 由于每天生产的零件还可以保存起来以后再使用,因此考查零件的生产数量是否满足需求时,需要从累计数量考查。为方便计算,程序中提前计算出累计的零件需求量并按天保存在数组 acc_req 口中。应注意第 i 天生产的零件数存在 P_numi中。 借助于注释可知 i 是循环控制变量,同时起计算天数时的序号作用。由代码“acc qty +=P_numi;”及注释可知变量 acc_qty 保存累计的零件生产量,因此之前必须将 acc_qty 初始值设为 0,因此空(1)处填入“acc qty=0”。由于 cost Produce 保存
26、的是到第 i 天时当前生产计划的总零件价格,因此应计算出第 i 天生产的零件总价格,所以空(2)处填入“P humi。dataiPrice”。显然,到第 i 天时累计生产的零件数减去累计的需求数就是应保存的零件,所以累计的零件保管费用为“cost_Keep+=(acc_qty-acc_reqi* dataiKeeping_fee;”,即空(3)处填入“ace_qty-ace_reqi”。 另外,从变量 tag 所起的作用看,它用于标志生产计划是否能满足要求。根据以下代码, if(acc_qtyacc_reqi)/*当前生产计划不能满足需求*/ tag=1; break; /*if*/ 可知当前
27、生产计划不能满足需求时,tag 等于 1。很明显,空(4)处应填入“tag=1。零件的成本包括生产价格和保管费用两部分,所以空(5)处填入“cost Produce+ cost+Keepmincost”。五、B试题五/B(总题数:1,分数:15.00)7.Vsual Basic 程序代码 Private Sub CmdSelect_Cliek() For i = O To List2.ListCount - 1 If Listl.Text = List2.List(i) Then Exit Sub 不要重复选择 Next i List2.AddltemU (1) /U 在 List2 中增添
28、List1 中所选的项 End Sub Private Sub CrndSelAll_Click() List2.Clear 先删除List2 中的已有项 For i = 0 To U(2) /U 对 List1 中所有各项做循环处理 List2.Addltem U(3) /U 将该项增添到 List2 中 Next i End Sub Private Sub CmdDelete_Cliek() If List2.Listlndex = O Then 如果 List2 中有选中的项, List2.Removeltem U (4) /U 则删除所选的项 End If End Sub Privat
29、e Sub CmdDelAll_Cliek() U(5) /U End Sub(分数:15.00)_正确答案:()解析:Listl.Text (2) Listl.ListCount- (3) Listl.List(i) (4) List2.Lisfindex (5) List2.Clear 分析试题五 本题涉及常用的列表框技术。 列表框常用的属性如下: ListCount 列表框内的数据项个数 List(o),List(1),. 列表框中从上到下各个数据项内容 Text 列表框中当前选中的数据项内容 Listlndex 列表框中当前选中的数据项的序号 列表框常用的方法如下: AddItem 列
30、表框尾部增加一个数据项(参数给出数据项内容) RemoveItem 列表框中删除指定的数据项(参数给出待删的数据项序号) Clear 删除列表框中的全部数据项 本题中有两个列表框 List1 和 List2,以及四个按钮。 按钮“”的功能是将列表框 List1 中选中的一个数据项复制到列表框 List2 的尾部。 List1 中当前所选的数据项内容是List1.Text。为避免重复,在复制前,应先判断它是否已经位于 List2 中。List2 中,已有的数据项个数为 List2.ListCount。各个数据项内容为: List2List(O),List2List(1),因此可以用循环语句来实现
31、这种比较。如果发现重复,则退出该过程(不再复制)。将 Listl.Text 复制到 List2 的尾部,可以用如下语句实现: List2Addltem Listl,Text 因此,(1)处应填写 Listl.Text。 如果 List1 中没有选中任何数据项,则上述复制语句自动作为空语句执行。 注意,如果不修改列表框属性“MultiSelect”的默认值(O),用户在列表框中就不能同时选择多个数据项。 按钮“”的功能是将 List1 中的全部数据项复制到 List2 中去。为避免重复,在复制前,应全部删除 List2 中的所有数据项。将 List1 中的逐个数据项:List1.List(O),
32、 ListlList(1),逐个复制到 List2 中,可以用循环语句来实现。List1中的数据项个数为 List1ListCount,因此,循环次数就是 List1ListCount。循环变量 i 从 0 开始执行循环,直到 Listl.ListCount-1。因此(2)处应填写 ListlListCount-1。循环体内执行数据项复制,将 ListlList(i)增添到 List2 的尾部: List2Addltem Listl.List(i) 因此,(3)处应填写Listl.List(i)。 按钮“”的功能是将 List2 中当前选中的数据项删除。由于删除数据项用Removeltem 方
33、法实现,其参数为选中数据项的序号值,所以,应该用语句: List2.Removeltem List2.Listlndex 来实现。因此(4)处应填写 List2.Listlndex。 如果 List2 中没有选择任何数据项(此时 List2Listlndex=1),则上述语句会出现运 行错误。为避免这种情况发生,可以将上述语句限制在List2Listlndex=O 的条件下执行。 按钮“”的功能是删除 List2 中已经有的全部数据项,因此可以采用语句: List2.Clear 来实现。因此,(5)处应填写 List2.Clear。六、B试题六/B(总题数:1,分数:15.00)8.C+代码
34、(分数:15.00)_正确答案:()解析:this-j (2)SuperClass 错误更正结果:SuperClass*s=new SubClass(-3); 变量 i 的值:0 运行结果:-3,2 分析试题六 本题考查的是面向对象程序设计语言 C+。 考查的主要知识点为 C+程序设计语言中类成员变量的初始化、父类成员方法的调用、对象的构造等。第一空要求用用参数 j 的值更新数据成员,由于成员变量名也为 i 因此需要明确地指出需要更新的变量 j 为类中的成员变量,可以在前面加上一个明确的前缀 this 来表示,因此(1)处应填写 this-j:(2)处要求调用父类的成员方法getValue()
35、,为了和子类中的 getValue()相区别,需要加上域前缀,因此(2)处应该填写 SuperClass,表明该函数属于类 SuperClass;在程序的第 23 行,由于 SuperClass s 表明已经定义了一个对象,因此,后面不应该使用 new 再次分配一个对象,但是后面的程序代码将 s 作为一个对象指针使用,因此需要将 s定义为一个指针,因此更改后结果应为:SuperClass*s= new SubClass(-3);当程序运行到第 15 行但是还没有执行 15 行的语句时,成员变量 i 的值应为构造函数初始化列表中指定的 j 的初始化值,本题目为0:最后程序的输出为-3 和 2,-
36、3 为子类中成员变量 j 的值,而 2 表示父类中 i 的值和子类中 i 的值的和。七、B试题七/B(总题数:1,分数:15.00)9.DimU (2) /U 声明全局变量 Private Sub Form_Load() Scale(0,0)-(20,6) 定义窗体的坐标系统 End Sub Private Sub CmdStart_Click() x=0 MMC.DevkeType=WaveAudio 设置多媒体设备类型 MMC.FileName=两只蝴蝶.wav 确定声音文件名 MMCCornmand=Open 打开多媒体设备 MMCCommand=P1ay 启动声音的播放 Timer1.
37、Enabled=True 打开定时器 End Sub Private Sub Timer1_Timer() Ifx20 Thenx=x-20 蝴蝶飞到右边界后再回到左边界 Image1.Left=x 动态调整蝴蝶框的位置 Imagel.Top=U (3) /U Image2.Len=x lmage2.Top= U(4) /U x=x+0.1 确定蝴蝶下一步飞行位置 End Sub Private Sub CmdStop_Click() U (5) /U Image1.Left=0 蝴蝶位置初始化 Image1Top=2 Image2Left=0 Imagc2.Top=3 MMlC.Comman
38、d=Stop 停止播放 MMCCommand=Ciosc 关闭多媒体设备 End Sub(分数:15.00)_正确答案:()解析:True (2)x As Single (3)2+sin(x) (4)2+cos(x) (5)Timer1.Enabled=False 分析试题七 本题涉及两个技术要点。一是利用图像框在窗体中的动态定位实现简单动画,一是利用多媒体控件播放声音文件。 在窗体中,为了便于实现图像框的定位,一般需要先建立自定义的坐标系统。 在主窗体加载过程(Form Load)中,采用语句: Seal(0,o)-(20,6) 就为该窗体设置了自己的坐标系统,左上角坐标为(0,0),右下角
39、坐标为(20,6)。 八、B试题八/B(总题数:1,分数:15.00)10.Java 代码 (分数:15.00)_正确答案:()解析:this (2)super 错误更正结果:public abstract int getSum(); 变量 i 的值:5 运行结果: -3 2 分析试题八 本题考查的是 Java 程序设计。 考查的主要知识点为 Java 程序设计语言中类成员变量的初始化、父类成员方法的调用、对象的构造等。(1)处要求用参数 i 的值更新数据成员,由于成员变量名也为 j 因此需要明确地指出需要更新的变量,j 为类中的成员变量,可以在前面加上一个明确的前缀 this来表示,因此(1
40、)处应填写 this;(2)处要求调用父类的成员方法 getValue(),为了和子类中的getValue()相区别,需要加上域前缀,因此(2)处应该填写 Super,表明该函数属于类 SuperClass;在程序的第 14 行,getSum 函数仅仅是一个抽象函数,它将被 SubClass 继承并实现,因此,不能够将其定义为 final,凡是定义为 final 的方法是不允许被子类重新实现的,因此更改后应该将 final 关键字去掉;当程序运行到第 22 行但是还没有执行 22 行的语句时,父类的构造函数已经被调用并执行,所以 i 的值应该为 5:最后程序的输出为-3 和 2,-3 为子类中成员变量,i 的值,而 2 表示父类中 i 的值和子类中 j 的值的和。