1、2005年上半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读以下说明和流程图,回答问题 1和问题 2。【说明】 设 8位二进制代码B0B1B7 中的最高位 B0为奇偶校验位。对于任何给定的代码 B1B2B7 ,可按下式计算偶校验位: 其中, “ ”表示 “异或 ”运算。 下面的流程图描述了计算偶校验位的过程。【流程图】 注:流程图中,循环开始的说明按照 “循环变量名:循环初值,循环终值,增量 ”格式描述。 1 将流程图中的 (1) (4)处补充完整。 2 若按下式计算奇校验位,则上述 流程图中的 (1)处应填 (5)。 3 阅读以下函数说明和 C语言函数,将应填
2、入 (n)处的字句写在答题纸的对应栏内。 【说明】 函数 int funl (int m,int n)的功能是:计算并返回正整数 m和 n的最大公约数。 【函数 2.1】 int funl (iht m,int n) while(1) if(m n) m=m-n; else n=n-m; (2); 【函数 2.2说明】 函数 long fun2(char*str)的功能是:自左至右顺序取出非空字符串 str中的数字字符形成一个十进制整数 (最多 8位 )。 例如,若字符串 str的值为 “f3g8d5.ji2e3p12fkp“,则函数返回值为 3852312。 【函数 2.2】 long fu
3、n2 (char*str) int i=0; long k=0; char*P=str; while (*p!=0& (3) if (*p =0&*p =9) k=(4)+*p-0; +i; (5); return k; 4 阅读以下说明和 C语言函数,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】 一棵非空二叉树中 “最左下 ”结点定义为:若树根的左子树为空,则树根为 “最左下 ”结点;否则,从树根的左子树根出发,沿结点的左子树分支向下查找,直到某个结点不存在左子树时为止,该结点即为此二叉树的 “最左 下 ”结点。例如,下图所示的以 A为根的二叉树的 “最左下 ”结点为 D,以 C为
4、根的子二叉树中的 “最左下 ”结点为 C。 二叉树的结点类型定义如下: typedef stmct BSTNode int data; struct BSTNode*lch,*rch; /结点的左、右子树指针 *BSTree; 函数 BSTree Find Del(BSTree root)的功能是:若 root指向一棵二叉树的根结点,则找出该结点的右子树上的 “最左下 ”结点 *p,并从树于删除以 *p为根的子树,函数返回被删除子树的根结点指针;若 该树根的右子树上不存在 “最左下 ”结点,则返回空指针。 【函数】 BSTrce Find_Del(BSTreeroot) BSTreep,pre
5、; if ( !root ) return NULL; /*root指向的二叉树为空树 */ (1); /*令 p指向根结点的右子树 */ if ( !p ) return NULL; (2); /*设置 pre的初值 */ while(p- lch) /*查找 “最左下 ”结点 */ pre=p; p=(3); if (4)=root) /*root的右子树根为 “最左下 ”结点 */ pre-rch=NULL; else (5)=NULL; /*删除以 “最左下 ”结点为根的子树 */ reurn p; 5 阅读以下说明和 C语言函数,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】
6、 假设一个剧场有 N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组 aNN模拟剧场中的座位, aij圆等于 0表示第 i排第 j列(0i, jN-1)的票尚未售出。 函数 int Find(int aN, int R, int*row, int*col)的功能是:在部 分票已售出的情况下,找出剧场中的 R*R个空座位,要求这些座位的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回 1,并算出该正方形左上角的行、列号;若未找到,则返回 0。 例如,一个 7X7个座位的剧场如下图 (a)所示,已售出部分座位的剧场如下图 (b)所示,图中阴影部分表示已售出的座位,从下图
7、 (b)中找出的 3X3正方形空座位如下图 (c)中斜线区所示。 【函数】 int Find(int aN int R,int*row,iht*col) int i, j, k, c, t; int FOUND=0; for(i=0; !FOUND&i N-R+1; i+) /*从第 0排开始查找 */ (1); while (j N-R+1&!FOUND) for (k=0; (2)&aij+k=0; k+); /*查找第 i排连续的 R个空座位 */ if (k =R) /*找到第 i排连续的 R个空座位 */ for (c=0; c R; c+) /*查找其余的 R*(R-1)个座位 *
8、/ for (t=1; t R; t+) if (a(3)j+c!=0) break; if (t R) break; /*for*/ if (4) FOUND=1; /*if*/ (5; /*while*/ /*fori*/ if (FOUND) *row=i-1; *col=j-1; /*计算正方形区域的左上角坐标 */ return 1; return 0; 6 阅读以下说明及 Visual Basic程序代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】 甲乙两地之间的铁路线上有二十多个火车站,为方便乘客查询票价,特开发了火车票价查询程序,其运行窗口如下图所示。乘客只要通过两
9、个下拉列表框分别选择起点与终点站名,再单击 “查询 ”按钮,则票价文本框中就会显示相应的票价。 在开发过程中,设选择起点和终点站名的组合框 (ComboBox)名分别为 ST和 SP,显示票价的文本框(TextBox)名为 Price, “查询 ”按钮 (CommandButton)名为 Query;设 ST与 SP中的诸列表项完全相同,且都是从甲地开始依次排列,从第 i站到第 j站的票价存放在二维对称矩阵 P的元素 P(i, j)中。假设从甲地到第 i站行驶的距离存放在 d(i)中,火车票价等于其行驶距离乘以 C(常数 )。【 Visual Basic代码】 Dim p(30, 30) As
10、 Single 通用声明 Const C=0.2 Private Sub Form_Load() Dim d (30) As Single (1)=“甲地 “ 在 ST组合框中设置首个列表项 在 ST和 SP中设置其他列表项 (若干行语句 ) 对数组 d(i)赋值 (若干行语句 ) For i=0 to ST (2) -1 对 ST中各列表项循环 For j=0 to SP. (2) -1 对 SP中各列表项循环 (这两处填写内容相同 ) P (i, j)=(3) Next j Next i End Sub Private Sub query_Click() i=(4) 组合框 ST中选择的当
11、前项编号 j= 组合框 SP中选择的当前项编号 (语句略 ) (5)=str$ ( p (i, j) End Sub 7 阅读以下说明及 Visual Basic程序代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】 某个文本文件中存放了若干个非零数值有效数据,每个数据占一行,最后一行以数字 “0”作为结束标志。下面的程序用于计算该文件中这些数据之和,其运行窗口如下。 用户只要通 过驱动器列表框、目录列表框和文件列表框,选择文本文件所在的驱动器、文件夹及相应的文件名,再单击 “累计 ”按钮,就能在 “总计 ”文本框中看到该文本文件中的数据之和。 在开发过程中,设驱动器列表框名为 Dr
12、ivel,目录列表框名为 Dirl,文件列表框名为 Filel,存放数据的文本文件名为 D: testvb7datA txt, “累计 ”按钮名为sum, “总计 ”文本框 (TextBox)名为 textl。【 Visual Basic代码】 Private Sub Drivel_Change() Dirl Path=(1) 户选择的驱动器反映到目录列表框中 End Sub Private Sub Dirl_Change() Filel Path=(2) 用户选择的文件夹改变文件列表框内容 End Sub Private Sub sum_Click() Dim (3) As New File
13、SystemOject, (4) As TextStxeam 创建自己的文件系统对象,说明自己的文本流对象 If Right (Dirl Path, 1)=“Then SetmyTextFile=fso OpenTextFile (Dirl Path+Filel FileNamc) Else SetmyTextFile=fso OpenTextFile(Dirl Path+”+Filel FileName) End“ S=0 Do d=Val (myTextFilE ReadRow) S=S+d Loop While (5) Textl Text=Str$(S) End Sub 8 阅读以下说
14、明和 C+抖程序,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 下面程序的功能是计算并输出某年某月的天数。 【 C+程序】 #include iostream using namespace std; (1) MonthJan, Feb, Mar,Art, May,Jun, Jul, Aug, Sep,Oct,Nov,Dec; class Date public: Date(int year,Month m_month) (2) =year; if (m_month Janm_month Dec) month=Jan; else month=m_month; ; Date(); b
15、ool IsLeapYear() return (year%4=0 & year%1001!=0)year%400=0); ; int CaculateDays() switch( (3) ) case Feb: if( (4) )return29; e1Se return 28; case Jan: case Mar: case May: case Jul: case AUg: case Oct: case Dec: retllrn 31; case Apr: case Jun: Case Sep: case Nov: roturu30; ; private: int year; Month
16、 month; ; void main() Date day(2000,Feb); tout day (5) (); 9 阅读以下说明、 Java代码和 HTML文档,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 当用户启动 html浏览器并首次打开下面的 HTML文档时, Java Applet小程序在显示面板上显示字符串 “Welcome!”;当 html页面被其他窗口 遮挡后再次显示时,小程序在显示面板上显示 “Welcome back!”。 【 Java代码】 import javA awt *; import javA applet; public class Hello
17、Applet extends (1) public void paim(2) g drawString(message,10,20); message=“welcome back!”; public void (3) () message=“Welcome!”; private (4) message; 【 HTML文档】 html head title HTML Test HelloApplet Page /title /head body Test HelloApplet小程序 br applet codebase=“.“ code=“(5) “ name=“TestApplet“ wid
18、th=“400“ height=“300“ /applet /body /html 2005年上半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析 1 【正确答案】 (1)0 (2)1, 7, 1 (3)Bi (4)B0 【试题解析】 “异或 ”运算就是 “按位加 ”运算,俗称不进位的二进制加法。符号“(图片 18)”反映了这种特点,便于记忆。偶数个 1“按位加 ”得 0, 奇数个 1“按位加 ”得 1。正是这个特点,计算机内部常用 “异或 ”运算来计算出校验位,从而可以用逻辑电路来实现奇偶校验。 对于 B1、 B2、 、 B6、 B7这 7个二进制位,采用偶校验时,要求 B
19、0 B7中 “1”的个数为偶数。因此,若 B1 B7中有偶数个 “1,则校验位 B0等于 0,否则 B0等于 1。 B0的初始值为 0时,正 好反映了 B1 B7的偶校验结果。因此,空 (1)处填入 “0”。 循环中应使每个二进制位参与 “异或 ”运算并把结果保存在 B0中,因此,空 (3)处填入 “Bi”,空 (4)处填入 “B0”,空 (2)处的循环描述为 “l: 1, 7, 1”。若采用奇校验,则 B0的初始值应为1。 2 【正确答案】 (5)1 3 【正确答案】 (1)m!=n,及其等价形式 (2)return m,或 return n (3)i 8,或 i =7,及其等价形式 (4)
20、 k*10 (5)p+,或 +p,或 p+=1,或 p=p+1 【试题 解析】 由函数 2.1的说明可知,该函数的功能是计算并返回正整数 m和 n的最大公约数。由于函数体中只有变量 m和 n,因此空 (1)所在的循环条件只 能是关于 m和 n关系的表达式,且最大公约数保存在 m或 n中。同时从 while的循环体可知,反复从较大者中减去较小者后,最后 m和 n的值会相等, 因此循环条件为 m!=n或其等价形式。 函数 long fun2(char*str)的功能是:自左至右顺序取出非空字符串 str仕中最多 8位数字字符形成一个十进制整数。从函数的功能描述和函 数体语句可知,变量 i是用于计算
21、得到的数字字符个数的 ,由于 i的初始值为 0,因此空 (1)处应填 “i 8”或其等价形式。 8位长度的十进制整数 a1a2a3a4a5a6a7a8表示为: a1a2a3a4a5a6a7a8=a1*107+a2*106+a3*105+a4*104+a5*103+a6*102+a7*101+a8 =(0*10+a1)*10+a2)*10+a3)*10+a4)*10+a5)*10+a6)*10+a7)*10+a8 因此有:k0=0, ki=ki-1*10+ai (1i8), k8就是计算结果。 4 【正确答案】 (1)p=root- rch (2)pre=root (3)p- lch (4)pr
22、e (5)pre- lch 【试题解析】 根据题目中的说明,函数 BSTree Find Del (BSTree root)的功能是:若 root指向一棵二叉树的根结点,则找出该结点的右子树上的 “最 左下 ”结点 *p,并从树中删除以 *p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在 “最左下 ”结点,则返回空指 针。而一棵非空二叉树中 “最左下 ”结点定义为:若树根的左子树为空,则树根为“最左下 ”结点;否则,从树 根的左子树根出发,沿结点的 左子树分支向下查找,直到某个结点不存在左子树时为止,该结点即为此二叉树的 “最左下 ”结点。 因此,给定一棵非空二叉树后,其
23、右子树上的 “最左下 ”结点要么为右子树根结点自己,要么为右子树根的左子树结点。 当二叉树非空时, root指向的结点是存在的,因此,令 p指向根结点的右子树表示为 “p=root- rch“。在二叉树上删除结点的操作实质上 是重置其父结点的某个子树指针,因此查找被删除结点时,需要保存被删结点的父结点指针, pre起的就是这个作用。空 (2)处应填入 “p=root“,使得指针 pre与 p指向的结点始终保持父子关系。根据 “最左下 ”结点的定义,空 (3)处应填入 “p- lch“。 当 root的右子树根为 “最左下 ”结点时, pre指针的指向就不会被修改,因此,空 (4)处应填入 “p
24、re”。若 “最左下 ”结点在 root的右子 树的左子树上,则删除以 p指向的 “最左下 ”结点为根的子树就是将 pre(*p的父结点 )的左子树指针置空,因此,空 (5)填入 “pre- Ich“。 5 【正确答案】 (1)j=0 (2)k R,及其等价形式 (3)i+t (4)c =R,及其 等价形式 (5)j+,或 +j,或 j+=1,或 j=j+1 【试题解析】 首先将函数代码加上行号,以便说明。 1: int Find (int aN,int R,int*row,int*col) 2: int i, j, k, c, t; int FOUND=0; 3: for (i=0; !FO
25、UND &i N-R+1; i+) /*从第 0排开始查找 */ 4: (1) ; 5: while (j N-R+I&!FOUND) 6: for(k=0; (2) &aij+k 0; k+); /*查找第 i排连续的 R个空座位*/ 7: if (k =R) /*找到第 i排连续的 R个空座位 */ 8: for (c=0; c R; c+) /*查找其余的 R*(R-1)个座位 */ 9: for (t=1; t R; t+) 10: if (a (3) j+c!=0) break; 11: if (t R) break; 12: /*for*/ 13: if ( (4) ) FOUND
26、=1 14: )/*if*/ 15: (5) ; 16: /*while*/ 17: )/*fori*/ 18c if (FOUND) 19: *row=i-1; *col=j-1; /*计算正力形区域的左上角坐标 */ 20: return 1 21: 22: return 0; 23: 根据题目中的说明可知,函数 Find()的计算过程就是在有标记的方阵中找出一个 R*R的尚未标记的子方阵。根据第 3行的代码及注释 “从第 0排开始查找 ”,可知 i起行号计数作用。 在确定的起始行上,显然是从左到右找到一个空座位 (即标记为 0的矩阵元素 ),然后考查是否存在连续的 R个空座位,若不存在,
27、本行不再 作为起始行,否则应考查与本行的连续 R个空座位同列的下一行空座位情况,且从 “aij+k=0”可知 j起列号计数作用。因此,空 (1)处应对 j赋初 值 0,空 (2)处的条件应保证元素 aij+k的下标有效,即 j+k N,又知 j=N-R,所以空 (2)处应填入 “k R”。 显然,一旦确定了第 i行的 R个空座位,随后就应考查第 i+1行第 i+R-1行上的座位情况,这部分功能是由第 8行第 12行代码来实现的。由 于循环变量 c的变化范围是 0 R-1, t的变化范围是 1 R-1,而且以 j+c作为列下标,因此空 (3)处的行下标应该为 “i+t”。第 11行代码表示的 是
28、循环 for(c: 0=; c R; c+)的中断处理,显然若该循环能在 c=R时结束,则说明 找到了 R*R子方阵,因此空 (4)处填入 “c R”。起列号计数 作用的 j在条件为 “j N-R+1”的 while循环中还需要有改变值的语句,因此空 (5)处应填入 “j+”。 6 【正确答案】 (1)st List(0) (2)ListCount (3)c*abs(d(j)-d(i) (4)st ListIndex (5)PricE Text 【试题解析】 本题目涉及的控件有组合列表框 (ComboBox)、文本框 (TextBox)和命令按钮 (CommandButton),主要考查组合列
29、表框的常用属 性。 组合列表框常用的基本属性主要有 ListIndex、 List、 Text、 ListCount等,其中, List属性是个数组,用于记录列表框中的所有条目 (每个 条目有唯一对应的序号,所有条目从 0开始编号 ), ListCount属性返回控件中条目的个数。当用户在控件中选择某个条目时, ListIndex属性返 回被选中内容的序号, Text属性返回被选中条目对应的字符串。若用户没有选中任何内容,则 ListIndex返回 -1。 根据题目的说明和程序代码中的注释,在组合框 st中设置首个列表项,显然就是要 设置 st List(0)的值。对组合框中各列表项循环时,应
30、 确定控件中的条目数,因此空 (2)处应填入 “ListCount“。由题中说明可知,第 i站到第 j站的票价等于两站之间的距离乘以常量 C,而第 i站到第 j站的距离为 “abs(d(j)-d(i)”,其中 abs()是求绝对值的函数,所以空 (3)处应填入“C*abs(d(j)-d(i)”。空 (4)所在行的注释已经表明应填 入组合框中被选中内容的序号 ListIndex,空 (5)则应填入 PricE Text,以在文本框中显示第 i站到第 j站的票价。 7 【 正确答案】 (1)Drivel Drive (2)Dirl Path (3)fso (4)myTextFile (5)d 0
31、【试题解析】 驱动器列表框 (DriveListBox)、目录列表框 (DirListBox)和文件列表框 (FileListBox)是 Visual Basic提供的内部控件,驱动器列表框 (DriveListBox)可自动填写驱动器的名字和卷标,目录列表框 (DirListBox)可显示指定驱动器的目录树,而文件列表框 (FileListBox)则是一 个特殊的 ListBox控 件,它显示指定目录下的所有文件,并可选择按文件的名字、扩展名或属性排列内容。 这些控件常常在一个窗体中工作,当用户在 DriveListBox中选择一个驱动器时, DirListBox控件就更新显示该驱动器上的目
32、录树,当用户 在 DirListBox中选择一条路径时, FileListBox控件中的内容为该目录下的文件列表,这些活动自动地触发 Change事件。但是,这些活动不能自 动完成,需要为 Change事件编写代码,通过代码将驱动器列表框的 Drive属性(指明当前驱动器 )赋值给目录列表框的 Path属 性,将目录列表框的 Path属性 (指明当前路径 )赋值给文件列表框的 Path属性,即Dirl Path=Drivel Drive, Filel Path=Dirl Path。 “Dim”是声明变量的关键字,在过程 sum_Click()中,显然是对文件系统对象 fso和文本流对象 myT
33、extFile进行声明。 根据题目的说明,所处理的文本文件中存放了若干个非零数值有效数据,每个数据占一行,最后一行以数字 “0”作为结束标志。计算该文 件中的数据之和时,当读入的数据 d等于 0时应结束计算。因此,根据循环 控制,空 (5)处填写 “d 0”(d不等于 0)。 8 【正确答案】 (1)enum (2)this- year (3)month (4)IsLeapYear() (5)Cacu lateDays 【试题解析】 程序的空 (1)所在行的目的是定义一枚举类型用来表示一年 12个月,所以空 1应填上 enum;在类 Data中定义了两个私有变量 year和 m_month分
34、别用来存储年份和月份,在 Data类的构造函数中,要求给出年份和月份来构造一个 Data类的对象,因为构造函数中参数名称和私有变量的名称 相同, 为了在构造函数中使用私有变量 year,必须加上 this指针,所以空 (2)应填上 this- year。 函数 CaculateDays用宋计算某一年某个月的天数,不论是否是闰年,除 2月份以外,所有的大月都是 31天,小月都是 30天;如果是闰年, 2 月份是 29天,否则是 28天。根据分析,空 (3)应填上 m month用来判断月份是大月、小月或者二月,空 (4)用来判断是否是闰年,调用函数 IsLeapYear()即可得到结果。 9 【
35、正确答案】 (1)Applet (2)Graphics g (3)init (4)String (5)HelloApplet Class 【试题解析】 本题考的是 Java的小应用程序的基础知识,当使用网页浏览器打开题目中给出的 html文件时,应该加载 Java源代码编译后生成的字节码, 即 java源文件对应的 class文件,题目中给出的可调用的公共类的类名为HelloApplet,因此,其对应的源文件和编译后的类文件应该为 HelloApplet.java和 HelloApplet class,空 (5)应该填写上 HelloApplet class; 由于 HelloApplet是一个小应用程序,所以应该继承小应用程序类 Applet,第 1空应填上 Applet,根据私有变量 message存储的数据是字符串 ,所以其对应的类型应为 String。题目中指明了当第一次显示页面时,显示的信息为 “Welcome尸,而当首次调用小应用程序时,对小应用程序 方法调用的顺序为先 init(),后 paint(),当 html页面被其他窗口遮挡后再次显示时,小程序将再次调用 paint()。所以空 (3)为 init(),空 2应 为 paint方法填上参数,根据小应用程序接口的定义,空 (2)应填上 Graphics g。