在2008门CS考试中提出了以下问题。
1.下面的C程序打印什么?
int f( int x, int *py, int **ppz) { int y, z; **ppz += 1; z = **ppz; *py += 2; y = *py; x += 3; return x + y + z; } void main() { int c, *b, **a; c = 4; b = &c; a = &b; printf ( "%d" , f(c,b,a)); getchar (); } |
(A) 18 (B) 19 (C) 21 (D) 22
答复(B)
/* Explanation for the answer */ /*below line changes value of c to 5. Note that x remains unaffected by this change as x is a copy of c and address of x is different from c*/ **ppz += 1 /* z is changed to 5*/ z = **ppz; /* changes c to 7, x is not changed */ *py += 2; /* y is changed to 7*/ y = *py; /* x is incremented by 3 */ x += 3; /* return 7 + 7 + 5*/ return x + y + z; |
2.选择正确的选项进行填充?1和?2以便下面的程序以相反的顺序打印输入字符串。假设输入字符串以换行符结尾。
void reverse( void ) { int c; if (?1) reverse() ; ?2 } main() { printf ( "Enter Text " ) ; printf ( "" ) ; reverse(); printf ( "" ) ; } |
(A) ??1是(getchar()!=’’) ?2是getchar(c); (B) ??1是(c=getchar())!=’’) ?2是getchar(c); (C) ??1是(c!=’’) ?2为putchar(c); (D) ??1是((c=getchar())!=’’) ?2为putchar(c);
答复(D) getchar()用于从用户获取输入字符,putchar()用于打印输入的字符,但在打印之前,会反复调用reverse,直到’“输入。什么时候’是从函数堆栈中逐个输入函数的run putchar()语句。因此,最后输入的字符将首先打印。 你可以试着运行下面的程序
void reverse( void ); /* function prototype */ void reverse( void ) { int c; if (((c = getchar ()) != '' )) reverse(); putchar (c); } main() { printf ( "Enter Text " ) ; printf ( "" ) ; reverse(); printf ( "" ) ; getchar (); } |
对于问题3和4,考虑以下C函数:
int f1( int n) { if (n == 0 || n == 1) return n; else return (2*f1(n-1) + 3*f1(n-2)); } int f2( int n) { int i; int X[N], Y[N], Z[N] ; X[0] = Y[0] = Z[0] = 0; X[1] = 1; Y[1] = 2; Z[1] = 3; for (i = 2; i <= n; i++) { X[i] = Y[i-1] + Z[i-2]; Y[i] = 2*X[i]; Z[i] = 3*X[i]; } return X[n] ; } |
3.f1(n)和f2(n)的运行时间为 (A) Θ(n)和Θ(n) (B) Θ(2^n)和Θ(n) (C) Θ(n)和Θ(2^n) (D) Θ(2^n)和Θ(2^n)
答复(B) 对于f1() 设T(n)为时间复杂度的函数。
T(n) = T(n-1) + T(n-2)
上面的递归是 斐波那契数 .在解决递归之后,我们得到
T(n) = 1/sqrt(5)[(1 + sqrt(5))/2]^n - 1/sqrt(5)[(1 - sqrt(5))/2]^n
上述递归也可以写成Θ(1.618.^n) (请看 这 ).
在f2()中 ,有一个循环,因此时间复杂度为Θ(n)
在所有四个给定的选择中,(B)看起来最接近。
4.f1(8)和f2(8)返回值 (A) 1661年和1640年 (B) 59和59 (C) 1640年和1640年 (D) 1640年和1661年
两个函数执行相同的操作,所以输出相同,这意味着(B)或(C)是正确的。 f1(2)=2*f1(1)+3*f1(0)=2 f1(3)=2*f1(2)+3*f1(1)=2*2+3*1=7 f1(4)=2*f1(3)+3*f1(2)=2*7+3*2=20 f1(5)=2*f1(4)+3*f1(3)=2*20+3*7=40+21=61
在这之后我们可以跳过,因为剩下的唯一选择是(C) f1(6)=2*f1(5)+3*f1(4)=2*61+3*20=122+60=182 f1(7)=2*f1(6)+3*f1(5)=2*182+3*61=364+183=547 f1(8)=2*f1(7)+3*f1(6)=2*547+3*182=1094+546=1640
如果您发现任何答案/解释不正确,或者您想分享有关上述主题的更多信息,请发表评论。