计算机二级考试C语言精选模拟题

特别策划

C语言是二级考试中参考人数最多的科目,我们特意刊登了孙老师精选的C语言模拟题,如果吃透这些题即可稳得60分。VB、VF的模拟题请到http://go.icpcw.com/f/d15.htm下载!

选择题

1.在一棵二叉树上,第5层的结点数最多为。

A.8 B.16 C.32 D.15

考点:二叉树的运算

名师解析:二叉树第i(i≥1)层上最多有2i-1个结点。考生需要特别注意二叉树运算类型的多变性。

2.数据库概念设计过程中,视图设计一般有三种设计次序,以下各项中不对的是。

A.自顶向下 B.自底向上

C.由内向外 D.由整体到局部

考点:数据库概念设计过程

名师解析:数据库概念设计过程中,视图设计一般有三种设计次序,它们分别是:1.自顶向下,这种方法是先从抽象级别高且普遍性强的对象开始逐步细化、具体化与特殊化。2.由底向上,这种设计方法是先从具体的对象开始,逐步抽象化、普遍化与一般化,最后形成一个完整的视图设计。3.由内向外,这种设计方法是先从最基本与最明显的对象着手逐步扩充至非基本、不明显的其他对象。

3.以下非法的赋值语句是。

A.n=(i=2,++i);

B.j++

C.++(i+1);

D.x=j>0;

考点:赋值语句

名师解析:选项A是将一个逗号表达式的值赋给一个变量;选项B是自增运算;选项C中(i+1)是一个常量,常量不能进行自增运算;选项D是将一个整数赋给一个变量。

4.以下叙述中正确的是。

A.全局变量的作用域一定比局部变量的作用域范围大

B.静态(static)类别变量的生存期贯穿于整个程序的运行期间

C.函数的形参都属于全局变量

D.未在定义语句中赋初值的auto变量和static变量的初值都是随机值

考点:全局变量和局部变量

名师解析:选项A说法不正确,全局变量的作用域跟定义变量的位置有关;选项C也不正确,函数的形参是局部变量,其他函数不能调用;若在定义局部变量时不赋初值,则对static变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量);而对auto变量来说,如果不赋初值则它的值是一个不确定的值,所以选项D也不对。

5.有以下程序

main()

{ int a,b,d=25;

a=d/10%9;

b=a&&(-1);

printf("%d,%d\n",a,b);

}

程序运行后的输出结果是。

A.6,1 B.2,1

C.6,0 D.2,0

考点:算术运算符

名师解析:如果算术运算符“/”后参与运算的变量都是整型变量,则“/”表示整除运算,“%”表示求余。要注意-1表示真,只有0才表示假。

6.有以下程序

main( )

{ int i,t[][3]={9,8,7,6,5,4,3,2,1};

for(i=0;i<3;i++) printf("%d ",t[2-i][i]);

}

程序执行后的输出结果是。

A.7 5 3

B.3 5 7

C.3 6 9

D.7 5 1

考点:二维数组的应用

名师解析:将初始值放在一对大括号内,按数组元素排列的顺序对各元素赋值,二维数组中行下标可以省略,但列下标必须要指定,由此题可以看出数组t是一个三行三列的二维数组,执行for循环语句t[2-i][i]分别为t[2][0]、t[1][1]、t[0][2],即可得出结果。

7.有以下程序

void swap(char *x,char *y)

{ char t;

t=*x;*x=*y;*y=t;

}

main()

{ char *s1="abc",*s2="123";

swap(s1,s2); printf("%s,%s\n",s1,s2);

}

程序执行后的输出结果是。

A.123,abc

B.abc,123

C.1bc,a23

D.321,cba

考点:指针变量值的交换

名师解析:C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符“a”与“1”的交换,而字符串中其他字符保持不变。

8.设有以下语句

int a=1,b=2,c;

c=a^(b<<2);

执行后,c的值为。

A.6 B.7 C.8 D.9

考点:位运算中的异或运算

