全国计算机等级考试二级c语言试题分析_第1页
全国计算机等级考试二级c语言试题分析_第2页
全国计算机等级考试二级c语言试题分析_第3页
全国计算机等级考试二级c语言试题分析_第4页
全国计算机等级考试二级c语言试题分析_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、全国计算机等级考试(二级 c语言)试卷分析一、选择题(每小题1分,共40小题,共40分)前面的10道题涉及计算机基础知识(数据结构、数据库、软件工 程等方面知识),在这里就不针对计算机基础知识部分进行分析。11.以下叙述中正确的是()。A.在C语言程序中,main函数必须放在其他函数的最前面B.每个后缀为C的C语言源程序都可以单独进行编译C.在C语言程序中,只有main函数才可单独进行编译D.每个后缀为.C的C语言源程序都应该包含一个main函数【解析】Bo C语言是一种成功的系统描述语言,具有良好的移植性, 每个后缀为.C的C语言源程序都可以单独进行编译;C语言程序中,不 管包含多少个后缀为

2、.C的程序文件,但是一定有且仅有一个main函数, 而且main函数在程序中可以放在任何其他函数之前或之后。语言中的标识符分为关键字、预定义标识符和用户标识符,以下叙 述正确的是()。A.预定义标识符(如库函数中的函数名)可用做用户标识符,但失去 原有含义B.用户标识符可以由字母和数字任意顺序组成C.在标识符中大写字母和小写字母被认为是相同的字符D.关键字可用做用户标识符,但失去原有含义【解析】A。用户标识符不能以数字开头,C语言中标识符是区分大 小写的,关键字不能用做用户标识符。13.以下选项中表示一个合法的常量是(说明:符号口表示空格)()。口 9 口 9【解析】Bo当用指数形式表示浮点数

3、据时,E的前后都要有数据,并且 E的后面数要为整数;整型常量:0123表示八进制 整型常量,0xab表示十六进制整型常量,123为十进制整型常量,123L 表示长整型常量,123U表示无符号整型常量,123UL表示无符号长整型 常量。答案A没有这种常量,如果加上双引号是可以表示字符串常量。语言主要是借助以下哪个功能来实现程序模块化?()A.定义函数B.定义常量和外部变量C.三种基本结构语句D.丰富的数据类型【解析】Ao C语言是由函数组成的,函数是C语言的基本单位。所 以可以说C语言主要是借助定义函数来实现程序模块化。15.以下叙述中错误的是()。A.非零的数值型常量有正值和负值的区分B.常量

4、是在程序运行过程中值不能被改变的量C.定义符号常量必须用类型名来设定常量的类型D.用符号名表示的常量叫符号常量【解析】Co在C语言中,可以用一个标识符来表示一个常量,称 之为符号常量。符号常量在使用之前必须先定义,其一般形式为: #define 标识符常量。16.若有定 义和语句:int a , b;scanf("%d , %d", &a, &b);以下选 项中的输人数据,不能把值3赋给变量a、5赋给变量b的是()。,5, 5, 45, 5【解析】Co在输入3和5之间除逗号外不能有其他字符。答案B 和A是可以的,原因是用scanf函数输入时,从左往右对应给值

5、,右边 多余的值不输入进去。语言中char类型数据占字节数为()。【解析】C。在标准C (ANSI-C )中,char类型数据 占1个字节。18.下列关系表达式中,结果为“假”的是()。A.(3+4)>6B.(3!=4)>2<=4| 3D.(3<4)=1【解析】Bo在一个表达式中,括号 的优先级高,先计算3 !=4 ,为 真即是l , 1>2为假。19.若以下选项中的变量全部为整型变量,且已正确定义并赋值, 则语法正确的switch 语句是()。(a+9)case cl : y=a-b;case c2 : y=a+b;a*bcase l0: x=a+b;defau

6、lt: y=a-b;(a+b)casel : case3 : y=a+b;break;case0 : case4 : y=a-b;(a*a+b*b)default : break;case 3 : y=a+b;break;case 2 : y=a-b;break;【解析】D。选项A, switch语句中要求case后面必须是 常量,不 能是变量;选项B, a*b要用括 号括起来;选项C, case与后面的数字用空格隔开。注意switch 语句语句结束的方式:一是见到break ;二是执行至U自然结束。20 .有以下程序:#includemain() int a=-2, b=0;while(a+

