全国计算机二级C选择题试题库第34套

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

全国计算机二级C选择题题库第34套
1、下列叙述中错误的是
A) 数据结构中的数据元素不能是另一数据结构
B) 数据结构中的数据元素可以是另一数据结构
C) 空数据结构可以是线性结构也可以是非线性结构
D) 非空数据结构可以没有根结点
参考答案:A
数据元素是一个含义很广泛的概念,它是数据的"基本单位",在计算机中通常作为一个整体进行考虑和处理。

数据元素可以是一个数据也可以是被抽象出的具有一定结构数据集合,所以数据结构中的数据元素可以是另一数据结构。

满足有且只有一个根结点并且每一个结点最多有一个前件,也最多有一个后件的非空的数据结构认为是线性结构,不满足条件的结构为非线性结构。

空数据结构可以是线性结构也可以是非线性结构。

非空数据结构可以没有根结点,如非性线结构"图"就没有根结点。

故选A选项。

2、为了降低算法的空间复杂度,要求算法尽量采用原地工作(in place)。

所谓原地工作是指
A) 执行算法时所使用的额外空间固定(即不随算法所处理的数据空间大小的变化而变化)
B) 执行算法时所使用的额外空间随算法所处理的数据空间大小的变化而变化
C) 执行算法时不使用额外空间
D) 执行算法时不使用任何存储空间
参考答案:A
算法的空间复杂度是指执行这个算法所需要的内存空间,包括输入数据所占的存储空
间、程序本身所占的存储空间、算法执行过程中所需要的额外空间。

如果额外空间量相对于问题规模(即输入数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的。

故选A选项
3、某循环队列的存储空间为Q(1:m),初始状态为front=rear=m。

现经过一系列的入队操作和退队操作后,front=m,rear=m-1,则该循环队列中的元素个数为
A) m-1
B) m
C) 1
D) 0
参考答案:A
循环队列长度为m,由初始状态为front=rear=m,可知此时循环队列为空。

入队运算时,首先队尾指针进1(即rear+1),然后在rear指针指向的位置插入新元素。

特别的,当队尾指针rear=m+1时,置rear=1。

退队运算时,排头指针进1(即front+1),然后删除front指针指向的位置上的元素,当排头指针front=m+1时,置front=1。

从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列
中的元素。

如果rear-front>0,则队列中的元素个数为rear-front个;如果rear-front<0,则队列中的元素个数为rear-front+m 。

该题中m-1<m,即rear-front<0,则该循环队列中的元素个数为(m-1)-m+m=m-1。

故选A选项。

4、某棵树只有度为3的结点和叶子结点,其中度为3的结点有8个,则该树中的叶子结点数

A) 15
B) 16
C) 17
D) 不存在这样的树
参考答案:C
树是一种简单的非线性结构,直观地来看,树是以分支关系定义的层次结构。

在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。

由于只有度为3的结点和叶子结点,可知最后一层都为叶子结点,倒数第二层一部分结点度为3,一部分为叶子结点,其余的结点的度均为3,计算度为3的结点总数
(33-1-1)/2<8<(34-1-1)/2可知,树共有4层,前两层有度为3的结点(33-1-1)/2=4个,第三层有33=9个结点,其中4个是度为3的结点,5个是叶子结点,所以该树中的叶子结点数为4×3+5=17。

故选C选项。

5、某二叉树共有530个结点,其中度为2的结点有250个,则度为1的结点数为
A) 29
B) 30
C) 249
D) 251
参考答案:A
在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。

对任何一棵二叉树,度为0的结点总是比度为2的结点多一个。

二叉树结点总数为530,度为2的结点有250个,则度为0的结点有251个,那么度为1的结点个数为530-250-251=29。

故选A选项。

6、若某二叉树中的所有结点值均大于其左子树上的所有结点值,且小于右子树上的所有结点值,则该二叉树遍历序列中有序的是
A) 前序序列
B) 中序序列
C) 后序序列
D) 以上说法均可以
参考答案:B
二叉树遍历可以分为3种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。

