2007年上半年  程序员 下午试卷 第 1 页 (共 11 页)  


全国计算机技术与软件专业技术资格 全全国国计计算算机机技技术术与与软软件件专专业业技技术术资资格格 全国计算机技术与软件专业技术资格( (( (水平 水水平平 水平) )) )考试 考考试试 考试    


200 220000 2007 77 7 年上半年 年年上上半半年年 年上半年        程序员 程程序序员员 程序员            下午试卷 下下午午试试卷卷 下午试卷    

(考试时间  14:00~16:30  共150分钟)  

请按下述要求正确填写答题纸 请请按按下下述述要要求求正正确确填填写写答答题题纸纸 请按下述要求正确填写答题纸    

1. 在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。

2. 在答题纸的指定位置填写准考证号、出生年月日和姓名。

3. 答题纸上除填写上述内容外只能写解答。

4. 本试卷共 8 道题,试题一至试题三是必答题,试题四至试题五选答 1 道,

试题六至试题八选答 1 道。每题 15 分,满分 75 分。

试题号 一~三 四~五 六~八

选择方法 必答题 选答 1 题 选答 1 题

5. 解答时字迹务必清楚,字迹不清时,将不评分。

6. 仿照下面例题,将解答写在答题纸的对应栏内。  

例题 例例题题 例题    

2007 年上半年全国计算机技术与软件专业技术资格(水平)考试日期是(1)

月(2)日。

因为正确的解答是“5月26日”,故在答题纸的对应栏内写上“5”和

“26”(参看下表)。

例题 解答栏

(1) 5

(2) 26  


2007年上半年  程序员 下午试卷 第 2 页 (共 11 页)

试题一 试题一 试题一 试题一 ((((共共共共

15

分分分分))))  


阅读以下说明和流程图 ,回答问题

1

和问题

2

,将解答填入答题纸的对应栏内 。

[[[ [说明 说明说明说明 ]]]]    为便于管理 ,每本正式出版 的图书都印有国际标准书号 。标准书号由 “

ISBN

”和

10

个数字组成 ,其格式为 : ISBN

组号

-

出版者号

-

书名号

- 校验码 。其中 ,校验码是根据前面 9 个数字计算得到的 ,用于计算机自动校验 。假设标准书号的 10

个数字依次是

a(1),a(2),…,a(10)

,则校验码

a(10)

的设置应使

S=10*a(1)+9*a(2)+8*a(3)+…+1*a(10)

能被

11

整除 。如果校验码

a(10)

应设置成

10

,则规定以 “ X ”表示之 。例如 ,信息处理技术员考试大纲的标准书号为 : ISBN

7-302-11191-X。第

1

段上的数字 “ 7

”是国际

ISBN

中心分配给中国

ISBN

中心管理的组号 。第

2

段上的 “ 302 ”表示清华大学出版社 。标准书号的校验过程如图 1-1 所示 ,计算校验码的过程如图 1-2 所示 ,其中 , Mod(S,11)

表示

S

除以

11

得到的余数 。

[[[ [流程图 流程图 流程图 流程图 ]]]]

a(10)= ’X’?

10

a(10)

0

S

循环开始

I = 1,10

S +    ( 1 )  

S

循环结束

Mod(S,11)=0? 校验正确 书号有错图 1-1

校验过程 图 1-2  

计算校验码的过程

0

S

循环开始

I = 1, ( 2 )  -

    ( 3 )   -

循环结束

a(10) = 10 ?

Mod(S,11)

R

  ( 4 )    

a(10)

’X’

a(10)

[[[ [问题 问题问题问题 1]11]]1] 请填补流程图中的空缺 ( 1

)~(

4 )。    [[[ [问题 问题问题问题 2]22]]2] 设“程序员考试大纲 ”标准书号前 9

个数字为 7-302-08493,请写出其校验码 。

Y

N

Y N Y

N

2007年上半年  程序员 下午试卷 第 3 页 (共 11 页)

试题二 试题二 试题二 试题二 ((((共共共共151155 15分 分分分))))    阅读以下说明和 C语言函数 ,将解答填入答题纸的对应栏内 。 [[[ [说明 说明说明说明 ]]]]    下面待修改的 C 程序完成的功能是 :对于给定的一个长正整数 ,从其个位数开始 ,每隔一位取一个数字 (即取其个位 、百位 、万位等数字 ), 形成一个新的整数并输出 。例如 ,将该程序修改正确后 ,运行时若输入 “ 14251382 ”,则输出的整数为 “ 4532

