全国计算机等级考试《二级C语言程序设计》试题(网友回忆版)一
二级C语言程序设计
历年真题
共 43 题
1427 次浏览
更新于 2026-09-27
一、选择题
每小题1分,共40分。
1
下列叙述中正确的是( )。
- A.所有数据结构必须有根结点
- B.所有数据结构必须有终端结点(即叶子结点)
- C.只有一个根结点,且只有一个叶子结点的数据结构一定是线性结构
- D.没有根结点或没有叶子结点的数据结构一定是非线性结构
2
以下叙述中错误的是( )。
- A.C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令
- B.C程序经过编译、链接步骤之后才能形成一个真正可执行的二进制机器指令文件
- C.用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中
- D.C语言源程序经编译后生成后缀为.obj的目标程序
3
C语言主要是借助以下( )功能来实现程序模块化的。
- A.定义函数
- B.定义常量和外部变量
- C.三种基本结构语句
- D.丰富的数据类型
4
有以下程序段:
char ch;
int k;
ch='a';
k =12;
printf("%c,%d,",ch,ch,k);
printf("k=%d\n",k);
已知字符a的ASCII码十进制值为97,则执行上述程序段后输出的结果是( )。
char ch;
int k;
ch='a';
k =12;
printf("%c,%d,",ch,ch,k);
printf("k=%d\n",k);
已知字符a的ASCII码十进制值为97,则执行上述程序段后输出的结果是( )。
- A.因变量类型与格式描述符的类型不匹配输出无定值
- B.输出项与格式描述符个数不符,输出为零值或不定值
- C.a,97,12k=12
- D.a,97,k=12
5
下列叙述中正确的是( )。
- A.栈是“先进先出”的线性表
- B.队列是“先进后出”的线性表
- C.循环队列是非线性结构
- D.有序线性表既可以采用顺序存储结构,也可以采用链式存储结构
6
若要实现total=1+2+3+4+5求和,以下程序段错误的是( )。
- A.
int i=1,total=1;
while(i<5)
{
total +=i;
i+=1;
} - B.
int i=1,total=0;
while(i <=5)
{
total +=i;
i+=1;
} - C.
int i=0,total=0;
while(i <5)
{
i +=1;
total+=i;
} - D.
int i=0,total=0;
while(i <=5)
{
total +=i;
i+=1;
}
7
下列不属于软件工程3个要素的是( )。
- A.工具
- B.过程
- C.方法
- D.环境
8
下面不属于黑盒测试方法的是( )。
- A.边界值分析法
- B.基本路径测试
- C.等价类划分法
- D.错误推测法
9
有三个关系R、S和T如下:

则下列操作中正确的是( )。