由于结点值均大于其左子树上的所有结点值,且小于右子树上的所有结点值,那么只要遍历时访问根结点在访问左子树和右子树之间,遍历序列有序,即中序序列有序。

故选B选项。

7、将C语言的整数设为整数类I,则下面属于类I实例的是
A) -103
B) 10E3
C) 10.3
D) "0103"
参考答案:A
整数类实例包括:十进制常量用0~9表示,不能以0开头;八进制常量用0~7表示,必须用0开头;十六进制常量用0~9和A~F(a~f)表示,必须以0x或0X开头。

本题中B选项是科学计数法表示的浮点数实例,C选项是浮点数实例,D选项是字符串实例。

故选A选项。

8、下列叙述中正确的是
A) 软件是程序、数据和文档
B) 软件是程序和数据
C) 软件是算法和数据结构
D) 软件是算法和程序
参考答案:A
计算机软件由两部分组成:一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。

故选A选项。

9、软件生命周期是指
A) 软件的定义和开发阶段
B) 软件的需求分析、设计与实现阶段
C) 软件的开发阶段
D) 软件产品从提出、实现、使用维护到停止使用退役的过程
参考答案:D
通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期。

选项A、B、C选项均为生命周期的一部分。

故选D选项。

10、下列叙述中正确的是
A) 数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能
B) 数据库系统能够管理各种类型的文件,而文件系统只能管理程序文件
C) 数据库系统可以管理庞大的数据量,而文件系统管理的数据量较少
D) 数据库系统独立性较差,而文件系统独立性较好
参考答案:A
数据管理技术的发展经历了3个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。

三者各自的特点如下表所示。

特点人工管理阶段文件系统阶段数据库系统阶段
管理者人文件系统数据库管理系统
面向对象某个应用程序某个应用程序现实世界
共享程度无共享,冗余度大共享性差,冗余度大共享性大,冗余度小
独立性不独立,完全依赖于
程序独立性差具有高度的物理独立性和一
定的逻辑独立性
结构化无结构记录内有结构,整体无
结构
整体结构化,用数据模型描述
控制能力由应用程序控制由应用程序控制由DBMS提供数据安全性、完
整性、并发控制和恢复
数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能。

数据库系统和文件系统的区别不仅在于管理的文件类型与数据量的多少。

数据库系统具有高度的物理独立性和一定的逻辑独立性,而文件系统独立性较好。

故本题选A选项。

11、关于程序模块化,以下叙述错误的是
A) 程序模块化可以提高程序运行的效率
B) 程序模块化可以提高程序编制的效率
C) 程序模块化可以提高程序代码复用率
D) 程序模块化可以提高调试程序的效率
参考答案:A
模块化程序的优点:1、易于维护和复用,可以提高程序编制的效率,2、易于分工合作,3、易于模块化调试测试。

模块化程序的副作用:1、可能会降低程序运行效率,2、设计的前期工作需要多花费时间。

可知选项B,C,D正确。

12、以下是正确C语言标识符的
A) &3
B) #3
C) _3
D) -3
参考答案:C
C语言合法标识名的命名规则是:(1)标识符由字母、数字和下划线组成,(2)第一个字符不能是数字只能是字母或下划线。

选项A的第一个字符为&,非法,选项B,第一个字符为#,非法,选项D,第一个字符为-,非法。

答案为选项C。

13、若有定义:int a,b,c; 以下程序段的输出结果是
a=11; b=3; c=0;
printf("%d\n",c=(a/b,a%b));
A) 2
B) 0
C) 3
D) 1
参考答案:A
C 语言中,逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式。

逗号运算符的优先级是所有运算符中级别最低的,逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。

也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算,并以最右边表达式值作为整个逗号表达式的值。

