Wednesday, December 9, 2015

GATE Questions - C Programming

Previous GATE questions with solutions on C Programming - CS/IT

GATE-2000
1. The number of tokens in the following C statement. 
printf("i = %d, &i = %x", i, &i);
is
(a) 3   (b) 26   (c) 10    (d) 21


Ans: option (c)
Explanation:
The smallest individual units are known as C Tokens. The keywords, identifiers, constants, string literals, and operators described in this section are examples of tokens. Punctuation characters such as brackets ([ ]), braces ({ }), parentheses ( ( ) ), and commas (,) are also tokens.
Example:
printf("Hello, World! \n");
The tokens for the above statement are:
1) printf
2) (
3) "Hello, World! \n"
4) )
5) ;
So there are 5 tokens

printf("i = %d, &i = %x", i, &i);
10 Tokens are:
1) printf
2) (
3) "i = %d, &i = %x"
4) ,
5) i
6) ,
7) &
8) i
9) )
10);

GATE-2012
2. What will be the output of the following C program segment?
char inchar = 'A';
switch (inchar)
{
case 'A' :
    printf ("choice A \n") ;
case 'B' :
    printf ("choice B ") ;
case 'C' :
case 'D' :
case 'E' :
default:
    printf ("No Choice") ;
}
(a) No choice
(b) Choice A
(c) Choice A
    Choice B No choice
(d) Program gives no output as it is erroneous

Ans: Option (c)
Explanation:
In switch statement if a case is executed and if the case doesn't contain break, then all the subsequent 'case' statements are executed until a break statement is found. If I modify the above code as below:
char inchar = 'B';
switch (inchar)
{
case 'A' :
    printf ("choice A \n") ;
case 'B' :
    printf ("choice B ") ;
case 'C' :
case 'D' :
case 'E' :
default:
    printf ("No Choice") ;
}
The output of the above program will be: Choice B No Choice

GATE-1999
3. Consider the following C function definition:
int Trial (int a, int b, int c) 
{ 
   if ((a > = b) && (c < b)) return b; 
   else if (a > = b) return Trial (a,c,b); 
   else return Trial (b,a,c); 
}
The function Trial:  
(a) Finds the maximum of a, b, and c 
(b) Finds the minimum of a, b and c 
(c) Finds the middle number of a, b, c 
(d) None of the above  

Ans: (c)
Explanation:
The first condition, (a > = b) && (c < b), if true will return the middle number, i.e. b. Again on calling the Trial function, it will return the middle number.

GATE CS 2000
4. The value of j at the end of the execution of the following C program. 
int incr (int i)
{
   static int count = 0;
   count = count + i;
   return (count);
}
main ()
{
   int i,j;
   for (i = 0; i <=4; i++)
        j = incr(i);
}
(a) 10    (b) 4    (c) 6    (d) 7

Ans: option (a)
Explanation:
count variable is declared as static in incr function. Therefore, static int count = 0;, will assign zero to the count variable in the first call only. When the incr function is called for 2nd, 3rd or 4th times, count variable will hold its previous value, and will not be re-initialized to zero again.
Static variables hold their previous values, and they do not re-initialized when the function is called again. The lifetime of a static variable is in the entire program.
For 1st iteration when i=0, incr(0) => count= 0 + 0 = 0
For 2nd iteration when i=1, incr(1) => count= 0 + 1 = 1
For 3rd iteration when i=2, incr(2) => count= 1 + 2 = 3
For 4th iteration when i=3, incr(3) => count= 3 + 3 = 6
For 5th iteration when i=4, incr(4) => count= 6 + 4 = 10

GATE CS 2002
5. Consider the following declaration of a ‘two-dimensional array in C:
char a[100][100];
Assuming that the main memory is byte-addressable and that the array is stored starting from memory address 0, the address of a[40][50] is
(a) 4040       (b) 4050       (c) 5040        (d) 5050

Ans: option (b)
Explanation:
Address of a[40][50] = Starting Address + 40 x 100 x memorySize + 50 x memorySize
                              = 0 + 40 x 100 x 1 + 50 x 1 = 4050
