📜  C语言 |组5

📅  最后修改于: 2021-09-28 09:33:36             🧑  作者: Mango

以下问题已在 GATE CS 2008 考试中提出。

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();
}

(一) 18
(二) 19
(三) 21
(四) 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 ("\n") ;
  reverse();
  printf ("\n") ;
}

(A) ?1 是 (getchar() != ‘\n’)
?2 是 getchar(c);
(B) ?1 是 (c = getchar() ) != ‘\n’)
?2 是 getchar(c);
(C) ?1 是 (c != ‘\n’)
?2 是 putchar(c);
(D) ?1 是 ((c = getchar()) != ‘\n’)
?2 是 putchar(c);

答案(D)
getchar() 用于从用户处获取输入字符, putchar() 用于打印输入的字符,但在打印之前反复调用 reverse 直到输入 ‘\n’ 。当输入 ‘\n’ 时,函数堆栈中的函数一一运行 putchar() 语句。因此,首先打印最后输入的字符。
您可以尝试运行以下程序

void reverse(void); /* function prototype */
  
void reverse(void)
 {
  int c;
  if (((c = getchar()) != '\n')) 
    reverse();  
  putchar(c);
}
main()
{
  printf ("Enter Text ") ;
  printf ("\n") ;
  reverse();
  printf ("\n") ;
  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)

在所有 4 个给定的选项中,(B)看起来最接近。

4. f1(8) 和 f2(8) 返回值
(A) 1661 和 1640
(二) 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