计算机二级考试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进制数的位数。