因此c的值为a%b即11%3=2,故答案为A选项。

14、以下选项中合法的C语言常量是
A) 'C-STR'
B) 2014.1
C) "\1.0
D) 2EK
参考答案:B
所谓常量是指在程序运行的过程中,其值不能被改变的量。

在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。

选项A是字符串,但使用单引号,错误,选项C,D,为实型常量中指数形式,但指数形式e(E)之前必须是数字,之后必须为整数,错误。


答案为B选项。

15、设有定义:int x,y,z;,且各变量已赋正整数值,则以下能正确表示代数式""的C语言表达式是()。

A) 1.0/x/y/z
B) 1/x*y*z
C) 1/(x*y*z)
D) 1/x/y/(double)z
参考答案:A
代数表达式1/()
x y z
⋅⋅
是小数,转为c语言的表达式必须是小数A选项由于1.0为浮点数,计
算结果自动转换为浮点数,故A正确。

选项B,C,D的表达式均为0,因此只有选项A正确。

答案为A选项。

16、有以下程序
#include <stdio.h>
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);
}
当执行程序时,按下列方式输入数据(从第1列开始,<CR>代表回车,注意:回车也是一个字符)
12<CR>
34<CR>
则输出结果是
A) 12
3
B) 12
C) 1234
D) 12
34
参考答案:A
scanf()函数从标准输入输出中读入两个字符'1''2'分别赋给变量a、b,遇到回车自动结束,但回车符已经存入缓冲区,函数getchar()将从中接受这个字符,故c赋值为回车符,然后第二个getchar()读入字符'3',因此a='1',b='2',c=<CR>,d='3',故答案为A 选项。

17、有以下程序
#include <stdio.h>
main( )
{ int a, b;
for (a=0; a<3; a++)
{ scanf("%d", &b);
switch(b)
{ default: printf("%d,",b+1); continue;
case 1: printf("%d,", b+1);
case 2: printf("%d,", b+1); continue;
}
}
}
执行时输入:1 2 3<回车>,则输出结果是
A) 2,2,3,4,4,4,
B) 2,3,4,
C) 2,2,3,4,
D) 2,3,3,4,5,6,
参考答案:C
continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。

switch…case如果没有break会导致多个分支重叠。

因此,输入1,2,3,则1执行case 1: printf("%d,",
b+1);case 2: printf("%d,", b+1); continue;后结束。

2则执行case 2: printf("%d,", b+1);
continue;3则执行default: printf("%d,",b+1); continue;得到的结果是2,2,3,4。

故答案为C选项。

18、有以下程序
#include <stdio.h>
#include <math.h>
main()
{ double x, y, z;
scanf("%lf%lf",&x,&y );
z= x/ y;
while(1)
if( fabs(z) > 1.0 )
{ x=y; y=x; z=x/y; }
else break;
printf("y=%f \n", y );
}
执行时输入:3.6 2.4<回车>,则输出结果是
A) 2.400000
B) 1.500000
C) 1.600000
D) 2.000000
参考答案:A
题目中程序执行过程中关键语句的结果为:z=1.5,if条件成立,x=2.4,y=2.4,z=1.0,下一次循环if条件不成立跳出循环,按照格式打印y值为2.400000。

故答案为A选项。

19、有以下程序
#include <stdio.h>
main( )
{ int i;
char c;
scanf("%c", &c);
for (i=0; i<5; i++)
{
if (i > c) continue;
printf("%d,", i);
}
}
执行时输入:0<回车>后,则输出结果是
A) 5
B) 0,0,0,0,0,
C) 0,1,2,3,4,
D) 0,1,
参考答案:C
scanf("%c", &c),输入的字符,题目中输入了0,是字符,对应于
ASCII码为48,因此for循环,i的范围从0~5,均小于48,
if条件不成立,直接执行下一条语句,因此执行printf,因此得到的结果是0,1,2,3,4。

故答案为C选项。