”。

下面给出的

C

程序代码中有五个错误 ,请指出所有的错误 。     [C[[CC [C程序代码 程序代码 程序代码 程序代码 ]]]]    行号行号行号行号    代码 代码代码代码    01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h>  int main() {   long  n, num;    int i;    do {       printf("请输入一个正整数 : ");      scanf("%ld",n);   }while(n <= 0);   k = 1;   for (i = 1; n >= 0; i++) {        if (i % 2 = 1)  {            num = num + (n % 10) * k;        k = k * 10;        }        n = n / 10;     }   printf("新数据为 :%d \n",num);     return 0; }  

2007年上半年  程序员 下午试卷 第 4 页 (共 11 页) 试题三 试题三 试题三 试题三 ((((共共共共151155 15分 分分分))))    阅读以下说明和 C语言函数 ,将应填入  (n)  处的字句写在答题纸的对应栏内 。 [[[ [说明 说明说明说明 ]]]]    函数 count_ months(DATE start, DATE end)的功能是 :计算两个给定日期之间所包含的完整月份数 。 该函数先算出起止日期中所含的完整年数 ,再计算余下的完整月份数 。 规定两个相邻年份的同月同日之间的间隔为 1年。例如 ,2007.5.30~2008.5.30的间隔为 1年。若相邻两年中前一年是闰年 ,并且日期是 2月29日,则到下一年的 2月28日为 1年,即2008.2.29~2009.2.28的间隔为 1年。 规定两个相邻月份的相同日之间的间隔为 1个月 ,但需要特别考虑月末的特殊情况 。例如 ,2007.1.29~2007.2.28的间隔为 1个月 ,同理 , 2007.1. 30330030 ~2007.2.28、2007.1. 31331131 ~2007.2.28的间隔都是 1个月 。 计算起止日期间隔不足一年的完整月份数时 ,分两种情况 : 1)起止日期不 跨年度 。先用 终 止日期的月号 减去 起始日期的月号得到月份数 ,然后再根据情况 进 行修正 。例如 ,起止日期为 2008.3.31~2008.9.20, 通 过月号算出月份数为 6。修正时 ,通过调 用函数 makev alid将2008.9.31改为 2008.9.30, 与终 止日期2008.9.20 比较 后 ,将月份数修正为 5。 2)起止日期 跨年度 。计算 方法 如下例所示 :对于起止日期 2008.7.25~2009.3.31,先计算 2008.7.25~2008.12.25的月份数为 5,再算出 2008.12.25~2009.3.25的月份数为 3, 因此 2008.7.25~2009.3.31之间的完整月份数为 8。 日期数据 类型 定义 如下 : ty pedef struct {    int y ear;   int month;   int da y ; /*日期的年号 (4位)、 月和日号 */ }DATE; 程序中使用的函数 cmp_date()、is LeapY ear()和make v alid()说明如下 : 函数名 参数 返回值 说明 cmp_date DATE start, DATE end -1:start<end 0: start=end 1: start>end 比较两个日期的大小 ,例如 : 2007.1.31小于 2007.5.15, 2008.11.23等于 2008.11.23, 2008.1.31大于 2007.5.15 isLeapYear int year 1:year表示的年号是闰年 0:year表示的年号不是闰年 判断给定年号是否为闰年 makevalid DATE *r 无 若日期 *r是非法的 ,即*r不是闰年时其日期为 2月29日,或者其 4、6、8、10等月份出现了 31日,则将其日期改为当月最后 一天的日期 。    

2007年上半年  程序员 下午试卷 第 5 页 (共 11 页) [C[[CC [C语言函数 语言函数 语言函数 语言函数 ]]]]    int count_months(DATE start, DATE end) {      int y ears = 0, months = 0;      DATE r;           if (cmp_date(start,end) > 0) {      r = start; start = end; end = r;    }     y ears = end. y ear - start. y ear;  /*计算年数 */     r = start;      r. y ear = end. y ear;          if (cmp_date(r,end) > 0) {     /*修正年数 */           (1)  ;       r. y ear--;    }     if (r. y ear < end. y ear) {      /* 跨年度时 ,先计算到 12月的月份数 */      months =    (2)  ;      r.month = 12;    }     months += (end.month + 12 - r.month) % 12;    r. y ear = end. y ear;     r.month = end.month;    make v alid(  (3)  );         /*将日期 r修正为有 效 日期 */    if (cmp_date(r,end) > 0)      /*修正月份数 */     (4)  ;       months +=   (5)  ;          /*计算 总 月份数 */    return months; }

