C语言|集合5

在2008门CS考试中提出了以下问题。

null

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

如果您发现任何答案/解释不正确,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享