Note: Since byte addressable, memorySize = 1

GATE CS 2005
6. Consider the following C-program:
void foo(int n, int sum)
{
  int k = 0, j = 0;
  if (n == 0) return;
  k = n % 10; j = n / 10;
  sum = sum + k;
  foo (j, sum);
  printf ("%d,", k);
}

int main ()
{
  int a = 2048, sum = 0;
  foo (a, sum);
  printf ("%d\n", sum);
  getchar();
}
What does the above program print?
(a) 8, 4, 0, 2, 14 
(b) 8, 4, 0, 2, 0 
(c) 2, 0, 4, 8, 14 
(d) 2, 0, 4, 8, 0

Ans: option (d)
going through each code, you will find that foo function prints all the digits of a number stored in variable a
Note:
i) k= n % 10  => modulus operator will return the remainder. for example, if n=2048, then 2048 %10 will store the value 8 in k.
ii) j is declared as integer datatype in foo function. Therefore after division if the result contains decimal part, it will be truncated and only the integer part will be stored in j. For example if j=2048/10, (actual result = 204.8) then 204 will be stored in j.
iii) The sum variable declared in the main function will not be used by the foo function. 

GATE CS 2004
7. Consider the following C function:
int f(int n)
{
   static int i = 1;
   if (n >= 5)
      return n;
   n = n+i;
   i++;
   return f(n);
}
The value returned by f(1) is
a) 5   b) 6   c) 7   d) 8

Ans: option (c)
Explanation:
Note that i is declared as static variable, first line of the function, static int i = 1;, will be executed only once. Static variables hold their previous values, and they do not re-initialized when the function is called again. The lifetime of a static variable is in the entire program. 

GATE CS 2004
8. Consider the following C program
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);
}
The program computes
(a) x + y using repeated subtraction
(b) x mod y using repeated subtraction
(c) the greatest common divisor of x & y
(d) the least common multiple of x & y

Ans: option (c)
Explanation:
Give some values to x and y and work out the code step by step. The program code is an implementation of Euclid's algorithm which is an efficient method for computing the greatest common divisor (GCD) of two integers. 
For more details: http://en.wikipedia.org/wiki/Euclidean_algorithm

GATE-2005
9. Consider the following C-program:
double foo (double); /* Line 1 */
int main () {
   double da, db;
   // input da
   db = foo (da);
}

double foo (double a) {
   return a;
}
The above code compiled without any error or warning. If Line 1 is deleted, the above code will show:
(a) no compile warning or error
(b) some compiler-warnings not leading to unintended results
(c) some compiler-warnings due to type-mismatch eventually leading to unintended results
(d) compiler errors

Ans: option (d)
Error:
Function 'foo' should have a prototype in function main()

GATE-2005
10. Consider line number 3 of the following C-program. 
int main ( ) { /* Line 1 */ 
  int i, n; /* Line 2 */ 
  fro (i =0, i<n, i++); /* Line 3 */ 
} 
Identify the compiler’s response about this line while creating the object-module: 
(a) No compilation error    (b) Only a lexical error
(c) Only syntactic errors    (d) Both lexical and syntactic errors

Ans: option(c)
Error: Function 'fro' should have a prototype in function main()

GATE-2006
11. Consider these two functions and two statements S1 and S2 about them.
int work1(int *a, int i, int j)
{
  int x = a[i+2];  
  a[j] = x+1;
  return a[i+2] – 3;
}

int work2(int *a, int i, int j)
{
  int t1 = i+2;
  int t2 = a[t1];
  a[j] = t2+1;
  return t2 – 3;
}

S1: The transformation from work1 to work2 is valid, i.e., for any program state  and input arguments, work2 will compute the same output and have the same  effect on program state as work1
S2: All the transformations applied to work1 to get work2 will always improve the  performance (i.e reduce CPU time) of work2 compared to work1
(a) S1 is false and S2 is false
(b) S1 is false and S2 is true
(c) S1 is true and S2 is false
(d) S1 is true and S2 is true