2007年上半年  程序员 下午试卷 第 6 页 (共 11 页) 试题四 试题四 试题四 试题四 ((((共共共共151155 15分 分分分))))    阅读以下说明和 C语言函数 ,将应填入  (n)  处的字句写在答题纸的对应栏内 。 [[[ [说明 说明说明说明 ]]]]    函数 sort( NO DE *head)的功能是 :用 冒泡排 序法对 单链 表中的 元素进 行 非递减排序。对于两个相邻 结点 中的 元素 ,若 较小 的 元素 在前面 ,则 交换这 两个 结点 中的 元素值 。其中 ,head指 向链 表的 头结点 。排 序时 ,为 了避免 每趟都 扫描 到链 表的 尾结点 ,设置一个指 针 endptr,使其指 向下 趟扫描 需要到 达的最 后一个 结点 。例如 ,对于图 4-1 (a)的链表进 行一 趟冒泡排 序后 ,得到图 4-1 ( b )所示的 链表 。           图4-1 链 表的 结点类型 定义 如下 : ty pedef struct N ode {    int data;    struct N ode *ne xt; }NO DE; [C[[CC [C语言函数 语言函数 语言函数 语言函数 ]]]]    v oid sort( NO DE *head)  {  NO DE *ptr,*preptr,*endptr;    int tempdata;     ptr = head -> ne xt;    while (   (1)   )  /* 查找 表 尾结点 */         ptr = ptr -> ne xt;    endptr = ptr;   /* 令 endptr指 向表 尾结点 */        ptr =   (2)  ;    while(ptr ! = endptr) {        while(   (3)  ) {            if (ptr->data > ptr->ne x t->data){                tempdata = ptr->data;  /* 交换 相邻 结点 的数据 */                ptr->data = ptr->ne x t->data;                 ptr->ne x t->data = tempdata;            }            preptr =   (4)  ;         ptr = ptr -> ne xt;        }        endptr =   (5)  ;    ptr = head->ne xt;    } } 23 13 42 5 ∧ head endptr (a) 13 23 5 42 ∧ head endptr (b)

2007年上半年  程序员 下午试卷 第 7 页 (共 11 页)

试题五 试题五 试题五 试题五 ((((共共共共151155 15分 分分分))))        阅读以下应用说明以 及用V isual B asic开 发 过程中所 编 写的 程序代码 ,将应填入  _(n) 处的字句写在答题纸的对应栏内 。 [[[ [应用说明 应用说明 应用说明 应用说明 ]]]]    某 应用的 登录界 面如下 :  登录界 面中的 文本框txtUserI D和t xtP assword分别用于 接受 用户 输入的用 户 名和口令 , 命令按钮 为确定 (cmdO k)和取 消 (cmdCancel) 。AD O 数据 控件 Adodc1 与 数据 库Emplo y eeData 连接 。在Emplo y eeData中,表“ U sers”的字段 “UserI D”和“ P swd”分别 记录了 所有的 合法 用户 名和 口令 。 在 登录界 面中 ,输入正确的用 户 名和 口令 并 单击 “确定 ” 按钮 后, 就会打 开应用程序的 主窗口 frmApp。用 户名 或密 码输入错误时 ,给出 提 示信息并 返回 登录界 面 。 [Visual Basic [Visual Basic [Visual Basic [Visual Basic程序代码 程序代码 程序代码 程序代码 ]]]] Private Sub cmd OK _Click()  Adodc1.Connection S tring = " Prov ider= M icrosoft. Jet.OLEDB .4.0;Data S ource=D:\data\Emplo y eeData.md b;P ersist S ecurit y Info=F alse" Adodc1. R ecord S ource = "select *   (1)  " Adodc1. R efresh     Do         usrname =   (2)           pwd = Adodc1. R ecordset(" P swd")         Adodc1. R ecordset. MoveNext     Loop U ntil (usrname =   (3)  ) O r (Adodc1. R ecordset.E OF)     I f usrname <> t xtUserID.Tex t Then        MsgBox " 无效 的用 户I D,请 重 新输入 ! ", , " 提 示信息 "     Else        I f   (4)   Then           MsgBox " 欢迎进 入 系统主界 面! ", , " 提 示信息 "           U nload me             (5)                       ’ 打 开应用程序的 主窗口        Else           MsgBox " 无效 的用 户密 码 ,请 重 新输入 ! ", , " 提 示信息 "        End If     End If End Sub