7、&&+b);printf("%d , %dn" , a, b);程序运行后的输出结果是()。,3,2,3,2【解析】D。while循环第一次结束后a, b取值为:-1 , 1 ;第二次 结束后a, b的值为:0, 2 ;第三次没有执行循环体(空语句),只是 判断了一下a+是否为真,因a为0,所以a+为假,但a的值加1,所 以a的值变成1,但&&运算符的第一个表达式为假时,第二个表达式不 计算,所以+b不执行,故b的值还是2。所以,最终a, b的值为1, 2。21 .设有定义:int x=0 , *p;,立刻执行以下语句,正确的语句是()。=x

8、;B.*p=x; =NULL; D.*p=NULL;【解析】C。对于指针变量p,如果没有把p指向一个指定的值,则 说明指针变量p内的值是NULL,即空值,也就是说没有存放任何存储空 间的地址,所以*p是不能被赋值的。定义指针变量不赋初始值时默认为 NULL22 .下列叙述中正确的是()。A.可以用关系运算符比较字符串的大小B.空字符串不占用内存,其内存空间大小是0C.两个连续的单引号是合法的字符常量D.两个连续的双引号是合法的字符串常量【解析】D。比较两个字符串大小用函数strcomp(s , t),不能用关 系运算符比较字符串的大小;空字符串有结束符(0 ),所以也要占用 1字节;两个连续的

9、单引号是不合法,单引号中间必须有一个字符(普 通字符或转义字符);两个连续的双引号表示的是空字符串。23 .有以下程序:#includemain() rhar a= 'H';a=(a>=' A'&&a<= 2')?(a - ' A' +'a' ) : a;printf("%cn" , a);程序运行后的输出结果是()。【解析】D。多元运算符问号前 面表达式为真,所以(a- ' A +' a') 赋值给a,括号里的运算是把大写字母变成小写字母,所以答案应

10、为选 项D。24 .有以下程序:#includeint f(int x);main() int a , b=0;for(a=0;a<3;a+)b=b+f(a);putchar( ' A +b);int f(int x) return x * xl; 程序运行后的输出结果是()【解析】Bo第一次循环时,b=1 ,输出结果为B;第二次循环时,b=3,输出结果为D;第三次循环时,b=8,输出结果为I。25 .设有定义:int x23;,则以下关于二维数组X的叙述错误的是()。0可看做是由3个整型元素组成的一维数组0和xl是数组名,分别代表不同的地址常量C.数组X包含6个元素D.可以用语

11、句x0=0;为数组所有元素赋初值0【解析】Do对于二维数组来说,数组的名字x是一个二级指针常 量;第一 维表 示行 地址,比如:x0表示第一行的地址,而且是个 地址 (一级指针)常量,所以x0是不能赋值的。26 .设变量P是指针 变量,语句P=NULL;是给 指针 变量 赋NULL值, 它等价于()。=""="0"=0;="【解析】Co在C语言中NULL等价于整数0。27 .有以下程序:#include <>main()int a=10, 20, 30 , 40 , *p=a , j;for(i=0;i<=3;i+)ai=*p

12、;p+; printf("%dn" , a2);程序运行后的输出结果是()。【解析】A。for循环中第一次循环时,a0=*p ,因为有p=a;故相 当于a0=*a ;根据一维数组的定式:ai=*(a+i),说明每次循环是将数组的当前元素赋值给自己,后面每次循环依此类推。所以,for循环 结束后,数组a的值并没有变化,由于数组下标是由0开始,所以a2 的值是30。28 .有以下程序:#include <>#define N 3void fun(int aN, int b口) int i , j;for(i=0;i<N;i+)bi=ai0;for(j=0;j&

