电脑报特邀名师指点全国计算机二级C考试
特别策划
离4月12日全国计算机二级C语言考试还有最后五天,该怎么准备?
电脑报专门请来了全国计算机等级考试技术组成员、浙江省计算机等级考试资深名师——孙顾天老师为大家精心制作了一套模拟题。孙顾天老师参与过全国计算机等级考试评卷及《全国计算机等级考试——习题集》、《C语言程序设计》等10多本教材与参考书籍的编写。如果你理解了这些题,相信二级C语言冲上90分也不难!
孙顾天眼中的计算机二级考试
电脑报:孙老师,每年的全国计算机二级等级考试前,我们都会收到很多学生的来信,希望能刊登一些相关的学习资料。我们也非常理解学生们的这种需求,这次请您来,希望能为应试的考生作一些指点,给他们带来一些惊喜。

孙顾天:惊喜?这有难度,呵呵。对只有五天时间来说,最好的方法,就是给大家出一套模拟考试题,并对考试题进行详细的解读,大家理解了这套题,相信过二级考试就不难了。
近年来,全国计算机二级等级考试知识点越来越明细,以基础知识为主体,并加强了对基础知识应用的深入理解。本套模拟试题,从基础知识点入手,让考生可以全面地掌握出这类考题的出题方向、知识点分布情况。其中,几个常见知识点均给出了不同的试题类型,以便考生可以举一反三。
我认为只须了解的知识点:算法(堆栈、队列、链表)、程序设计基础(程序设计风格)、软件工程基础(软件生命周期、软件危机、结构化分析、设计方法)、数据库设计基础(数据库基本概念、关系代数)。
我认为必须掌握的知识点:算法(二叉树性质运算与遍历、排序运算)、程序设计基础(面向对象与面向过程的基本概念)、软件工程基础(软件定义、软件工程概念、软件测试分类)、数据库设计基础(数据模型)。选择排序、冒泡排序、交换、二维数组元素值对换、杨辉三角、阶乘、累加、素数、字符ASCII、字符串连接、字符串比较、求最大/小值、链表插入、链表删除、结构体应用。
各类试题侧重知识点
回顾历年试题,选择题的前10题与填空题的前5题均为公共基础知识部分,其出题重心在理论的了解与算法的掌握(考生不必在这些题上下太多的功夫,但二叉树部分的计算是必须掌握的)。
选择题后40题分为三大部分:11~20题为C语言语法基础(标识符命名、输入/输出函数、变量定义等);21~30题为简单程序(条件表达式理解、控制语句、字符型数据运算);30~50题为综合程序(数组、函数、指针、结构体、预处理命令等)。填空题的6~20题为C语言的程序应用(主要考查一些常用的算法代码书写与程序的阅读能力)。
上机题主要分三大部分:第一题:填空,主要考查简单算法与控制语句的掌握;第二题:改错题,测试考生对语义的理解;第三题:编程题,必考知识点是数组、指针、函数,可能还会涉及数值数组运用、字符串操作、链表操作等。
本次考试最可能考到的知识点
4月12号就要参加考试的学生,在复习时一定要重点明确。例如基础部分的知识,在一定程度上讲是可以研究很深入的但根本没有必要,一旦分寸把握不当反而失分。因此,我建议考生在复习基础部分时,以概念掌握为主导,只重点掌握排序与二叉树部分。
我认为这次考试最可能考到的知识点是:C语言基本语法(如C程序的组成,语句的书写、标识符命名、常量、变量的区分)、数据类型(区分不同的数据类型、注意整型与字符型相互的ASCII运算)、控制语句(分支——条件的书写与控制的语句数量、循环——执行顺序与次数判定)、数组(初始化、二维数组、字符串,注意字符串相关函数应用)、函数(声明、定义、调用、递归)。
此外,请考生要注意函数定义时返回值类型的应用、指针(指向数组、指向字符串)、预处理命令(#define、#include,由于本次考试的一些变化,请考生要注意#include的使用)、结构体(这一类型是笔试必出题,往往出现在选择与填空的最后一题。出题的要点在于链表的应用:建立、删除结点、查找结点)。
考试重点仍然在数组、函数、指针这三大部分,但也可能扩展至其他知识点。考生在复习时,一定要重点明确,加强程序阅读能力,在程序中梳理知识点。
上机考试是本次考试中变化比较明显的部分,全部统一使用VC6.0编译工具。对于大部分考生来说应该更加方便,因为VC是中文版本。但VC对程序编写格式的要求也比较高。考生一定要熟练运用(Ctrl+F7——编译,Ctrl+F5——链接,Ctrl+F5——执行),上机时不要忘记保存与执行。
笔试部分
一、选择题
1.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为
A)GEDHFBCA B)DGEBHFCA C)ABCDEFGH D)ACBFEDHG
2.树是节点的集合,它的根节点数目是
A)有且只有1 B)1或多于1 C)0或1 D)至少2
3.如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是
A)e3,e1,e4,e2 B)e2,e4,e3,e1 C)e3,e4,e1,e2 D)任意顺序
4.在设计程序时,应采纳的原则之一是
A)不限制goto语句的使用 B)减少或取消注解行
C)程序越短越好 D)程序结构应有助于读者理解
5.下列叙述中,不属于软件需求规格说明书的作用的是
A)便于用户、开发人员进行理解和交流
B)反映出用户问题的结构,可以作为软件开发工作的基础和依据
C)作为确认测试和验收的依据
D)便于开发人员进行需求分析
6.下列不属于软件工程的3个要素是
A)工具 B)过程 C)方法 D)环境
7.单个用户使用的数据视图的描述称为
A)外模式 B)概念模式 C)内模式 D)存储模式
8.将E-R图转换到关系模式时,实体与联系都可以表示成
A)属性 B)关系 C)键 D)域
9.下列工具中为需求分析常用工具的是
A)PAD B)PFD C)N-S D)DFD
10.SQL语言又称为
A)结构化定义语言 B)结构化控制语言
C)结构化查询语言 D)结构化操纵语言
11.C语言程序的基本单位是
A)程序行 B)语句 C)函数 D)字符
12.下面四个选项中,均是合法整型常量的选项是
A)160-0xffff011 B)-0xcdf01a0xe
C)-01986,0120668 D)-0x48a2e50x
13.以下选项中合法的用户标志符是
A)long B)_2Test C)3Dmax D)A.dat
14.在C语言中,变量的隐含存储类别是
A)auto B)static C)extern D)无存储类别
15.以下4个选项中,不能看做一条语句的是
A); B)a=5,b=2.5,c=3.6; C)if(a<5); D)if(b!=5)x=2;y=6;
16.假定x和y为double型,则表达式x=2,y=x+3/2的值是
A)3.500000 B)3 C)2.000000 D)3.000000
17.设x,y,t均为int型变量,执行下列语句后,y的值为
x=y=3;
t=++x||++y;
A)不确定 B)4 C)3 D)1
18.已知i,j,k为int型变量,若从键盘输入:1,2,3<回车>,使i的值为1,j的值为2,k的值为3,以下选项中正确的输入语句是
A)scanf("-,-,-", i, j, k);
B)scanf("%d %d %d",&i,&j,&k);
C)scanf("%d,%d,%d",&i,&j,&k);
D)scanf)"i=%d,j=%d,k=%d",&i,&j,&k);
19.有如下定义
#define D 2
int x=5;float y=3.83;
char c='D';
则下面选项中错误的是
A)x++; B)y++; C)c++; D)D++;
20.下列程序运行的结果是
main()
{
float x;
int i;
x=3.6;
i=(int)x;
printf("x=%f,i=%d ",x,i);
}
A)x=3.600000,i=3 B)x=3.6,i=3
C)x=3,i=3 D)x=3.600000,i=3.000000
21.以下程序的输出结果是
main()
{
int x=1,y=3;
printf("%d,",x++);
{ int x=0;x+=y*2;
printf("%d,%d, ",x,y);
}
printf("%d,%d\n",x,y);
}
A)1,6,3,1,3 B)1,6,3,6,3
C)1,6,3,2,3 D)1,7,3,2,3
22.以下程序段的描述,正确的是
x=-1;
do
{x=x*x;}
while(!x);
A)死循环 B)循环执行两次
C)循环执行一次 D)有语法错误
23.设有以下程序段
int x=0,s=0;
while(!x!=0)s+=++x;
printf("%d",s);
则
A)运行程序段后输出0
B)运行程序段后输出1
C)程序段中的控制表达式是非法的
D)程序段执行无限次
24.在下述程序中,判断i>j共执行的次数是
main()
{int i=0, j=10, k=2, s=0;
for (;;)
{i+=k;
if(i>j)
{printf("%d",s);
break;
}s+=i;
}
}
A)4 B)7 C)5 D)6
25.执行下面的程序段后,变量k中的值为
int k=3, s[2];
s[0]=k; k=s[1]*10;
A)不定值 B)33 C)30 D)10
26.以下不能对二维数组a进行正确初始化的语句是
A)int a[2][3]={0};
B)int a[2][]={{1,2},{0}};
C)int a[][3]={{1,2},{3,4},{5,6}};
D)int a[2][]={1,2,3,4,5,6};
27.下面程序输出的结果是
main()
{
int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
printf("%d ",a[2-i][i]);
}
A)1 5 9 B)7 5 3 C)3 5 7 D)5 9
28.下面说明不正确的是
A)char a[10]="china";
B)char a[10],*p=a;p="china"
C)char *a;a="china";
D)char a[10],*p;p=a="china"
29.下列程序执行后的输出结果是
main()
{ char arr[2][4];
strcpy(arr,"you"); strcpy(arr[1],"me");
arr[0][3]='&';
printf("%s\n",arr);}
A)you&me B)you C)me D)err
30.C语言规定,函数返回值的类型是由
A)return语句中的表达式类型所决定
B)调用该函数时的主调函数类型所决定
C)调用该函数时系统临时决定
D)在定义该函数时所指定的函数类型所决定
31.设有如下函数
fun (float x)
{
printf("\n%d",x*x);}
则函数的类型是
A)与参数x的类型相同 B)void C)int型 D)无法确定
32.以下正确的说法是
A)定义函数时,形参的类型说明可以放在函数体内
B)return后边的值不能为表达式
C)如果函数值的类型与返回值类型不一致,以函数值类型为准
D)如果形参与实参类型不一致,以实参类型为准
33.若有以下程序
#include <stdio.h>
void f(int n);
main()
{ void f(int n);
f(5);
}
void f(int n)
{ printf("%d\n",n); }
则以下叙述中不正确的是
A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f
B)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f
C)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明
D)函数f无返回值,所以可用void将类型定义为无返回值型
34.有以下程序
int f(int n)
{ if(n==1)return 1;
else return f(n-1)+1;}
main()
{ int i,j=0;
for(i=1;i<3;i++)j+=f(i);
printf("%d\n",j);}
程序运行后的输出结果是
A)4 B)3 C)2 D)1
35.若说明int *p,n;则通过语句scanf能够正确读入数据的程序段是
A)p=&n;scanf("%d",&p);
B)p=&n;scanf("%d",*p);
C)scanf("%d",n);
D)p=&n;scanf("%d",p);
36.下面函数的功能是
char *fun(char *str1,char*str2)
{
while((*str1)&&(*str2++=*str1++));
return str2;
}
A)求字符串的长度
B)比较两个字符串的大小
C)将字符串str1复制到字符串str2中
D)将字符串str1接续到字符串str2中
37.下列程序的运行结果是
void fun(int *a,int *b)
{
int *k;
k=a;a=b;b=k;
}
main()
{
int a=2004, b=9,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
}
A)2004 9 B)9 2004
C)0 0 D)编译时出错
38.下列程序是用来判断数组中特定元素的位置所在。如果输入如下整数:
876 675 896 101 301 401 980 431 451 777
#include <stdio.h>
int fun(int *s, int t, int *k)
{
int i;
*k=0;
for(i=0;i<=t;i++)
if(s[i]==980) *k=i;
}
main()
{
int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;
clrscr();
fun(a, 10, &k);
printf("%d, %d\n ", k, a[k]);
}
则输出结果为
A)7,431 B)6 C)980 D)6,980
39.下面程序应能对两个整型变量的值进行交换。以下正确的说法是
main()
{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
}
swap(int p,int q)
{
int t;
t=p;p=q;q=t;
}
A)该程序完全正确
B)该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可
C)该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可
D)以上说法都不对
40.有以下程序
main()
{
char *p,*q;
p=(char *)malloc(sizeof(char)*20); q=p;
scanf("%s %s",p,q); printf("%s %s\n",p,q);
}
若从键盘输入:abc def<回车>,则输出结果是
A)def def B)abc def C)abc d D)d d
41.有如下程序
main()
{ char ch[2][5]={"6937","8254"},*p[2];
int i,j,s=0;
for(i=0;i<2;i++)p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>'\0';j+=2)
s=10*s+p[i][j]-'0';
printf("%d\n",s);}
该程序的输出结果是
A)69825 B)63825 C)6385 D)693825
42.设有如下定义:
struct sk
{ int a;
float b;
} data;
int *p;
若要使P指向data中的a域,正确的赋值语句是
A)p=&a; B)p=data.a; C)p=&data.a; D)*p=data.a;
43.有以下程序
struct STU
{ char num[10]; float score[3]; };
main()
{
struct STU s[3]={{"20021",90,95,85},
{"20022",95,80,75},
{ "20023",100,95,90},
},*p=s;
int i; float sum=0;
for(i=0;i<3;i++)
sum=sum+p->score[i];
printf("%6.2f\n",sum);
}
程序运行后的输出结果是
A)260.00 B)270.00 C)280.00 D)285.00
44.以下对结构体类型变量的定义中,不正确的是
A)typedef struct aa
{ int n;
float m;
}AA;
AA tdl;
B)#define AA struct aa
AA{ int n;
float m;
} tdl;
C)struct
{ int n;
float m;
} aa;
struct aa tdl;
D)struct
{ int n;
float m;
} tdl;
45.若有下面的说明和定义
struct test
{ int ml; char m2; float m3;
union uu {char ul[5]; int u2[2];} ua;
} myaa;
则sizeof(struct test)的值是
A)12 B)16 C)14 D)9
46.以下程序的输出是
struct st
{ int x; int *y;} *p;
int dt[4]={ 10,20,30,40 };
struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};
main()
{ p=aa;
printf("%d\n",++(p->x));
}
A)10 B)11 C)51 D)60
47.若有运算符<<,sizeof,^,&=,则它们按优先级由高至低的正确排列次序是
A)sizeof,&=,<<,^
B)sizeof,<<,^,&=
C)^,<<,sizeof,&=
D)<<,^,&=,sizeof
48.函数fseek(pf, OL,SEEK_END)中的SEEK_END代表的起始点是
A)文件开始 B)文件末尾 C)文件当前位置 D)以上都不对
49.有以下程序
#include <stdio.h>
main()
{ FILE *fp; int i=20,j=30,k,n;
fp=fopen("d1.dat","w");
fprintf(fp,"%d\n",i);fprintf(fp,"%d\n",j);
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp,"%d%d",&k,&n); printf("%d %d\n",k,n);
fclose(fp);
}
程序运行后的输出结果是
A)20 30 B)20 50 C)30 50 D)30 20
50.有以下程序
#include
struct NODE
{ int num; struct NODE *next; };
main()
{
struct NODE *p,*q,*r;
p=(struct NODE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r=(struct NODE*)malloc(sizeof(struct NODE));
p->num=10; q->num=20; r->num=30;
p->next=q;q->next=r;
printf("%d\n ",p->num+q->next->num);
}
程序运行后的输出结果是
A)10 B)20 C)30 D)40
二、填空题
冒泡排序算法在最好的情况下的元素交换次数为【1】 。
在最坏情况下,堆排序需要比较的次数为【2】 。
若串s=“MathTypes”,则其子串的数目是【3】 。
【4】是数据库设计的核心。
在关系模型中,把数据看成一个二维表,每一个二维表称为一个【5】 。
以下程序的输出结果是【6】。
main ()
{ int i=010,j=10;
pirntf (“%d,%d\n”,i,j);
}
下列程序的输出结果为【7】。
main ()
{ int x=3,y=5;
printf ('%d',x=)x--)*(--y));
}?
以下程序的输出结果是【8】。
fun (int x,int y,int z)
{ z =x*x+y*y;}
main ()
{ int a=31;
fun (6,3,a)
printf ("%d", a)
}
已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch='a'+'8'-'3'的值为【9】。
若从键盘输入58,则以下程序输出的结果是【10】 。
main()
{ int a;
scanf("%d",&a);
if(a>50)printf("%d",a);
if(a>40)printf("%d",a);
if(a>30)printf("%d",a);
}
下列程序的输出的结果是【11】和【12】。
main()
{ int i,j row,colum,m;
static int array[3][3]={{100,200,300},{28,72,-30}{-850,2,6}};
m=array[0][0];for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(array[i][j]<m)
{m=array[i][j];colum=j;row=i;}
printf("%d,%d,%d\n",m,row);
}
以下程序中,select 函数的功能是在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。请填空。
#define N 3
#define M 3
select(int a[N][M],int *n)
{ int i,j,row=1,colum=1;
for(i=0;I<N;I++)
for(j=0;j<M;j++)
{
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=【13】;
return 【14】 ;
}
main()
{ int a[N][M]={9,11,23,6,1,15,9,17,20},max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}
函数my_cmp()的功能是比较字符串s和t的大小,当s等于t时返回0,否则返回s和t的第一个不同字符的ASCII码差值,即s>t时返回正值,当s my_cmp(char *s, char *t) { while (*s == *t) { if (*s == '\0')return 0; ++s; ++t; } return 【15】 ; } 下列程序的功能是输入一个整数,判断是否是素数,若为素数输出1,否则输出0,请填空。 main() {int i, x, y=1; scanf("%d", &x); for(i=2; i<=x/2; i++) if【16】{ y=0; break;} printf("%d\n", y); } 下面程序的功能是将一个字符串str的内容颠倒过来,请填空。 #include<string.h> main() { int i,j,【17】;char str[]={“1234567”}; for(i=0,j=strlen(str)【18】;i<j;i++,j--) {k=str[i];str[i]=str[j];str[j]=k;} printf("%s\n",str); } 以下程序可把输入的十进制数以十六进制数的形式输出,请填空。 main() {char b[17]={"0123456789ABC DEF"}; int c[64],d,i=0,base=16; long n; printf("Enter a number:\n");scanf("%ld",&n); do{c[i]=【19】;i++;n=n/base;} while(n!=0); printf("Transmite new base:\n"); for(--i;i>=0;--i) {d=c[i];printf("%c",b【20】);} printf("\n"); } 1.B 本题解析方法为:先根据前序,找到总的根,再到中序里,根之前的为左,根之后的为右子树,再用同样的方法继续…… 2.A 送分题,考察有关树的基本定义。 3.B 栈元素的“弹出”与“压入”动作可以交叉进行,但栈的“先入后出”原则必须遵守。 4.D 送分题,考查结构化程序设计基本概念。 5.D 软件需求规格说明书方便于用户、开发人员进行理解和交流;软件需求规格说明书能反映出用户问题的结构,可以作为软件开发工作的基础和依据;软件需求规格说明书也是作为确认测试和验收的依据。 6.D 软件工程包括三个要素:方法、工具和过程。 7.A 考查考生对有关数据库的三级模式结构概念模式、外模式、内模式的理解。外模式是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图。 8.B 考查考生对E-R图与关系模式的转换方法的理解。 9.D 考查考生对软件工程需求分析常用工具的了解。 10.C 送分题,考查SQL语言的基本概念。 11.C C程序是由函数所组成的,每个程序必须有且只有一个main函数。 12.A 判断常量和变量每年都有一两道题,但对常量理解不透彻极易出错。答案B和D,在数字中的中后段均出现了非法字符x,答案C的非法,在新标准中八进制不允许用8和9。 13.B 标志符由数字、字母、下划线组成且第一个字符必须为字母或者下划线。 14.A C语言中,变量存储分为动态与静态二种存储方式。auto是自动存储类别,变量定义时隐含不写,它属于动态存储方式。故而,本题选A项。 15.D C语言中,语句以分号结束标志。分号的个数就代表语句数。 16.D y=x+3/2,即y=2+3/2=3,因为y为double型,故选D项。 17.C t=++x||++y时,++x值为非0(真),++y没有执行,y的值没有改变,仍为3。 18.C A项,错在双引号内格式控制符与对应的变量没有添加&符号。B项,错在双引号内所指定的数据分隔符与实际要求不符。D项,错在双引号内输入的格式要求与实现输入不符,它所对应的输入“i=1,j=2,k=3”。故而,C项正确。 19.D 宏定义在C代码的“预编译”阶段完成替换。因此D选项相当于 2++,对一个常量进行++操作无效。 20.A C语句中对数据类型的操作有二种:强制转换、自动转换。强制转换时,必须保证类型添加(),即(类型)(表达式)。题中,i=(int) x;即:将x值转换为int型数据存入i变量。 21.C 本题考核的数据运算与定义方面内容比较全面。其中,x++作为表达式输出结果为x的原值。变量定义与使用法则:就近性原则,即使用的变量是最近定义的。{}内所定义的变量只对{}内有效,即{}内定义的x变量,对外层定义的x变量进行屏蔽。 22.C 非0即真,为0即假。题中经一次循环体操作后,x并没有变成0。 23.B 本题需要区别前置++与后置++的区别。s+=++x中。x经前置++后,在整个表达式完成求值之前,x的值已经是1。另外逻辑取反(!)操作符与不等判断操作符(!=)的优先级,在此处并不重要,聪明的考生应可以发现这一点,避免陷入考题的陷阱。 24.D 本题测试for语句的格式,题中for语句的表达式均省略,考生要注意本题的阅读。Break语句所在的if语句,即为循环的结束条件。这一类型题,也是考试中最频繁出现的。 25.A s1没有得到初始化,就被加入表达式中参以计算。 26.C 对于二维数组初始化时,其列长度可以省略,但行长度是不可以省略的。 27.B C语言中,二维数组下标从左到右所反应的维度高低,即下标进行运算,这是考试中必然要遇到的。 28.D 了解数组的基本概念,理解题中的a是一个地址,而不是一个指针。你可以将一个指针指向另一个地址,但不存在将一个“地址”再“重新指向”到另一个“地址”。 29.A 本题所涉及的strcpy函数作用:将表达式2的值存入表达式1中。因为是对字符串的操作,所以表达式1使用数组名(地址、二维数组行地址)。 30.D C语言是一门静态语言。函数的返回值类型在定义时就必须得以确定。 31.C C语言中函数定义时,缺省返回值类型(默认为int),而不是无返回值。 32.C 主要考核函数的定义格式。 33.C C语言中,凡是调用函数定义部分在语句下方的函数时,必须在当前函数体内添加声明语句。 34.B 本题主要考核函数的递归知识,函数的调用分两种:1.被其他函数所调用;2.自身调用。对于自身调用(递归),考生必须注意调用的次数与返回点,必须遵循在哪儿调用返回至哪儿。不可以跳级返回。 35.D A项为地址的地址,错误。B项为指针变量所指向的变量中的值,错误。C项直接使用变量,错误。D项,为指针变量(变量的地址),故而正确。 36.C C语言中,可以用单独的分号表示空语句。题中的while循环体正是空语句,但其相关操作都在条件判断过程中完成。 37.A 关键在于理解fun函数中,交换的是什么?事实上它试图交换a,b两个形参的指向,并且没能取得成功,因为要交换指针的指向,则参数必须为“指针的指针”。 38.D 函数形参为指针变量时,实参为地址,进行地址传递。*形参变量的值将更改实参变量的值。 39.D C选项说法最接近,但仍有两处有严重问题,1.t不应改为指针,2.负责交换的执行语句t=p;p=q;q=t也需要改变,应为:t=*p;*p=*q;*q=t。 40.A 由于q=p,所以q,p二者指向同一块内存。 41.C 本题重点考评考生的代码阅读能力。代码本身并不复杂,但在不上机的情况下要得出其运行结果,仍然有很大难度。 42.C 在C语言中,结构体变量成员引用的格式:变量名.成员变量,p为指针变量,所以得出p=&data.a;。故而,C项正确。 43.B 因为p指向在循环过程中并没有发生改变,始终指向s[0],所以sum 依次加的是:90,95,85。 44.C 在C语言中,typedef对数据类型可以进行重命名,通常用在结构体类型声明中。 45.A 本题考点比较偏,但知识点非常重要。共用体union定义类型的变量所占内存长度等于最长的成员的长度;而结构体变量占内存长度为全体成员长度之和。sizeof()是求数据类型/变量占内存空间大小。 46.C 本题主要考核结构体知识的应用。题中p为指向结构体类型的指针变量,p->x表示*p.x,即为p所指向的结构体数组aa中某个元素的x成员值。掌握这一点后,考生就可以得出C项。 47.B 请考生注意对位运算的了解,虽然在历年考题中位运算的题不常见,但希望考生不要忽视(位运算还是比较简单的)。 48.B 本题直接考核文件函数的掌握,对于文件部分知识,只要求考生对常用文件函数的格式进行掌握,不要求深入研究与编程。 49.A 本题考核文件的打开、读取与写入函数的基本应用。 50.D q->next指向了r。q->next->num 就是 r->num。故值为10+30。 1.0 冒泡排序算法基本概念。 2.nlog2n 在几种排序算法中,快速排序法是最快的。 3.46 串s中共有9个字符,由于串中字符各不相同,则其子串中有0个字符的1个(空串),1个字符的9个,2个字符的8个,3个字符的7个,4个字符的6个,5 个字符的5个,6个字符的4个,7个字符的3个,8个字符的2个,9个字符的1个,共有1+2+3+4+5+6+7+8+9+1=46。 4.数据模型 数据模型是数据库设计的核心。其内容有三个部分:数据结构、数据操作和数据约束。 5.关系 数据库设计概念题。 6.8 10 C语言中,八进制数以0开始。故010转换为10进制后为8,而j保持不变,故输出为8,10。 7.12 在多数编译器上输出为12。抓住一点:后置操作对操作数的结果,需在表达式完成以后才体现。而前置操作的结果立即体现在操作数上,所以,在计算x=(x--) * (--y)的过程中,x仍为3,而y已为4。 8.31 仍然为31。因为fun函数中,三个形参都采用传值方式,在实际调用时,相当于复制了一份实参a的值。则函数内对z的操作并不影响到a的值。 9.f f的ASCII码为102,ch=97+8-3=102。 10.585858 三个条件均成立 11~12. -850 2 该题看得似乎复杂,但关键在于if (array[i][j] < m)这个条件。该条件表明是在array这个二维数组中找小于m的数,m最初为100。因此第一个找到的是28,然后m值变为28,继续这个过程。最终找到的是-850。 13~14. row a[row][colum] 本题所涉及的是二维数组最大值的常用算法,考生在阅读程序代码时对select函数中的if语句要重点理解,这是整个程序的中心。由此得出,*n取得行下标,return返回值为if语句中所得到的行与列对应的数组元素(即最大值)。 15.*s-*t return 的值为*s - *t 因为此时while循环已结束,说明当前s和t所指向的字符不相同(即*s != *t),依题意,此时应返回二者所指字符的ASCII差值。 16.(x%i==0) 本题考核基本算法——素数,题中的条件为判断是否能被整除。考试中数值的整除与取整这两种数值算法要掌握。 17~18. k -1 本题重点在于字符串操作,必须掌握字符串以'\0'字符结尾,所以题中str的长度为8(包含'\0'),在交换时'\0'字符不参加,所以要将它-1,从尾部第2个字符开始交换。这类题,在考试中出现频率较高。 19~20. n%base d 此题很难,对考生数据转换的掌握要求很高。题中n%base含义:取数值除16的余数(这一语句采自于数制转换公式),最后输出的是16进制数据。 请补充函数fun( ),该函数的功能是:依次取出字符串中所有的小写字母以形成新的字符串,并取代原字符串。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 #include <stdlib.h> #include <stdio.h> #include <conio.h> void fun(char *s) { int i=0; char *p=s; while (【1】) { if ( *p>='a' && *p<='z') { s[i]=*p; 【2】; } p++; } s[i]=【3】; } void main() { char str[80]; system("CLS"); printf("\nEnter a string:"); gets(str); printf("\n\nThe string is: %s\n",str); fun(str); printf("\n\nThe string of changing is : %s\n",str); } 下列给定程序中,函数fun( )功能是:将m(1<=m<=10)个字符串反着连接起来,组成一个新串,放入pt所指字符串中,例如:把3个串DEG,ac,df反着串联起来,结果是dfacDEG。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main( )函数,不得增加或者删行,也不得改变程序的结构。 #include <stdlib.h> #include <conio.h> #include <string.h> #include <stdio.h> void fun (char str[ ][10], int m, char *pt) { int k,q,i,j=0; /**********found**********/ for(k=m;k>0;k--) { q=strlen(str[k]); j+=q; for(i=0;i pt[i]=str[k][i]; pt+=q; pt[0]=0; } /***********found********/ pt=j; } void main( ) { int m,h; char s[10][10],p[120]; system("cls"); printf("\n please enter m:"); scanf("%d",&m); printf("\n please enter %d string:\n",m); gets(s[0]); for(h=0;h<m;h++) gets(s[h]); fun(s,m,p); printf("\n the result is :%s\n",p); } 下列程序定义了N*N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[ ][N], int n),该函数的功能是:使数字右上半三角元素中的值乘以m。 例如,若m的值为2,a数组中的值为: A=1 9 2 7 则返回主程序后a数组的值应为: 2 18 2 14 注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <conio.h> #include <stdio.h> #include <stdlib.h> #define N 5 void fun(int a[ ][N], int m) { } void main() { int a[N][N],m,i,j; system("CLS"); printf("******the array ******\n"); for(i=0;i<N;i++) /*输出一个随机的5*5矩阵*/ { for(j=0;j { a[i][j]=rand( )%20; printf("%d",a[i][j]); } printf("\n"); } do m=rand( )%10; while(m>=3); /*产生一个小于3的随机数*/ printf("m=%4d\n",m); fun(a,m); printf("THE RESULT\n"); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%4d",a[i][j]); printf("\n"); } } (1)*p (2)i++ (3)'\0' 本题考核知识点:字符串操作、指针应用。填空1:while循环的循环条件是指针p所指向的字符不是'\0',也就是说,当处理到字符串最后的结束标记字符'\0'时,while循环结束(即:读取整个字符串中的字符)。填空2:如果指针p所指的字符为小写字母,则将这个字符存于原字符串s中,同时下标自动加1,为下次存储做准备。填空3:在取出所有小写字母并存于原字符串s后,要注意在最后加上字符串结束标志符'\0'。 (1)错误:for(k=m;k>0;k--) 正确改为:for(k=m-1;k>=0;k--) (2)错误:pt=j; 正确改为:pt-=j; 本题是上机考试中常见的知识点题型,主要考查二维数组(字符串)运用及指针编程。错误1:二维数组下标的灵活运用,如果二维数组有m行,则行下标取值从0至m-1。在改错题中,控制语句改写是考核的重点,请广大考生注意掌握控制语句的语法格式与语义。错误2:此时指针pt指向字符串的尾部,而函数返回的应是字符串的首地址,所以pt向前移动j个字符,则达到字符串的首部。 int fun(int a[ ][N], int m) { int i,j; for(i=0;i< for(j=i;j<N;j++) a[i][j]=a[i][j]*m; /*右上半三角元素中的值乘以m*/ } 这道题可以算是上机编程中二维数组的典型考题,考查考生容易失分的知识点(二维数组应用)。本题考查表示右上半三角元素的算法。行下标肯定是从0到N-1,而列下标要根据行下标来定,当到第i行时列下标要从第i列开始,所以考生在编写程序时,第2个for循环中表达式1为j=i(而不是j=1,这是考题的关键)。 由于全国计算机等级考试的性质比较特殊,所以它的题重点突出、知识覆盖面广。考生在应考时,应注意识别题中所考核的知识点。试卷中80%左右的试题均以直接考核知识为目标,而考生在考试中经常出现自我联想状态——会让程序代码自我联想执行(产生错误的知识点关联)。 在做程序阅读时,一定要逐句阅读,理清程序代码段的执行顺序与涉及的知识点。考生容易出错的知识点: 1.数据运算与数据类型。主要考核C语言的基础知识,考生阅题不认真会失分。防范方法:看清题目的要求,是判断数据类型,还是数据运算,或者对数据类型进行转换后运算。 2.控制结构。主要考核C语言中三大结构控制语句的语法规则,考生往往会以直观的方式来决定答案,容易失分。防范方法:看清语句个数——因为控制语句中多条语句执行必须加{}(这是考试的热门题型),语句的执行顺序与次数——考生千万不要只想找捷径(很多题必须按步骤进行)。 3.数组。定义数组长度时——特别在长度缺省中,很容易出现错误;下标的遍历与循环结构套用——这一类型是出题的主体,也是考生最有可能失分的地方。防范方法:做此类题时,要做到“三清楚”:数组的数据类型看清楚,数组长度一定要清楚,循环次数与下标变化方式清楚,这样就不会失分了。 4.函数。函数定义与声明,这部分试题以格式规则要求为主,只要熟记函数的返回值类型、形参与实参、函数定义格式相关知识即可;函数调用占了程序阅读题的大部分,主要把握有调用必有返回、调用的位置即为返回的位置。其中,递归是一个难点,考生答题是不要急于看结果,一定要进行调用与返回配对。 5.指针。这部分知识是C语言的难点,也是考试的重点。主要考核指针变量的指向概念——记清楚指针变量所存储的是内存地址,记住两种运算符(*,&);指针变量运算——主要用于数组、字符串中,学会用指针的方式表示数组元素;指针变量作函数参数时,注意*指针变量才有实参值的更改。 指针是对C语言基本知识的综合应用,在历年出卷中,以考核基本知识为主,所以不必在指针的一些深入应用花太多时间。更要注意的是指针、函数、数组这三个知识点常常结合在出题,考生要看清题目的主旨。 从历年考生的答题情况来看,考生笔试时间比较充裕,上机答案时间紧张。原因是很多考生在复习时一贯注重书面答题,所以在笔试答题中会觉得流畅些。上机时,考生经常出现:找不到题目描述,找不到题目的程序代码,没有保存,没有执行。所以,考生在考前复习时一定要加强上机答题的练习与模拟。特别强调,上机题一定要保存与执行!名师解析选择题答案
选择题答案
填空题答案
上机部分
一、填空题
二、改错题
三、编程题
名师解析上机题答案
填空题答案:
改错题答案:
编程题答案:
孙顾天总结的考试经验