Ans: option (d)
Explanation:
Both functions work1 & work2 performs the same task, therefore S1 is true.
In S2 it is asking about improvement in performance i.e. reduction in CPU time. When compared work2 will reduce the CPU time, because in work1 a[i+2] is computed twice but in work2 a[i+2] is computed once and stored in t2, and then t2 is used. When we consider the performance in terms of reduction in CPU time, S2 is correct.

GATE - 2007
12. Consider the following C function:
int f(int n)
{
 static int r = 0;
 if (n <= 0) return 1;
 if (n > 3)
 {
  r = n;
  return f(n-2)+2;
 }
 return f(n-1)+r;
}
What is the value of f(5) ?
(a) 5    (b) 7    (c) 9    (d) 18

Ans: option (d)
Explanation:
As explained before, Static variables retain their values throughout the life of the program. The steps involved in the execution is shown below.

Since f(3) returns value 16, the final step is 16+2 = 18. Therefore f(5) will return value 18.

GATE-2011
Common data Questions (13 & 14)

Consider the following recursive C function that takes two arguments
unsigned int foo(unsigned int n, unsigned int r) {
  if (n  > 0) return (n%r +  foo (n/r, r ));
  else return 0;
}

13. What is the return value of the function foo when it is called as foo(345, 10) ?
(a) 345   (b) 12   (c) 5   (d) 3
Ans: option (b)
Explanation:
foo(345,10) = 5 + [ foo(34,10) ]
                 = 5 + [ 4 + { foo(3,10) } ]
                 = 5 + [ 4 + { 3 + foo(0,10) } ] = 5 + 4 + 3 + 0 = 12
Therefore, foo function returns sum of digits in the number n, because r = 10.

14. What is the return value of the function foo when it is called as foo(513, 2)?
(a) 9   (b) 8   (c) 5   (d) 2
Ans: option (d)
Explanation:
Executing as above we get the value returned as 2. Here, foo function returns sum of bits of a number n, because r = 2.

GATE-2008

15. Choose the correct option to fill ?1 and ?2 so that the program below prints an input string in reverse order. Assume that the input string is terminated by a newline character. 
void reverse(void)
{
  int c;
  if (?1) reverse() ;
  ?2
}

main()
{
  printf ("Enter Text ") ;  printf ("\n") ;
  reverse();  printf ("\n") ;
}

(a) ?1 is (getchar() != '\n'’)
     ?2 is getchar(c);
(b) ?1 is (c = getchar() ) != '\n')
     ?2 is getchar(c);
(c) ?1 is (c != ’\n’)
     ?2 is putchar(c);
(d) ?1 is ((c = getchar()) != '\n')
     ?2 is putchar(c);

Ans: option (d)
Explanation:
getchar() is used to get the input character.
putchar() is used to print the character.
The reverse function should read the character you type until you press the "enter" key. Hence before printing, reverse function is called again and again until "enter" key is pressed. Once the "enter" key is pressed; the functions from the function stack run putchar(c) statements one by one. Therefore, last entered character is printed first.

GATE-2000
16. The following C declaration
struct node 
{ 
   int i; 
   float j; 
}; 
struct node *s[10] ; 

define s to be 
(a) An array, each element of which is a pointer to a structure of type node
(b) A structure of 2 fields, each field being a pointer to an array of 10 elements
(c) A structure of 3 fields: an integer, a float, and an array of 10 elements
(d) An array, each element of which is a structure of type node.

Ans: option (a)

GATE-2000
17. The most appropriate matching for the following pairs
X: m=malloc(5); m= NULL;        1: using dangling pointers
Y: free(n); n->value=5;         2: using uninitialized pointers
Z: char *p; *p = ’a’;           3: lost memory 

is:
(a) X—1 Y—3 Z-2
(b) X—2 Y—1 Z-3
(C) X—3 Y—2 Z-1
(d) X—3 Y—1 Z-2

