阅读以下C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【C代码1】
#include <stdio.h>
int main ( ) {
int m,n;
for ( m=3 ; m>0 ; --m )
for( n=0; n<m;++n ) {
printf ("%d %d\n", m, n) ;
break;
}
return 0;
}
【问题1】(3分)
请写出【C代码1】运行时的输出结果。
【C代码2】
#include <stdio.h>
void foo ( int n ) {
printf ( "%d " , n) ;
if(n>1)
foo (n-1) ;
printf ( "%d " , n) ;
}
int main () {
foo ( 3 );
return 0 ;
}
【问题2】(6分)
请写出【C代码2】运行时的输出结果。
【C代码3】
#include <stdio.h>
#include <ctype.h>
int main () {
char *p, str[] ="e=2.718aT9\tRf\n#";
int lc=0 , uc=0 , dc=0 , oc=0 ;
for(p=str; *p!='#'; ++p) {
if (islower (*p)) lc++;
else if (isupper (*p)) uc++;
else if (isdigit (*p))dc++;
else oc++;
}
printf ( "lc=%d uc=%d dc=%d oc=%d\n", lc, uc,dc,oc);
return 0;
}
【问题3】(6分)
请写出【C代码3】运行时的输出结果。
本题考查对C语言基本语法和基本控制逻辑的理解和应用。【问题1】
本问题考查基本的循环控制逻辑。break语句在循环语句中的作用是跳出循环,从而结束该break所在的循环结构。在嵌套的循环中,break 只是跳出其所在的循环结构层次,外层的循环还要继续执行。
【C代码1】for语句执行情况如下表所示。
【问题2】
本问题考查对递归函数执行过程的理解。
递归函数foo的定义如下:
void foo( int n ) {
printf ("%d " , n) ;//①
if (n>1)
foo(n-1);printf("%d " , n) ; //②
)
调用foo(3)是对函数foo 的第1次调用,此时形参n被初始化为3,执行“printf("%d " ,n);”(注释①)之后输出3。由于“n>1”成立,所以用“n-1”的值(即2)作为实参第2次调用函数foo,此时实参n被初始化为2,再次执行“printf("%d ",n);”(注释①)之后输出2。由于“n>1”成立,所以用“n-1”的值(即1)作为实参第3次调用函数foo,此时实参n被初始化为1,再次执行“printf("%d ",n);”(注释①)之后输出1。
当形参n被初始化为1,“n>1”就不成立了,接下来开始第一次执行“printf("%d ",n);”(注释②),输出1,然后foo函数的第三次执行结束,需要返回,应返回到调用点foo(1)(即实参表达式n-1的值为1)后继续执行接下来的语句“printf("%d ",n);”(注释②),输出了2,然后结束了对函数foo的第二次调用。同理,返回到调用点foo(2)(即实参表达式n-1的值为2),接下来再次执行“printf("%d ",n);”(注释②)后输出了3,结束了对foo(3)的调用,控制流回到main函数。
综上,函数调用foo(3)执行的过程中,输出的值为3 2 1 1 2 3。
【问题3】
本问题考查字符数据的表示及字符指针的运算。
这里的关键是明确字符串"e=2.718aT9\tRf\n#" ;中每个字符的类型属于小写字母(islower)的字符有“e”“a”“f",大写字母(isupper)为“T”“R”,数字字符(isdigit)为“2”“7”“1”“8”“9”,其他字符为“=”“.”“\t”“\n”“#”,循环条件为当前字符不等于“#”时进行循环,因此不对“#”计数。