案例分析题

试题三
阅读以下代码和问题, 回答问题, 将解答填入答题纸的对应栏内。

【代码 1】
typedef enum {A, B, C, D} EnumType;
EnumType f(int yr)
{
if(0 == yr%400) {
return A;
}
else if (!(yr%4)) {
if(0!=yr%100)
return B;
else
return C;
}
return D;
}
【代码 2 】
#include
int main()
{ int score;
scanf("%d", &score);
switch (score)
{
case 5: printf("Excellent!\n");
case 4: printf("Good!\n"); break;
case 3: printf("Average!\n");
case 2:
case 1:
case 0: printf("Poor!\n");
default: printf("Oops,Error\n");
}
return 0;
}
【代码 3】
#include
int main()
{ int i,j,k;
for(i=0; i<2; i++)
for(j=0; j<3;j++)
for( k=0; k<2;k++) {
if(i!=j&&j!=k)
printf("%d %d %d\n", i,j,k);
}
ruturn 0;
}

问答题

对于代码 1, 写出下面的函数调用后 x1 、 x2、 x3 和 x4 的值。
x1 = f(1997);
x2 = f(2000);
x3 = f(2100);
x4 = f(2020);

【正确答案】

x1=3;x2=0;x3=2;x4=1

【答案解析】

第一个条件 0==yr%400, 2000 满足, 返回为 A; 其余都不满足, 继续进行判断;
第二个条件 ! yr%4, 1997 不满足, 返回为 D; 其余满足, 继续进行判断;
第三个条件 0! =yr%100, 2020 满足, 返回为 B; 2100 不满足, 返回为 C。
枚举类型中列出的每一个枚举符都对应着一个整数值, 枚举类型实际上是一个整型符号常量的集合。 当定义枚举类型时, 枚举符都已经被系统隐含地赋予了一个整型值, 默认情况下,第一个元素为 0, 第二个元素为 1, 依此类推。 所以相应的 A=0, B=1, C=2, D=3, 故返回为: x1=3;x2=0;x3=2;x4=1。

问答题

(1) 写出代码 2 进行时输入为 3 的输出结果;
(2) 写出代码 2 进行时输入为 5 的输出结果。

【正确答案】

(1)Average!
poor!
Oops, Error
(2) Excellent!
Good!

【答案解析】

控制传递给与开关的值匹配的 case 语句。 switch 语句可以包括任意数目的 case 实例, 但是任何两个 case 语句都不能具有相同的值。 语句体从选定的语句开始执行, 直到 break 将控制传递到 case 体以外。 case 后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即"只是开始执行处的入口标号". 因此,一旦与 switch 后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个 case 后面的语句后,若没遇到 break 语句,就自动进入下一个 case 继续执行,而不在判断是否与之匹配,直到遇到 break 语句才停止执行,退出 break语句。因此,若想执行一个 case 分之后立即跳出 switch 语句,就必须在此分支的最后添加一个break 语句。

问答题

写出代码 3 运行后的输出结果。

【正确答案】

0 1 0
0 2 0
0 2 1
1 0 1
1 2 0
1 2 1

【答案解析】

此题考察多重 for 循环再加上一个判定条件, i 的取值为(0, 1) , j 的取值为(0, 1, 2) ,k 的取值为(0, 1) , 只要按顺序找到 i! =j 且 j! =k 的组合即可。