Ans: option (d)
Explanation:
malloc(size) - malloc function allocates a block of size bytes from the free data area (heap). On success, malloc returns a pointer to the newly allocated block of memory.
Therefore after execution of m=malloc(5);,m contains a pointer to the newly allocated memory. But m=NULL; statement will store the NULL value to m, without freeing the memory. Since the allocated memory is not yet freed, it is a lost memory.

free - deallocates a memory block allocated previously by malloc, calloc, or realloc. Here, "free(n); n->value=5;", n is trying to retrieve a value after the memory has freed, hence dangling pointer.
A dangling pointer is a pointer to storage that is no longer allocated.

GATE CS 2000
18. Consider the following C declaration
struct { 
    short s [5] 
    union { 
         float y; 
         long z; 
    }u; 
} t; 
Assume that objects of the type short, float and long occupy 2 bytes, 4 bytes and 8 bytes, respectively. The memory requirement for variable t, ignoring alignment considerations, is 
(a) 22 bytes  (b) 14 bytes  (c) 18 bytes  (d) 10 bytes

Ans: option (c)
Explanation:
The amount of memory required to store a structure variable is the sum of the sizes of all its members. But in the case of union, the amount of memory required is the amount required by its largest member.
Therefore u, which is a union member of the struct, occupies only 8 bytes of memory, because the largest memory is 8 bytes consumed by long z;. Another member in the struct is short s [5], this will occupy 10 bytes of memory ( 2 bytes x 5).
Hence total 10 + 8 =18 bytes.

GATE CS 2003
19. Assume the following C variable declaration
int *A [10], B[10][10]; 
Of the following expressions
I.   A[2]
II.  A[2][3]
III. B[1]
IV.  B[2][3]
which will not give compile-time errors if used as left hand sides of assignment statements in a C program?
(a) I, II, and IV only 
(b) II, III, and IV only
(c) II and IV only
(d) IV only

Ans: option (a)
Explanation:
A is an array of pointers, and A[2] can be used as left hand sides of assignment statements. Suppose we have another array of integers i.e. int marks[]={10,20,30,40}. Then we can assign A[2] = marks; Because marks represents the starting address of the array marks[], and on execution, the address is stored in the 3rd element of array A.
Considering the assignment A[2] = marks;, A[2][3] represents the element 40 (i.e. 4th element in the marks array). Therefore, A[2][3] also can be used as left hand sides of assignment statements. i.e. A[2][3] = 45; will make the contents of marks array as {10,20,30,45}.
B[2][3] =12; represents a simple assignment to an element of a two-dimensional array. So B[2][3] can also be used as left hand sides of assignment statements.
B[1] cannot be used as left hand sides of assignment statements, because, since it is a two-dimensional array B[1] represents an address and we cannot write it.

GATE CS 2004
20. Consider the following C function
void swap (int a, int b)
{
   int temp;
   temp = a;
   a = b;
   b = temp;
}
In order to exchange the values of two variables x and y. 
a) call swap (x, y)
b) call swap (&x, &y)
c) swap (x,y) cannot be used as it does not return any value
d) swap (x,y) cannot be used as the parameters are passed by value

Ans: option (d)
Explanation:
call swap (x, y) - will swap only the formal parameters (i.e. a and b). The value actual parameters (i.e. x and y) will remain the same, because the value are passed by  CALL BY VALUE.
call swap (&x, &y) - will not work because, swap function accepts VALUES as parameters, but we are passing addresses of x and y.
option (c): swap (x,y) cannot be used, it is  correct, but reason is not correct.

GATE-2005
21. What does the following C-statement declare? 
int ( * f) (int * ) ;
(a) A function that takes an integer pointer as argument and returns an integer 
(b) A function that takes an integer as argument and returns an integer pointer 
(c) A pointer to a function that takes an integer pointer as argument and returns an integer.
(d) A function that takes an integer pointer as argument and returns a function pointer

Ans: option (c)
Explanation:
Syntax to declare pointer to a function => datatype (*pointer_variable)(list of arguments)
To make a pointer to a function => pointer_variable = function_name   
Note: don't use parenthesis of the function.
 To call (invoke) the function => pointer_variable(list of arguments)