20、以下程序拟实现计算sum=1+1/2+1/3+ …+1/50 。

#include <stdio.h>
main( )
{ int i; double sum;
sum=1.0;
i=1;
do
{ i++; sum += 1/i; }
while( i<50 );
printf("sum=%lf\n",sum);
}
程序运行后,不能得到正确结果,出现问题的语句是
A) sum += 1/i;
B) while(i<50);
C) sum = 1.0;
D) i++;
参考答案:A
选项A,sum+=1/i;i为整型,因此1/i是整型类型,当1/i有小数时,会被截断。

因此1/i结果始终
为0,导致结果出错。

,应该改为sum+=1.0/i。

因此答案为A选项。

21、若有定义语句:
double a, *p=&a;
以下叙述中错误的是
A) 定义语句中的* 号是一个间址运算符
B) 定义语句中的* 号是一个说明符
C) 定义语句中的p只能存放double类型变量的地址
D) 定义语句中*p=&a 把变量a的地址作为初值赋给指针变量p
参考答案:A
指针运算符(通常称为间接引用运算符:indirection operator或复引用运算符:dereferencing operator),它返回其操作数(即一个指针)所指向的对象的值。

定义语句中的* 号不是一个间址运算符,而是定义指针变量的说明符,因此,A项错误,B项正确,原则上说p可以放double 兼容性的变量地址,C项正确,根据指针的赋值运算,可知D项正确。

故答案为A选项。

22、关于函数返回值,以下叙述正确的是
A) 函数可以返回整个结构体,即使结构体中有数组
B) 函数只能返回基本数据类型的数值或指针
C) 函数不可以返回一个数组
D) 函数不能没有返回值
参考答案:A
函数返回值可以整型、实型、字符型、指针和结构类型,也可以没有返回值。

因此选项A正
确,可以返回数组指针,因此可知选项B,C,D错误。

故答案为A选项。

23、有以下程序
#include <stdio.h>
int fun( int *b, int n )
{ int i, r=1;
for( i=0; i<=n; i++ ) r=r*b[i];
return r;
}
main()
{ int x, a[]={2,3,4,5,6,7,8,9 };
x=fun( a,3 );
printf("%d\n", x);
}
程序运行后的输出结果是
A) 24
B) 720
C) 120
D) 6
参考答案:C
fun(),求数组指定返回的元素的积。

fun(a,3),求的是数组a[0]~a[3]的积。

因此结果为2*3*4*5=120,故答案为C选项。

24、若有语句:int a[3][4], (*p)[4]; p = a;,则以下选项中叙述错误的是
A) 系统将开辟一个名为p的二维数组,p[0][0]中的值即为a[0][0]中的值
B) p+1代表a[1][0]的地址
C) p中将存放a 数组的首地址
D) p+2代表a 数组最后一行的首地址
参考答案:A
(*p)[4]定义了一个数组指针。

p可以指向类似于arry[][4]的数组,题设中,p不是一个二维数组,只是可以指向这类二维数组,因此选项A错误。

p+1代表了第一行第一个元素的地址,p=a 指向数组a的首地址,则B、C选项正确,同理可知选项D也正确。

故答案为A选项。

25、有以下程序
#include <stdio.h>
void change( char* array, int len )
{ for (len--; len>=0; len--)
array[len] += 1;
}
main( )
{ int i;
char array[5] = "ABCD";
change(array, 4);
for (i=0; i<4; i++)
printf("%c,", array[i]);
}
程序运行后的输出结果是
A) B,C,D,E,
B) A,B,C,D,
C) C,D,E,F,
D) B,D,F,H,
参考答案:A
函数change()的作用将从数组尾部将数组内的元素值加1。

数组的初始值为ABCD,因此经change()后,得到的值为BCDE。

故答案为A选项。

