2008年上半年 程序员 下午试卷 第 1 页 (共 12 页)
全国计算机技术与软件专业技术资格 全全国国计计算算机机技技术术与与软软件件专专业业技技术术资资格格 全国计算机技术与软件专业技术资格( (( (水平 水水平平 水平) )) )考试 考考试试 考试
200 220000 2008 88 8 年上半年 年年上上半半年年 年上半年 程序员 程程序序员员 程序员 下午试卷 下下午午试试卷卷 下午试卷
(考试时间 14:00~16:30 共150分钟)
请按下述要求正确填写答题纸 请请按按下下述述要要求求正正确确填填写写答答题题纸纸 请按下述要求正确填写答题纸
1. 在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。
2. 在答题纸的指定位置填写准考证号、出生年月日和姓名。
3. 答题纸上除填写上述内容外只能写解答。
4. 本试卷共 7 道题,试题一至试题四是必答题,试题五至试题七选答 1 道。
每题 15 分,满分 75 分。
试题号 一~四 五~七
选择方法 必答题 选答 1 题
5. 解答时字迹务必清楚,字迹不清时,将不评分。
6. 仿照下面例题,将解答写在答题纸的对应栏内。
例题 例例题题 例题
2008 年上半年全国计算机技术与软件专业技术资格(水平)考试日期是(1)
月(2)日。
因为正确的解答是“5月24日”,故在答题纸的对应栏内写上“5”和
“24”(参看下表)。
例题 解答栏
(1) 5
(2) 24
2008年上半年 程序员 下午试卷 第 2 页 (共 12 页)
试题一 试题一 试题一 试题一 ((((共共共共
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
(4) > M ?
(5)
> N ?
结束
(3) →
C(k)
j + 1
→ j
k + 1
→
k
(6) →
C(k)
j + 1
→ j
k + 1
→
k
(7) →
C(k)
i + 1
→ i
k + 1
→
k
(8) > N ?
(9)
> M ?
Y
N
Y
Y Y
N N
N
≤≤≤≤
>
2008年上半年 程序员 下午试卷 第 3 页 (共 12 页)
试题二 试题二 试题二 试题二 ((((共共共共
15
分分分分)))) 阅读以下说明和 C程序 ,将应填入 (n) 处的字 句写在答题纸的对应栏内 。
[
说明说明说明说明
] 下面的程序按照以下规则输出给定名词的复数形式 : a. 若名词以 “y”结尾 ,则删除 y并添加 “ies”; b. 若名词以 “s”、“ch”或“sh”结尾 ,则添加 “es”; c. 其他所有情况 ,直接添加 “s”。 [C[[CC [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"); }
2008年上半年 程序员 下午试卷 第 4 页 (共 12 页)
试题三 试题三 试题三 试题三 ((((共共共共
15
分分分分)))) 阅读以下说明和 C程序 ,将应填入 (n) 处的字句写在答题纸的对应栏内 。
[
说明说明说明说明
]
下面的程序用 Dole Rob算法生成 N阶(N为奇数 )魔方阵 (各行 、列、对角线数字之和相等 )。 该算法的过程为 :从1开始 ,按如下方法依次插入各自然数 ,直到 N2 为止 :
a.
在第一行的正中插入 1;
b.
新位置应当处于最近插入位 置的右上方 ,若该位置已超出方阵的上边界 ,则新位置取应选列的最下一个位置 ;若超出右边界 ,则新位置取应选行的最左一个位置 ;
c. 若最近插入的元素是 N的整数倍 ,则选同列的下一行位置为新位置 。 例如 ,3阶魔方阵如下所示 : [C[[CC [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"); } } 8 1 6 3 5 7 4 9 2
2008年上半年 程序员 下午试卷 第 5 页 (共 12 页)
试题四 试题四 试题四 试题四 ((((共共共共
15
分分分分)))) 阅读以下说明和 C函数 ,将应填入 (n) 处的字句写在答题纸的对应栏内 。
[
说明说明说明说明
] 计算机在处理算术表达式时 , 首先 将其 转换 为后 缀 表达式 。例如 ,表达式“46+5*(120-37)”的后 缀 表达式形式为 “46 5 120 37 - * +”。 计算后 缀 表达式时 ,从左 至右 扫描 后缀 表达式 :若 遇到运 算对 象 ,则 压入栈中;遇到运算符 ,则从 栈中弹 出相 关运 算对 象进 行计算 ,并将 运 算结 果压 入栈中,重 复以上过程,直到后 缀 表达式 扫描 结束 。例如 ,后 缀 表达式 “46 5 120 37 - * +”的计算过 程为: a. 依次将 46、5、120、37 压入栈中 ; b. 遇到 “-”,取出 37、120,计算 120 �C 37, 得8 3,将其 压入栈中 ; c. 遇到 “*”,取出 8 3、5,计算 5*83, 得 415,将其 压入栈中 ; d. 遇到 “+”,取出 415、46,计算 46+415, 得 461,将其 压入栈中 ; e. 表达式结 束 ,则计算过程 完成 。 函数 computing(char expr[],int *result)的 功能 是基于栈 计算后 缀 形式的表达式(以 串 形式存入字 符 数组 expr)的 值 ,并 通过参数 result 返回 该值 。函数的 返回值 为-1/0 分别 表示表达式有 / 无错 误 。假设表达式中 仅包含 数字 、空 格 和算术 运算 符号 ,其中所有 项均 以空 格分隔 ,且 运算 符仅包含 加 (“+”)、 减 (“-”)、 乘 (“*”)、除(“\”)。 函数 computing中所用 栈的 基本操作 的函数 原型 说明如下 : void InitStac k(STACK *s): 初始 化栈 。 void P ush(S TACK *s, int e): 将一个整数 压栈 ,栈 中元素数 目增 1。 void Pop(STACK *s): 栈顶 元素出 栈,栈 中元素数 目减 1。 int Top(STACK s): 返回非 空栈的 栈顶 元素 值,栈 中元素数 目不变 。 int IsEmpty(S TACK s):若s是空 栈 ,则 返回 1否则 返回 0。 [C[[CC [C函数 函数函数函数 ]]]] int computing(char expr[], int *result) { STACK s; int tnum, a,b; char *ptr; InitStac k (&s); ptr = expr; /*字 符指针指向 后缀 表达式 串 的第一个字 符 */ while (*ptr!='\0') { if (*ptr==' ') { /*当 前字符 是空 格 */ (1) ; /*字 符指针指向 下一字 符 */ continue; } else
2008年上半年 程序员 下午试卷 第 6 页 (共 12 页) if (isdigit(*ptr)) { /*当 前字符 是数字 ,则将该数字开始的数字 串转换 为数 值 */ tnum = (2) ; while (*ptr>= ’0’ && *ptr <= ’9’ ) { tnum = tnum * 10 + (3) ; ptr++; } P ush( (4) ); } else /*当 前字符是运算符 或其他 符号 */ if (*ptr=='+'||*ptr=='-'||*ptr =='*'||*p tr =='/'){ if (!IsEmpty(s)) { a = T op(s); P op(&s); /*取 运算符 的第 二个运 算数 */ if (!IsEmpty(s)) { b = T op(s); P op(&s); /*取 运算符 的第一个 运 算数 */ } else return -1; } else return -1; switch (*ptr) { case '+': P ush(&s,b+a); brea k; case '-': P ush(&s,b-a); brea k; case '*': P ush(&s,b*a); brea k; case '/': P ush(&s,b/a); brea k; } } else return -1; ptr++; /*字 符指针指向 下一字 符 */ } /* while */ if (IsEmpty(s)) return -1; else { (5) = T op(s); P op(&s); /*取 运 算结 果 */ if (!IsEmpty(s)) return -1; return 0; } }
2008年上半年 程序员 下午试卷 第 7 页 (共 12 页)
试题五 试题五 试题五 试题五 ((((共共共共
15
分分分分)))) 阅读下列说明 、图和 C++ 代码 ,将应填入 (n) 处的字句写在答题纸的对应栏内 。
[
说明说明说明说明
] 已知对 某载客车辆 (Car) 进行 类建模 ,如图 5-1所示 ,其中 类 Engine表示 发动 机引擎,类W heel表示 车轮 ,类 Body表示 车身 ,类 Driver表示 司机,类P assenger表示 乘客 。 图5-1 类图 [C++[C++[C++ [C++代码 代码代码代码 ]]]] const int (1) = 7; //定 义最 多载客 数 const int MA X_WH EELS = 5; //定 义最 多轮胎 数 class Body{ // 此处 代码省略 }; // 车身类 class P assenger{ // 此处 代码省略 }; // 乘客类 class W heel{ // 此处 代码省略 }; // 车轮类 class Driver{ // 司机类 public: string name; //表示第 几路公交车司 机 Driver(string driverName):name( (2) ){}; // 构造 函数 }; class Engine{ // 引擎类 public: string engineNo; // 引擎编号 Engine(string engineNo){ (3) ->engineNo = engineNo; } // 构造 函数 }; 从下列 3 道试 题(试题 五至试 题七 )中 任选1道 解答 。如果 解答的 试 题数超过 1道 ,则题 号 小的 1道 解答有 效 。
2008年上半年 程序员 下午试卷 第 8 页 (共 12 页) class Car{ // 汽车类 protected: Engine * engine; Driver * driver; Body body; W heel * wheels[MA X_WH EELS]; P assenger * passengers[MA X_P ASSEN G ERS]; public: Car(Driver *driver){ // 构造 函数 this->driver = driver; engine = new Engine(" TX 6536 型号引擎 "); for (int index = 0; index < MA X_WH EELS; index++){ wheels[index] = new W heel(); } for (int index = 0; index < MA X_P ASSEN G ERS; index++){ passengers[index] = NULL; } } virtual ~ Car(){ // 析构 函数 for (int index=0; index < MA X_WH EELS; index++) delete wheels[index]; delete (4) ; } int get P assengerNumber(){ // 获取车上 乘客 数量 // 此处 代码省略 } void get OnP assenger( P assenger * a P assenger ){ // 乘客 上车 // 此处 代码省略 } void run(){ //开 车 if(driver == NULL){ cout << " 司机 尚未 上车 !"; return; } // 此处 代码省略 } }; void main(){ Driver driver("第 五路公交车司 机 "); Car car( (5) ); P assenger passengers[MA X_P ASSEN G ERS]; for (int index = 0 ; index < MA X_P ASSEN G ERS; index ++) // 乘客 上车 处理 car.get OnP assenger(&passengers[index]); car.run(); }
2008年上半年 程序员 下午试卷 第 9 页 (共 12 页)
试题六 试题六 试题六 试题六 ((((共共共共
15
分分分分))))
阅读以下应用说明以及 V isual Basic程序 代码 ,将应填入 (n) 处的字句写在答题纸的对应栏内 。
[
应用说明 应用说明 应用说明 应用说明
]
某 应用程序可选 择打 开用 户指 定的 文本文件 ,将其内 容显 示在 指 定的 文本框 内供用户编辑 ,并将 编辑 后的结 果 保存在用 户指 定的 文件 中。运 行时的 窗口 如图 6-1 所示 ,其中有 六 个标 签 、一个 驱动器 列表框 、一个 目录 列表 框 、一个 文件 列表 框 、一个 文件类型组 合框 、一个 文件编辑文本框 、一个 文件 名 文本框 以及 两个 命令 按钮。
图6-1 该程序的开 发 要求如下 : (1) 通过 驱动器 列表 框 (Drive1)、 目录 列表 框 (Dir1)和 文件 列表 框(F ile1),选 择文件 。 (2) 文件类型 组 合框 (Cmb _ type)设置为下 拉 式列表 框 ,其中有 三个供选项,分别为 “所有 文件 (*.*)”、“ 文本文件 (*.txt)”和 “可执行 文件 (*.exe)”。在 文件 列表框 中列出的 文件类型会 自动与 文件类型 组 合框 中选 择的 文件类型 相 匹配 。 (3)在 文件 列表 框 中单 击 一个 文件 名时 ,该 文件 名 会显 示在 文件 名 文本框(Txt_ filename)中。 (4)在 文件 列表 框中 双击 一个 文件 名时 ,若是 文本文件 ,则在 文件编辑文本框(Txt_ file)中 显 示该 文件 的内 容 并可 进行 编辑 ;若不是 文本文件 ,则 弹 出一个对 话框 ,提示 “请选 择文本文件 !” (5)对于 编辑 后的 文本文件 ,可在 文件 名 文本框 (Txt_ filename)中输入新的 文件名 ,并单 击命令 按钮 (Cmd _ save) 进 行保存 。 [Visual Basic
程序代码 程序代码 程序代码 程序代码
] P rivate Sub Form_ Load() Cmb _ type.AddItem "所有 文件 (*.*)" Cmb _ type.AddItem " 文本文件 (*.txt)"
2008年上半年 程序员 下午试卷 第 10 页 (共 12 页) Cmb _ type.AddItem "可执行 文件 (*.exe)" Cmb _ type.ListIndex = 0 F ile1. P attern = "*.*": Txt_ filename. T ext = "" Txt_ file. T ext = "" End Sub P rivate Sub Dir1 _ Change() F ile1. P ath = (1) End Sub P rivate Sub Drive1 _ Change() Dir1. P ath = Drive1.Drive End Sub P rivate Sub Cmb _type_click() Select Case Cmb _ type. (2) Case 0 F ile1. P attern = "*.*" Case 1 F ile1. P attern = "*.txt" Case 2 F ile1. P attern = "*.exe" End Select End Sub P rivate Sub Cmd _save_Click() usr F ile = GetF ileName() ‘ 函数GetF ileName 获得 要保存的 文件 名 O pen usr File For O utput As #1 ‘定义usrF ile为1 号 输出 文件 P rint #1, Txt_ file. T ext ‘ 输出到 1 号文件 Close #1 End Sub P rivate Sub File1_ DblClic k() If right( F ile1. F ileName, 3) <> (3) T hen MsgBox "请选 择文本文件 !" Exit Sub End If usr F ile = GetF ileName() ‘ 函数GetF ileName 获得 要打 开的 文件 名 O pen usr File F or Input As #1 ‘定义usrF ile为1 号 输入 文件 Txt_ file. T ext = "" Do W hile (4) EOF (1) Line Input #1, fContext ‘ 从1 号文件 读入一行 Txt_ file. T ext = Txt_ file. T ext + (5) + vbCrLf Loop Close #1 End Sub ‘ 其他 代码略
2008年上半年 程序员 下午试卷 第 11 页 (共 12 页)
试题七 试题七 试题七 试题七 ((((共共共共
15
分分分分)))) 阅读下列说明 、图和 Java 代码 ,将应填入 (n) 处的字句写在答题纸的对应栏内 。
[
说明说明说明说明
] 已知对 某载客车辆 (Car) 进行 类建模 ,如图 7-1所示 ,其中 类 Engine表示 发动 机引擎,类W heel表示 车轮 ,类 Body表示 车身 ,类 Driver表示 司机,类P assenger表示 乘客 。 图7-1 类图
[
Java Java Java Java 代码 代码代码代码 ] class Body{ // 此处 代码省略 }; // 车身类 class P assenger{ // 此处 代码省略 }; // 乘客类 class W heel{ // 此处 代码省略 }; // 车轮类 class Driver{ // 司机类 public String name; //表示第 几路公交车司 机 public Driver(String driverName){name = driverName ;} // 构造 函数 }; class Engine{ // 引擎类 public String engineNo; // 引擎编号 public Engine(String engineNo){ this.engineNo = e ngineNo; } // 构造 函数 }; public class Car{ // 汽车类 static final int (1) = 7; //定 义最 多载客 数 static final int MA X_WH EELS = 5; //定 义最 多轮胎 数 protected Engine engine; protected Driver driver; protected Body body = new Body(); protected W heel[] wheels;
2008年上半年 程序员 下午试卷 第 12 页 (共 12 页) protected P assenger[] passengers; public Car(Driver driver){ // 构造 函数 (2) .driver = driver; engine = new Engine(" TX 6536 型号引擎 "); wheels = new W heel[MA X_WH EELS]; passengers = new P assenger[MA X_P ASSEN G ERS]; for (int index = 0; index < MA X_WH EELS; index++){ wheels[index] = new W heel(); } for (int index = 0; index < MA X_P ASSEN G ERS; index++){ passengers[index] = null; } } int get P assengerNumber(){ // 获取车上 乘客 数量 // 此处 代码省略 } void get OnP assenger( P assenger a P assenger ){ // 乘客 上车 // 此处 代码省略 } 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 < MA X_P ASSEN G ERS; index ++) car.get OnP assenger( (5) P assenger()); car.run(); } }