GATE-2010
22. What does the following program print?
#include<stdio.h>
void f(int *p, int *q)
{
  p = q;
 *p = 2;
}
int i = 0, j = 1;

int main()
{
  f(&i, &j);
  printf("%d %d \n", i, j);
  getchar();
  return 0;
}
(a) 2 2    (b) 2 1    (c) 0 1    (d) 0 2

Ans: option (d)
Explanation:
Initially i=0 and j=0
f(&i, &j); on execution p pointer points to i, and q pointer points to j.
p = q; means p now contains the address of j, therefore p also now points to j.
*p = 2; 2 value is saved in the location where the p is pointing. Since p points to j, value of j is changed to 2 now.
Now returns to main function and prints i and j.Hence i=0 and j=2 

GATE-2011
23. What does the following fragment of C-program print?
char c[] = "GATE2011";
char *p =c;
printf("%s", p + p[3] - p[1]); 
(a) GATE2011    (b) E2011    (c) 2011    (d) 011

Ans: option (c)
Explanation:
p has the base address of character array c.
p[3] is E and p[1] is A

p[3] - p[1] = ASCII value of E - ASCII value of A
            = 69 - 65 =4

p = base address of C
Therefore, p + p[3] - p[1] = base_address + 4
(base_address + 4) is the base address of the string 2011.

GATE CS 2004
24. Consider the following C program segment:
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);
The output of the program is 
(a) gnirts 
(b) gnirt
(c) string 
(d) no output is printed

Ans: option (d)
Explanation:
string is stored in the character array s.
We know that s[0]='s',s[1]='t',s[2]='r',...,s[5]='g',s[6]='\0'

During first iteration of the for loop, i=0, then p[0] = s[6-0]
Therefore p[0]='\0'
Hence during the execution of the printf statement since the very first character is the null character, it assumes that it is the end of the string and no output is printed.


GATE-2012
Common Data Question for 25 & 26
Consider the following C program
int a, b, c = 0; void prtFun (void); int main () { static int a = 1; /* line 1 */ prtFun(); a += 1; prtFun(); printf ( "\n %d %d " , a, b) ; } void prtFun (void) { static int a = 2; /* line 2 */ int b = 1; a += ++b; printf (" \n %d %d " , a, b); }
25. What output will be generated by the given code segment?
(a)    (b)   (c)   (d)
3 1    4 2   4 2   3 1
4 1    6 1   6 2   5 2
4 2    6 1   2 0   5 2

Ans: option (c)
Explanation:
When a function encounters a variable, it will first check for its local variable. If local variable not found then it will go for global variable.  In the above program we can see that there are 3 global variable a,b, & c. But in prtFun() we have local variable a & b.  Therefore it will not go for the global variable a & b. But in the main function we have only a as the local variable, therefore the print statement in main() will take the value of global variable b and the value of local variable a, while printing. 


26. What output will be generated by the given code segment if:
Line 1 is replaced by “auto int a = 1;
Line 2 is replaced by “register int a = 2;
(a)   (b)   (c)   (d)
3 1   4 2   4 2   4 2
4 1   6 1   6 2   4 2
4 2   6 1   2 0   2 0

Ans: option (d)
Explanation:
static variable are now made as non-static, therefore each time when the function is called the variables are again initialized. 
Note that the register variables are same as auto variables, the only difference is that the register variables are allocated iin the registers, instead of main memory, for faster access.

GATE-2008
27. What is printed by the following C program?
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

Ans: option(b)
Hint: pointer b and py is pointing to c
Initially c = 4
ppz contains the address of b, therefore **ppz refers to the value to which b is pointing. Since b is pointing towards c, the value of c increments when **ppz += 1; statement executes. Therefore c now becomes 5.
z=**ppz; means z = 5
py pointer is pointing towards c, therefore on execution of *py += 2;, value of c becomes 7.
y=*py; means y = 7
x contains value 4, therefore on execution of  x+=3;  x becomes 7.