名师解析:有括号的先算括号内的数据,所以先对b进行左移运算:b换算成二进制0000 0010,左移后变为0000 1000,然后再与a进行异或运算(参与运算的两个对应位相同,则为0,相异则为1),结果为0000 1001,换算成十进制数结果为9。对于左移运算也可直接用此规则:左移1位相当于该数乘以2,左移2位相当于该数乘以22=4,依此类推。

9.以下程序的输出结果是。

main()

{ int i, k, a[10], p[3];

k=5;

for(i=0;i<10;i++) a[i]=i;

for(i=0;i<3; i++) p[i]=a[i*(i+1)];

for(i=0;i<3; i++) k+=p[i]*2;

printf("%d\n",k);

}

A.20 B.21 C.22 D.23

考点:控制语句的执行

名师解析:按照程序的流程运行一遍,我们可以得到,p[0]=0,p[1]=2,p[3]=6;执行三次k+=p[i]*2,就相当于k=5+0*2+2*2+6*2。

10.以下程序的输出结果是。

#define SQR(X) X*X

main()

{ int a=16,k=2,m=1;

a/=SQR(k+m)/SQR(k+m);

printf("%d\n",a);

}

A.16 B.2 C.9 D.1

考点:宏定义

名师解析: C语言在预编译时遇到带实参的宏名,则按命令行中指定的字符串从左到右进行置换。在做此题时,我们可以运用置换法。得到a/=k+m*k+m/k+m*k+m=16/7=2。注:a为整型,所以在做除法时,自动取整。

11.以下程序的输出结果是。

long fun(int n)

{long s;

if(n==1||n==2) s=2;

else s=n-fun(n-1);

return s;

}

main()

{ printf("%ld\n",fun(3));}

A.1 B.2 C.3 D.4

考点:递归算法

名师解析:这是一个递归函数。递归的结束条件是,n=1或者n=2。按照程序顺序,即可得出结果。

12.以下程序的输出结果是。

main()

{ int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;

for (i=1;i<3;i++)

for(j=0;j<=i;j++)s+=a[i][j];

printf("%d\n",s);

}

A.18 B.19 C.20 D.21

考点:环控制语句的嵌套

名师解析:本题外循环执行两次,分别是i=1,i=2。内循环,第一次j从0到1,s=0+a[1][0]+a[1][1]=7;第二次j从0到2,s=7+a[2][0]+a[2][1]+a[2][2]。

13.下列程序的输出结果是。

main()

{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;

printf("%d",*--p);

}

A.非法 B.a[4]的地址 C.5 D.3

考点:指针与地址的运算

名师解析:本题中char *p=a+5; 即相当于p=&a[5],而--p要先减1再运算,则printf语句输出的值就是本题所求。

14.有以下程序

main( )

{unsigned char a,b,c;

a=0x3; b=a|0x8; c=b<<1;

printf("%d%d\n",b,c);

}

程序运行后的输出结果是。

A.-11 12

B.-6 -13

C.12 24

D.11 22

考点:位运算中的位或运算

名师解析:0x3表示十六进制的3,“|”为按位或运算,“<<”为按位左移,将a、b转换为二进制数进行位运算,再将结果以十进制打印出。

15.有以下程序

#include

main(int argc,char *argv[])

