PRogramming
Question 1 
Consider the following C program:
#include <stdio.h> int counter = 0; int calc (int a, int b) { int c; counter++; if (b==3) return (a*a*a) ; else { c = calc (a, b/3) ; return (c*c*c) ; } } int main () { calc (4, 81); printf ("%d", counter) ; }
The output of this program is ______.
4  
5  
6  
7 
Question 2 
Consider the following C program.
#include <stdio.h> struct Outnode { char x, y, z ; }; int main () { struct Ournode p = {'1', '0', 'a'+2} ; struct Ournode *q = &p ; printf ("%c, %c", *((char*)q+1), *((char*)q+2)) ; return 0 ; }
The output of this program is
0, c  
0, a+2  
‘0’, ‘a+2’  
‘0’, ‘c’ 
The x variable here stores a character ‘c’ in it.
Because +2 will increment ascii value of a from 92 to 95.
Hence the structure p contains 3 character values and they are ‘1’, ‘0’, and ‘c’.
q is a pointer pointing to structure p.
Hence q is pointing to ‘1’, q+1 pointing to ‘0’ and q+2 pointing to ‘c’.
Option d cannot be correct, as though they are characters, printf will not print them in single quotes.
Question 3 
Consider the following C program:
#include<stdio.h> void fun1(char *s1, char *s2) { char *tmp; tmp = s1; s1 = s2; s2 = tmp; } void fun2(char **s2, char **s2) { char *tmp; tmp = *s1; *s1 = *s2; *s2 = tmp; } int main () { char *str1 = "Hi", *str2 = "Bye"; fun1(str1, str2); printf("%s %s", str1, str2); fun2(&str1, &str2); printf("%s %s", str1, str2); return 0; }
The output of the program above is
Hi Bye Bye Hi  
Hi Bye Hi Bye  
Bye Hi Hi Bye  
Bye Hi Bye Hi 
Hence, any change in the formal parameters are NOT reflected in actual parameters.
Hence, str1 points at “hi” and str2 points at “bye”.
The second call to the function ‘func2(&str1, &str2);’ is call by reference.
Hence, any change in formal parameters are reflected in actual parameters.
Hence, str1 now points at “bye” and str2 points at “hi”.
Hence answer is “hi bye bye hi”.
Question 4 
Consider the following C code. Assume that unsigned long int type length is 64 bits.
unsigned long int fun(unsigned long int n) { unsigned long int i, j, j=0, sum = 0; for (i = n; i > 1; i = i/2) j++; for ( ; j > 1; j = j/2) sum++; return sum; }The value returned when we call fun with the input 2^{40} is
4  
5  
6  
40 
Next for loop will divide j value (which is 40) by 2, each time until j>1.
j loop starts:
j=40 & sum=1
j=20 & sum=2
j=10 & sum=3
j=5 & sum=4
j=2 & sum=5
j=1 & break
So, sum = 5.
Question 5 
Consider the following program written in pseudocode. Assume that x and y are integers.
Count (x, y) { if (y != 1) { if (x != 1) { print("*") ; Count (x/2, y) ; } else { y = y  1 ; Count (1024, y) ; } } }
The number of times that the print statement is executed by the call Count(1024, 1024) is ______.
10230  
10231  
10232  
10233 
int count=0;
Count(x,y){
if(y!=1){
if(x!=1){
printf("*");
count = count +1;
Count(x/2,y);
}
else{
y=y1;
Count(1024,y);
}
}
}
void main()
{
Count(1024,1024);
printf("\n%d\n",count);
}
Count ( ) is called recursively for every (y = 1023) & for every y, Count ( ) is called (x = 10) times = 1023 × 10 = 10230
Question 6 
Consider the following C code:
#include <stdio.h> int *assignval(int *x, int val) { *x = val; return x; } void main ( ) { int *x = malloc(sizeof(int)); if(NULL == x) return; x = assignval(x, 0); if(x) { x = (int *)malloc(size of(int)); if(NULL == x) return; x = assignval(x, 10); } printf("%dn", *x); free(x); }
The code suffers from which one of the following problems:
compiler error as the return of malloc is not typecast approximately  
compiler error because the comparison should be made as x==NULL and not as shown  
compiles successfully but execution may result in dangling pointer  
compiles successfully but execution may result in memory leak 
In C++, we need to perform type casting, but in C Implicit type casting is done automatically, so there is no compile time error, it prints10 as output.
Option B:
NULL means address 0, if (a == 0) or (0 == a) no problem, though we can neglect this, as it prints 10.
Option C:
x points to a valid memory location. Dangling Pointer means if it points to a memory location which is freed/ deleted.
int*ptr = (int*)malloc(sizeof(int));
free(ptr); //ptr becomes a dangling pointer
ptr = NULL; //Removing Dangling pointers condition
Option D:
x is assigned to some memory location
int*x = malloc(sizeof(int));
→ (int*)malloc(sizeof(int)) again assigns some other location to x, previous memory location is lost because no new reference to that location, resulting in Memory Leak.
Hence, Option D.
Question 7 
Consider the following two functions.
void fun1(int n) { void fun2(int n) { if(n == 0) return; if(n == 0) return; printf("%d", n); printf("%d", n); fun2(n  2); fun1(++n); printf("%d", n); printf("%d", n); } }
The output printed when fun1(5) is called is
53423122233445  
53423120112233  
53423122132435  
53423120213243 
In fun2, we increment (pre) the value of n, but in fun1, we are not modifying the value.
Hence increment in value in recursion (back).
Hence, 5 3 4 2 3 1 2 2 2 3 3 4 4 5.
Question 8 
Consider the C functions foo and bar given below:
int foo(int val) { int x = 0; while (val>0) { x = x + foo(val); } return val; } int bar(int val) { int x = 0; while (val>0) { x = x + bar(val1); } return val; }
Invocations of foo(3) and bar(3) will result in:
Return of 6 and 6 respectively.  
Infinite loop and abnormal termination respectively.  
Abnormal termination and infinite loop respectively.  
Both terminating abnormally. 
{
x = x + foo(val);
}
In this case foo(val) is same as foo(val) & val ;
Because the recursive function call is made without changing the passing argument and there is no Base condition which can stop it.
It goes on calling with the same value ‘val’ & the system will run out of memory and hits the segmentation fault or will be terminated abnormally.
The loop will not make any difference here.
while(val>0)
{
x = x + bar(val1);
}
bar(3) calls bar(2)
bar(2) calls bar(1)
bar(1) calls bar(0) ⇾ Here bar(0) will return 0.
bar(1) calls bar(0)
bar(1) calls bar(0)……..
This will continue.
Here is a problem of infinite loop but not abrupt termination.
Some compilers will forcefully preempt the execution.
Question 9 
#include <stdio.h> #include <string.h> void printlength (char*s, char*t) { unsigned int c = 0; int len = ((strlen(s)  strlen(t)) > c) ? strlen(s):strlen(t); printf("%d\n", len); } void main () { char*x = "abc"; char*y = "defgh"; printlength(x,y); }Recall that strlen is defined in string.h as returning a value of type size_t, which is an unsigned int. The output of the program is _________.
3  
4  
5  
6 
{
char*x = "abc";
char*y = "defgh";
printlength(x,y);
}
printlength(char*3, char*t)
{
unsigned int c = 0;
int len = ((strlen(s)  strlen(t))> c) ? strlen(s) : strlen(t);
printf("%d", len);
}
Here strlen(s)  strlen(t) = 3  5 = 2
But in C programming, when we do operations with two unsigned integers, result is also unsigned. (strlen returns size_t which is unsigned in most of the systems).
So this result '2' is treated as unsigned and its value is INT_MAX2.
Now the comparison is in between large number & another unsigned number c, which is 0.
So the comparison returns TRUE here.
Hence (strlen(s)  strlen(t))>0 will return TRUE, on executing, the conditional operator will return strlen(s)
⇒ strlen(abc) = 3
Question 10 
The output of executing the following C program is __________.
#include<stdio.h> int total (int v) { static int count=0; while(v) { count += v&1; v ≫= 1; } return count; } void main() { static int x = 0; int i = 5; for(; 1> 0; i) { x = x + total(i); } printf("%d\n", x); }
23  
24  
25  
26 
Question 11 
Consider the following function implemented in C:
void printxy (int x, int y) { int *ptr; x = 0; ptr = &x; y = *ptr; *ptr = 1; printf("%d,%d",x,y); }
The output of invoking printxy(1, 1) is
0, 0  
0, 1  
1, 0  
1, 1 
{
int *ptr;
x = 0;
ptr = &x;
y = *ptr;
*ptr = 1;
}
printxy (1, 1)
Question 12 
Consider the C program fragment below which is meant to divide x and y using repeated subtractions. The variables x, y, q and r are all unsigned int.
while (r >= y) { r = r  y; q = q + 1; }
Which of the following conditions on the variables x, y, q and r before the execution of the fragment will ensure that the loop terminates in a state satisfying the condition x == (y*q + r)?
(q == r) && (r == 0)  
(x > 0) && (r == x) && (y > 0)  
(q == 0) && (r == x) && (y > 0)  
(q == 0) && (y > 0) 
x, y, q, r are unsigned integers.
while (r >= y)
{
r = r – y;
q = q + 1;
}
Loop terminates in a state satisfying the condition
x == (y * q + r)
y ⇒ Dividend = Divisor * Quotient + Remainder
So, to divide a number with repeated subtractions, the Quotient should be initialized to 0 and it must be incremented for every subtraction.
So initially q=0 which represents
x = 0 + r ⇒ x = r
and y must be a positive value (>0).
Question 13 
Consider the following snippet of a C program. Assume that swap(&x, &y) exchanges the contents of x and y.
int main () { int array[] = {3, 5, 1, 4, 6, 2}; int done = 0; int i; while (done == 0) { done = 1; for (i=0; i<=4; i++) { if (array[i] < array[i+1]) { swap (&array[i], &array[i+1]); done = 0; } } for (i=5; i>=1; i) { if (array[i] > array[i1]) { swap(&array[i], &array[i1]); done=0; } } } printf("%d", array[3]); }
The output of the program is ___________.
3  
4  
5  
6 
(1) ⇒ 1st for i = 0 <= 4
a[0] < a[1] ≃ 3<5 so perform swapping
done =
(1) ⇒ no swap (3, 1)
(2) ⇾ perform swap (1, 4)
(1) ⇒ perform swap (1, 6)
(1) ⇒ perform swap (1, 2)
(1) ⇒ (done is still 0)
for i = 5 >= 1 a[5] > a[4] ≃ 1>2 – false. So, no swapping to be done
(2) ⇾ no swap (6, 2)
(3) ⇾ swap (4, 6)
(1) ⇒ Swap (3, 6)
(1) ⇒ Swap (5, 6)
⇒ Done is still 0. So while loop executes again.
(1) ⇾ no swap (6, 5)
done = 1
(2) ⇾ No swap (5, 3)
(3) ⇾Swap (3, 4)
So, array [3] = 3
Question 14 
#include int main () { int m=10; int n, n1; n=++m; n1=m++; n; n1; n=n1; printf(“%d”, n); return 0; }The output of the program is ______
0  
1  
2  
3 
Question 15 
Consider the following C program.
#include<stdio.h> #include<string.h> int main () { char* c = "GATECSIT2017"; char* p = c; printf("%d", (int) strlen (c + 2[p]  6[p]  1)); return 0; }
The output of the program is __________.
1  
2  
4  
6 
char * P = C;
(int) strlen (C + 2[P] – 6[P] – 1)
C + 2[P]  6[P] – 1
∵2[P] ≃ P[2]
100 + P[2] – P[6] – 1
100 + T – I – 1
100 + 84 – 73 – 1
ASCII values: T – 84, I – 73
100 + 11 – 1
= 110
(int) strlen (110)
strlen (17) ≃ 2
Question 16 
Consider the following C program.
void f(int, short); void main () { int i = 100; short s = 12; short *p = &s; __________ ; // call to f() }
Which one of the following expressions, when placed in the blank above, will NOT result in a type checking error?
f(s, *s)  
i = f(i, s)  
f(i, *s)  
f(i, *p) 
short s = 12;
short *p = &s;
_______ // call to f ( ) :: (void f(int,short);)
It is clearly mentioned the return type of f is void.
By doing option elimination
(A) & (C) can be eliminated as s is short variable and not a pointer variable.
(B) i = f(i, s) is false because f’s return type is void, but here shown as int.
(D) f(i, *p)
i = 100
*p = 12
Hence TRUE
Question 17 
Consider the following C program.
#include<stdio.h> void mystery(int *ptra, int *ptrb) { int *temp; temp = ptrb; ptrb = ptra; ptra = temp; } int main() { int a=2016, b=0, c=4, d=42; mystery(&a, &b); if (a < c) mystery(&c, &a); mystery(&a, &d); printf("%d\n", a); }
The output of the program is ________.
2016  
2017  
2018  
2019 
For the first mystery (&a, &b);
temp = ptr b
ptr b = ptr a
ptr a = temp
If (a
Hence, a = 2016 will be printed.
Question 18 
The following function computes the maximum value contained in an integer array p[] of size n (n >= 1).
int max(int *p, int n) { int a=0, b=n1; while (__________) { if (p[a] <= p[b]) {a = a+1;} else {b = b1;} } return p[a]; }
The missing loop condition is
a != n  
b != 0  
b > (a + 1)  
b != a 
{
int arr [ ] = {3, 2, 1, 5, 4};
int n = sizeof(arr) / sizeof (arr[0]);
printf (max(arr, 5));
}
int max (int *p, int n)
{
int a = 0, b = n – 1;
(while (a!=b))
{
if (p[a] <= p[b])
{
a = a + 1;
}
else
{
b =b – 1;
}
}
return p[a];
}
The function computes the maximum value contained in an integer array p [ ] of size n (n >= 1).
If a = = b, means both are at same location & comparison ends.
Question 19 
What will be the output of the following C program?
void count(int n) { static int d=1; printf("%d ", n); printf("%d ", d); d++; if(n>1) count(n1); printf("%d ", d); } void main() { count(3); }
3 1 2 2 1 3 4 4 4  
3 1 2 1 1 1 2 2 2  
3 1 2 2 1 3 4  
3 1 2 1 1 1 2 
Count (3)
static int d = 1
It prints 3, 1
d++; //d = 2
n>1, count(2)
prints 2, 2
d++; // d = 3
n>1, count(1)
prints 1, 3 → Here n = 1, so condition failed & printf (last statement) executes thrice & prints d
d++; //d=4 value as 4. For three function calls, static value retains.
∴ 312213444
Question 20 
What will be the output of the following pseudocode when parameters are passed by reference and dynamic scoping is assumed?
a=3; void n(x) {x = x * a; print(x);} void m(y) {a = 1; a = y  a; n(a); print(a);} void main() {m(a);}
6, 2  
6, 6  
4, 2  
4, 4 
First m(a) is implemented, as there are no local variables in main ( ), it takes global a = 3;
m(3) is passed to m(y).
a = 1
a = 3 – 1 = 2
n(2) is passed to n(x).
Since it is dynamic scoping
x = 2 * 2 = 4 (a takes the value of its calling function not the global one).
The local x is now replaced in m(y) also.
Hence, it prints 4,4.
And we know it prints 6, 2 if static scoping is used.
It is by default in C programming.
Question 21 
The value printed by the following program is __________.
void f(int* p, int m) { m = m + 5; *p = *p + m; return; } void main() { int i=5, j=10; f(&i, j); printf("%d", i+j); }
30  
31  
32  
33 
P is a pointer stores the address of i, & m is the formal parameter of j.
Now, m = m + 5;
*p = *p + m;
Hence, i + j will be 20 + 10 = 30.
Question 22 
The following function computes X^{Y} for positive integers X and Y.
int exp (int X, int Y) { int res = 1, a = X, b = Y; while ( b != 0 ){ if ( b%2 == 0) { a = a*a; b = b/2; } else { res = res*a; b = b1; } } return res; }
Which one of the following conditions is TRUE before every iteration of the loop?
X^{Y} = a^{b}  
(res * a)^{Y} = (res * X)^{b}  
X^{Y} = res * a^{b}  
X^{Y} = (res * a)^{b} 
{
int res = 1, a = X, b = Y;
while (b != 0)
{
if (b%2 == 0)
{
a = a*a;
b = b/2;
}
else
{
res = res*a;
b = b – 1;
}
}
return res;
}
From that explanation part you can understand the exponent operation, but to check the conditions, first while iteration is enough.
x = 2, y = 3, res = 2, a = 2, b = 2.
Only (C) satisfies these values.
x^{y} = res * a^{b}
2^{3} = 2 * 2^{2} = 8
Explanation:
Will compute for smaller values.
Let X = 2, Y = 3, res = 1
while (3 != 0)
{
if(3%2 == 0)  False
else
{
res = 1*2 = 2;
b = 3 – 1 = 2;
}
For options elimination, consider
return res = 2 (but it is out of while loop so repeat while)
__________
while (2 != 0)
{
if (2%2 == 0)  True
{
a = 2*2 = 4
b = 2/2 = 1
}
__________
repeat while
while (1 != 0)
{
if (1%2 == 0)  False
else
{
res = 2 * 4 = 8
b = 1 – 1 = 0
}
__________
while (0 != 0)  False
return res = 8 (2^{3})
Question 23 
Consider the following program:
int f(int *p, int n) { if (n <= 1) return 0; else return max (f(p+1,n1),p[0]p[1]); } int main() { int a[] = {3,5,2,6,4}; printf("%d", f(a,5)); }Note: max(x,y) returns the maximum of x and y.
The value printed by this program is __________.
3  
4  
5  
6 
f(a, 5) ⇒ f(100, 5)
Question 24 
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”, cab); return 0; }
5  
6  
7  
8 
But f_{2} will swap the value of 'b' and 'c' because f_{2} is call by reference. So finally the value of
a=4
b=6
c=5
So, answer will be
c  a  b
5  4  6 = 5
Question 25 
#include <stdio.h> 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); }
2036, 2036, 2036  
2012, 4, 2204  
2036, 10, 10  
2012, 4, 6 
⇒ x [4] [3] can represents that x is a 2dimensional array.
⇒ x+3 = (Address of x) + 3 * 4 * 3 [3×4×3 is inner dimention]
= 2000 + 36
= 2036
⇒ *(x+3) also returns the address i.e., 2036.
The '*' represents 1  D but x is starting at 2036.
⇒ *(x+3)+3 = *(Address of x + 2 * 3 * 4) + 3
= *(2000 + 24) +3
= *(2024) + 3 ['*' will change from 2D to 1D]
= 2024 + 3 * 4
= 2024 + 12
= 2036
Question 26 
begin q := 0 r := x while r >= y do begin r := r – y q := q + 1 end endThe post condition that needs to be satisfied after the program terminates is
{r = qx+y ∧ r  
{x = qy+r ∧ r  
{y = qx+r ∧ 0  
{q+1 
⇒ x = qy + r
Question 27 
while (first <= last) { if (array [middle] < search) first = middle +1; else if (array [middle] == search) found = True; else last = middle – 1; middle = (first + last)/2; } if (first < last) not Present = True;The cyclomatic complexity of the program segment is __________.
5  
6  
7  
8 
Question 28 
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; }
n^{3}  
n(log n)^{2}  
nlog n  
nlog (log n) 
for (j=n; j>1; j=j/2)  p = O(log n) ++p;
for (k=1; k
++q;
}
∴ The return value of the function fun1,
q = n log p
= n log log n
Question 29 
ABCD EFGH
 
ABCD  
HGFE DCBA
 
DCBA 
if condition fails
& returns controls
∴ DCBA will be pointed
Question 30 
51  
52  
53  
54 
f(n) = 1; if n = 1
Question 31 
2  
2  
1  
15 
When next time stkFunc (0,5) is called then, inside Switch(opcode), the control will go to Case0, where A[0]=5 and stkTop = 0+1 =1.
When next time stkFunc (0,10) is called then, inside Switch (opcode), the control will go to Case '0', where A[1]=10 and stkTop=1+1=2.
When next time stkFunc(1,0) is called from inside the printf statement, then inside Switch(opcode), the control will go to default and stkTop = 21 = 1 and value of A[1] will get returned, i.e., 10.
When next time stkFunc(1,0) is called from inside the printf statement, then inside Switch(opcode), the control will go to default and stkTop = 11 = 0 and value of A[0] will get returned, i.e., 5.
Finally the two values 10 & 5 will be added and printed.
Question 32 
# include <stdio.h> int main( ) { char s1[7] = "1234" , *p; p = s1 + 2; *p = '0' ; printf ( "%s" , s1); } 
12  
120400  
1204  
1034 
p now points to third element in s1, i.e., '3'.
*p = '0', will make value of '3' as '0' in s1. And finally s1 will become 1204.
Question 33 
void
get (
int
n)
{
if
(n < 1)
return
;
get(n1);
get(n3);
printf
(
"%d"
, n);
}
15  
25  
35  
45 
Question 34 
# include
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};
}
140  
150  
160  
170 
**ptr = 40
∴ printf (“%d%d”, p + r – p, p + r) will print 140.
Question 35 
# 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; } 
10  
11  
12  
13 
= 6 / 4+2.0 / 5+1;
= 1 + 0.4 + 1
= 2.4
But since j is integer,
j=2
Now,
k = k  (j)
k = 0  (1) = 1
When i=0, i+k = 1,
printf executed 1 time
When i=1, i+k = 0,
printf executed 1 time
When i=2, i+k = 1,
printf executed 3 times
When i=3, i+k = 2,
printf executed 3 times
When i=4, i+k = 3,
printf executed 2 times
∴ Total no. of times printf executed is,
1 + 1 + 3 + 3 + 2 = 10
Question 36 
# 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(); pirntf( "%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; } 
230  
240  
250  
260 
f1( ) = 25 + 1 = 26
f2( ) = 50 + 1 = 51
f3( ) = 10 × 10 = 100
f2( ) = 51 × 1 = 52 (Since here x is static variable so old value retains)
∴ x = 1+26+51+100+52 = 230
Question 37 
#include <stdio.h> main() { int i; int *pi = &i; scanf ( "%d" , pi); printf ( "%dn" , i+5); } 
Compilation fails.  
Execution results in a runtime error.  
On execution, the value printed is 5 more than the address of variable i.  
On execution, the value printed is 5 more than the integer value entered. 
int *pi = &i; // pi is a pointer which stores the address of i.
scanf (pi); // pi = &i (we rewrite the garbage value with our values) say x = 2
printf (i+5); // i+5 = x+5 = 2+5 = 7
Hence on execution, the value printed is 5 more than the integer value entered.
Question 38 
9  
10  
11  
12 
Shift left of 1, which means the number gets doubled.
In program, shift right of 1 is given, means every time we enter the loop the number will get halved, and the value of count will get incremented by 1. And when the value of num will become zero then the while loop will get terminated. So,
num = 435/2 = 217/2 = 108/2 = 54/2 = 27/2= 13/2 = 6/2 = 3/2 = 1/2 = 0
Count = 9
So, the value count that will get returned is 9.
Question 39 
p = n * (n1) * (n2) / 6;  
p = n * (n1) / 2 * (n2) / 3;  
p = n * (n1) / 3 * (n2) / 2;  
p = n * (n1) * (n2) / 6.0; 
From the options n*(n1)*(n2) will go out of range. So eliminate A & D.
n*(n1) is always an even number. So subexpression n(n1)/2 also an even number.
n*(n1)/ 2*(n2), gives a number which is a multiple of 3. So dividing with 3 will not have any loss. Hence B is option.
Question 40 
double f( double x){ if ( abs (x*x  3) < 0.01) return x; else return f(x/2 + 1.5/x); } 
1.73  
1.74  
1.75  
1.76 
x^{2}  3 < 0.01 will become True.
So, x^{2}  3 < 0.01
x^{2}  3 < 0.01
x^{2} < 3.01
x < 1.732
Hence, x = 1.73.
Question 41 
int f( int j) { static int i = 50; int k; if (i == j) { printf (“something”); k = f(i); return 0; } else return 0; } 
The function returns 0 for all values of j.  
The function prints the string something for all values of j.  
The function returns 0 when j = 50.  
The function will exhaust the runtime stack or run into an infinite loop when j = 50. 
int f(int j)
{
static int i = 50;
int k;
if (i == j) // This will be True.
{
printf ("Something");
k = f(i); // Again called f(i) with value of i as 50. So, the function will run into infinite loop.
return 0;
}
else return 0;
}
Question 42 
for i = 1 to n do for j = 1 to n do 
output (A [i][j]); 
The matrix A itself  
Transpose of the matrix A  
Adding 100 to the upper diagonal elements and subtracting 100 from lower diagonal elements of A  
None of the above 
For first row iteration, it get swapped and becomes
For second row iteration, it comes to the original position
=A
So, it is the same matrix A.
Question 43 
int unknown( int n) { int i, j, k = 0; for (i = n/2; i <= n; i++) for (j = 2; j <= n; j = j * 2) k = k + n/2; return k; } 
Θ(n^{2})  
Θ(n^{2} log n)  
Θ(n^{3})  
Θ(n^{3} logn) 
So, the total number of times loop runs is (n/2 logn).
So, the final k value will be n/2*(n/2 logn) = O(n^{2}logn)
= (n/2+1).n/2 ∙log n
= (n^{2}log n)
Question 44 
The procedure given below is required to find and replace certain characters inside an input character string supplied in array A. The characters to be replaced are supplied in array oldc, while their respective replacement characters are supplied in array newc. Array A has a fixed length of five characters, while arrays oldc and newc contain three characters each. However, the procedure is flawed
void find_and_replace(char *A, char *oldc, char *newc) { for (int i = 0; i < 5; i++) for (int j = 0; j < 3; j++) if (A[i] == oldc[j]) A[i] = newc[j]; }
The procedure is tested with the following four test cases (1) oldc = "abc", newc = "dab" (2) oldc = "cde", newc = "bcd" (3) oldc = "bca", newc = "cda" (4) oldc = "abc", newc = "bac" The tester now tests the program on all input strings of length five consisting of characters ‘a’, ‘b’, ‘c’, ‘d’ and ‘e’ with duplicates allowed. If the tester carries out this testing with the four test cases given above, how many test cases will be able to capture the flaw?
None  
2 only  
3 and 4 only  
4 only 
1, 2 works fine, 3, 4 carries flaw.
Question 45 
int f (int n) { if (n <= 1) return 1; else if (n % 2 == 0) return f(n/2); else return f(3n  1); }Assuming that arbitrarily large integers can be passed as a parameter to the function, consider the following statements. 1. The function f terminates for finitely many different values of n ≥ 1. ii. The function f terminates for infinitely many different values of n ≥ 1. iii. The function f does not terminate for finitely many different values of n ≥ 1. iv. The function f does not terminate for infinitely many different values of n ≥ 1. Which one of the following options is true of the above?
(i) and (iii)  
(i) and (iv)  
(ii) and (iii)  
(ii) and (iv) 
→ Let n=3, then it is terminated in 2^{nd} iteration.
→ Let n=5, then sequence is 5→14→7→20→10 and it will repeat.
→ Any number with factor 5 and 2 leads to infinite recursion.
So, (iv) is True and (iii) is False.
Question 46 
#include <stdio.h> struct test { int i; char *c; }st[] = {5, "become", 4, "better", 6, "jungle", 8, "ancestor", 7, "brother"}; main () { struct test *p = st; p += 1; ++p > c; printf("%s,", p++ > c); printf("%c,", *++p > c); printf("%d,", p[0].i); printf("%s n", p > c); }
jungle, n, 8, ncestor  
etter, u, 6, ungle  
cetter, k, 6, jungle  
etter, u, 8, ncestor 
Line 1  main ( )
Line 2  {
Line 3  struct test *p = st;
Line 4  p += 1;
Line 5  ++p → c;
Line 6  printf("%s", p++→ c);
Line 7  printf("%c", +++p → c);
Line 8  printf("%d", p[0].i);
Line 9  printf("%s\n", p → c);
Line 10  }
Now,
Line 3: Initially p is pointing to st, i.e., first element of st which is {5, "become"}
Line 4: Now p is pointing to {4, "better"}
Line 5: ++(p → c), since → has higher precedence, so p → c points to 'e' of "better".
Line 6: prints 'enter' and p now points to {6, "jungle"}
Line 7: ***(p → c), since → has higher precedence. So, prints 'u'.
Line 8: p → i, which is 6 so prints '6'.
Line 9: prints 'ungle' since p is pointing to 'u'.
So, output is "enter, u, 6, ungle".
Question 47 
#include void swap (int *x, int *y) { static int *temp; temp = x; x = y; y = temp; } void printab () { static int i, a = 3, b = 6; i = 0; while (i <= 4) { if ((i++)%2 == 1) continue; a = a + i; b = b + i; } swap (&a, &b); printf("a = %d, b = %dn", a, b); } main() { printab(); printab(); }
a = 0, b = 3 a = 0, b = 3  
a = 3, b = 0 a = 12, b = 9  
a = 3, b = 6 a = 3, b = 6  
a = 6, b = 3 a = 15, b = 12 
Inside print 'a' and 'b' are added to odd integers from 1 to 5, i.e., 1+3+5=9. So, in first call to print ab,
a = 3+9 = 6
b = 6+9 = 3
Static variable have one memory throughout the program run (initialized during program start) and they keep their values across function calls. So during second call to print ab,
a = 6+9 = 15
b = 3+9 = 12
Question 48 
#include int a1[] = {6, 7, 8, 18, 34, 67}; int a2[] = {23, 56, 28, 29}; int a3[] = {12, 27, 31}; int *x[] = {a1, a2, a3}; void print(int *a[]) { printf("%d,", a[0][2]); printf("%d,", *a[2]); printf("%d,", *++a[0]); printf("%d,", *(++a)[0]); printf("%dn", a[1][+1]); } main() { print(x); }
8, 12, 7, 23, 8  
8, 8, 7, 23, 7  
12, 12, 27, 31, 23  
12, 12, 27, 31, 56 
It returns the value of 3^{rd} element in a1.
First printf print 8.
2) *a[2] = *(*(a+2))
It returns the value of 1^{st} element in a3.
Second printf print 12.
3) *++a[0] = *(++(*(a+0)))
a[0] is pointing to 1^{st} element in a1.
++a[0]  after preincrement performed, now a[0] is pointing to 2^{nd} element in a1.
*++a[0] return the value of 2^{nd} element in a1.
Third printf print 7.
4) *(++a)[0]
++a  after preincrement is performed 'a' is pointing to a2.
(++a)[0] is pointing to 1^{st} element in a2.
*(++a)[0] returns the value of 1^{st} element in a2.
Fourth printf print 23.
5) a[1][+1] = *(*(a1)+1)
(a1) is pointing to a1.
*(a1) is pointing to the 2^{nd} element in a1, because in 3^{rd} printf already a1 was incremented by 1.
*(a1)+1 is pointing 3^{rd} element in a1.
*(*(a1)+1) returns the value of 3^{rd} element in a1, i.e., 8.
Question 49 
int func(int m, int n) { if (E) return 1; else return(func(m 1, n) + func(m  1, n  1)); }In the above function, which of the following is the correct expression for E?
(n == 0)  (m == 1)  
(n == 0) && (m == 1)  
(n == 0)  (m == n)  
(n == 0) && (m == n) 
^{m}C_{0} = 1
^{n}C_{n} = 1
Question 50 
int anagram (char *a, char *b) { int count [128], j; for (j = 0; j < 128; j++) count[j] = 0; j = 0; while (a[j] && b[j]) { A; B; } for (j = 0; j < 128; j++) if (count [j]) return 0; return 1; }Choose the correct alternative for statements A and B.
A : count [a[j]]++ and B : count[b[j]]–  
A : count [a[j]]++ and B : count[b[j]]++  
A : count [a[j++]]++ and B : count[b[j]]–  
A : count [a[j]]++and B : count[b[j++]]– 
B: Decrements the count by 1 at each index that is equal to the ASCII value of the alphabet it is pointing at. Also it increments the loop counter for next iteration.
If one string is permutation of other, there would have been equal increments and decrements at each index of array, and so count should contain zero at each index, that is what the loop checks at last and if any nonzero elements is found, it returns 0 indicating that strings are not anagram to each other.
Question 51 
struct node { int value; struct node *next; ); void rearrange ( struct node *list) { struct node *p, *q; int temp; if (!list  !list > next) return ; p = list; q = list > next; while (q) { temp = p > value; p > value = q > value; q > value = temp; p = q > next; q = p ? p > next : 0; } } 
1, 2, 3, 4, 5, 6, 7  
2, 1, 4, 3, 6, 5, 7  
1, 3, 2, 5, 4, 7, 6  
2, 3, 4, 5, 6, 7, 1 
Question 52 
i = 0; j = 1; while (j < n ) { if (E) j++; else if (a[j]  a[i] == S) break ; else i++; } if (j < n) printf ( "yes" ) else printf ( "no" ); 
Choose the correct expression for E.
a[j] – a[i] > S  
a[j] – a[i] < S  
a[i] – a[j] < S  
a[i] – a[j] > S