GATE - 2015
28. The output of the following C program is __________.
#include <stdio.h>
void f1(int a, int b)
{
 int c;
 c=a; a=b; b=c;
}

void f2(int *a, int *b)
{
 int c;
 c=*a; *a=*b;*b=c;
}

int main()
{
 int a=4, b=5, c=6;
 f1 (a, b);
 f2 (&b, &c);
 printf(“%d”, c-a-b);
}

Ans: -5
Explanation:
You can see that the f1 function is calls its parameters by value. Hence the modifications are made inside the scope of f1 functions does not effect any of the variables of main function. But in f2, the parameters are called by reference.
In f2, we can see that pointer a points to variable b and pointer b points to variable c.
c = *a; // means that c = 5;
*a = *b; // means that *a = 6; that is b= 6;
*b = c; // means *b = 5; that is c = 5;

Refer question number 22 for the basics of pointer.

GATE - 2015
29. What is the output of the following C code? Assume that the address of x is 2000 (in decimal) and an integer requires four bytes of memory.
int main()
{
    unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
    printf("%u,%u, %u", x+3, *(x+3),*(x+2)+3);
}
(a) 2036, 2036, 2036
(b) 2012, 4, 2204
(c) 2036, 10, 10
(d) 2012, 4, 6

Ans: option (a)
Explanation:
Here x is a two-dimensional array. Also it is given that the base address of x = 2000. And the integer requires 4 bytes of memory. x[4][3] means that x has 4 rows and each row has 3 integers.
x + 3 means address of the 4th row (i.e. row with integers 10,11,12)
 = Base address of x + 3 * (size of memory required by a row)
 = 2000 + 3 * (3 * 4)
 = 2036

*(x + 3) => Since x is a two-dimensional array one reference operator (*) will only return the starting address of the one-dimensional array. i.e. *(x + 3) will return the starting address of the 4th-row, which equals 2036.

*(x + 2) + 3 means the address of 4th-integer of 3rd-row [ *(x + 2) means address of 3rd-row ]
=> address of second row + 3 * (size of memory required by an integer)
=> address of second row + 3 * 4
=> 2024 + 12
=> 2036

GATE - 2015
30. Consider the following C function.
int fun1 (int n)
{
    int i, j, k, p, q = 0;
    for (i = 1; i<n; ++i)
    {
        p = 0;
        for (j=n; j>1; j=j/2)
            ++p;
        for (k=1; k<p; k=k*2)
            ++q;
    }
    return q;
}
Which one of the following most closely approximates the return value of the function fun1?
(a) n3                      (b) n(logn)2
(c) nlogn                (d) nlog(logn)

Ans: option (d)
Explanation:
We can see that the first(outer) 'for' loop [i.e. for (i = 1; i<n; ++i)] runs for O(n) times.
Inner loop has two 'for' loops (j & k). 'j' loop runs for O(log n) times. 'k' loop runs for O(log p) times. Since the 'j' loop runs for O(log n) times, p = log n.

Therefore total running of fun1:
T(n) = n(log n + log(log n))
     = n(log n) //dominant is log n

But if we iterate through the question again, we need to find the approximate value that is returned by the function fun1 (i.e. value of q). As we saw above, value of q depends on p. On each iteration of 'i' loop, value of q increases by O(log p). And since p = log n, the value of q on each iteration of i increases by Θ(log(log n)). Hence nlog(log n) most closely approximates the return value of the function fun1.
Refer: How to find Time Complexity of an Algorithm

GATE - 2015
31. Consider the following C program segment.
#include <stdio.h>
int main( )
{
   char s1[7] = “1234”, *p;
   p = s1 + 2;
   *p = ‘0’ ;
   printf (“%s”, s1);
}
What will be printed by the program?
(a) 12
(b) 120400
(c) 1204
(d) 1034

Ans: option (c)
Explanation:
We know that p is a pointer.
p = s1 + 2; means that p holds the address of character 3. [s1 gives the address of character 1, s1+1 gives the address of character 2, s1+2 gives the address of character 3, so on ...]

