📜  C语言 | 6套

📅  最后修改于: 2021-09-28 10:15:41             🧑  作者: Mango

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

1. 考虑以下 C 程序片段,其中 i、j 和 n 是整数变量。

for (i = n, j = 0; i >0; i /= 2, j += i);

让 val(j) 表示在 for 循环终止后存储在变量 j 中的值。以下哪一项是正确的?
(A) val(j) = Θ(logn)
(B) vaI(j) = Θ(sqrt(n))
(C) val(j) = Θ(n)
(D) val(j) = Θ(nlogn)

答案 (C)

请注意 for 循环后面的分号,因此正文中没有任何内容。变量 j 最初为 0,j 的值是 i 的值之和。 i 初始化为 n 并在每次迭代中减半。

j = n/2 + n/4 + n/8 + .. + 1 = Θ(n)

2. 考虑以下 C 函数,其中 a[n] 和 b[m] 是两个已排序的整数数组,而 c[n + m] 是另一个整数数组。

void xyz(int a[], int b [], int c[])
{
  int i, j, k;
  i = j = k = O;
  while ((i

在 while 循环终止后,下列哪个条件成立?
(i) j < m, k = n+j-1, and a[n-1] < b[j] 如果 i = n (ii) i < n, k = m+i-1, and b[m -1] <= a[i] 如果 j = m

(A) 仅 (i)
(B) 仅 (ii)
(C) (i) 或 (ii) 但不是两者
(D) 既不是 (i) 也不是 (ii)

答案 (C)
如果 c[] 中最后插入的元素来自 a[],则条件 (i) 为真,如果最后插入的元素来自 b[],则条件 (ii) 为真。


3. 考虑这个 C 代码来交换两个整数和这五个语句:代码

void swap(int *px, int *py) 
{
   *px = *px - *py;
   *py = *px + *py;
   *px = *py - *px;
}

S1:会产生编译错误
S2:可能会在运行时根据传递的参数生成分段错误
S3:正确实现所有输入指针的交换过程,这些指针指向存储在进程可访问的内存位置中的整数
S4:为一些但不是所有的有效输入指针正确实现交换过程
S5:可以加减整数和指针。
(一) S1
(B) S2 和 S3
(C) S2 和 S4
(D) S2 和 S5

答案 (C)
S2:如果指针 px 或 py 处的值是常量或 px 或 py 指向无效的内存位置,则可能会生成分段错误
S4:可能不适用于所有输入,因为可能发生算术溢出。