If at times difference becomes greater than S we know that it won't reduce further for same 'i' and so we increment the 'i'.
Question 53 
#include<stdio.h> int f( int n, int k) { if (n == 0) return 0; else if (n % 2) return f(n/2, 2*k) + k; else return f(n/2, 2*k)  k; } int main () { printf ( "%d" , f(20, 1)); return 0; } 
5  
8  
9  
20 
Hence, 9 is the answer.
Question 54 
x = 1 + x;  
x = 1  x;  
x = x  1;  
x = 1 % x; 
For x = 0, it gives 1.
For x = 1, it gives 0.
Question 55 
A program attempts to generate as many permutations as possible of the string, 'abcd' by pushing the characters a, b, c, d in the same order onto a stack, but it may pop off the top character at any time. Which one of the following strings CANNOT be generated using this program?
abcd  
dcba  
abad  
cabd 
B) First push abcd, and after that pop one by one. Sequence of popped elements will come to dcba.
C) push abc, and after that pop one by one. Sequence of popped elements will come to cba. Now push 'd' and pop 'd', final sequence comes to cbad.
D) This sequence is not possible because 'a' cannot be popped before 'b' anyhow.
Question 56 
#include<stdio.h> #define ROW 4 #define COL 4 int M[ROW][COL] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; main() { int i, j, t; for (i = 0; i < 4; ++i) { X } for (1 = 0; i < 4; ++i) for (j = 0; j < 4; ++j) printf ("%d", M[i][j]); }
In (D) , given statements is wrong as temporary variable needs to be assigned some value and not viceversa.
Question 57 
#include <stdio.h> int funcf (int x); int funcg (int y); main() { int x = 5, y = 10, count; for (count = 1; count <= 2; ++count) { y += funcf(x) + funcg(x); printf ("%d ", y); } } funcf(int x) { int y; y = funcg(x); return (y); } funcg(int x) { static int y = 10; y += 1; return (y+x); }
43 80  
42 74  
33 37  
32 32 
In first case of funcf, which in turn calls funcg, y becomes 11 and it returns 5+11=16.
In second call of funcg, y becomes 12 and it returns 5+12=17.
So, in main y is incremented by 16+17=33 to become 10+33 =43.
In second iteration:
y will be incremented by 18+19=37 to give 43+37=80.
Question 58 
#include <stdio.h> void wrt_it (void); int main (void) { printf("Enter Text"); printf ("n"); wrt_ it(); printf ("n"); return 0; } void wrt_it (void) { int c; if (?1) wrt_it(); ?2 }
?1 is getchar() ! = ‘\n’ ?2 is getchar(c);  
?1 is (c = getchar()); ! = ‘\n’ ?2 is getchar(c);  
?1 is c! = ‘\n’ ?2 is putchar(c);  
?1 is (c = getchar()) ! = ‘\n’ ?2 is putchar(c); 
putchar( ) = writes a character specified by the argument to stdout.
As getchar( ) and putchar( ), both are needed to read the string and prints its reverse and only option (D) contains both the function. (D) is the answer.
Now coming to the code, wrt_id(void) is calling itself recursively. When \n is encountered, putchat( ) gets executed and prints the last character and then the function returns to its previous call and prints last 2^{nd} character and so on.
Question 59 
#include <stdio.h> typedef struct { char *a; char *b; } t; void f1(t s); void f2(t *p); main() { static t s = {"A", "B"}; printf ("%s %sn", s.a, s.b); f1(s); printf ("%s %sn", s.a, s.b); f2(&s); } void f1(t s) { s.a = "U"; s.b = "V"; printf ("%s %sn", s.a, s.b); return; } void f2(t *p) { p > a = "V"; p > b = "W"; printf("%s %sn", p > a, p > b); return; }What is the output generated by the program ?
AB UV VW VW  
AB UV AB VW  
AB UV UV VW  
AB UV VW UV 
→ f1 is call by value. The changes applicable only for local from f1. UV is printed.
→ Back in main( ), AB is printed.
→ Then in f2, VW is printed.
Hence, answer is (B).
Question 60 
89  
90  
91  
92 
fun(95) = fun(fun(106))
= fun(96)
= fun(fun(107))
= fun(97)
= fun(fun(108))
= fun(98)
= fun(fun(109))
= fun(99)
= fun(110)
= fun(100)
= fun(fun(111))
= fun(101)
= 91
Question 61 
5  
25  
36  
42 
If it is call by value then answer is 36.
Question 62 
2  
Run time error  
None of the above 
X in the procedure FIND is a local variable. No change will be reflected in global variable X.
Question 63 
it makes it more difficult to verify programs  
it increases the running time of the programs  
it increases the memory required for the programs
 