*p = '0'; Here we set the character '0' to the address pointed by p.
Hence the character array will be updated as 1204.

GATE - 2015
32. Consider the following C program.
#include<stdio.h>
int main( )
{
   static int a[ ] = {10, 20, 30, 40, 50};
   static int *p[ ] = {a, a+3, a+4, a+1, a+2};
   int **ptr = p;
   ptr++;
   printf {“%d%d”, ptr-p, **ptr};
}
The output of the program is _________.

Ans: 140
Explanation:
a is the array of integers and p is the array of pointers.
Initially ptr points to the first cell of p.
When we increment a pointer (like ptr++; in our question) it adds the size of the data type. Hence, it moves to the next cell of p, which in turn points to the 4th cell of a. Hence **ptr gives us the value 40.
According to Pointer Subtraction, we can subtract two pointers of the same type. The result is the distance (in array elements) between the two elements.
For example if p1 and p2 are two  pointers of type T, then
    ( p2 - p1 ) == ( addr( p2 ) - addr( p1 ) ) / sizeof( T )
Refer: https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html

Hence applying it to our question:
    ptr - p = 1

GATE-2015
33. Consider the following recursive C function.
void get (int n)
{
   if (n < 1) return;
   get (n–1);
   get (n–3);
   printf (“%d”, n);
}
If get(6) function is being called in main( ) then how many times will the get() function be invoked before returning to the main( )?
(a) 15
(b) 25
(c) 35
(d) 45

Ans: option (b)
Explanation:

GATE - 2015
34. Consider the following C program:
# include <stdio.h>
int main( )
{
   int i, j, k = 0;
   j = 2 * 3 / 4 + 2.0 / 5 + 8 / 5;
   k –= ––j;
   for(i = 0; i < 5; i++)
   {
      switch(i + k)
      {
         case 1:
         case 2: printf(“\n%d”, i + k);
         case 3: printf(“\n%d”, i + k);
         default: printf(“\n%d”, i + k);
      }
   }
   return 0;
}
The number of times printf statement is executed is __________.

Ans: 10
Explanation:
According to the precendence of operators we know that * & / has same precedence. Hence we need to evaluate them in left to right associativity. Also we know that, * & / has higher precedence than +, and higher precedence operators will be evaluated first.
j = 2 * 3 / 4 + 2.0 / 5 + 8 / 5;
  = 1 + 0.4 + 1
  = 2.4
  = 2
Note1: 8/5 = 1 rather than 1.6 because both are integers. Hence result also remains integer by implicit type conversion.
Note2: 2.0/5 = 0.4 because since 2.0 is of type double 5 is implicitly typecast to double.
Note3: j = 2.4 = 2 since j is of integer type implicit typecast takes place. Hence 2.4 becomes 2.

So after evaluation, we get j = 2 and k = -1

Evaluation of For Loop:
i = 0; Hence switch (-1) => Since no case is defined for the value of -1, we go to the default case. Hence printf will be excuted once when i =0.
i = 1; switch (0) => printf will be executed only once since its the default case again.
i = 2; switch (1) => Now since case 1 is defined it moves to the case 1 block but since break is not specified in any case, case1, case2, case3, and default case is executed. Hence printf statement is executed 3 times when i = 2.
i = 3; switch (2) => Now since case-2 is defined it moves to the case2 block but since break is not specified case2, case3, and default case is executed. Hence printf statement is executed 3 times when i = 3.
i = 4; switch (3) => Now since case-3 is defined it moves to the case3 block but since break is not specified case3, and default case is executed. Hence printf statement is executed 2 times when i = 4.

Hence in total printf is executed 10 times.

GATE - 2015
35. Consider the following C program.
#include<stdio.h>
int f1(void);
int f2(void);
int f3(void);
int x = 10;
int main( )
{
   int x = 1;
   x +=f1() + f2() + f3() + f2();
   printf(“%d”, x);
   return 0;
}
int f1() { int x = 25; x++; return x; }
int f2() { static int x = 50; x++; return x; }
int f3() { x *= 10; return x; }
The output of the program is __________.