2007年上半年  程序员 下午试卷 第 8 页 (共 11 页) 试题六 试题六 试题六 试题六 ((((共共共共151155 15分 分分分))))    阅读下 列 说明和 C++代码 ,请回答问题 1至 问题 3,将解答写在答题纸的对应栏内 。 [[[ [说明 说明说明说明 ]]]]    已知 下列 程序运行时的输出应为 : 1:1 1:1 1:1 [[[ [问题 问题问题问题 1] 1] 1] 1]     请补 齐下述 代码中的空缺 1和2。 [[[ [问题 问题问题问题 2] 2] 2] 2]     类S tock的定 义 中有两处错误 ,请指出错误所在行号并给出该行修改后的完整 结果。 [[[ [问题 问题问题问题 3] 3] 3] 3]     指出该代码是 否存 在内 存泄漏 。 [C++ [C++ [C++ [C++ 程 程程程序序序序]]]]                              01  #include <iostream> 02 using namespace std; 03  class S tock{ 04  protect: 05    

1

 {}; 06   S tock(int n, int pr=1){ 07    shares = n; share_ v al=pr; 08   }; 09   void ~S tock(){}; 10  pu b lic: 11   //成员函数 12  v oid output(){  13    

2

   << shares << ":" << share_ v al << endl;  14  } 15  pri v ate: 16   //成员 变量 17   int shares; 18   int share_ v al; 19  }; 20   21  v oid main(){ 22   S tock a(1);   a.output(); 23   S tock b ;   b .output(); 24   S tock c = S tock();  c.output(); 25  }

2007年上半年  程序员 下午试卷 第 9 页 (共 11 页)

试题七 试题七 试题七 试题七 ((((共共共共

15

分分分分))))


阅读以下应用说明 、 Visual Basic

开发 说明以 及 程序代码 ,将应填入  (n)  的字句写在答题纸的对应栏内 。

[

应用说明 应用说明 应用说明 应用说明

] 某交通灯演 示程序 启 动后 ,其运行 窗口 中包 括红绿灯 标志以 及当 前 红绿灯状态剩 余秒 数的动 态显 示 (如下图 )。 红灯与绿灯持续 的时间分别为 30

秒与

40 秒。 持续 时间 结束时,立即 变更红绿灯 ,并 重新显示剩余秒数。          

[Visual Basic

开发说明 开发说明 开发说明 开发说明

]


 在开 发 过程中 ,先在 窗体 内 制作 形状“ 红绿 灯框架 ”(长 方形,透明 ), 在该 框架 中,上 部制作 形状“ 红灯 ”(ShpR ed, 圆形 ), 默认属性 为透明;下 部制作 形状“ 绿灯 ”(ShpG reen,圆形 ), 初 始设置其填 充方 式 属性FillSty le为 实心 ,填 充颜色属性 F illColor为 绿色 。 再设置两个图 像框 (I mage1在 左,I mage2在 右 ), 使其能分别 装 入数字图 像文件 ,以显示当前 红绿灯状态剩 余的 秒数 。10个数字图 像文件 N0.b mp~N9.b mp分别用于 显示数字 0、1、 … 、9, 这些文件存放 在该应用程序所在 目录 中 ,以便在程序运行时 按 需要选择装 入这 两个图 像框 。为使图 像文件装 入图 像框 时能自动改 变大小以适 应图 像框 ,这些图 像框 的S tretch 属性 都应设置成 (1) 。为使 这些 数字能每 秒变化 一次 ,开 发窗体 中设置 了 计时 器 Timer1,其Ena ble 属性 设置成 True,其 Interval 属性 设置成 1000。 程序中 , 全局变量 L ight用以标 志当 前 红灯 (0) 或绿灯状态 (1), R edT和 G reenT分别表示 红灯或绿灯状态剩 余的 秒数 。 计时 器 Timer1的定时过程是在该程序 启动1秒后首次执 行的 ,以后每隔 1 秒执 行1次。开 发 者应考虑对以下 四 种情况的处理 : 绿灯持续 、 绿灯转红灯 、 红灯持续 、 红灯转绿灯 。 过程LoadNumb er的功能是 :将 红绿灯剩 余秒数N (2位整数 )分 离 出两个一位数 i与j ,再将其 变换 成字 符,删 除前面 可能 产生 的空格 ,再将数字图 像文件 Ni.bmp 与Nj.bmp装 入两个图 像框 (其中 i 与j 应以相应的数字字 符代替 )。

