全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 )
试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明 ] 假 设 数 组 A 中 的 各 元 素 A(1),A(2),,A(M) 已 经 按 从 小 到 大 排 序 (M 1); 数 组 B 中 的 各 元 素 B(1),B(2),,B(N) 也 已 经 按 从 小 到 大 排 序 (N 1) 执 行 下 面 的 流 程 图 后, 可 以 将 数 组 A 与 数 组 B 中 所 有 的 元 素 全 都 存 入 数 组 C 中, 且 按 从 小 到 大 排 序 ( 注 意 : 序 列 中 相 同 的 数 全 部 保 留 并 不 计 排 列 顺 序 ) 例 如, 设 数 组 A 中 有 元 素 :2,5,6, 7,9; 数 组 B 中 有 元 素 :2,3,4,7; 则 数 组 C 中 将 有 元 素 :2,2,3,4,5,6,7,7, 9 [ 流 程 图 ] 开 始 (1) i, j, k A(i) : B(j) > (2) C(k) i + 1 i k + 1 k (3) C(k) j + 1 j k + 1 k N (4) > M? (5) > N? N Y (6) C(k) j + 1 j k + 1 k Y (7) C(k) i + 1 i k + 1 k N (8) > N? (9) > M? N Y Y 结 束
试 题 二 ( 共 15 分 ) [ 说 明 ] 阅 读 以 下 说 明 和 C 程 序, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 下 面 的 程 序 按 照 以 下 规 则 输 出 给 定 名 词 的 复 数 形 式 : a. 若 名 词 以 y 结 尾, 则 删 除 y 并 添 加 ies ; b. 若 名 词 以 s ch 或 sh 结 尾, 则 添 加 es ; c. 其 他 所 有 情 况, 直 接 添 加 s [C 程 序 ] #include <stdio.h> #include <string.h> char *plural(char *word) { int n; char *pstr; n = strlen(word); /* 求 给 定 单 词 的 长 度 */ pstr = (char *)malloc(n+3); /* 申 请 给 定 单 词 的 复 数 形 式 存 储 空 间 */ if (!pstr n < 2) return NULL; strcpy(pstr,word); /* 复 制 给 定 单 词 */ if ( (1) ) { pstr[n-1] = 'i'; pstr[n] = 'e'; pstr[n+1] = 's'; (2) ; else if(pstr[n-1]=='s' pstr[n-1]== 'h' && ( (3) )) { pstr[n] = 'e'; pstr[n+1] = 's'; pstr[n+2] = '\0'; else { pstr[n] = 's'; pstr[n+1] = '\0'; (4) ; main( ) { int i; char *ps; char wc[9][10] = {"chair","dairy","boss","circus","fly","dog","church","clue","dish"; for(i = 0; i < 9; i++) { ps = (5) ; printf("%s: %s\n",wc[i],ps); /* 输 出 单 词 及 其 复 数 形 式 */ free(ps); /* 释 放 空 间 */ system("pause");
试 题 三 ( 共 15 分 ) 阅 读 以 下 说 明 和 C 程 序, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 [ 说 明 ] 下 面 的 程 序 用 Dole Rob 算 法 生 成 N 阶 (N 为 奇 数 ) 魔 方 阵 ( 各 行 列 对 角 线 数 字 之 和 相 等 ) 该 算 法 的 过 程 为 : 从 1 开 始, 按 如 下 方 法 依 次 插 入 各 自 然 数, 直 到 N 2 为 止 : a. 在 第 一 行 的 正 中 插 入 1; b. 新 位 置 应 当 处 于 最 近 插 入 位 置 的 右 上 方, 若 该 位 置 已 超 出 方 阵 的 上 边 界, 则 新 位 置 取 应 选 列 的 最 下 一 个 位 置 ; 若 超 出 右 边 界, 则 新 位 置 取 应 选 行 的 最 左 一 个 位 置 ; c. 若 最 近 插 入 的 元 素 是 N 的 整 数 倍, 则 选 同 列 的 下 一 行 位 置 为 新 位 置 例 如,3 阶 魔 方 阵 如 下 所 示 : 8 1 6 3 5 7 4 9 2 [C 程 序 ] #include <stdio.h> #include <stdlib.h> #define SIZE 50 main( ) { int row, col, n, value; int a[size+1][size+1]; /* 不 使 用 下 标 为 0 的 元 素 */ printf(" 请 输 入 要 输 出 魔 方 阵 的 阶 数 n( 奇 数, <%d):n=", SIZE); scanf("%d",&n); if (!(n % 2) n < 1 (1) ) { printf(" 输 入 数 据 有 误!\n"); exit(0); row = 1; col = (n+1)/2; value = 1; while(value <= (2) ) { a[row][col] = value; /* 计 算 下 一 位 置 */ if(value%n!= 0){ row--; (3) ; if(row < 1) row = n; if(col > n) (4) ; else row++; value = (5) ; printf("\n%d 阶 魔 方 阵 如 下 所 示 :\n\n",n); for(row = 1; row <= n; row++){ for(col = 1; col <= n; col++) printf("%5d",a[row][col]); printf("\n");
试 题 四 ( 共 15 分 ) 阅 读 以 下 说 明 和 C 函 数, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 [ 说 明 ] 计 算 机 在 处 理 算 术 表 达 式 时, 首 先 将 其 转 换 为 后 缀 表 达 式 例 如, 表 达 式 46+5*(120-37) 的 后 缀 表 达 式 形 式 为 46 5 120 37 - * + 计 算 后 缀 表 达 式 时, 从 左 至 右 扫 描 后 缀 表 达 式 : 若 遇 到 运 算 对 象, 则 压 入 栈 中 ; 遇 到 运 算 符, 则 从 栈 中 弹 出 相 关 运 算 对 象 进 行 计 算, 并 将 运 算 结 果 压 入 栈 中, 重 复 以 上 过 程, 直 到 后 缀 表 达 式 扫 描 结 束 例 如, 后 缀 表 达 式 46 5 120 37 - * + 的 计 算 过 程 为 : a. 依 次 将 46 5 120 37 压 入 栈 中 ; b. 遇 到 -, 取 出 37 120, 计 算 120 37, 得 83, 将 其 压 入 栈 中 ; c. 遇 到 *, 取 出 83 5, 计 算 5*83, 得 415, 将 其 压 入 栈 中 ; d. 遇 到 +, 取 出 415 46, 计 算 46+415, 得 461, 将 其 压 入 栈 中 ; e. 表 达 式 结 束, 则 计 算 过 程 完 成 函 数 computing(char expr[],int *result) 的 功 能 是 基 于 栈 计 算 后 缀 形 式 的 表 达 式 ( 以 串 形 式 存 入 字 符 数 组 expr) 的 值, 并 通 过 参 数 result 返 回 该 值 函 数 的 返 回 值 为 -1/0 分 别 表 示 表 达 式 有 / 无 错 误 假 设 表 达 式 中 仅 包 含 数 字 空 格 和 算 术 运 算 符 号, 其 中 所 有 项 均 以 空 格 分 隔, 且 运 算 符 仅 包 含 加 ( + ) 减 ( - ) 乘 ( * ) 除 ( \ ) 函 数 computing 中 所 用 栈 的 基 本 操 作 的 函 数 原 型 说 明 如 下 : void InitStack(STACK *s): 初 始 化 栈 void Push(STACK *s, int e): 将 一 个 整 数 压 栈, 栈 中 元 素 数 目 增 1 void Pop(STACK *s): 栈 顶 元 素 出 栈, 栈 中 元 素 数 目 减 1 int Top(STACK s): 返 回 非 空 栈 的 栈 顶 元 素 值, 栈 中 元 素 数 目 不 变 int IsEmpty(STACK s): 若 s 是 空 栈, 则 返 回 1 否 则 返 回 0 [C 函 数 ] int computing(char expr[], int *result) { STACK s; int tnum, a,b; char *ptr; InitStack(&s); ptr = expr; /* 字 符 指 针 指 向 后 缀 表 达 式 串 的 第 一 个 字 符 */ while (*ptr!='\0') { if (*ptr==' ') { /* 当 前 字 符 是 空 格 */ (1) ; /* 字 符 指 针 指 向 下 一 字 符 */ continue; else
if (isdigit(*ptr)) { /* 当 前 字 符 是 数 字, 则 将 该 数 字 开 始 的 数 字 串 转 换 为 数 值 */ tnum = (2) ; while (*ptr>= 0 && *ptr <= 9 ) { tnum = tnum * 10 + (3) ; ptr++; Push( (4) ); else /* 当 前 字 符 是 运 算 符 或 其 他 符 号 */ if (*ptr=='+' *ptr=='-' *ptr =='*' *ptr =='/'){ if (!IsEmpty(s)) { a = Top(s); Pop(&s); /* 取 运 算 符 的 第 二 个 运 算 数 */ if (!IsEmpty(s)) { b = Top(s); Pop(&s); /* 取 运 算 符 的 第 一 个 运 算 数 */ else return -1; else return -1; switch (*ptr) { case '+': Push(&s,b+a); break; case '-': Push(&s,b-a); break; case '*': Push(&s,b*a); break; case '/': Push(&s,b/a); break; else return -1; ptr++; /* 字 符 指 针 指 向 下 一 字 符 */ /* while */ if (IsEmpty(s)) return -1; else { (5) = Top(s); Pop(&s); /* 取 运 算 结 果 */ if (!IsEmpty(s)) return -1; return 0;
从 下 列 3 道 试 题 ( 试 题 五 至 试 题 七 ) 中 任 选 1 道 解 答 如 果 解 答 的 试 题 数 超 过 1 道, 则 题 号 小 的 1 道 解 答 有 效 试 题 五 ( 共 15 分 ) 阅 读 下 列 说 明 图 和 C++ 代 码, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 [ 说 明 ] 已 知 对 某 载 客 车 辆 (Car) 进 行 类 建 模, 如 图 5-1 所 示, 其 中 类 Engine 表 示 发 动 机 引 擎, 类 Wheel 表 示 车 轮, 类 Body 表 示 车 身, 类 Driver 表 示 司 机, 类 Passenger 表 示 乘 客 图 5-1 类 图 [C++ 代 码 ] const int (1) = 7; // 定 义 最 多 载 客 数 const int MAX_WHEELS = 5; // 定 义 最 多 轮 胎 数 class Body{ // 此 处 代 码 省 略 ; // 车 身 类 class Passenger{ // 此 处 代 码 省 略 ; // 乘 客 类 class Wheel{ // 此 处 代 码 省 略 ; // 车 轮 类 class Driver{ // 司 机 类 public: string name; // 表 示 第 几 路 公 交 车 司 机 Driver(string dr ivername):name( (2) ; ){; // 构 造 函 数 class Engine{ // 引 擎 类 public: string engineno; // 引 擎 编 号 Engine( string engineno){ (3) ; ->engineno = engineno; // 构 造 函 数
class Car{ // 汽 车 类 protected: Engine * engine; Driver * driver; Body body; Wheel * wheels[max_wheels]; Passenger * passengers[max_passengers]; public: Car(Driver *driver){ // 构 造 函 数 this->driver = driver; engine = new Engine("TX6536 型 号 引 擎 "); for (int index = 0; index < MAX_WHEELS; index++){ wheels[index] = new Wheel(); for (int index = 0; index < MAX_PASSENGERS; index++){ passengers[index] = NULL; virtual ~Car(){ // 析 构 函 数 for (int index=0; index < MAX_WHEELS; index++) delete wheels[index]; delete (4) ; int getpassengernumber(){ // 获 取 车 上 乘 客 数 量 // 此 处 代 码 省 略 void getonpassenger(passenger * apassenger ){ // 乘 客 上 车 // 此 处 代 码 省 略 void run(){ // 开 车 if(driver == NULL){ cout << " 司 机 尚 未 上 车!"; return; // 此 处 代 码 省 略 ; vo id main(){ Driver driver(" 第 五 路 公 交 车 司 机 "); Car car( (5) ); Passenger passengers[max_passengers]; for ( int index = 0 ; index < MAX_PASSENGERS; index ++) // 乘 客 上 车 处 理 car.getonpassenger(&passengers[index]); car.run();
试 题 六 ( 共 15 分 ) 阅 读 以 下 应 用 说 明 以 及 Visual Basic 程 序 代 码, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 [ 应 用 说 明 ] 某 应 用 程 序 可 选 择 打 开 用 户 指 定 的 文 本 文 件, 将 其 内 容 显 示 在 指 定 的 文 本 框 内 供 用 户 编 辑, 并 将 编 辑 后 的 结 果 保 存 在 用 户 指 定 的 文 件 中 运 行 时 的 窗 口 如 图 6-1 所 示, 其 中 有 六 个 标 签 一 个 驱 动 器 列 表 框 一 个 目 录 列 表 框 一 个 文 件 列 表 框 一 个 文 件 类 型 组 合 框 一 个 文 件 编 辑 文 本 框 一 个 文 件 名 文 本 框 以 及 两 个 命 令 按 钮 图 6-1 该 程 序 的 开 发 要 求 如 下 : (1) 通 过 驱 动 器 列 表 框 (Drive1) 目 录 列 表 框 (Dir1) 和 文 件 列 表 框 (File1), 选 择 文 件 (2) 文 件 类 型 组 合 框 (Cmb_type) 设 置 为 下 拉 式 列 表 框, 其 中 有 三 个 供 选 项, 分 别 为 所 有 文 件 (*.*) 文 本 文 件 (*.txt) 和 可 执 行 文 件 (*.exe) 在 文 件 列 表 框 中 列 出 的 文 件 类 型 会 自 动 与 文 件 类 型 组 合 框 中 选 择 的 文 件 类 型 相 匹 配 (3) 在 文 件 列 表 框 中 单 击 一 个 文 件 名 时, 该 文 件 名 会 显 示 在 文 件 名 文 本 框 (Txt_filename) 中 (4) 在 文 件 列 表 框 中 双 击 一 个 文 件 名 时, 若 是 文 本 文 件, 则 在 文 件 编 辑 文 本 框 (Txt_file) 中 显 示 该 文 件 的 内 容 并 可 进 行 编 辑 ; 若 不 是 文 本 文 件, 则 弹 出 一 个 对 话 框, 提 示 请 选 择 文 本 文 件! (5) 对 于 编 辑 后 的 文 本 文 件, 可 在 文 件 名 文 本 框 ( Txt_filename) 中 输 入 新 的 文 件 名, 并 单 击 命 令 按 钮 (Cmd_save) 进 行 保 存 [Visual Basic 程 序 代 码 ] Private Sub Form_Load() Cmb_type.AddItem " 所 有 文 件 (*.*)" Cmb_type.AddItem " 文 本 文 件 (*.txt)"
Cmb_type.AddItem " 可 执 行 文 件 (*.exe)" Cmb_type.ListIndex = 0 File1.Pattern = "*.*": Txt_filename.Text = "" Txt_ file.text = "" End Sub Private Sub Dir1_Change() File1.Path = (1) End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Cmb_type_click() Select Case Cmb_type. (2) Case 0 File1.Pattern = "*.*" Case 1 File1.Pattern = "*.txt" Case 2 File1.Pattern = "*.exe" End Select End Sub Private Sub Cmd_save_Click() usrfile = GetFileName() 函 数 GetFileName 获 得 要 保 存 的 文 件 名 Open usrfile For Output As #1 定 义 usrfile 为 1 号 输 出 文 件 Print #1, Txt_file.Text 输 出 到 1 号 文 件 Close #1 End Sub Private Sub File1_DblClick() If right(file1.filename, 3) <> (3) Then MsgBox " 请 选 择 文 本 文 件!" Exit Sub End If usrfile = GetFileName() 函 数 GetFileName 获 得 要 打 开 的 文 件 名 Open usrfile For Input As #1 定 义 usrfile 为 1 号 输 入 文 件 Txt_file.Text = "" Do While (4) EOF(1) Line Input #1, fcontext 从 1 号 文 件 读 入 一 行 Txt_file.Text = Txt_file.Text + (5) + vbcrlf Loop Close #1 End Sub 其 他 代 码 略
试 题 七 ( 共 15 分 ) 阅 读 下 列 说 明 图 和 Java 代 码, 将 应 填 入 (n) 处 的 字 句 写 在 答 题 纸 的 对 应 栏 内 [ 说 明 ] 已 知 对 某 载 客 车 辆 (Car) 进 行 类 建 模, 如 图 7-1 所 示, 其 中 类 Engine 表 示 发 动 机 引 擎, 类 Wheel 表 示 车 轮, 类 Body 表 示 车 身, 类 Driver 表 示 司 机, 类 Passenger 表 示 乘 客 图 7-1 类 图 [Java 代 码 ] class Body{ // 此 处 代 码 省 略 ; // 车 身 类 class Passenger{ // 此 处 代 码 省 略 ; // 乘 客 类 class Wheel{ // 此 处 代 码 省 略 ; // 车 轮 类 class Driver{ // 司 机 类 public String name; // 表 示 第 几 路 公 交 车 司 机 public Driver(String drivername){name = drivername; // 构 造 函 数 ; class Engine{ // 引 擎 类 public String engineno; // 引 擎 编 号 public Engine(String engineno){ this.engineno = engineno; // 构 造 函 数 ; public class Car{ // 汽 车 类 static final int (1) = 7; // 定 义 最 多 载 客 数 static final int MAX_WHEELS = 5; // 定 义 最 多 轮 胎 数 protected Engine engine; protected Driver driver; protected Body body = new Body(); protected Wheel[] wheels;
protected Passenger[] passengers; public Car(Driver driver){ // 构 造 函 数 (2).driver = driver; engine = new Engine("TX6536 型 号 引 擎 "); wheels = new Wheel[MAX_WHEELS]; passengers = new Passenger[MAX_PASSENGERS]; for (int index = 0; index < MAX_WHEELS; index++){ wheels[index] = new Wheel(); for (int index = 0; index < MAX_PASSENGERS; index++){ passengers[index] = null; int getpassengernumber(){ // 获 取 车 上 乘 客 数 量 // 此 处 代 码 省 略 void getonpassenger(passenger apassenger ){ // 乘 客 上 车 // 此 处 代 码 省 略 void run(){ // 开 车 if( (3) ){ System.out.println(" 司 机 尚 未 上 车!"); return; // 此 处 代 码 省 略 public static void main(string args[]){ Driver driver = new Driver(" 第 五 路 公 交 车 司 机 "); Car car = new Car( (4) ); for (int index = 0 ; index < MAX_PASSENGERS; index ++) car.getonpa ssenger( (5) Passenger()); car.run();