it results in the compiler generating longer machine code 
Question 64 
1, because m is a local variable in P  
0, because m is the actual parameter that corresponds to the formal parameter in p
 
0, because both x and y are just reference to m, and y has the value 0  
1, because both x and y are just references to m which gets modified in procedure P  
none of the above 
Question 65 
0, because n is the actual parameter corresponding to x in procedure Q.  
0, because n is the actual parameter to y in procedure Q.  
1, because n is the actual parameter corresponding to x in procedure Q.  
1, because n is the actual parameter corresponding to y in procedure Q.  
none of the above 
Question 66 
PARAM, P, Q  
PARAM, P  
PARAM, Q  
P, Q  
none of the above 
Question 67 
exchanges a and b  
doubles a and stores in b  
doubles b and stores in a  
leaves a and b unchanged  
none of the above 
Let us consider a=5; b=2
a := a+b = 5+2 = 7
b := ab = 72 = 5
a := ab = 75 = 2
O/P: a=2; b=5
Question 68 
10  
11  
3  
None of the above 
W(n)=W(3)
Procedure W(var x; int)
begin
x = x+1 = 3+1 = 4
Print x → Print x=4
end
Question 69 
It makes it more difficult to verify programs.  
It makes programs more inefficient.  
It makes it more difficult to modify existing programs.  
It results in the compiler generating longer machine code. 
Question 70 
3, 6  
6, 7  
3, 7  
None of the above. 
Question 71 
Var x,y :integer; begin x:=(n+2)/(n3) end; procedure Q Var x,y :integer; begin x:=3; y:=4; P(y); write (x)(1) end; begin x:=7; y:=8; Q: Write (x);(2) end.
3, 6  
6, 7  
3, 7  
None of the above 