200505程序员下午真题
第 1 题
(15分,每空3分)
【说明】
设8位二进制代码B0B1……B7中的最高位B0为奇偶校验位。对于任何给定的代码B1B2……B7可按下式计算偶校验位:
B0=B0⊕B1⊕……⊕B7
其中,“⊕”表示“”异或运算。下面的流程图描述了计算偶校验位的过程。
【流程图】
注:流程图中,循环开始的说明按照“循环变量名:循环初值,循环终值,增量”格式描述。
【问题1】
将流程图中的(1)~(4)处补充完整。
【问题2】
若按下式计算奇校验位,则上述流程图中的(1)处应填__(5)__。
B0=B0⊕B1⊕……⊕B7 ⊕1
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) 0
(2) 1,7,1
(3) Bi
(4) B0
(5) 1 - 试题解析:
(1) 0
(2) 1,7,1
(3) Bi
(4) B0
(5) 1
第 2 题
()(15分,每空3分)
【函数2.1说明】
函数 int fun1(int m,int n)的功能是:计算并返回正整数m和n的最大公约数。
【函数2.2说明】
函数long fun2 ( char *str )的功能是:自左至右顺序取出非空字符串 str 中的数字字符形成一个十进制整数(最多8位)。例如:若字符串 str的值为“f3g8d5. ji2e3p12fkp”,则函数返回值为3852312。
【函数2.1】
int fun1(int m,int n)
{
while ( __(1)__ ) {
if (m>n) m=m-n;
else n=n-m;
}
___(2)___ ;
}
【函数2.2】
long fun2 ( 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;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
函数2.1:
(1) m ! =n ;
(2) return m; 或return n;
函数2.2:
(3) i<8;
(4) k*10;
(5) p++ - 试题解析:
函数2.1:
(1) m ! =n ;
(2) return m; 或return n;
函数2.2:
(3) i<8;
(4) k*10;
(5) p++
第 3 题
()(15分,每空3分)
【说明】
一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如:下图所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。二叉树的结点类型定义如下:
typedef struct BSTNode {
int data ;
struct BSTNode *lch , *rch; //结点的左、右孩子指针
} *BSTree;
函数BSTree Find_Del (BSTree root )的功能是:若root指向一棵二茶树的根结点,则找出该结点的右子树上的“最左下”结点 *p,并从树中删除以 *p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。
【函数】
BSTree Find_Del (BSTree root)
{ BSTree p, pre;
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; /* 删除以“最左下”结点为根的子树*/
return p;
}
()(15分,每空3分)
【说明】
一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如:下图所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。二叉树的结点类型定义如下:
typedef struct BSTNode {
int data ;
struct BSTNode *lch , *rch; //结点的左、右孩子指针
} *BSTree;
函数BSTree Find_Del (BSTree root )的功能是:若root指向一棵二茶树的根结点,则找出该结点的右子树上的“最左下”结点 *p,并从树中删除以 *p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。
【函数】
BSTree Find_Del (BSTree root)
{ BSTree p, pre;
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; /* 删除以“最左下”结点为根的子树*/
return p;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) p=root->rch
(2) pre =root
(3) p->lch
(4) pre
(5) pre->lch - 试题解析:
(1) p=root->rch
(2) pre =root
(3) p->lch
(4) pre
(5) pre->lch
第 4 题
()(15分,每空3分)
【说明】
假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[i][j]等于0表示第i排第j列(0≤I , j≤N-1)的票尚未售出。
函数int Find ( int a[][N] , int R , int *row , int *col )的功能是:在部分票已售出的情况下,找出剧场中的R*R个空座位,要求这些座位的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回1,并算出该正方形左上角的行、列号;若未找到,返回0;
例如,一个7×7个座位的剧场如下图(a)所示,已售出部分座位的剧场如下图(b)所示,图中阴影部分表示已售出的座位,从图(b)中找出3×3正方形空座位如图(c)中斜线区所示。
【函数】
int Find ( int a[][N] , int R , int *row , int *col )
{ int i,j,k,c,t; int FOUND = 0;
for ( i=0 ; !FOUND && i
while ( j
if ( k >=R ){ /* 查找第i排连续的R个空座位 */
for ( c=0 ; c < R ; c++ ) { /* 查找其余的R*(R-1)个座位 */
for ( t = 1 ; t < R ; t++ )
if (a[ __(3)__ ] [j+c] !=0 ) break;
if ( t
if ( ___(4)___ ) FOUND =1;
} /* if */
___(5)___ ;
} /* while */
} /* for i */
if ( FOUND ) {
*row = i-1 ; *col = j-1; /* 计算正方形区域的左上角坐标*/
return 1;
}
return 0;
}
()(15分,每空3分)
【说明】
假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[i][j]等于0表示第i排第j列(0≤I , j≤N-1)的票尚未售出。
函数int Find ( int a[][N] , int R , int *row , int *col )的功能是:在部分票已售出的情况下,找出剧场中的R*R个空座位,要求这些座位的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回1,并算出该正方形左上角的行、列号;若未找到,返回0;
例如,一个7×7个座位的剧场如下图(a)所示,已售出部分座位的剧场如下图(b)所示,图中阴影部分表示已售出的座位,从图(b)中找出3×3正方形空座位如图(c)中斜线区所示。
【函数】
int Find ( int a[][N] , int R , int *row , int *col )
{ int i,j,k,c,t; int FOUND = 0;
for ( i=0 ; !FOUND && i
while ( j
if ( k >=R ){ /* 查找第i排连续的R个空座位 */
for ( c=0 ; c < R ; c++ ) { /* 查找其余的R*(R-1)个座位 */
for ( t = 1 ; t < R ; t++ )
if (a[ __(3)__ ] [j+c] !=0 ) break;
if ( t
if ( ___(4)___ ) FOUND =1;
} /* if */
___(5)___ ;
} /* while */
} /* for i */
if ( FOUND ) {
*row = i-1 ; *col = j-1; /* 计算正方形区域的左上角坐标*/
return 1;
}
return 0;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) j = 0
(2) k(3) i+t
(4) c==R
(5) j++ - 试题解析:
(1) j = 0
(2) k(3) i+t
(4) c==R
(5) j++
第 5 题
() (15分,每空3分)
【说明】
甲乙两地之间的铁路线上有二十多个火车站,为方便乘客查询票价,特开发了火车票价格查询程序,其运行窗口如下图所示。乘客只要通过两个下拉列表框分别选择起点与终点站名,再单击“查询”按钮,则票价文本框就会显示相应的票价。
在开发过程中,设选择起点和终点站名的组合框(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 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中选择的当前项编号
j = …… ‘组合框SP中选择的当前项编号(语句略)
___(5)___ = str $ ( p ( i , j ) )
End Sub
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) st.List(0)
(2) ListCount
(3) abs(d(j)-d(k))*C
(4) st.ListIndex
(5) Price.Text - 试题解析:
本题目涉及的控件有组合列表框(ComboBox)、文本框(TextBox)和命令按钮(CommandButton),主要考查组合列表框的常用属性。
第 6 题
()(15分,每空3分)
【说明】
当用户启动html浏览器并首次打开下面的html文档时,Java Applet小程序在显示面板上显示字符串“Welcome !”;当html页面被其他窗口遮挡后再次显示时,小程序在显示面板上显示“Welcome back !”。
【Java代码】
import javA.awt.*;
import javA.applet.*;
public class HelloApplet extends ___(1)___ {
public void paint ( ___(2)___ ) {
g.drawstring ( message, 10, 20 );
message = “welcome back !”;
}
public void ____(3)____ () {
message = “welcome !” ;
}
private ___(4)___ message;
}
【html文档】
Test HelloApplet 小程序
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) Applet
(2) Graphics g
(3) init
(4) String
(5) HelloApplet.class - 试题解析:
(1) Applet
(2) Graphics g
(3) init
(4) String
(5) HelloApplet.class
第 7 题
()(15分,每空3分)
【说明】
某个文本文件中存放了若干个非零数值有效数据,每个数据占一行,最后一行以数字“0”作为结束标志。下面的程序用于计算该文件中这些数据之和,其运行窗口如下:
用户只要通过驱动器列表框、目录列表框和文件列表框,选择文本文件所在的驱动器、文件夹及相应的文件名,再单击“累计”按钮,就能在“总计”文本框中看到该文本文件中的数据之和。
在开发过程中,设驱动器列表框名为Drive1,目录列表框名为Dir1,文件列表框名为File1,存放数据的文本文件名为D:\test\vb7\data.txt,“累计”按钮名为sum,“总计”文本框(TextBox)名为text1。
【Visual Basic代码】
Private Sub Drive1_Change ()
Dir1.Path = ___(1)___ ‘用户选择的驱动器反映到目录列表框中
End Sub
Private Sub Dir1_Change ()
File1.Path = ___(2)___ ‘用户选择的文件夹改变文件列表框内容
End Sub
Private Sub sum_Click ()
Dim ___(3)___ As New FileSystemObject , ____(4)____ As TestStream
‘创建自己的文件系统对象,说明自己的文本流对象
If Right ( Dir1.Path , 1 ) = “ \ ” Then
Set myTextFile = fso.OpenTextFile ( Dir1.Path + File1.FileName)
End If
Set myTextFile= fso.OpenTextFile ( Dir1.Path + “ \ ” +File1.FileName)
S = 0
Do
D = Val ( myTextFile.ReadRow )
S = S + d
Loop While ___(5)___
Text1.Text = Str$ (S)
End Sub
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) Drive1.Drive
(2) Dir1.Path
(3) fso
(4) myTextFile
(5) d <> 0 - 试题解析:
这些控件常常在一个窗体中工作,当用户在DriveListBox中选择一个驱动器时,DriveListBox控件就更新显示该驱动器上的目录树,当用户在DirListBox中选择一条路径时,FileListBox控件中的内容为该目录下的文件列表,这些活动自动地触发Change事件。但是,这些活动不能自动完成,需要为Change事件编写代码,通过代码将驱动器列表框Drive属性(指明当前驱动器)赋值给目录列表框的Path属性,将目录列表框的Path属性(指明当前路径)赋值给文件列表框的Path属性,即Dir1.Path=Drive1.Drive,File1.Path=Dir1.Path。
“Dim”是声明变量的关键字,在过程sum_Click()中,显然是对文件系统对象fso和文本流对象myTextFlie进行声明。
根据循环控制,空(5)处填写“d<>0”(d不等于0)。
第 8 题
()(15分,每空3分)
【说明】
下面程序的功能是计算并输出某年某月的天数。
【C++程序】
#include < iostream>
using namespace std;
___(1)___ Month ( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) ;
class Date {
public:
Date ( int year , Month m_month ) {
___(2)___ = year ;
if ( m_month < Jan || m_month > Dec ) month = Jan;
else month = m_month;
} ;
~Date () {} ;
bool IsLeapYear () {
return ( ( year % 4 = = 0&&year % 100 != 0 ) || year %400 = = 0);
};
int CaculateDays () {
switch ( ___(3)___ ) {
case Feb : {
if ( ___(4)___ ) return 29;
else return 28;
}
case Jan : case Mar : case May : case Jul : case Aug : case : Oct:
case Dec : return 31;
case Apr : case Jun : case Sep : case Nov : return 30;
}
};
private :
int year;
Month month;
};
Void main () {
Date day ( 2000 ,Feb );
Cout << day. ___(5)___ ();
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
(1) enum
(2) this->year
(3) month
(4) IsleapYear()
(5) CaculateDays - 试题解析:
(1) enum
(2) this->year
(3) month
(4) IsleapYear()
(5) CaculateDays