{int i,len=0;

for(i=1;i

printf("%d\n",len);

}

程序编译后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是:

ex1 abcd efg 10↙

则运行的结果是。

A.22 B.17 C.12 D.9

考点:指针数组作main函数的形参

名师解析: argc和argv是main函数的形参,main函数是由系统调用的。当处于操作命令状态下,输入main所在的文件名(经过编译后得到的可执行文件名),系统就调用main函数。实参是和命令行一起给出的,也就是在一个命令行中包括命令名和需要传给main函数的参数。

16.有以下程序

#include

main()

{char *p="abcde\0fghjik\0";

printf("%d\n",strlen(p));

}

程序运行后的输出结果是。

A.12 B.15 C.6 D.5

考点:计算字符串的长度

名师解析:“\0”是字符串结束标志,当遇到此标志时字符串已结束,知道这一点,此题就简单了。

17.有以下程序

void ss(char *s,char t)

{while(*s)

{if(*s==t) *s=t-'a'+'A';

s++;

}

}

main()

{char str1[100]="abcddfefdbd",c='d';

ss(str1,c); printf("%s\n",str1);

}

程序运行后的输出结果是。

A. ABCDEFEDBD

B. abcDDfefDbd

C. abcAAfefAbA

D. Abcddfefdbd

考点:将字符串中指定的小写字母转换为大写字母

名师解析:在主函数中,因为“c”被赋值为字符“d”,所以函数的功能是将字符串中“d”字母转换为大写。

18.有以下程序

void f(int v, int w)

{ int t;

t=v; v=w; w=t;

}

main()

{ int x=1,y=3,z=2;

if(x>y) f(x,y);

else if(y>z) f(y,z);

else f(x,z);

printf("%d,%d,%d\n",x,y,z);

}

执行后输出结果。

A.1,2,3

B.3,1,2

C.1,3,2

D.2,3,1

考点:if控制语句的运用

名师解析:if语句的作用是判定是否满足条件,再根据判定的结果(真或假)决定执行哪一条指令。本题中条件y>z为真,所以执行f(y,z)。在函数调用开始时,y的值传送给v,z的值传送给w,执行完f函数后,v和w的值就互换了,但main函数中的y和z并未互换。

19.有以下程序

main()

{ int i,n=0;

for( i=2;i<5;i++)

{do

{ if(i%3) continue;

n++;

}while(!i);

n++;

}

printf("n=%d\n",n);

}

程序执行后输出结果是。

A.n=5 B.n=2 C.n=3 D.n=4

考点:不同循环控制语句的嵌套使用

名师解析:当i=2时,i%3为真,继续执行n++,此时n=1,!i为假,结束while循环,执行n++,此时n为2。当i=3时,i%3=0,跳出循环。当i=4时,i%3=1为真,继续执行n++,此时n为3,!i为假,结束while循环,继续往下执行n++,即可得出n的值。

20.有以下程序

#include

#include

int fun(int n)

{ int *p;

p=(int*)malloc(sizeof(int));

*p=n; return *p;

}

main()

{ int a;

a=fun(10); printf("%d\n",a+fun(10));

}

程序的运行结果是。

A.0 B.10 C.20 D.出错

考点:指针的运用

名师解析: malloc(sizeof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量p。然后执行语句*p=n,使得*p的值为10,并通过return返回此值,在主函数中输出a+10的值。

填空题

21.在最坏情况下,冒泡排序的时间复杂度为。

考点:算法的复杂度

名师解析:冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏的情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描。

22.设一棵完全二叉树共有500个结点,则在该二叉树中有个叶子结点。

考点:数据结构中二叉树的性质

名师解析:所谓完全二叉树是指除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。本题n=500,故父结点数等于int(500/2)=250,即可得出叶子结点数。

23.人员基本信息一般包括:身份证号、姓名、性别、年龄等。其中可以作为主关键字的是。

考点:数据库中键的概念

名师解析:主关键字能唯一标示每条记录,它可以是一个字段,也可以是一组字段。根据“唯一识别”这个标准,就可以知道答案。

24.下面的函数strcat(str1,str2)实现将字符串str2拼接到字符串str1后面的功能。请填空使之完整。

char *strcat(str1,str2)

char *str1,*str2;

{ char *t=str1;

while()str1++;

while();

return(t);}

考点:字符串连接函数strcat()

名师解析:函数strcat(str1,str2)实现将字符串str2连接到字符串str1后面,所以首先要找到字符串str1的串尾,根据C语言的语法规定,一个字符串的串尾一定是一个隐含字符“\0”,而在程序中,对字符串中字符的访问是通过两个指针变量来完成的,因此要找到字符串str1的串尾,要判断*str1是否为“\0”,字符串str2也同理,程序中必须可以使字符串中的字符逐一顺序体现。

25.以下程序的输出结果是。

main()

{ int x=0;

sub(&x,8,1);

printf("%d\n",x);

}

sub(int *a,int n,int k)

{ if(k<=n) sub(a,n/2,2*k);

*a+=k;

}

考点:一个完整的递归调用

名师解析:主函数中调用sub函数流程如下:

sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k

| |

x=x+k=7 x=x+k=6

26.设有如下宏定义

#define MYSWAP(z,x,y) {z=x; x=y; y=z;}

以下程序段通过宏调用实现变量a,b内容的交换,请填空。

float a=5,b=16,c;

MYSWAP(,a,b)

考点:宏的应用

名师解析:本题最重要的是理解宏MYSWAP(z,x,y)的作用:通过z实现x,y的内容交换。所以MYSWAP(c,a,b)可以通过c实现a,b内容的交换。

27.以下程序运行后的输出结果是。

#include

main()

{ FILE *fp; int x[6]={1,2,3,4,5,6},i;

fp=fopen("test.dat","wb");

fwrite(x,sizeof(int),3,fp);

rewind(fp);

fread(x,sizeof(int),3,fp);

for(i=0;i<6;i++) printf("%d",x[i]);

printf("\n");

fclose(fp);

}

考点:文件操作

名师解析:“fp=fopen("test.dat","wb"); ”表示文件test.dat以二进制形式打开,然后对该文件进行写操作。“fwrite(x,sizeof(int),3,fp);”表示要从数组x中输出3次(每次sizeof「int」个字节)数据到fp所指向的文件中,其中sizeof(int)=2。rewind函数的功能是使文件的位置指针回到文件的开头。“fread(x,sizeof(int),3,fp); ”表示从fp所指向的文件读入3次(每次2个字节)数据,存储到数组x中。最后通过for循环依次输出数组x中的元素,就可以得到输出结果。

上机题

28.人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存入在考生文件夹下的BLANK.C中。不得增行或删行,也不得更改程序结构!

代码:

#include

#define N 8

typedef struct

{ int num;

int year,month,day ;

}STU;

int fun(STU *std, STU *k, int year)

{ int i,n=0;

for (i=0; i

/**********found**********/

if( 1==year)

/**********found**********/

k[n++]= 2;

/**********found**********/

return (3);

}

main()

{ STU std[N]={ {1,1984,2,15},{2,1983,9,21},{3,1984,9,1},{4,1983,7,15},

{5,1985,9,28},{6,1982,11,15},{7,1982,6,22},{8,1984,8,19}};

STU k[N]; int i,n,year;

printf("Enter a year : "); scanf("%d",&year);

n=fun(std,k,year);

if(n==0)

printf("\nNo person was born in %d \n",year);

else

{ printf("\nThese persons were born in %d \n",year);

for(i=0; i

printf("%d %d-%d-%d\n",k[i].num,k[i].year,k[i].month,k[i].day);

}

}

考点:结构体

名师解析:在fun函数中,要比较人员记录的出生年份是否为指定年份,只要比较STU变量中year成员变量是否等于形参中提供的year值,而在for循环中是对STU型数组中各个变量进行比较的;如果两者相等,则将其存入到STU型数组k中;最后,整数n就是能够查到的记录的条数。

29.给定程序modi.c中,函数fun的功能是:将十进制正整数m转换成k(2<=k≤9)进制数,并按位输出。例如:若输入8和2,则应输出1000(即十进制数8转换成二进制数表示为1000)。

请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

#include

#include

#include

void fun(int m,int k)

{

int aa[20],i;

for (i=0;m;i++)

{

/************found************/

aa[i]=m/k;

m/=k;

}

/************found************/

for(;i;i——)

printf("%d",aa[i]);

}

main()

{

int b,n;

system("cls");

printf(“\nPlease enter a number and a base:\n”);

scanf("%d %d",&n,&b);

fun(n,b);

printf("\n");

}

考点:数制的转换

名师解析:k进制数有两个特点:有0到k-1共k个数码和逢k进1、借1当k。k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12,1实际代表1*10。源程序给出的fun函数中,第一个for循环用来将十进制的整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组aa中。在for循环之后,i即为转换成的k进制数的位数。