阅读以下C代码,回答问题1和问题2,将解答写在答题纸的对应栏内。
【C代码1】
typedef enum { RED=0,BLUE, YELLOW }COLOR;
int main ( ) {
COLOR color = RED;
switch (++color) {
case RED:printf ( "red\n");
case BLUE: printf ( "blue\n");
case YELLOw : printf ( "yellow\n" );break ;
default: printf ( "error\n" ) ;
}
return 0 ;
}
【问题1】(6分)
(1)对于【代码1】中定义的枚举类型COLOR,请给出枚举符BLUE和YELLOW的值。(2)请写出【代码1】运行时的输出结果。
【C代码2】
int main( ) {
int a[ ] = {85,40,73,16} ;
int i,j, n = sizeof(a)/sizeof(int); //n表示数组元素个数
for (i=0 ; i<n; ++i)
printf ("%d ", a [i] );
for(i=0,j=n-1; i<j; ++i,--j)
if (a[i] > a[j]) { int t = a[i]; a[i] = a[j]; a[j] = t; }
for (i=0 ; i<n; ++i)
printf ("%d ", a[i] );
return 0 ;
}
【问题2】(9分)
(1)请写出【代码2】运行时的输出结果。
(2)将【代码2】中数组 a的定义修改为“int a[6]= {85,40,73,16};”后再编译运行,请写出对应的输出结果。
本题考查C语言基本语法和基本的控制逻辑。
【问题1】
C语言提供的枚举(enum)类型能够列出所有可能的取值(称为枚举符),并给它们取一个名字。
在代码1中,枚举类型的数据元素依次为RED, BLUE, YELLOW。枚举符的值默认从О开始,往后逐个加1(递增)。因此,RED的值为0、BLUE的值为1、YELLOW的值为2。若规定了其中某个枚举符的值,则从其下一个枚举符开始,依次递增1。
“++”运算符在变量之前时,是先将变量的值增1,然后用增加之后的值参与下一步计算。color的初始值为RED(即0),自增后color 的值变为1,此时符合case BLUE,输出字符串“blue”之后,流程没有离开switch语句,继续向下执行,输出字符串“yellow”之后,通过执行break离开switch语句,然后结束程序。
【问题2】
对于数组定义“int a[ ]= {85,40,73,16};”,由初始值列表中的四个元素可知数组 a的大小为4,程序中用sizeof(a)计算出数组a占用的存储空间大小为4个int型数值的大小,因此通过sizeof(a)/sizeof(int)得到数组元素个数,这样,当初始化数组的初始值列表中元素个数有变化时就不需要重新修改下面n的值。程序中的主要处理是第二个for 语句,如下:
for(i=0,j=n-1; i<j; ++i,—-j)
if (a[i] > a[j]){ int t = a[i]; a[i] = a[j]; a[j] = t; }
其功能是将数组中对称位置的元素a[i]和a[j]进行比较,若位于前半区域的元素a[i]较大,则将其交换至后端al[i],到达中间元素或i>=j时为止。因此,由第一个for 语句输出的数组元素为85 40 73 16,第二个for语句将对称位置的元素互换后,第三个for语句输出的数组元素为16 40 73 85。
将数组a的定义修改为“int a[6] = {85,40,73,16};”之后,数组a有6个元素,初始值列表中的四个值设置了a[0]~a[3]的初始值,a[4]和 a[5]则被初始化为0,因此再执行程序后,由第一个for 语句输出的数组元素为85 40 73 16 0 0,第二个for 语句交换了85和0、40和0、73和16,从而由第三个for语句输出了值序列00 16 73 40 85。