则下列操作中正确的是( )。
- A.T=R∩S
- B.T=R∪S
- C.T=R×S
- D.T=R-S
10
下列选项中,不属于数据管理员(DBA)职责的是( )。
- A.数据库维护
- B.数据库设计
- C.改善系统性能,提高系统效率
- D.数据类型转换
11
有以下程序
#include
main()
{
int a=0,b=0;
/*给a赋值a=10;
给b赋值b=20 */
printf("a+b=%d\n",a+b);/*输出计算结果*/
}
程序运行后的输出结果是( )。
#include
main()
{
int a=0,b=0;
/*给a赋值a=10;
给b赋值b=20 */
printf("a+b=%d\n",a+b);/*输出计算结果*/
}
程序运行后的输出结果是( )。
- A.a+b=0
- B.a+b=30
- C.a+b=10
- D.出错
12
有以下程序段
#include
main()
{
int a,b,c;
a=10;b=50;c=30;
if(a>b)a=b,b=c;c=a;
printf("a=%d b=%d c=%d\n",a,b,c);
}
程序的输出结果是( )。
#include
main()
{
int a,b,c;
a=10;b=50;c=30;
if(a>b)a=b,b=c;c=a;
printf("a=%d b=%d c=%d\n",a,b,c);
}
程序的输出结果是( )。
- A.a=10 b=50 c=30
- B.a=10 b=50 c=10
- C.a=10 b=30 c=10
- D.a=50 b=30 c=50
13
下列二叉树描述中,正确的是( )。
- A.任何一棵二叉树必须有一个度为2的结点
- B.二叉树的度可以小于2
- C.非空二叉树有0个或1个根结点
- D.至少有2个根结点
14
下列叙述中,不符合良好程序设计风格要求的是( )。
- A.程序的效率第一,清晰第二
- B.程序的可读性好
- C.程序中要有必要的注释
- D.输入数据前要有提示信息
15
有以下程序
#include
main()
{
int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
#include
main()
{
int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
- A.2,3,1
- B.2,3,2
- C.2,3,3
- D.2,2,1
16
设二叉树如下:
则后序序列为( )。
则后序序列为( )。- A.ABDEGCFH
- B.DBGEAFHC
- C.DGEBHFCA
- D.ABCDEFGH
17
以下叙述中正确的是( )。
- A.break语句不能用于提前结束for语句的本层循环
- B.使用break语句可以使流程跳出switch语句体
- C.continue语句使得整个循环终止
- D.在for语句中,continue与break的效果是一样的,可以互换
18
有以下程序:
#include
main()
{
int a=1,b=0;
if(--a) b++;
else if(a==0) b+=2;
else b+=3;
printf("%d\n",b);
}
程序运行后的输出结果是( )。
#include
main()
{
int a=1,b=0;
if(--a) b++;
else if(a==0) b+=2;
else b+=3;
printf("%d\n",b);
}
程序运行后的输出结果是( )。
- A.0
- B.1
- C.2
- D.3
19
待排序的关键码序列为(15,20,9,30,67,65,45,90),要按关键码值递增的顺序排序,采取简单选择排序法,第一趟排序后关键码15被放到第( )个位置。
- A.2
- B.3
- C.4
- D.5
20
下列关系表达式中,结果为“假”的是( )。
- A.(3+4)>6
- B.(3!=4)>2
- C.3<=4‖3
- D.(3<4)==1
21
有如下程序:
#include
main()
{
int i;
for (i=0;i<5;i++)
putchar('9'-i);
printf("\n");
}
程序运行后的输出结果是( )。
#include
main()
{
int i;
for (i=0;i<5;i++)
putchar('9'-i);
printf("\n");
}
程序运行后的输出结果是( )。
- A.54321
- B.98765
- C.'9''8''7''6''5'
- D.'43210'
22
下列叙述中正确的是( )。
- A.可以用关系运算符比较字符串的大小
- B.空字符串不占用内存,其内存空间大小是0
- C.两个连续的单引号是合法的字符常量
- D.两个连续的双引号是合法的字符串常量
23
以下关于C语言函数参数传递方式的叙述正确的是( )。
- A.数据只能从实参单向传递给形参
- B.数据可以在实参和形参之间双向传递
- C.数据只能从形参单向传递给实参
- D.C语言的函数,参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用
24
以下叙述中错误的是( )。
- A.当在程序的开头包含头文件sdivio.h时,可以给指针变量赋NULL
- B.函数可以返回地址值
- C.改变函数形参的值,不会改变对应实参的值
- D.可以给指针变量赋一个整数作为地址值
25
有以下程序(说明:字母A的ASCII码值是65):
#include
void fun(char *s)
{
while(*s)
{
if(*s%2)printf("%c",*s);
s++;
}
}
main()
{
char a[]="BYTE";
fun(a);
printf("\n");
}
程序运行后的输出结果是( )。
#include
void fun(char *s)
{
while(*s)
{
if(*s%2)printf("%c",*s);
s++;
}
}
main()
{
char a[]="BYTE";
fun(a);
printf("\n");
}
程序运行后的输出结果是( )。
- A.BY
- B.BT
- C.YT
- D.YE
26
有以下程序:
#include
main()
{
…
while(getchar()!='\n');
…
}
以下叙述中正确的是( )。
#include
main()
{
…
while(getchar()!='\n');
…
}
以下叙述中正确的是( )。
- A.此while语句将无限循环
- B.getchar()不可以出现在while语句的条件表达式中
- C.当执行此while语句时,只有按回车键程序才能继续执行
- D.当执行此while语句时,按任意键程序就能继续执行
27
有以下程序:
#include
void fun(int *p,int *q)
main()
{
int m=1,n=2,*r=&m;
f(r,&n);
printf("%d,%d",m,n);
}
void f(int *p,int *q)
{
p=p+1;
*q=*q+1;
}
程序运行后的输出结果是( )。
#include
void fun(int *p,int *q)
main()
{
int m=1,n=2,*r=&m;
f(r,&n);
printf("%d,%d",m,n);
}
void f(int *p,int *q)
{
p=p+1;
*q=*q+1;
}
程序运行后的输出结果是( )。
- A.1,3
- B.2,3
- C.1,4
- D.1,2
28
以下函数按每行8个输出数组中的数据:
void fun(int *w,int n)
{
int i;
for(i=0;i
{
______
printf("%d",w[i]);
}
printf("\n");
}
下划线处应填入的语句是( )。
void fun(int *w,int n)
{
int i;
for(i=0;i
{
______
printf("%d",w[i]);
}
printf("\n");
}
下划线处应填入的语句是( )。
- A.if(i/8==0) printf("\n");
- B.if(i/8==0)continue;
- C.if(i%8==0)printf("\n");
- D.if(i%8==0)continue;
29
以下叙述中正确的是( )。
- A.函数的形参类型不能是指针类型
- B.函数的类型不能是指针类型
- C.设有指针变量为double *p,则p+1将指针p移动8个字节
- D.基类型不同的指针变量可以相互混用
30
设有以下定义:
char s1[]="0123";
char s2[]={'0','1','2','3'};
则以下叙述正确的是( )。
char s1[]="0123";
char s2[]={'0','1','2','3'};
则以下叙述正确的是( )。
- A.数组s1的长度小于s2的长度
- B.数组s1和s2的长度相同
- C.数组s1的长度大于s2的长度
- D.数组s1和s2完全等价
31
有以下程序(sdivcpy为字符串复制函数,sdivcat为字符串连接函数):
#include
#include
main()
{
char a[10] = "abc",b[10] = "012",c[10] = "xyz";
sdivcpy(a+1,b+2);
puts(sdivcat(a,c+1));
}
程序运行后的输出结果是( )。
#include
#include
main()
{
char a[10] = "abc",b[10] = "012",c[10] = "xyz";
sdivcpy(a+1,b+2);
puts(sdivcat(a,c+1));
}
程序运行后的输出结果是( )。
- A.a12xyz
- B.12yz
- C.a2yz
- D.bc2yz
32
以下叙述中正确的是( )。
- A.简单递归不需要明确的结束递归的条件
- B.任何情况下都不能用函数名作为实参
- C.函数的递归调用不需要额外开销,所以效率很高
- D.函数既可以直接调用自己,也可以间接调用自己
33
有以下函数:
#include
void func(int n)
{
int i;
for(i=0;i<=n;i++)printf("*");
printf("#");
}
main()
{
func(3);
printf("????");
func(4);
printf("\n");
}
程序运行后的输出结果是( )。
#include
void func(int n)
{
int i;
for(i=0;i<=n;i++)printf("*");
printf("#");
}
main()
{
func(3);
printf("????");
func(4);
printf("\n");
}
程序运行后的输出结果是( )。
- A.****#????***#
- B.***#????*****#
- C.**#????*****#
- D.****#????*****#
34
有以下程序:
#include
int b=2;
int fun(int *k)
{
b=*k+b;
return(b);
}
main()
{
int a[10]={1,2,3,4,5,6,7,8},i;
for(i=2;i<4;i++)
{
b=fun(&a[i])+b;
printf("%d",b);
}
printf("\n");
}
程序运行后的输出结果是( )。
#include
int b=2;
int fun(int *k)
{
b=*k+b;
return(b);
}
main()
{
int a[10]={1,2,3,4,5,6,7,8},i;
for(i=2;i<4;i++)
{
b=fun(&a[i])+b;
printf("%d",b);
}
printf("\n");
}
程序运行后的输出结果是( )。
- A.1012
- B.810
- C.1028
- D.1016
35
以下叙述中正确的是( )。
- A.在C语言中,预处理命令行都以“#”开头
- B.预处理命令行必须位于C源程序的起始位置
- C.#include必须放在C程序的开头
- D.C语言的预处理不能实现宏定义和条件编译的功能
36
有以下程序:
#include
main()
{
char a,b,c,d;
scanf("%c%c",&a,&b);
c=getchar();d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第一列开始,代表回车,注意:回车是一个字符)
12
34
则输出结果是( )。
#include
main()
{
char a,b,c,d;
scanf("%c%c",&a,&b);
c=getchar();d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第一列开始,代表回车,注意:回车是一个字符)
12
34
则输出结果是( )。
- A.1234
- B.12
- C.123
- D.1234
37
在C语言中,只有在使用时才占用内存单元的变量,其存储类型是()。
- A.auto和register
- B.extern和register
- C.auto和static
- D.static和register
38
以下程序:
#include
void fun(int x)
{
if(x/2>1) fun(x/2);
printf("%d",x);
}
main()
{
fun(7);
printf("\n");
}
程序运行后的结果是( )。
#include
void fun(int x)
{
if(x/2>1) fun(x/2);
printf("%d",x);
}
main()
{
fun(7);
printf("\n");
}
程序运行后的结果是( )。
- A.137
- B.731
- C.73
- D.37
39
以下结构体类型说明和变量定义中正确的是( )。
- A.typedef sdivuct{int n;char c;}REC; REC t1,t2;
- B.sdivuct REC;{int n;char c;}; REC t1,t2;
- C.typedef sdivuct REC:{int n=0;char c='A';} t1,t2; REC t1,t2;
- D.sdivuct{int n;char c;}REC;
40
以下叙述正确的是( )。
- A.在C语言中调用fopen函数就可把程序中要读、写的文件与磁盘上实际的数据文件联系起来
- B.fopen函数的调用形式为:fopen(文件名)
- C.fopen函数的返回值为NULL时,则成功打开指定的文件
- D.fopen函数的返回值必须赋给一个任意类型的指针变量
二、程序填空题
共18分。
41
请补充fun函数,该函数的功能是:计算N×N维矩阵元素的方差,结果由函数返回。维数在主函数中输入。
例如:

的计算结果是14.414。
求方差的公式为:

其中

注意:
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
/**********code.c**********/
#include
#include
#define N 20
/**********found**********/
double fun(①______,int n)
{
int i,j;
double s=0.0;
double f=0.0;
double aver=0.0;
double sd=0.0;
for(i=0;i
for(j=0;j
s+=a[i][j];
/**********found**********/
aver=②______;
for(i=0;i
for(j=0;j
f+=(a[i][j]-aver)*(a[i][j]-aver);
f/=(n*n);
/**********found**********/
sd=③______;
return sd;
}
main()
{
int a[N][N];
int n;
int i,j;
double s;
printf("*****Input the dimension of array n******\n");
scanf("%d",&n);
printf("*****The array*****\n");
for(i=0;i
{
for(j=0;j
{
a[i][j]=rand()%50;
while (a[i][j]==0)
a[i][j]=rand()%60;
printf("%4d",a[i][j]);
}
printf("\n\n");
}
s=fun(a,n);
printf("*****THE RESULT*****\n");
printf("%4.3f\n",s);
}
例如:

的计算结果是14.414。
求方差的公式为:

其中

注意:
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
/**********code.c**********/
#include
#include
#define N 20
/**********found**********/
double fun(①______,int n)
{
int i,j;
double s=0.0;
double f=0.0;
double aver=0.0;
double sd=0.0;
for(i=0;i
for(j=0;j
s+=a[i][j];
/**********found**********/
aver=②______;
for(i=0;i
for(j=0;j
f+=(a[i][j]-aver)*(a[i][j]-aver);
f/=(n*n);
/**********found**********/
sd=③______;
return sd;
}
main()
{
int a[N][N];
int n;
int i,j;
double s;
printf("*****Input the dimension of array n******\n");
scanf("%d",&n);
printf("*****The array*****\n");
for(i=0;i
{
for(j=0;j
{
a[i][j]=rand()%50;
while (a[i][j]==0)
a[i][j]=rand()%60;
printf("%4d",a[i][j]);
}
printf("\n\n");
}
s=fun(a,n);
printf("*****THE RESULT*****\n");
printf("%4.3f\n",s);
}
三、程序改错题
共18分。
42
请根据以下各小题的要求设计C应用程序(包括界面和代码)。
下列给定程序中,函数fun()的功能是:将n个无序整数从小到大排序。请改正程序指定部位的错误,使它能得到正确结果。
注意:
不要改动函数main(),不得增行或删行,也不得更改程序的结构。
/**********code.c**********/
#include
void fun(int n, int *a)
{
int i,j,p,t;
for(j=0;j {
p=j;
/**********found**********/
for(i=j+1;i if(a[p]>a[i])
/**********found**********/
t=i;
if(p!=j)
{
t=a[j];
a[j]=a[p];
a[p]=t;
}
}
}
void putarr(int n, int *z)
{
int i;
for(i=1;i<=n;i++,z++)
{
printf("%4d",*z);
if(!(i%10))
printf("\n");
}
printf("\n");
}
void main()
{
int aa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;
printf("\n\nBefore sorting %d numbers:\n",n);
putarr(n,aa);
fun(n,aa);
printf("\nAfter sorting %d numbers:\n",n);
putarr(n,aa);
}
/**********-code.c**********/
下列给定程序中,函数fun()的功能是:将n个无序整数从小到大排序。请改正程序指定部位的错误,使它能得到正确结果。
注意:
不要改动函数main(),不得增行或删行,也不得更改程序的结构。
/**********code.c**********/
#include
void fun(int n, int *a)
{
int i,j,p,t;
for(j=0;j
p=j;
/**********found**********/
for(i=j+1;i
/**********found**********/
t=i;
if(p!=j)
{
t=a[j];
a[j]=a[p];
a[p]=t;
}
}
}
void putarr(int n, int *z)
{
int i;
for(i=1;i<=n;i++,z++)
{
printf("%4d",*z);
if(!(i%10))
printf("\n");
}
printf("\n");
}
void main()
{
int aa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;
printf("\n\nBefore sorting %d numbers:\n",n);
putarr(n,aa);
fun(n,aa);
printf("\nAfter sorting %d numbers:\n",n);
putarr(n,aa);
}
/**********-code.c**********/
四、程序设计题
共24分。
43
函数fun功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是将a中的十位和个位数依次放在变量c的千位和十位上,b中的十位和个位数依次放在变量c的个位和百位上。
例如,当a=45,b=12。调用该函数后,c=4251。
注意,部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun花括号中填入你编写的若干语句。
/**********code.c**********/
#include
void fun(int a, int b, long *c)
{
}
int main()
{
int a,b;
long c;
printf("Input a b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
}
/**********-code.c**********/
例如,当a=45,b=12。调用该函数后,c=4251。
注意,部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun花括号中填入你编写的若干语句。
/**********code.c**********/
#include
void fun(int a, int b, long *c)
{
}
int main()
{
int a,b;
long c;
printf("Input a b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
}
/**********-code.c**********/
输入阅读码
查看答案与解析需要输入阅读码