Рубрики

Язык C | Комплект 5

На экзамене 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
(D) 22

Ответ (Б)

/ * Объяснение к ответу * /

  

  / * ниже строки меняет значение c на 5. Обратите внимание, что x остается неизменным

    этим изменением, поскольку x является копией c, а адрес x отличается от c * /

  **ppz += 1 

  

  / * z изменено на 5 * /

  z  = **ppz;

  

  / * изменяет c на 7, x не изменяется * / 

  *py += 2;

  

   / * у изменено на 7 * /

  y = *py;   

  

  / * х увеличивается на 3 * /

   x += 3;   

  

  / * возврат 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 — путчар (с);
(D)? 1 есть ((c = getchar ())! = '/ N')
? 2 — путчар (с);

Ответ (D)
getchar () используется для получения вводимого символа от пользователя и putchar () для печати введенного символа, но перед печатью обратный вызов вызывается снова и снова, пока не будет введен '/ n'. Когда вводится '/ n', функции из стека функций запускают операторы putchar () один за другим. Поэтому последний введенный символ печатается первым.
Вы можете попробовать запустить программу ниже

void reverse(void); / * прототип функции * /

  

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)

Ответ (Б)
Для 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) возвращают значения
(А) 1661 и 1640
(Б) 59 и 59
(С) 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

Пожалуйста, пишите комментарии, если вы найдете какие-либо неправильные ответы / объяснения, или вы хотите поделиться дополнительной информацией по темам, обсужденным выше.

Рекомендуемые посты:

Язык C | Комплект 5

0.00 (0%) 0 votes