26、
设有以下程序段
float a[8] = {1.0, 2.0};
int b[1] = {0};
char c[] = {"A", "B"};
char d == "1";
以下叙述正确的是
A) 只有变量c的定义是合法的
B) 只有变量a,b,c的定义是完全合法的
C) 所有变量的定义都是完全合法的
D) 只有变量a, b的定义是完全合法的
参考答案:D
float a[8]={1.0, 2.0};定义了一个包含8个float型元素的数组,并初始化了数组的前2项,其他项是随机数。

int b[1] = {0},定义了只有一个int型元素的数组,并初始化为0。

char c[] = {"A", "B"};定义一个char型数组,大小有初始化元素决定,但初始化值是字符串,类型不兼容,编译出错。

char d = "1";定义一个char型变量,但是初始化赋值字符串,类型不兼容,编译出错。

因此只有a,b定义和初始化正确。

故答案为D选项。

27、有以下程序
#include <stdio.h>
main( )
{ int a[4],p,x,i;
for( i=3;i>0;i-- )a[i-1]=i*2-1;
scanf("%d",&x);
i=0;
while( a[i]<x ) i++;
p=i;
for( i=3;i>p;i-- ) a[i]=a[i-1];
a[p]=x;
for( i=0;i<4;i++ ) printf("%3d",a[i]);
printf("\n");
}
执行时输入:2<回车>,则输出结果是
A) 1 2 3 4
B) 5 4 3 1
C) 1 2 3 5
D) 3 2 1 4
参考答案:C
第一个for循环初始化数组a,分别为1,3,5,随机数,形成了基本有序的序列,再将输入的数字插入到数组a,使他们形成有序序列。

因此可以分析出,打印的结果为1,2,3,5。

故答案为C选项。

28、有以下程序
#include <stdio.h>
int fun(int a[],int n,int x)
{ int *p=a;
while( p<a+n && *p!=x ) p++;
if ( p<a+n ) return p-a;
else return -1;
}
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",fun(a,10,10));
}
程序运行后的输出结果是
A) 9
B) -1
C) 10
D) 0
参考答案:A
while( p<a+n && *p!=x ) p++;p=a;n=10,x=10;while循环条件成立,直到p=a+9,结束循环,执行下一条语句,if条件成立,返回p-a,此时执行p-a=a+9-a=9;因此,输出9。

故答案为A 选项。

29、有以下程序
#include <stdio.h>
main( )
{ char w[20], a[5][10]={"abcde", "fghij", "klmno", "pqrst", "uvwxy"};
int i;
for ( i=0; i<5; i++ )
w[i] = a[i][i];
w[5]= '\0';
printf( "%s\n", w );
}
程序运行后的输出结果是
A) ejoty
B) afkpu
C) agmsy
D) eimqu
参考答案:C
数组a是二维数组,数组w存放二维数组a行列值相同位置的元素,由a[5][10]可得w[0]~w[4]的元素分别是agmsy,因此打印结果为agmsy。

故答案为C选项。

30、语句printf("%d\n", strlen("\t\"\\\n\'\065\08AB"));的输出结果是
A) 6
B) 7
C) 8
D) 9
参考答案:A
字符串"\t\"\\\n\'\065\08AB"中共有13个字符,而strlen()函数从字符串第一个字符开始扫描,直到碰到第一个结束符'\0'为止,然后返回计数器值(长度不包含"\0")。

故输出结果为6。

答案为A选项。

31、有以下程序
#include <stdio.h>
#include <string.h>
void fun( char *s, int m1, int m2 )
{ char t, *p;
p=s + m1; s= s+m2;
while( s<p )
{ t=*s; *s=*p; *p=t;
s++; p--;
}
}
main()
{ char ss[10]="012345678";
int n=6;
fun( ss,0,n-1 );
fun( ss,9,n );
fun( ss,0,9 );
printf("%s\n", ss );
}
程序运行后的输出结果是
A) 012345
B) 876543210
C) 876543
D) 012345678
参考答案:A
fun(*ss, m1, m2 )的作用是,如果m1>m2交换数组元素ss[m1],ss[m2]。

