全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2007 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 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 ( 参 看 下 表 ) 例 题 2007 年 上 半 年 程 序 员 下 午 试 卷 第 1 页 ( 共 11 页 ) 解 答 栏 (1) 5 (2) 26
:ISBN :ISBN,Mod(S,11) ISBN 共 面 个 15 10 9 a(1),a(2),,a(10), 整 则 码 除 以 国 图 11 a(10) ISBN 1-1 S 11 试 题 阅 一 读 ( 以 下 说 分 明 ) 和 流 程 图, 回 答 问 题 和 问 题 2, 将 解 答 填 入 答 题 纸 的 对 应 栏 内 前 [ 说 明 为 数 ] 便 字 于 组 管 成 理,, 其 每 格 本 式 正 式 出 版 组 图 书 出 都 版 印 者 有 国 际 书 标 名 准 书 校 号 验 码 标 准 其 书 中 号 由 校 验 码 是 根 和 据 1 员 个 数 字 计 算 得 到 的, 用 于 计 算 机 自 动 校 验 假 设 标 准 书 号 个 数 字 依 次 是 中 校 验 的 设 置 应 能 被 书 考 试 除 大 纲 如 的 果 标 校 准 验 书 号 为 应 设 置 7-302-11191-X 则 规 定 以 X 段 表 上 示 的 之 数 字 例 7 如, 信 是 息 国 处 理 技 术 [ 流 心 号 程 分 的 图 配 校 ] 给 验 得 中 过 到 程 的 如 余 数 中 心 所 管 示 理, 计 的 算 组 校 号 验 码 的 段 过 上 程 的 如 所 表 示, 清 其 华 中 大 学 出 版 社 表 标 示 准 循 环 开 始 开 始 循 环 结 束 循 环 结 束 校 验 正 确 书 号 有 错 [ 问 题 2] 1] 设 请 填 程 补 图 序 流 员 程 校 验 过 程 图 计 算 校 验 码 的 过 程 1-1 2007 考 图 试 中 年 大 的 空 缺 (1)~(4) 上 纲 半 年 标 准 程 序 书 员 号 下 午 试 个 卷 数 第 字 为 2 页 7-302-08493, ( 1-2 共 11 页 ) 请 写 出 其 校 验 码 Y a(10)=x? 0 S I = 1,10 S + ( 1 ) N S Mod(S,11)=0? 码 a(10) Y N 成 号 - 10, 第 使 S=10*a(1)+9*a(2)+8*a(3)+ +1*a(10) 2 号 - 10 a(10) 前 9 号 第 302 - 图 1 1-2 的 10 0 S I = 1, ( 2 ) - 际 ISBN ( 3 ) - Mod(S,11) R ( 4 ) a(10) Y a(10) = 10? N X a(10)
14251382, 4532 试 [ 题 二 ( 共 15 分 ) 每 说 隔 明 阅 一 ] 读 位 以 待 取 下 修 一 说 改 个 明 数 和 字 C ( 程 语 即 序 言 取 完 函 其 成 数 个 的, 位 功 将 能 解 百 是 答 位 : 填 对 入 于 万 答 给 位 题 定 等 纸 的 数 一 字 对 个 ), 应 长 形 栏 正 成 内 整 一 数 个, 新 从 的 其 整 个 数 位 并 数 输 开 出 始, [C 例 程 如, 将 该 程 序 修 改 正 确 后, 运 行 时 若 输 入 则 输 出 的 整 数 为 行 序 下 面 给 出 程 序 代 码 中 有 五 个 错 误, 请 指 出 所 有 的 错 误 01 02 代 码 ] 03 号 代 码 04 #include 05 06 int 07 { main() <stdio.h> 08 09 10 11 do long int i; n, num; 12 13 14 }while(n { 15 k printf(" 请 输 入 一 个 正 整 数 :"); 16 for = scanf("%ld",n); 1; (i 17 if = 1; <= n 0); >= 0; i++) { 18 19 20 }(i% 2 = 1) { 21 n = k num n = / k = 10; * num 10; + (n% 10) * k; 22 } printf(" return } 0; 新 数 据 为 :%d\n",num); 2007 年 上 半 年 程 序 员 下 午 试 卷 第 3 页 ( 共 11 页 ) 的 的 C C
试 题 三 ( 共 15 分 ) 包 [ 说 明 函 阅 ] 数 读 以 count_ 下 说 明 months(date 和 C 语 言 函 数 start,, 将 应 填 DATE 入 end) (n) 的 功 处 能 的 是 字 : 句 计 写 算 在 两 答 个 题 给 纸 定 的 日 对 期 应 之 栏 间 内 所 的 含 的 完 整 月 份 数 月 该 函 数 先 算 出 起 年 止 日 期 同 月 所 同 含 日 的 之 完 间 整 的 间 数 隔, 为 再 1 计 年 算 余 例 下 如 的,2007.5.30~2008.5.30 完 整 月 份 数 例 间 隔 1 若 相 邻 两 年 中 前 一 年 是 闰 年, 并 且 日 期 是 2 月 29 日, 则 到 下 一 年 的 2 2007.1.31 如 28 规,2007.1.29~2007.2.28 日 定 为 两 1 个 年 相, 邻 即 月 2008.2.29~2009.2.28 份 相 同 日 之 间 的 隔 间 为 隔 1 的 为 间 个 1 隔 月 个 为 月, 同 1 但 年 理 需, 要 特 2007.1.30 别 考 虑 30~2007.2.28 月 末 的 特 殊 情 况 后 31~2007.2.28 的 间 隔 都 是 1 个 再 计 1) 根 算 据 情 况 进 行 不 修 间 跨 正 隔 年 不 度 例 足 如 一 先, 年 用 起 的 终 止 完 止 日 整 日 期 月 期 份 的 2008.3.31~2008.9.20, 数 月 时 号, 减 分 去 两 起 种 始 情 日 况 期 : 的 月 号 通 得 过 到 月 月 号 份 算 数 出, 然 先 6 修 正 时, 通 过 调 用 函 数 makevalid 将 2008.9.31 改 为 2008.9.30, 与 终 止 日 期 数 2008.9.20 计 为 2) 比 较 后, 将 月 份 数 修 正 为 5 日 起 止 日 期 跨 年 度 计 算 方 法 如 下 例 所 示 : 对 于 起 止 日 期 2008.7.25~2009.3.31, typedef 算 3, 期 2008.7.25~2008.12.25 的 月 份 数 为 5, 再 算 出 2008.12.25~2009.3.25 的 月 份 int 因 数 此 据 year; 类 2008.7.25~2009.3.31 struct 型 定 义 int { 如 下 month; : int 之 间 day; 的 完 整 /* 月 日 份 期 数 的 为 年 8 号 (4 位 ) 月 和 日 号 */ cmp_date 程 函 }DATE; 序 数 中 名 使 用 DATE 的 函 参 start, end 数 cmp_date() isleapyear() -1:start<end 0: 和 makevalid() 如 下 : start=end start>end 返 回 值 比 较 两 个 日 期 说 的 明 大 小, 例 如 : isleapyear 2007.1.31 2008.11.23 小 等 2007.5.15, 2008.11.23, makevalid DATE int year *r 无 1:year 0:year 表 示 的 年 号 是 不 闰 是 年 闰 年 若 2008.1.31 判 大 于 闰 断 给 定 年 号 是 否 为 闰 年 者 31 期 *r 是 非 法 的, 即 *r 不 是 2007 年 上 半 年 程 序 员 下 午 试 卷 第 4 一 年 其 页 天 日 时 4 6 8 10 其 日 期 为 2 等 月 29 份 出 日 现, 了 或 ( 的, 则 将 其 日 期 改 为 当 月 最 后 共 日 11 期 页 )
[C int { 语 言 函 数 ] DATE count_months(date start, DATE end) if int (cmp_date(start,end) years r; = 0, months = 0; > 0) { years } r = start; end.year - start.year; = end; end /* = 计 r; 算 年 数 */ if r r.year = (cmp_date(r,end) start; = (1) end.year; ; > 0) { /* 修 正 年 数 */ if } r.year--; }(r.year months < = end.year) (2){; /* 跨 年 度 时, 先 计 算 到 12 月 的 月 份 数 */ months r.month = 12; r.year makevalid( if (cmp_date(r,end) += (end.month + 12 - r.month) % 12; (4) = end.year; (3) ; ); > 0) r.month /* = 将 修 end.month; 日 正 期 月 份 r 修 数 */ 正 为 有 效 日 期 */ } months return += months; (5); /* 计 算 总 月 份 数 */ 2007 年 上 半 年 程 序 员 下 午 试 卷 第 5 页 ( 共 11 页 )
[ 试 题 阅 四 读 ( 以 共 下 15 说 分 明 ) 序 说 明 对 函 ] 于 数 两 sort(node 个 相 邻 结 和 点 C *head) 中 语 的 言 元 函 的 素 数 功, 若 能 将 较 是 应 小 : 填 的 用 入 元 冒 素 泡 (n) 在 排 前 序 面 法 处, 对 则 的 单 交 字 链 换 句 表 这 写 中 两 在 的 个 答 元 结 题 素 点 纸 进 中 的 行 的 对 非 元 应 递 素 栏 减 值 内 排 其 个 链 表 中 指 针,head 进 行 endptr, 一 趟 指 冒 向 泡 链 使 排 表 其 序 的 指 后 头 向, 结 下 得 点 趟 到 扫 排 图 描 序 需 4-1 时 要, 到 (b) 为 达 所 了 的 示 避 最 的 免 后 链 每 一 表 趟 个 都 结 扫 点 描 到 例 链 如 表, 的 对 尾 于 结 图 点 4-1, 设 (a) 置 的 一 5 endptr 23 13 42 (a) endptr 13 23 5 42 链 typedef 表 的 结 点 类 型 定 义 如 下 : 图 4-1 }NODE; struct Node { [C int data; void struct Node *next; { 语 NODE int 言 函 数 ] while sort(node tempdata; *ptr,*preptr,*endptr; head ( (1) -> *head) next; )/* 查 找 表 尾 结 点 */ while(ptr endptr ptr = ptr -> next; = = (2) ptr;!= endptr) (3) ;/* 令 ) endptr {{ 指 向 表 尾 结 点 */ } if (ptr->data ptr->next->data tempdata = = > ptr->data; ptr->next->data; ptr->next->data){ = tempdata; /* 交 换 相 邻 结 点 的 数 据 */ }} } endptr preptr = = (5)(4) ; ; ptr = head->next; = ptr -> next; 2007 年 上 半 年 程 序 员 下 午 试 卷 第 6 页 ( 共 11 页 ) head head (b)
_(n) 试 [ 应 题 用 阅 五 说 ( 共 15 分 ) 某 读 处 明 应 以 的 ] 用 下 字 的 应 句 登 用 写 录 说 在 明 界 答 以 面 题 及 如 纸 用 下 的 : 对 Visual 应 栏 内 Basic 开 发 过 程 中 所 编 写 的 程 序 代 码, 将 应 填 入 口 EmployeeData 别 令 登, 录 命 界 令 面 按 中 钮 的 为 文 确 本 定 框 (cmdok) txtuserid 和 取 消 和 (cmdcancel) txtpassword ADO 分 别 用 数 于 据 接 控 受 件 用 户 Adodc1 输 入 的 与 用 数 户 名 据 库 和 序 记 的 在 主 录 登 窗 了 录 所 口 界 有 frmapp 面 的 连 中 合 接, 法 输 在 用 入 户 EmployeeData 正 名 确 和 或 的 口 密 用 令 码 户 输 名 入 中 和 错, 口 误 表 令 时 Users 并, 单 给 击 出 提 确 的 示 定 字 信 段 息 按 UserID 并 钮 返 后 回, 登 就 录 会 和 界 打 Pswd 面 开 应 用 分 程 Source=D:\data\EmployeeData.mdb;Persist Private [Visual Adodc1.ConnectionString Basic 程 序 代 码 ] Adodc1.RecordSource Sub cmdok_click() Adodc1.Refresh = "Provider=Microsoft.Jet.OLEDB.4.0;Data Do Security Info=False" usrname = (2) = "select* (1)" If Loop pwd Adodc1.Recordset.MoveNext = Adodc1.Recordset("Pswd") Else MsgBox Until (usrname = (3)) Or (Adodc1.Recordset.EOF) If usrname (4) " 无 <> 效 txtuserid.text 的 Then 用 户 ID, 请 重 Then 新 输 入!",," 提 示 信 息 " Else MsgBox Unload (5) me 欢 迎 进 入 系 统 主 界 面!",, 打 " 提 开 示 应 信 用 息 程 " 序 的 主 窗 口 End Sub End End If MsgBox If " 无 效 的 用 户 密 码, 请 重 新 输 入!",," 提 示 信 息 " 2007 年 上 半 年 程 序 员 下 午 试 卷 第 7 页 ( 共 11 页 )
试 [ 说 题 明 阅 已 六 ] 读 知 ( 下 共 列 15 说 程 分 明 序 ) 和 运 行 C++ 时 代 的 码 输, 出 请 应 回 为 答 : 问 题 1 至 问 题 3, 将 解 答 写 在 答 题 纸 的 对 应 栏 内 1] 1:1 [ 请 补 2] 齐 下 述 代 码 的 空 缺 1 和 2 [C++ 问 指 类 题 出 程 Stock 3] 该 序 代 ] 的 码 定 是 义 否 中 存 有 在 两 内 处 存 错 泄 误 漏, 请 指 出 错 误 所 在 行 号 并 给 出 该 行 修 改 后 的 完 整 结 果 04 01 02 03 using #include class protect: Stock{ namespace <iostream> std; 08 05 (1){}; 09 07 06 void Stock(int }; shares ~Stock(){}; n, = n; int share_val=pr; pr=1){ 13 10 public: 14 11 // 函 数 15 12 void output(){ 16 (2) << shares << ":" << share_val << endl; 17 } 18 private: 19 // 成 员 变 量 20 shares; 21 int share_val; 22 }; 23 24 void main(){ 25 } Stock b; a(1); c = Stock(); b.output(); c.output(); a.output(); 2007 年 上 半 年 程 序 员 下 午 试 卷 第 8 页 ( 共 11 页 )
写 试 题 阅 七 读 ( 以 下 应 分 用 ) 应 在 用 答 某 说 题 交 明 纸 通 的 灯 对 演 应 示 说 栏 程 明 内 序 启 动 后, 其 运 行 窗 发 口 说 中 明 包 以 括 及 红 程 绿 序 灯 代 标 码 志, 以 将 及 应 当 填 前 红 绿 灯 状 的 态 字 剩 余 句 秒 束 数 时, 的 动 立 态 即 显 变 示 更 ( 红 如 绿 下 灯 图,) 并 重 红 新 灯 显 与 示 绿 剩 灯 余 持 秒 续 数 的 时 间 分 别 秒 秒 持 续 时 间 结 [ 应 明 共 15 ] 开 Visual Basic 圆 上 部 制 在 作 开 形 发 状 过 开 程 红 发 中 说, (ShpRed, 先 明 在 窗 体 内 圆 制 形 作 ), 形 默 状 认 属 红 性 绿 灯 透 框 明 架 ; 下 ( 部 长 制 方 作 形, 状 透 明 绿 ), 灯 (ShpGreen, 在 该 框 架 中 数 形 ), 初 始 设 置 其 填 充 方 式 属 性 FillStyle 为 实 心, 填 充 颜 色 属 性 FillColor 为 绿 色 选 再 设 置 (Image1 左,Image2 在 右 ), 使 其 能 分 别 装 入 数 字 文 件, 些 以 显 字 择 示 装 0 1 9, 入 当 这 前 两 红 个 绿 图 灯 像 状 这 框 态 些 剩 文 为 余 件 使 的 存 图 秒 放 像 数 在 文 10 该 件 应 装 个 用 入 数 程 图 字 序 像 图 所 框 像 在 时 文 目 能 件 录 自 N0.bmp~N9.bmp 中 动, 改 以 变 便 大 在 小 程 以 序 适 分 运 应 别 行 图 用 时 像 按 于 框 需 显, 示 这 要 分 体 图 中 像 设 框 置 的 了 计 Stretch 时 器 Timer1, 属 性 都 其 应 Enable 设 置 成 属 (1) 性 设 置 成 为 True, 使 这 些 其 数 字 Interval 能 每 秒 变 属 化 性 一 设 次 置, 成 开 1000 发 窗 1 次 别 表 计 程 开 示 时 序 发 红 器 中 者 灯, Timer1 应 全 或 考 局 绿 虑 变 灯 的 对 量 状 定 以 态 Light 时 下 剩 过 四 余 程 种 用 的 是 情 以 秒 在 况 标 数 该 的 志 程 处 当 序 理 前 启 : 红 动 绿 灯 灯 1 (0) 秒 持 后 续 或 首 次 绿 执 灯 状 行 转 态 的 红 (1),RedT, 灯 以 后 红 每 灯 隔 持 和 续 1 秒 GreenT 执 红 行 灯 装 转 与 入 绿 j, 两 灯 过 再 个 程 将 图 其 LoadNumber 像 变 框 换 ( 成 其 字 中 符 的, i 功 删 与 能 除 j 是 前 应 : 面 以 将 可 相 红 能 应 绿 产 的 灯 生 数 剩 的 字 余 空 字 秒 格 符 数, 代 再 N(2 替 将 ) 数 位 字 整 图 数 像 ) 文 分 件 离 Ni.bmp 出 两 个 与 一 Nj.bmp 位 数 i 2007 年 上 半 年 程 序 员 下 午 试 卷 第 9 页 ( 共 11 页 ) [Visual Basic 开 明 ] 为 30 与 40 入 (n)
Private Public Light 程 序 代 As 码 Integer, RedT As Integer, GreenT As Integer Private End Sub Form_Load() If Light Sub Light = 1 : GreenT = 40 : RedT = 0 初 始 化 设 置 If Sub = Timer1_Timer() 1 Then 计 时 器 状 定 态 过 程 Else (2) GreenT Call ShpRed.FillStyle > 0 Then 绿 持 续 时 ShpRed.FillColor LoadNumber(GreenT) 调 用 过 程, 显 示 数 字 GreenT ShpGreen.FillStyle = vbred 01 为 置 红 绿 灯 灯 转 形 红 状 灯 时 填 实 透 心 充 明 红 色 Else End Call LoadNumber(30) RedT Light = 0 : RedT = 30 If If 灯 状 态 时 Else Call RedT = RedT - 1 ShpRed.FillStyle > 0 Then 红 持 续 时 ShpGreen.FillStyle LoadNumber(RedT) ShpGreen.FillColor 灯 转 绿 灯 时 (3) = 1 = vbgreen 0 End Light = 1 : GreenT = 40 Sub End Sub LoadNumber(N End If Dim If i Int( i As Integer, (4) As Integer) ) j As Integer 根 据 剩 余 秒 数 N 将 数 字 图 像 装 入 图 像 框 End Sub Image2.Picture j Image1.Picture = (5) 2007 年 = 上 LoadPicture("N"&Trim(Str(j))&".bmp") LoadPicture("N"&Trim(Str(i))&".bmp") 十 半 年 程 序 员 下 午 试 卷 第 10 页 ( 共 11 页 ) 显 示 个 位 上 的 数 字 [Visual Basic 程 码 ] 红 红 绿 绿
试 题 八 ( 共 15 分 ) 14 [ 说 明 阅 已 ] 读 知 以 类 下 Stock 说 明 和 类 Java cxyjava 代 码, 请 都 回 定 答 义 问 在 题 cxyjava.java 1 和 问 题 2, 将 文 解 件 答 中 写, 在 类 答 Stock 题 纸 的 对 定 应 义 栏 中 内 第 行 前 1] 共 有 四 行 出 现 了 错 误, 将 下 面 代 码 修 改 正 确 并 完 善 后 的 输 出 结 果 为 : [Java[ 问 题 2] 指 出 错 误 所 在 行 号 并 给 出 该 行 修 改 后 的 完 整 结 果 01 请 补 代 public 齐 码 第 ] 21 class 行 代 码 Stock{ 中 的 空 缺 05 02 static { 06 03 shares = 0; 07 04 share_val = 0.0; 08 } 09 Stock(){getData();} 10 public Stock(int n, int pr=0){ 11 shares = n; 12 share_val = pr; 13 getdata(); 14 } 15 public void getdata(){ 16 System.out.println(shares + ":"+share_val); 17 } 18 }; private int shares; share_val; 22 19 public class cxyjava{ 23 20 public static void main(string args[]){ 24 21 a (1) ; 25 } } Stock // 其 它 b 无 输 = 出 new 代 Stock(1,23); 码 省 略 2007 年 上 半 年 程 序 员 下 午 试 卷 第 11 页 ( 共 11 页 ) 0:0 1:23