Ans: 230
Explanation:
x +=f1() + f2() + f3() + f2();
   = x + f1() + f2() + f3() + f2();
   = 1 + f1() + f2() + f3() + f2(); //x=1 since there is a local declaration of x in main function.
   = 1 + 26 + 51 + 100 + 52
   = 230

Note that in f2() x is declared as static, which means that x will be initialized only once and will retain its value between invocations. Hence first call of f2() returns 51 and second call of f2() returns 52.

In f3(), x = x * 10; Since there is no local declaration of x in f3(), we get the value of x as 10, from the global declaration.

GATE - 2015
36. Consider the C program below.
#include<stdio.h>
int *A, stkTop;
int stkFunc (int opcode, int val)
{
   static int size=0, stkTop=0;
   switch (opcode)
   {
      case -1: size = val; break;
      case 0: if (stkTop < size) A[stkTop++] = val; break;
      default: if (stkTop) < return A[--stkTop];
   }
   return –1;
}
int main()
{
   int B[20]; A=B; stkTop = –1
   stkFunc(–1, 10);
   stkFunc(0, 5);
   stkFunc(0, 10);
   printf(“%d\n”, stkFunc (1, 0) + stkFunc (0, 0));
}

Ans: 15
Explanation:
stkFun(-1, 10); // case -1 executes. initializes size =  10
stkFun(0, 5); // case 0 executes. Now stkTop = 0 and size = 10 (since static variable. check explanation of question 35 to know more on static variable). Hence A[0] = 5, and stkTop = 1.
stkFunc(0, 10); // again  case 0. Now stkTop = 1 and size = 10. Hence A[1]=10 and stkTop = 2;

printf(“%d\n”, stkFunc (1, 0) + stkFunc (0, 0)); // prints 15. Since stkFun(1,0) and stkFun(0,0) returns 10 and 5 respectively.

GATE-2015
37. Consider the following C function.
int fun(int n)
{
   int x=1, k;
   if (n==1) return x;
   for (k=1; k<n; ++k)
      x = x + fun (k) * fun (n – k);
   return x;
}
The return value of fun (5) is __________.

Ans: 51
Explanation:
Recurrence Relation

fun(5) = 1 + fun(1) * fun(4) + fun(2) * fun(3) + fun(3) * fun(2) + fun(4) * fun(1)
           = 1 + 15 + 10 + 10 + 15
           = 51

GATE - 2015
38. Consider the following function written in the C programming language.
void foo (char *a)
{
   if (*a && *a != ` `)
   {
      foo (a+1);
      putchar (*a);
   }
}
The output of the above function on input “ABCD EFGH” is
(a) ABCD EFGH
(b) ABCD
(c) HGFE DCBA
(d) DCBA

Ans: option (d)
Explanation:
Note that there is a space after ABCD, in the input. Therefore input is ABCD<space>EFGH.
The program prints all characters before the space or ‘\0′ (whichever comes first) in reverse order.


Try these also:
Tricky concepts of Operators in C Programming Language
C Programming - Aptitude Questions

11 comments:

  1. thanx a lot for the beautiful explanations

    ReplyDelete
  2. thank you sir.........

    ReplyDelete
  3. sir kindly provides more latest questions for more practice thnks a lot

    ReplyDelete
  4. your most welcome.............

    ReplyDelete
  5. GATE-1999
    3. Consider the following C function definition:
    int Trial (int a, int b, int c)
    {
    if ((a > = b) && (c < b)) return b;
    else if (a > = b) return Trial (a,c,b);
    else return Trial (b,a,c);
    }
    The function Trial:
    (a) Finds the maximum of a, b, and c
    (b) Finds the minimum of a, b and c
    (c) Finds the middle number of a, b, c
    (d) None of the above


    Answer is option D.
    a b c Return
    1 1 1 The final return statement is c < b, so this never returns. Answer D.

    ReplyDelete
    Replies
    1. I think it finds the middle number (assuming that a, b and c are different numbers).

      Delete
  6. please explain the solution of question no 36 and 37

    ReplyDelete