因此,fun(ss,0,5)后ss的0,1,2,3,4,5,6,7,8,\0。

fun(ss,9,6) 后ss的0,1,2,3,4,5, \0,8,7,6。

fun(ss,0,9)后ss的0,1,2,3,4,5,\0,8,7,6。

因此打印结果012345。

故答案为A选项。

32、有以下程序
#include <stdio.h>
int m=1,n=2;
void sub1(int m,int n)
{ m+=2; n++; }
void sub2( )
{ m++; n+=2; }
main( )
{ printf("%d,%d,",m,n);
sub1(4,5);
printf("%d,%d,",m,n);
sub2();
printf("%d,%d\n",m,n);
}
程序运行后的输出结果是
A) 1,2,1,2,2,4
B) 1,2,6,6,7,8
C) 1,2,2,4,2,4
D) 1,2,6,6,2,4
参考答案:A
全局变量与函数体内局部变量同名时,局部变量会覆盖全局变量,因此在sub1()函数内,
全局变量m,n是不可见的,在sub1()对m,n操作的是局部变量,对全局变量不产生影响。

但在sub2()函数内,由于没有和全局变量变量重名,因此在此函数内,m,n是可见的。

因此,第一个printf()打印的是全局变量m,n,故打印的是1,2,第二个printf(),调用sub1(),没有修改全局变量m,n.故打印的是1,2,第三个printf(),之前调用了sub2(),修改了全局变量m,n。

因此,打印的是2,4,故答案为A选项。

33、有以下程序
#include <ctype.h>
#include <stdio.h>
long fun( char s[] )
{ long n; int sign;
for( ; isspace(*s); s++ );
sign=(*s=='-')? -1 : 1;
if(*s=='+' || *s=='-') s++;
for( n=0 ; isdigit(*s); s++ )
n=10*n+(*s-'0');
return sign*n;
}
main()
{ char s[]=" -26a3";
printf("%d\n ",fun(s));
}
程序运行后的输出结果是
A) -263
B) 2
C) 0
D) -26
参考答案:D
isspace(c)检查参数c是否为空格字符,也就是判断是否为空格('')、水平定位字符('\t')、归位键('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况。

若参数c为空格字符,则返回TRUE,否则返回NULL(0)。

Isdigit(c)函数检查参数c是否为阿拉伯数字0到9。

返回值若参数c为阿拉伯数字,则返回TRUE,否则返回NULL(0)。

fun()函数的第一个for循环判断字符串是否负号。

第二个for循环获取符号后面的数字字符,并将它们转化为整数。

遇到了非数字的字符跳出,最后返回数组的结果。

因此,可知首先获取负号,紧接着获取数值26,遇到了字符a,跳出返回-26,因此打印的结果是-26。

故答案为D选项。

34、设有定义:
struct complex
{ int real,unreal;} data1={1,8},data2;
则以下赋值语句中错误的是
A) data2=(2,6);
B) data2=data1;
C) data2.real=data1.real;
D) data2.real=data1.unreal;
参考答案:A
结构体变量建议在定义的时候进行初始化。

结构体常见的几种初始化方法如下:
(1)struct a a1 = {
.b = 1,
.c = 2
};
(2)struct a a1 = {
b:1,
c:2
};
(3)struct a a1 = { 1, 2};
计算机内核喜欢用第一种,使用第一种和第二种时,成员初始化顺序可变。

因此,可以判断选项A错误。

35、有以下程序
#include <stdio.h>
#define S(x) x*x/x
main( )
{ int k = 6, j = 3;
printf("%d,%d\n", S(k+j+2), S(j+k+2));
}
程序运行后的输出结果是
A) 11,11
B) 29,29
C) 26,29
D) 121,121
参考答案:B
#define命令是C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识符,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

