电脑报特邀名师考前指点——要过二级不能不看
主题策划
5天,还有5天,2009年全国计算机等级考试就开考了!5天的时间,进行冲刺复习够吗?一般不够,不过如果有电脑报特邀的二级考试专家组的名师指点,5天时间就够了……
孙顾天
全国计算机等级考试技术组成员,浙江省计算机等级考试资深名师。参与全国计算机等级考试评卷及《全国计算机等级考试——习题集》、《C语言程序设计》等10多本教材与参考书籍的编写。
上半年考试折射的趋势
电脑报:孙老师,欢迎你来给我们的读者做考前的指导。每次的全国计算机二级等级考试前,我们都会收到读者的大量来信,希望得到考前的一些指点和辅导、传授一些考试经验,于是我们就想到了你。去年的专题给我们读者朋友带来了意外的惊喜,希望这次你也会给他们带来惊喜。
孙顾天:去年出的模拟题,有80%左右的题型和知识点都与最后的考题相符合,只要会变通考试及格是肯定没有问题的,例如知道3×2=6,就会做6÷2=3。不过随着2008年全国计算机等级考试大纲改革以来,出题的方式又有了新的变化,去年的模拟题在今年的参考价值就不大了。所以针对今年的变化,出了考前冲刺题,只要大家认真做,理解透彻,通过二级是不会有任何问题的。
电脑报:孙老师,从今年上半年的考试中,你看到了哪些变化,题目变化的趋势是什么?请你给我们的读者先大概讲讲。
孙顾天:好的。从趋势来看,考C语言的人数最多,但要求也越来越高,对动手能力的考查更多了。C语言和VFP语言成为报考的主流科目。在新增加的语言中,最受考生欢迎的是Java语言。
二级C语言
从整体来看,上半年的笔试卷仍以控制结构、数组、函数、指针为重点,知识点是if语句、for语句、字符串、函数参数及调用、数组的指针应用。但出现了新的题型以及新的难点。
1. 初始化概念的题增多,所占的比例比较大,而且是概念题的主体。
2. 宏定义语句。除了要掌握宏定义语句的“原样替换”概念之外,还要注意语句应用的格式(语法)——试题中出现的源程序代码段本身的错误(本次考试的新题型)。
3. 格式化输入、输出函数的应用。新的重点,考查考生的一些知识模糊点。
4. 结构体、文件、位运算概念,这类题主要是以概念与格式为主,题型比较新。
5. 上机填空题,加大了对结构体的考核,不再是原来的基础算法的阅读与填写。
6. 上机修改题,以“字符串+指针”为主要出题模式,这在一定程度上加大了程序修改的难度,也不再是以语法修改为主,逐渐变为进行语意的修改。
7. 上机程序设计题,加大了对题目中源代码的阅读要求,必须完全理解源代码才可以进行编程。
二级VFP语言
从上半年的考试中可以发现试卷对指令的理解要求比较高,其中的SQL指令是考试的重点与难点。回顾上半年的试题,发现了不少新的内容:
1.理论判断选择题中,基本上以数据库概念为主,这也体现了试题的方向趋向于基础知识的理解与深入认识。
2. SQL是VFP命令中最重要的命令,也是考试的主要内容,上半年的试题中加重了SQL条件设置的题目。
3. VFP试题中很少出有关编写代码的试题,但在上半年试题中出现了对代码的阅读与转换试题,这一点要引起考生的极大注意。
4.上机应用题中以SQL查询为主,这部分对Select查询命令的要求比较高,考生要掌握多表查询、结果输出。
二级Java语言
细看2009年3月份的笔试题,考核的内容重点突出两个方向:
1.Swing包中基本类的应用与Applet编程,这是笔试程序类题的主体。
2.Java程序运行。这类题与其他语言出题有所不同(根据2008年与2009年的试题),主要考核内容不是运行的结果,而是运行中代码、指令或特定标志符的含义。
这些考试经验必须重视
电脑报:孙老师,还有几天就要考试了,在这期间考生应该怎么复习呢?
孙顾天:第一,复习时要巩固基础知识。第二,做复习题要“求精去杂”。第三,要有复习方案,先精读教材,特别是自己运用得不好的知识点,然后反复练习,特别要进行一些专项的突击练习,最后全面温习自己的笔记,加强记忆。
此外,在冲刺复习时,一定要安装考试指定的上机调试软件,要注意软件应用时的特性:C语言的VC6.0编译软件(运行环境的清除、调试过程中错误的查看)、VFP语言的VFP6.0编译软件(数据库的独占打开方式、工作区、关闭已经打开的表或库)、Java中NetBeans5.0(考查环境变量的配置、调试过程中错误的查看)。
考生一定要熟悉上机软件的运用,每次做题时最好把编译软件关闭后,再打开(以免对前一次操作的程序产生调试或编译的影响)。特别注意:上机时,程序必须执行与保存(否则会没有成绩)。
电脑报:孙老师,在考试中应该注意什么?你有什么经验可以传授给大家的吗?
孙顾天:好的,下面我来说说在考试中容易出现的问题。
感到试题“复杂”、“繁”
感到试题“复杂”,主要是笔试中的程序阅读题与程序填空题。这类题考生在做题中,很喜欢以“最佳方式”来解题,其实这种想法是错误的。二级考题中的阅读题部分,往往就是以看懂程序执行步骤为主旨的,所以一味找“最佳方式”,反而引导考生进入一个错误的环境。
在实际考试中,我们也经常发现一些考生做题过快,阅读题没有按语句逐条执行,而是用眼来代替手工执行,这样答题必定是要出错的。我建议考生在看到“复杂”的题时,一定要用草稿纸来手工模拟执行过程(分别写出每次执行的变量值,并要明确写出执行语句的方向),这样“复杂”题也会变“简单”的。
感到试题“繁”,主要是知识点理解不深的部分题目。考生见到“繁”题,多以乱做与瞎猜为主,在实际考试中,经常可以看到考生出现这种情况。我建议考生注意这几个方面:函数中的递归、函数中形参与实参的关系、循环执行步骤、指针变量的指向与运算、位运算、结构体。这类的复习要注意原理的掌握。
感到试题“模糊”、“难”
感到试题“模糊”,主要是数据库概念及其应用,这是考生复习与应考中最大的问题。我建议考生,从SQL着手来认识数据库概念与应用命令实现,SQL命令是一个很庞大的语句组,其中包含了所有的数据库操作指令,但考生在复习中一定要以Select、Alter、Update、Delete、Drop为主,特别是Select——掌握查询条件的运用与目标的输出,Alter——数据库完整性设置(有效规则等)及表结构。
感到试题“难”,主要是笔试与上机中的数组、指针、表单设计、函数程序阅读与编程等题,这类题是考生最怕见到的,但却是考试中分值较重的题。在实际考试中,考生遇到这类题时,总是会去想以往做过的练习题——“经典题”,这种做法往往使考生更不能掌握解题的要旨。
我建议考生在做“难”题时,按照“目的→数据结构→编程思路”的顺序来解题。先确定程序代码的执行目的,通过结果可以看出所要用的一些基本算法,然后在明确结果的基础上,查看程序所用的数据结构,最后通过已知的代码进行编程思路的判断。
不能靠感觉做题
在考试中,哪怕是基础题也要手工进行模拟运算,不能以主观来代替运算。很多考生在二级考试中都不用草稿纸的——在Java考试中最常见。这说明,考生做题完全是靠感觉的,这样答题得分怎么能高呢?要避免这个问题,就是要分析题目的主旨,手工在草稿纸上模拟执行过程。
碰到没见到过的题
没见到过的题中大半以上是难题,考生在答题前必须认清题目的主要考核方向。例如,Java考试中,难题的主要出题方向是Applet,所以考生一定要熟练掌握Applet中的图像绘制、组件应用。在实际考试中,此类题的比重不是很大,如果实在做不了可以放弃。
冲刺题独家奉上
二级C语言
1.若变量已正确定义,有以下程序段
int a=3,b=5,c=7;
if(a>b) a=b;c=a;
if(c!=a) c=b;
printf("%d,%d,%d\n",a,b,c);
其输出结果是。
A.程序段语法有错
B.3,5,3
C.3,5,5
D.3,5,7
本题难度: ★★★
涉及知识: 控制语句,if语句语法
名师解析: 本题程序先判断表达式a>b,不成立,跳过此if的语句“a=b;”,执行“c=a;”语句,此时c=3。判断第二个if的表达式c!=a,由于此时c为3,所以此表达式不成立,跳过此if的语句“c=b;”,执行printf语句,输出3,5,3。注:if语句中若要执行多条语句,必须加{}。
2.假设变量已正确定义并赋值,以下正确的表达式是。
A.x=y*5=x+x
B.int(15.8%5)
C.x=y+z+5,++y
D.x=25%5.0
本题难度: ★★
涉及知识: 数据类型、运算符与表达式
名师解析: 由赋值运算符将一个变量和一个表达式连起来的式子称为“赋值表达式”,由于选项A相当于x=y*5和y*5=x+z两个赋值表达式组合在一起,而y*5=x+z由于赋值运算符左边不是变量,而是表达式,所以选项A不正确;由于求余运算符%两侧均要求为整型数据,所以选项B、D不正确。
3.有以下程序
#include
void fun(char *a,char *b)
{ while(*a=='*') a++;
while(*b=*a) {b++;a++;}
}
main()
{ char *s="*****a*b****",t[80];
fun(s,t); puts(t);
}
程序的运行结果是。
A.*****a*b
B.a*b
C.a*b****
D.ab
本题难度: ★★★★
涉及知识:指针变量作为函数的参数
名师解析:本程序的主函数中定义了一个字符型指针变量s和字符型数组t,将s和t作为实参调用fun函数,使得形参指针变量a和b分别指向s和t所在存储单元的首地址,子函数中第一个while循环用于将指针变量a移动并指向非*字符的地址,即字符a的地址。
第二个while循环的作用是将a指向的所有字符通过循环赋值方式赋给*b,由于指针变量b与字符数组t共用同一存储单元,所以对*b的改变也即对数组t内容的改变,最终通过puts函数输出数组t的内容。puts()函数的作用是将一个字符串输出到终端,即最终输出a*b****。
4.有以下程序
#include
main()
{ int x=8;
for( ;x>0;x--)
{ if(x%3) { printf("%d,",x--); continue;}
printf("%d,",--x);
}
}
程序的运行结果是。
A.7,4,2
B.8,7,5,2
C.9,7,6,4
D.8,5,4,2
本题难度: ★★★★
涉及知识:循环控制结构、continue语句
名师解析:continue语句的功能是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下次是否执行循环的判定。本题执行过程如下:
x=8:判断表达式x>0,值为真,执行for循环,判断条件表达式x%3,值为真,输出x--,即先输出x再减1,即输出8,然后x减1,此时x=7。遇到continue,跳过下面的语句,判断for语句的表达式,由于循环表达式使得x减1,所以此时x再次减1,即x=6。
x=6:判断表达式x>0,值为真,执行for循环,判断条件表达式x%3,值为假,跳过if语句,执行下面的printf语句,输出--x,即x先减1,再输出,此时输出的x为5,判断for语句的表达式,由于循环表达式使得x减1,所以此时x再次减1,即x=4。
x=4:判断表达式x>0,值为真,执行for循环,判断条件表达式x%3,值为真,输出x--,即先输出x再减1,即输出4,然后x减1,此时x=3。遇到continue,跳过下面的语句,判断for语句的表达式,由于循环表达式使得x减1,所以此时x再次减1,即x=2。
x=2:判断表达式x>0,值为真,执行for循环,判断条件表达式x%3,值为真,输出x--,即先输出x再减1,即输出2,然后x减1,此时x=1。遇到continue,跳过下面的语句,判断for语句的表达式,由于循环表达式使得x减1,所以此时x再次减1,即x=0。
x=0:判断表达式x>0,值为假,退出for循环。
5.变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是11110000。若要求将a的高4位取反,低4位不变,所要执行的运算是。
A.a^b
B.a|b
C.a&b
D.a<<4
本题难度: ★★★
涉及知识:位运算
名师解析:“按位异或”运算的规则是参与运算的两个相应位同号,则结果为0,不同则为1。从这个规则中我们分析可得,通过与1异或可达到求反的效果,与0异或可保持被异或的值本身不变。
根据此题要求,a和b必然是异或运算,故本题答案为A。<<是C语言中规定的左移运算符,例如a<<2,这个语句即是将a的二进制数左移两位,左移一位相当于该数乘以2,左移两位相当于该数乘以2的2次方。|和&分别是按位或运算符和按位与运算符。
6.有以下程序
#include
int f(int x)
{ int y;
if(x==0||x==1) return(3);
y=x*x-f(x-2);
return y;
}
main()
{ int z;
z=f(3); printf("%d\n",z);
}
程序的运行结果是。
A.0
B.9
C.6
D.8
本题难度: ★★★★★
涉及知识:函数常规调用、嵌套调用、递归调用
名师解析: 本程序中的子函数f是一个递归调用函数,其结束条件是x的值为0或1。首先主函数调用f函数,x值为3,不满足条件x==0||x==1,则执行y=x*x-f(x-2);,所以y=3*3-f(1),调用f(1),满足条件x==0||x==1,返回函数值3,即f(1)的值为3。 y=x*x-f(x-2)=3*3-3=6,即f(3)的结果是6,故程序输出6。
7.程序中已构成如图1所示的不带头结点的单向链表结构,指针变量s、p、q均已正确定义,并用于指向链表结点,指针变量s总是作为头指针指向链表的第一个结点。

