全国计算机技术与软件专业技术资格 ( 水平 ) 考试 2010 年下半年程序员下午试卷 ( 考试时间 14:00~16:30 共 150 分钟 ) 请按下述要求正确填写答题纸 1. 在答题纸的指定位置填写你所在的省 自治区 直辖市 计划单列市的名称 2. 在答题纸的指定位置填写准考证号 出生年月日和姓名 3. 答题纸上除填写上述内容外只能写解答 4. 本试卷共 6 道题, 试题一至试题四是必答题, 试题五至试题六选答 1 道 每题 15 分, 满分 75 分 试题号 一 ~ 四 五 ~ 六 选择方法 必答题 选答 1 题 5. 解答时字迹务必清楚, 字迹不清时, 将不评分 6. 仿照下面例题, 将解答写在答题纸的对应栏内 例题 2010 年下半年全国计算机技术与软件专业技术资格 ( 水平 ) 考试日期是 (1) 月 (2) 日 因为正确的解答是 11 月 13 日, 故在答题纸的对应栏内写上 11 和 13 ( 参看下表 ) 例题 解答栏 (1) 11 (2) 13 2010 年下半年程序员下午试卷第 1 页 ( 共 10 页 )
试题一 ( 共 15 分 ) 阅读以下说明和流程图, 回答问题 1 至问题 4, 将解答填入答题纸的对应栏内 说明 下面的流程图中有两个判断条件 A>0 和 B>0 这些判断条件的各种组合情况如下表 所示 表中 Y 表示相应的条件成立,N 表示相应的条件不成立 每一列表示一种条件组 合, 并在列首用相应的序号来表示 流程图 条件 序号 1 2 3 4 A>0 Y Y N N B>0 Y N Y N 问题 1 (4 分 ) 当遇到哪几种条件组合时, 流程图能执行 1 i?( 写出相应的序号即可 ) 问题 2 (4 分 ) 当遇到哪几种条件组合时, 流程图能执行 2 j?( 写出相应的序号即可 ) 问题 3 (6 分 ) 当遇到哪几种条件组合时, 流程图能执行 3 k?( 写出相应的序号即可 ) 问题 4 (1 分 ) 该流程图共有多少条实际执行路径? 2010 年下半年程序员下午试卷第 2 页 ( 共 10 页 )
试题二 ( 共 15 分 ) 阅读以下说明和 C 函数, 将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内 说明 1 函数 deldigit(char *s) 的功能是将字符串 s 中的数字字符去掉, 使剩余字符按原次序构成一个新串, 并保存在原串空间中 其思路是 : 先申请一个与 s 等长的临时字符串空间并令 t 指向它, 将非数字字符按次序暂存入该空间, 最后再拷贝给 s C 函数 void deldigit(char *s) char *t = (char *)malloc( (1) ); /* 申请串空间 */ int i, k = 0; if (!t) return; for(i = 0; i < strlen(s); i++) if (!(*(s+i)>='0' && *(s+i)<='9') ) t[k++] = (2) ; (3) = '\0'; /* 设置串结束标志 */ strcpy(s,t); free(t); 说明 2 函数 reverse(char *s, int len) 的功能是用递归方式逆置长度为 len 的字符串 s 例如, 若串 s 的内容为 abcd, 则逆置后其内容变为 dcba C 函数 void reverse(char *s, int len) char ch; if ( (4) ) ch = *s; *s = *(s+len-1); *(s+len-1) = ch; reverse( (5) ); 2010 年下半年程序员下午试卷第 3 页 ( 共 10 页 )
试题三 ( 共 15 分 ) 阅读以下说明和 C 代码, 回答问题 1 和问题 2, 将解答写在答题纸的对应栏内 说明 1 下面代码的设计意图是 : 将保存在文本文件 data.txt 中的一系列整数 ( 不超过 100 个 ) 读取出来存入数组 arr[], 然后调用函数 sort() 对数组 arr 的元素进行排序, 最后在显示屏输出数组 arr 的内容 C 代码 行号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 代码 #include<stdio.h> void sort(int a[], int n) /* 对 n 个元素的整型数组 a 按递增方式排列 */ /* 此处代码省略 */ return; int main() int i, num = 0; int arr[100]; FILE fp; fp = fopen("data.txt", "r"); if (!fp) return -1; while(!feof(fp)) fscanf(fp, "%d", arr[num++]); sort(arr[], num); for(i=0; i < num; ) fprintf(stdout, "%d ", arr[i++]); fclose(fp); return 0; 问题 1 ( 9 分 ) 以上 C 代码中有三处错误 ( 省略部分的代码除外 ), 请指出这些错误所在的代码行 号, 并在不增加和删除代码行的情况下进行修改, 写出修改正确后的完整代码行 2010 年下半年程序员下午试卷第 4 页 ( 共 10 页 )
说明 2 下面是用 C 语言书写的函数 get_str 的两种定义方式以及两种调用方式 定义方式 1 void get_str(char* p) p = (char *) malloc(1+sizeof("testing")); strcpy(p, "testing"); 定义方式 2 void get_str(char** p) *p =(char *) malloc(1+sizeof("testing")); strcpy(*p, "testing"); 调用方式 1 调用方式 2 int main( ) int main( ) char* ptr = NULL; char* ptr = NULL; get_str(ptr); get_str(&ptr); if (ptr) if (ptr) printf("%s\n", ptr); printf("%s\n", ptr); else else printf("%p\n", ptr); /* 输出指针的值 */ printf("%p\n", ptr); return 0; return 0; 问题 2 ( 6 分 ) 若分别采用函数定义方式 1 2 和调用方式 1 2, 请分析程序的运行情况, 填充下 面的空 (1)~(3) 若采用定义方式 1 和调用方式 1, 则输出为 00000000 若采用定义方式 1 和调用方式 2, 则 (1) 若采用定义方式 2 和调用方式 1, 则 (2) 若采用定义方式 2 和调用方式 2, 则 (3) 2010 年下半年程序员下午试卷第 5 页 ( 共 10 页 )
试题四 ( 共 15 分 ) 阅读以下说明和 C 函数, 将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内 说明 已知单链表 L 含有头结点, 且结点中的元素值以递增的方式排列 下面的函数 DeleteList 在 L 中查找所有值大于 mink 且小于 maxk 的元素, 若找到, 则逐个删除, 同 时释放被删结点的空间 若链表中不存在满足条件的元素, 则返回 -1, 否则返回 0 例如, 某单链表如图 4-1 所示 若令 mink 为 20 maxk 为 50, 则删除后的链表如 图 4-2 所示 图 4-1 链表结点类型定义如下 : typedef struct Node int data; struct Node *next; Node, *LinkList; 图 4-2 C 函数 int DeleteList (LinkList L, int mink, int maxk) /* 在含头结点的单链表 L 中删除大于 mink 且小于 maxk 的元素 */ (1) *q = L, *p = L->next; /*p 指向第一个元素结点 */ int deltag = 0; while ( p ) if ( p->data <= mink ) else q = p; p = (2) ; if ( p->data < maxk ) /* 找到删除满足条件的结点 */ q->next = (3) ; free(p); p = (4) ; deltag = 1; else break; if ( (5) ) return -1; return 0; 2010 年下半年程序员下午试卷第 6 页 ( 共 10 页 )
试题五 ( 共 15 分 ) 阅读以下说明和 C++ 代码, 将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内 说明 某数据文件 students.txt 的内容为 100 名学生的学号和成绩, 下面的程序将文件中的数据全部读入对象数组, 按分数从高到低进行排序后选出排名前 30% 的学生 C++ 代码 #include <iostream> #include <fstream> #include <string> using namespace std; class Student private: string sno; // 学号 int credit; // 分数 public: Student(string a,int b) sno = a; credit = b; Student() int getcredit(); void out(); ; (1) ::getcredit() return credit; (2) ::out() cout << "SNO: " << sno << ", Credit=" << credit << endl; class SortStudent public: void sort(student *s, int n); SortStudent() ; void SortStudent::sort(Student *s,int n) for(int i = 0; i < n-1; i++) for(int j = i+1; j < n; j++) if(s[i]. (3) < s[j]. (4) ) Student temp = s[i]; s[i] = s[j]; s[j] = temp; 2010 年下半年程序员下午试卷第 7 页 ( 共 10 页 )
int main(int argc, char* argv[]) const int number = 100; // 学生总数 ifstream students; students.open("students.txt"); if(!students.is_open()) throw 0; Student *teststudent = (5) [number]; int k = 0; string s; while (getline(students,s,'\n')) // 每次读取一个学生的学号和成绩 Student student(s.substr(0,s.find(',')), atoi(s.substr(s.find(',')+1).c_str())); teststudent[k++] = student; students.close(); (6) ; ss.sort(teststudent,k); cout <<"top 30%: "<<endl; for(k = 0; k < number * 0.3; k++) teststudent[k].out(); delete []teststudent; return 0; 2010 年下半年程序员下午试卷第 8 页 ( 共 10 页 )
试题六 ( 共 15 分 ) 阅读以下说明和 Java 代码, 将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内 说明 某数据文件 students.txt 的内容为 100 名学生的学号和成绩, 下面的程序将文件中的数据全部读入对象数组, 按分数从高到低进行排序后选出排名前 30% 的学生 Java 代码 import java.io.*; class Student private String sno; // 学号 private int Credit; // 分数 public int getcredit() return Credit; public String tostring() return "sno = " + this.sno + ", Credit = " + this.credit; Student(String sno, int Credit) (1) = sno; (2) = Credit; public class SortStudent void sort(student[] s) //Sort the array s[] in decending order of Credit for (int i = 0; i < s.length-1; i++) for (int j = i+1; j < s.length; j++) if (s[i]. (3) < s[j]. (4) ) Student tmp = s[i]; s[i] = s[j]; s[j] = tmp; 2010 年下半年程序员下午试卷第 9 页 ( 共 10 页 )
public static void main(string argv[]) Student[] teststudent = new Student[size]; try BufferedReader in = new BufferedReader(new FileReader("students.txt")); boolean done = false; int i = 0; while (!done) String s = in.readline(); // 每次读取一个学生的学号和成绩 if (s!= null) String tmp[] = s.split(","); teststudent[i++] = (5) (tmp[0], Integer.parseInt(tmp[1])); else done = true; in.close(); (6) = new SortStudent(); ss.sort(teststudent); System.out.println("top 30%:"); for (int j = 0; j < size * 0.3; j++) System.out.println(testStudent[j]); catch (IOException e) System.out.println("io error!"); catch (NumberFormatException e) System.out.println("not a number!"); (7) int size = 100; // 学生总数 2010 年下半年程序员下午试卷第 10 页 ( 共 10 页 )