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