若有以下程序段
q=s; s=s->next; p=s;
while (p->next) p=p->next;
p->next=q; q->next=NULL;
该程序段实现的功能是。
A.首结点成为尾结点
B.尾结点成为首结点
C.删除首结点
D.删除尾结点
本题难度: ★★★★★
涉及知识:结构体、指针链表
名师解析: 根据语句q=s得知指针q指向结点a。由s=s->next;p=s得知指针p和s均指向结点b。在满足while语句的情况下,执行p=p->next;得知p现在指向结点c。由p->next=q得知p 指向的结点是a,a移到c的后面。由q->next=NULL得知结点a与结点b的指针断开。移动后的结构图如图2所示:

8.有以下程序
#include
main()
{ FILE *fp; int k,n,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w");
fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]); fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);
fclose(fp);
fp=fopen("d2.dat","r");
fscanf(fp,"%d%d",&k,&n); printf("%d%d\n",k,n);
close(fp);
}
程序运行后的输出结果是。
A.1 2
B.1 4
C.123 4
D.123 456
本题难度: ★★★★
涉及知识:文件的综合应用
名师解析:本题首先以创建方式打开文件d2.dat,两次调用fprintf()函数把a[0],a[1],a[2] ,a[3],a[4],a[5]的值写到文件d2.dat中,文件d2.dat的内容为“1,2,3<回车>4,5,6”。
然后把该文件关闭再以只读方式打开,文件位置指针指向文件头,再通过fscanf()函数从中读取两个整数到k和n中,由于格式符之间无间隔,因此输入数据可以用回车隔开,故输入的k的值为123,n的值为456。
9.有以下程序
#include
main()
{char c;
while((c=getchar())!='?') putchar(--c);
}
程序运行时,如果从键盘输入:Y?N?↙,则输出结果为。
本题难度: ★★★
涉及知识:输入输出函数
名师解析: getchar()只能接收一个字符,当从键盘输入Y?N?↙,系统判断出第一个字符Y!='?'条件为真,输出X,继续循环,这时while条件不成立,循环结束。
10.fun函数的功能是:首先在a指向的N行N列的矩阵中,找出各行中的最大的数,再求这N个最大值中的最小的那个数并作为函数值返回。
#include
#define N 100
int fun(int(*a)[N])
{int row,col,max,min;