宏定义不进行其他操作,仅仅只是替换标识符。

S(k+j+2)=k+j+2*k+j+2/k+j+2,经计算可得29,S(j+k+2)=j+k+2*k+j+2/j+k+2,计算可得29。

因此输出为29,29。

答案为B选项。

36、若有定义
typedef int *T[10];
T a;
则以下选项与上述定义中a的类型完全相同的是
A) int *a[10];
B) int (*a)[10];
C) int a[10];
D) int (*a[10])();
参考答案:A
C语言允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取"别名"。

类型定义符typedef即可用来完成此功能,可以完全代替原来的类型说明符。

因此,变量a的类型为int *a[10]。

typedef int *T[10],由于[]运算符优先级高于*,可以看成typedef int[10] *T,替换T
可得int[10] *a=>int *a[10],因此,答案为A选项。

37、有以下程序
#include <stdio.h>
main( )
{ FILE *fp;
int i, a[6]={1,2,3,4,5,6},k;
fp = fopen( "data.dat", "w+" );
for ( i=0; i<6; i++ )
fprintf(fp, "%d\n", a[5-i]);
rewind(fp);
for ( i=0; i<6; i++ )
{ fscanf(fp, "%d", &k);
printf("%d,", k);
}
fclose(fp);
}
程序运行后的输出结果是
A) 6,5,4,3,2,1,
B) 1,2,3,4,5,6,
C) 1,1,1,1,1,1
D) 6,6,6,6,6,6,
参考答案:A
fopen( "data.dat", "w+" ); w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。

若文件不存在则建立该文件。

rewind(fp);使文件fp的位置指针指向文件开始。

fprintf(fp,"%d\n", a[5-i]);将a[i]输出到fp指向的文件中。

fscanf(fp, "%d", &k);将fp读入到变量k 中,第一个for循环将数组中元素倒着输入到fp指向的文件中,rewind()则指向文件开始,因此打印是数组a的倒叙。

故打印为6,5,4,3,2,1。

答案为A选项。

38、有以下程序
#include <stdio.h>
#include <stdlib.h>
void fun( double *p1, double *p2, double *s )
{ s=( double* )calloc( 1,sizeof(double) );
*s = *p1 + *p2;
}
main()
{ double a[2]={1.1,2.2 }, b[2]={ 10.0,20.0 }, *q=NULL;
fun( a,b,q );
printf("%5.2f \n", *q );
}
程序运行后的结果是
A) 有运行错误
B) 输出11.10
C) 输出12.10
D) 输出21.10
参考答案:A
calloc(n,sizeof(type))在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针,如果分配不成功,返回NULL。

s在函数fun()申请了内存空间,但是在调用fun()函数后会释放掉,因此,最后q指向NULL,因此运行是打印出错。

答案为A 选项。

39、若文件指针fp已正确指向文件,ch为字符型变量,以下不能把字符输出到文件中的语句是
A) fget( fp,ch );
B) fputc(ch,fp);
C) fprintf( fp, "%c",ch );
D) fwrite( &ch,sizeof(ch),1,fp);
参考答案:A
fgetc()从文件读入一个字符到指定变量。

fputc()将指定字符写入fp文件中,fprintf(),fwrite()均是写入文件操作函数。

因此选项B,C,D错误。

答案为A选项。

40、有以下程序
#include <stdio.h>
struct ball
{
char color[10];
int dim;
};
main( )
{
struct ball list[2] = {{"white", 2}, {"yellow", 3}};
printf("%s:%d\n", (list+1)->color, list->dim);
}
程序运行后的输出结果是
A) yellow:3
B) yellow:2
C) white:2
D) white:3
参考答案:B
结构体定义时初始化,list[0]={"white", 2},list[1]= {"yellow", 3},
(list+1)->color=list[1].color="yellow",list->dim=list[0].dim=2,因此,打印的结果是yellow:2。

故答案为B选项。

相关文档
最新文档