📜  C语言 | 2套

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

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

1. 考虑以下 C 程序段:

char p[20];
char *s = "string";
int length = strlen(s);
int i;
for (i = 0; i < length; i++)
     p[i] = s[length — i];
printf("%s",p);

程序的输出是 (GATE CS 2004)
a) 点火
b) 点火
c)字符串
d) 不打印输出

答案(d)
让我们考虑 for 循环内的以下行
p[i] = s[长度 — i];
对于 i = 0,p[i] 将是 s[6 — 0] 并且 s[6] 是 ‘\0’
所以 p[0] 变成了 ‘\0’。 p[1]、p[2]….. 中的内容无关紧要,因为当 i > 0 时 P[0] 不会改变。如果我们打印第一个字符’\0’ 的字符串,则不会打印任何内容


2. 考虑下面的 C函数

void swap (int a, int b)
{
   int temp;
   temp = a;
   a = b;
   b = temp;
}

为了交换两个变量x和y的值。 (GATE CS 2004)

a) 调用交换 (x, y)
b) 调用交换(&x, &y)
c) 不能使用 swap (x,y) 因为它不返回任何值
d) 不能使用swap(x,y),因为参数是按值传递的

答案(d)
为什么 a、b 和 c 不正确?
a) 调用 swap(x, y) 不会对 x 和 y 造成任何影响,因为参数是按值传递的。
b) 调用 swap (&x, &y) 将不起作用,因为函数swap() 期望值而不是地址(或指针)。
c) 不能使用 swap (x, y) 但给出的原因不正确。

3. 考虑以下 C函数:

int f(int n)
{
   static int i = 1;
   if (n >= 5)
      return n;
   n = n+i;
   i++;
   return f(n);
}

f(1) 返回的值是 (GATE CS 2004)
一)5
b) 6
c) 7
d) 8

答案 (c)
因为 i 是静态的,所以 f() 的第一行只执行一次。

Execution of f(1) 
    i = 1
    n = 2
    i = 2
 Call f(2) 
    i = 2
    n = 4
    i = 3
 Call f(4) 
   i = 3
   n = 7
   i = 4
 Call f(7)
  since n >= 5 return n(7)


4. 考虑以下用于反转给定整数中的数字以获得新整数的程序片段。令 n = D1D2…Dm

int n, rev;
rev = 0;
while (n > 0) 
{
   rev = rev*10 + n%10;
   n = n/10;
}

第 i 次迭代结束时的循环不变条件为:(GATE CS 2004)

a) n = D1D2….Dm-i 和 rev = DmDm-1…Dm-i+1
b) n = Dm-i+1…Dm-1Dm 和 rev = Dm-1….D2D1
c) n≠rev
d) n = D1D2….Dm 和 rev = DmDm-1…D2D1

答案(一)


5. 考虑下面的 C 程序

main()
{
   int x, y, m, n;
   scanf ("%d %d", &x, &y);
   /* x > 0 and y > 0 */
   m = x; n = y;
   while (m != n)
   { 
      if(m>n)
         m = m - n;
      else
         n = n - m;
   }
   printf("%d", n);
}

程序计算 (GATE CS 2004)
a) x + y 使用重复减法
b) x mod y 使用重复减法
c) x 和 y 的最大公约数
d) x 和 y 的最小公倍数

答案(c)
这是找到 GCD 的欧几里德算法的实现