13、lt;N;j+)if(a皿>bi)bi=ai皿main()intxNN=1, 2, 3, 4, 5, 6, 7, 8, 9 , yN , i;fun(x , y);for(i=0;i<N;i+)printf( “%d,",yi);程序运行后的输出结果是()。,4, 8, 6, 9,5, 7,,3, 5,【解析】Bo fun函数功能是把数组a的每一行的最大值赋给b, a 的第一行的最大值是3,第二行的最大值是6,第三行的最大值是9,所 以答案是3, 6, 9。29 .有以下程序(strcpy 为字符串复制函数,strcat 为字符串连接 函数):#include <&

14、gt;#include <>main()char a10="abc", b10="012", c10="xyz"strcpy(a+1 , b+2);puts(strcat(a , c+1);程序运行后的输出结果是()。【解析】Co第一次执行字符串的复制函数后,字符串a中的值是 a2,第二次执行的是字符串的连接函数,连接后,a字符串变成了 a2yz , 再输出,所以运行结果为a2yz。本题最主要的是了解字符串名加一个整 型常量所代表的字符串是什么,比如:有char a10="abc”; 定义,则 字符串a的值是ab

15、c ;而字符用a+1的值是bc ;字符用a+2的值是c; 字符用b+3的值是0 ,即不空用。30 .以下选项中,合法的是()ostr3= 'd', 'e', 'b', 'u', ' g' , '0'str4;str4="hello world"name10;name="china"strl5="pass",str26;str2=strl;【解析】A。选项B不能把一个字符串赋值给一个字符变量str4 ; 选项C和D犯了同样的错误是把字符串赋给

16、了数组名,数组名是一个指 针常量,常量是不能被赋值的。31 .有以下程序:#include<> main() char *s="234"int k=0, a=0;while (sk+1!= '0 ') k+;if(k%2=0)a=a+(sk-' 0' +1);continue; a=a+(sk-' 0');printf("k=%d a=%dn", k, a);程序运行后的输出结果是()。=6 a=11=3 a=14=4 a=12=5 a=15【解析】Co输出结果:k=1 a=2k=2 a=4k=

17、3 a=7k=4 a=1232 .有以下程序:#include<>main()char a510="one", "two" , "three" , "four" , "five"int i , j;chartfor(i=0;i<4;i+)for(j=i+1;j<5;j+)if(ai0>aj0)t=ai同i0=aj0;aj0=t;puts(a1);程序运行后的输出结果是()。【解析】A。for循环完成的功能是 把二维数组a的第一列的字母按 从小到大排序,其他列的字母不

18、变。排序方法是类冒泡排序。33 .有以下程序:#include<>int a=1, b=2;void funl(int a , int b)printf( "%d %d", a, b); void fun2() a=3;b=4; main() funl(5 , 6);fun2();printf("%d %dn", a, b);程序运行后的输出结果是()。2 5 66 3 46 1 24 5 6【解析】Bo funl是输出局部变量的值,fun2是把全局变量的值改 成3和4,所以输出的结果是5634。当全局变量与局部变量同名时,在重叠的作用域中,

19、局 部变量起作用(可 怜原则,即谁的作用域小谁就在 重叠的作用域中起作用)。34 .有以下程序:#includevoid func(int n) static int num=1;num=num+n;printf("%d" , num);main()func(3);func;printf("n"); 程序运行后的输出结果是()。8455【解析】A。第一调用func函数时输出4,第二次调用func函数时 num的值并不会释放,仍然是上次(第一次调用func函数时)修改后的 值4,第二次调用结果为8,所以输出结果是4 8。本题 考的是静态局部 变量的作用域与

20、生存期(存放在静态存储区)不一致的情况,第一次调 用完后,静态局部变量num的值为4,存放到静态存储区,函数func 执行结束,其作用域消失,但存放在静态存储区的num变量的值4还在, 但仍然不能拿出来用,只能等下次再进入作用域时,即第 二次调用函数 func时,又进入静态局部变量num的作用域,此时,变量num又可以拿 出来使用,由于已经存在静态存储区,所 以不用重新定义该变量,可以 直接从静态存储区取出变量num的值(4)来使用,所以第二次调用后, num的值变成了 8。35 .有以下程序:#include<>#include<>void fun(int *pl ,

21、 int *p2, int *s) s=(int *)malloc(sizeof(int);*s=*pl+*p2;free(s);main()int a=1, b=40 , *q=&a;fun(&a , &b, q);printf("%dn" , *q);程序运行后的输出结果是()。【解析】Co fun函数功能是新开辟内存空间(地址s)存放a和b 的值(通过&a、&b将地址复制给p1、p2) , q的地址并没有变化,所以 应该还是指向地址a。36 .有以下程序:#include<>struct STUchar name9;

22、char sex;int score2;void f(struct STU a口) struct STU b="Zhao" ,'吊 ,85, 90);a1=b;main()struct STUc2="Qian" , ' f' , 95, 92 , "Sun",'吊 98, 99;f(c);printf( "s %c, %d, %d,,,c0.sex, c0.score0,co.score1);printf("%s , %g %d, %dn" ,

23、 , c1.sex, c1.scoreo,c1.score1);程序运行后的输出结果是()。,m,85,90,Sun,m,98,99,m,85,90,Qian, f, 95,92,f,95,92,Sun,m,98,99,f,95,92,Zhao, m, 85,90【解析】D。f函数是为结构体数组的第二个元素(结构体类型的元 素)赋值,数组的第一个元素没有变化,所以正确答案应选D。37 .以下叙述中错误的是()。A.可以用typedef说明的新类型名来定义变量说明的新类型名必须使用大写字母,否则会出编译错误C.用typedef可以为基本 数据类型 说明一个新名称D.用typedef说明新类型的作

24、用是用一个新的标识符来代表已存在 的类型名【解析】Bo typedef是用来定义新类型,或定义原有类型的别名(新 名称)。用typedef 说明的类型不是必须用大写,而是习惯上用大写。38 .以下叙述中错误的是()。A.函数的返回值类型不能是结构体类型,只能是简单类型B.函数可以返回指向结构体变量的指针C.可以通过指向结构体变量的指针访问所指结构体变量的任何成D.只要类型相同,结构体变量之间可以整体赋值【解析】Ao函数返回值类型可以是简单类型和结构体类型。39.若有定义语句int b=2;,则表达式(b<<2)/(3 II b)的值是()【解析】Bo 2的二进制数为010,移两位后

25、的二进制数为01000 , 转成十制数为8, (3|2)为真即1, 8/ 1=8 ,所以结果为8。40.有以下程序:#include <>main() FILE *fp; int i,a6=1, 2, 3, 4, 5, 6;fp=fopen("" , "w+");for=(i=0;i<6;i+) fpintf(fp rewind(fp);for(i=0;i<6;i+) fscanf(fp,"%dn" , ai);,"%d" , &a5-i);fclose(fp);for(i=0;i%

26、6;i+)printf("%d, " , ai);程序运行后的输出结果是()。,5, 6, 1, 2, 3,2, 3, 3, 2, 1,2, 3, 4, 5, 6,,5, 4, 3, 2, 1,【解析】D。这个是对文件的操作,把数组的数写到文件里,然后再从文件里倒序读出。所以输出结果为6, 5, 4, 3, 2, 1二、基本操作题(共18分)str是一个由数 字和字母字符 组成的字 符串,由变量num传入字符 用长度。请补充函数proc(),该函数的功能是:把字 符用str中的数字 字符转换成数字并存放到整型数组bb中,函数返回数组bb的长度。例如,str="ab