2007年上半年  程序员 下午试卷 第 10 页 (共 11 页)

[Visual Basic

程序代码 程序代码 程序代码 程序代码

] Public L ight As I nteger, R edT As I nteger, G reenT As I nteger Private Sub Form_L oad()        L ight = 1  :  G reenT = 40  :  R edT = 0 ’ 初始化 设置     End Sub Private Sub Timer1_Timer()               ’ 计时 器 定时过程   If L ight = 1 Then                      ’ 绿灯状态 时        (2)        If G reenT > 0 Then                 ’ 绿灯持续 时 Call LoadNumber(G reenT)        ’ 调 用过程 ,显 示数字 G reenT       Else                               ’ 绿灯转红灯 时           ShpRed.FillSty le = 0           ’ 置 红灯 形 状实 心           ShpRed.F illColor = vbR ed       ’ 为 红灯 形状填 充红色           ShpG reen. FillSty le = 1         ’ 置 绿灯 形 状透 明           Call LoadNumb er(30)           L ight = 0  :  R edT = 30       End If Else                           ’ 红灯状态 时       R edT = R edT - 1       If R edT > 0 Then               ’ 红灯持续 时 Call LoadNumber(R edT)       Else                           ’ 红灯转绿灯 时          ShpRed.FillSty le = 1          ShpG reen. FillSty le = 0          ShpG reen. F illColor = vbG reen           (3)           L ight = 1  :  G reenT = 40       End If End If End Sub Sub LoadNumber(N As I nteger)     ’ 根据 剩余秒数N 将数字图 像装 入图 像框   Dim i As I nteger, j As I nteger   i = I nt(  (4)  )   j =  (5)    I mage1. P icture = LoadP icture(" N"& Trim( S tr(i)) &".b mp") ’ 显示十位上的数字   I mage2. P icture = LoadP icture(" N"& Trim( Str(j))&".b mp") ’ 显示个位上的数字 End Sub

2007年上半年  程序员 下午试卷 第 11 页 (共 11 页)

试题八 试题八 试题八 试题八 ((((共共共共151155 15分 分分分)))) 阅读以下说明和 Jav a代码 ,请回答问题 1和问题 2,将解答写在答题纸的对应栏内 。 [[[ [说明 说明说明说明 ]]]]        已知类 S tock和 类cxyjav a都定 义在cxyjava.java 文件 中,类S tock的定 义 中第14行前 共有四 行出 现了 错误 ,将下面代码修改正确并完 善 后的输出 结 果为 : 0:0                                                       1:23                                                     [[[ [问题 问题问题问题 1]11]]1]    请指出错误所在行号并给出该行修改后的完整 结果 。 [[[ [问题 问题问题问题 2]22]]2]    请补 齐第 21行代码中的空缺 。 [Java [Java [Java [Java 代码 代码代码代码 ]]]]             01  pu b lic class S tock{ 02   static { 03        shares = 0; 04        share_ v al = 0.0; 05   } 06   pu blic S tock(){getData();} 07   pu blic S tock(int n, int pr=0){ 08      shares = n; 09      share_ v al = pr; 10      getData();  11     } 12   pu b lic  v oid getData(){ 13    Sy stem.out.println(shares + ":"+share_ v al); 14   } 15   pri v ate int shares; 16   pri v ate int share_ v al; 17  }; 18   19  pu b lic class c xyjava{ 20   pu b lic static v oid main( S tring args [] ){ 21    S tock a =    (1)   ; 22    S tock b = new S tock(1,23); 23    //其 它无 输出代码 省略 24   } 25  }