2007年春~2009年春笔试真题原题、答案及解析
方式。
选项D通过retrun语句将a的平方带回到主调函数中去。 27、【解析】答案:D。语句 “p[i]=p[i+1],i++;”是一条逗号表达式语句,该逗号表达式实现了两个功能,功能一:p[0]=p[1],功能二:i++后使得i的值变为1。
(1)选项A:功能一:p[0]=p[0],功能二:i++后使得i的值变为1。 (2)选项B:功能一:++i使得i的值变为1,功能二:p[1]=p[1]。 (3)选项C:功能一:++i使得i的值变为1,功能二:p[1]=p[2]。 (4)选项D:功能一: i++使得i的值变为1,功能二:p[0]=p[1]。 所以只有选项D和语句“p[i]=p[i+1],i++;”等价。 28、【解析】答案:B。C语言规定,数组名有其特定含义:它代表数组中首元素的地址,因此不允许对它做赋值运算。选项B试图对数组名a赋值,这是错误的。 29、【解析】答案:B。本题p1是一个指向整型变量的指针,用p1指向整型的数组元素,则p1值加一,就使得p1指向数组的下一个元素;p2是一个指向由3个元素组成的一维数组的指针,即行指针,则p2只能指向一个包含3个元素的一维数组,p2的值加一,就使得p2指向下一行,如果先使得p2=a,则p2的值加一之后就指向了a[1]。数组元素的引用方法有下标法和指针法,这两种方法等价。对题中的p1来说,p1[1]和*(p1+1)等价,对p2来说,p2[1][1]和*(*(p2+1)+1)等价,这四种引用方法都是引用的数组元素a[1][1]。 30、【解析】答案:D。假设p为指向结构体变量的指针,则对于结构体变量成员的引用以下三种形式等价:
(1)结构体变量·成员名 (2)(*p)·成员名 (3)p->成员名 所以选项D错误。 二、填空题 ? 基本概念 1、【解析】答案:主函数。C程序是由函数组成的。一个C源程序至少且仅包含一个main函数,也可以包含一个main函数和若干个其他函数。 2、【解析】答案:32767。C语言中sizeof是求字节运算符,一个2个字节的有符号整数的表示范围为-215~(215-1),即-32768~32767,也就是说一个int型变量的最大允许值为32767。数据在内存中是以二进制补码的形式存放的,在存放整数的存储单元中,最左边的一位是表示符号的,该位为0,表示数值为正;该位为1则表示数值为负。32767如果再加1,就会发生“溢出”现象,如下图所示: 32767 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32767加1 -32768 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 之后
由上图可以看出:表示32767时最高位为0,后15位全为1,加1后变成第1位为1,后面15位全为0。而它是-32768的补码形式。所以当x值为32767时,x+1的值是-32768,这时“x+1>x”的值为假。 3、【解析】答案:3.15。由于x是整型变量,所以计算表达式“x=y*100+0.5”时是将“y*100+0.5”的值取整之后赋给x,这时x的值为315,再计算表达式“y=x/100.0”后y的值为3.15。 4、【解析】答案:6。宏定义是用宏名代替一个字符串,也就是作简单的置换。本题语句“k=M*M+1;”在替换后为“k=2+1*2+1+1;”,所以k的值为6。 ? 阅读程序
47
2007年春~2009年春笔试真题原题、答案及解析
5、【解析】答案:3.3。本题主要考察C语言文件打开方式、定位及读写的有关函数,其中: (1)文件打开方式“wb+”表示新建立一个二进制文件,先向此文件写数据,然后可以读此文件中的数据。
(2)fread(buffer,size,count,fp)/fwrite(buffer,size,count,fp):fread函数用来一次读入一组数据,fwite函数用来一次向文件中写一组数据,其中buffer指明起始地址,size表示要读写的字节数,count为一次读写长度是size字节的数的个数,fp为文件指针。 (3)fssek(文件类型指针,偏移量,起始位置):将文件的读写指针移动到文件的指定位置。 起始位置:分别用如下三个符号常量表示三种选择:SEEK_SET文件首,SEEK_END文件尾,SEEK_CUR文件当前位置。
偏移量:指针移动的目的地位置相对于起始位置的字节数,要求为长整型,数值为正数时表示从起始位置向后(文件尾)移动,为负数时向前(文件头)移动。
程序执行时首先通过fwite函数将数组x的所有元素的值写入文件a.out中,然后通过调用fseek函数使得文件指针指向x[2]元素值所在位置,再通过fread函数将文件指针所指的数读入变量y中,所以y的值即x[2]的值。 6、【解析】答案:2 3 5 6。本题的考察重点是switch语句。switch语句的流程控制是根据switch后面表达式的值找到匹配的入口,执行case后的语句,如果没有break语句,执行完一个case后面的语句后,流程控制转移到下一个case继续执行,不再判断。本题执行流程为:
(1)第一次循环:k等于5,执行default后面的语句,由于default后面没有break语句,流程会转移到下一个case继续执行,最终n等于2,k等于3,进入下一次循环。
(2)第二次循环:k等于3,执行case 3后面的语句,使得n等于3,k等于2,因后面有break语句,所以中断switch语句进入下一次循环。
(3)第三次循环:k等于2,执行case 2后面的语句,由于case 2后面没有break语句,继续执行case 4后面的语句,使得n等于5,k等于1,进入下一次循环。
(4)第四次循环:k等于1,执行case 1后面的语句,由于case 1后面没有break语句,继续执行case 3后面的语句,使得n等于6,k等于0,因后面有break语句,所以中断switch语句,循环结束。 7、【解析】答案:x=18,y=27,z=18。本题考点是函数的参数传递。C语言函数参数的传递有二种方式: (1)值传递方式:将变量的值传递给形参,数据的传递方式是单向的,只能把实参的值传递给形参,而不能把形参的值反向传递给实参。本题的实参x和y属于这种传递方式,所以参数传递后,x的值仍然是18,y的值仍然是27。
(2)地址传递方式:将变量地址作为值传递给形参,这种传递方式使得形参和实参共用一块存储区域,因此当形参的值发生变化时,实参的值也随之改变。本题的实参z属于这种传递方式,所以参数传递后,z的值变为18。 8、【解析】答案:7。本题实参a、b是double型的,而形参x、y是整型的,所以在值传递时,分别将a、b的值取整之后传递给x和y,所以x的值为5,y的值为2,x+y的值就为7。 9、【解析】答案:第一行 33333,第三行 3 3。本题的考点是循环。第一个for循环从a[0][0]开始以逆时针方向实现对二维数组最外围一圈数组元素赋值,并且后一次循环会将前一次循环的赋值结果覆盖,所以数组元素的值是最后一次循环的赋值。循环体内关键语句的功能如下: (1)for(i=j=start;i
48