27、cl23de45f967”,结果为:1234567 。注意:部分源程序给出如下。请勿改动 main()函数和其他函数中的任何内容,仅在函数proc() 的横线上填入所编写的若干表达式或语句。试题程序:#include <>#define M 80int bbM;int proc(char str口 , int bb口 , int num)int i , n=0;for(i=0 ; i<num ; i+)if( 11 )bbn=2;n+;return 3;void main()char strM;int num=0 , n, i;printf("Enter a str

28、ing: n");gets(str);while(strnum)num+;n=proc(str , bb, num);printf("nbb=");for(i=0;i<n;i+) printf("%d", bbi);答案:【1】stri>= '0'&&stri<= '9'【2】stri- ,O 【3】n【解析】题目中要求把字符用str中的数字字符转换成数字并存放 到整型数组bb中。首先,应判断字符串str中每个字符是否是数字字 符。因此,【1】处填"stri>=

29、' 0' &&stri<= ' 9' ” 将每一个数 字字符转化为数字放在整型数组bb中,因此,【2】处填"stri -' 0'; 由函数proc()可知,变量n中存放整型数组bb中的元素个数,最后要 返回到主函数当中,因此,【3】处填n'。三、程序改错题(共24分)下列给定程序中,函数proc()的功能是:读入一个字符串(长度 <20),将该字符串中的所有字符按ASCIl码升序排序后输出。例如,输入opdye ,则应输出deopy。请修改程序中的错误,使它能得到正确结果。注意:不要 改动main()函数,不得增行或删行,也不 得更改程序的 结构。试题程序:#include <>#include <>#include <>int proc(char str口)char c;unsigned i , j;for(i=0;i<strlen(str)-1;i+) for(j=i+1;j<strlen(str);j+) if(stri>strj)c=strj/*found*strj=stri+;stri=c;void main()char str81;system(&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论