Monday, March 10, 2008

C C++ Puzzles

What is the potential problem with the following C program?


#include <stdio.h>


int
main()
{

char
str[80];

printf("Enter the string:");

scanf("%s",str);

printf("You entered:%s\n",str);


return
0;
}


 

What is the output of the following program?


#include <stdio.h>


int
main()
{

int
i;

i
=
10;

printf("i : %d\n",i);

printf("sizeof(i++) is: %d\n",sizeof(i++));

printf("i : %d\n",i);

return
0;
}


 

Why does the following program give a warning? (Please remember that sending a normal pointer to a function requiring const pointer does not give any warning)


#include <stdio.h>


void
foo(const
char
**p) { }

int
main(int
argc, char
**argv)
{

foo(argv);

return
0;
}


 

What is the output of the following program?


#include <stdio.h>


int
main()
{

int
i;

i
=
1,2,3;

printf("i:%d\n",i);

return
0;
}


 

The following is a piece of code which implements the reverse Polish Calculator. There is a(are) serious(s) bug in the code. Find it(them) out!!! Assume that the function getop returns the appropriate return values for operands, opcodes, EOF etc..


#include <stdio.h>


#include <stdlib.h>


 


#define MAX
80


#define NUMBER
'0'


 


int
getop(char[]);

void
push(double);

double
pop(void);

int
main()
{

int
type;

char
s[MAX];


while((type
=
getop(s)) !=
EOF)
{

switch(type)
{

case
NUMBER:

push(atof(s));

break;

case
'+':

push(pop() +
pop());

break;

case
'*':

push(pop() *
pop());

break;

case
'-':

push(pop() -
pop());

break;

case
'/':

push(pop() /
pop());

break;

/* ...


* ...


* ...


*/

}
}
}


 

The following is a simple program which implements a minimal version of banner command available on most *nix systems. Find out the logic used in the program.


#include<stdio.h>


#include<ctype.h>


 


char
t[]={

0,0,0,0,0,0,12,18,33,63,

33,33,62,32,62,33,33,62,30,33,

32,32,33,30,62,33,33,33,33,62,

63,32,62,32,32,63,63,32,62,32,

32,32,30,33,32,39,33,30,33,33,

63,33,33,33,4,4,4,4,4,4,

1,1,1,1,33,30,33,34,60,36,

34,33,32,32,32,32,32,63,33,51,

45,33,33,33,33,49,41,37,35,33,

30,33,33,33,33,30,62,33,33,62,

32,32,30,33,33,37,34,29,62,33,

33,62,34,33,30,32,30,1,33,30,

31,4,4,4,4,4,33,33,33,33,

33,30,33,33,33,33,18,12,33,33,

33,45,51,33,33,18,12,12,18,33,

17,10,4,4,4,4,63,2,4,8,

16,63

};


int
main(int
argc,char**
argv)
{


int
r,pr;

for(r=0;r<6;++r)
{

char
*p=argv[1];


while(pr&&*p)
{

int
o=(toupper(*p++)-'A')*6+6+r;

o=(o<0||o>=sizeof(t))?0:o;

for(pr=5;pr>=-1;--pr)
{

printf("%c",( ( (pr>=0) && (t[o]&(1<<pr)))?'#':' '));

}
}

printf("\n");
}

return
0;
}


 

What is the output of the following program?


#include <stdio.h>


#include <stdlib.h>


 


#define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))


 


#define PrintInt(expr) printf("%s:%d\n",#expr,(expr))


int
main()
{

/* The powers of 10 */


int
pot[] = {

0001,

0010,

0100,

1000

};

int
i;


for(i=0;i<SIZEOF(pot);i++)

PrintInt(pot[i]);

return
0;
}


 

The following is the implementation of the Euclid's algorithm for finding the of two integers. Explain the logic for the below implementation and think of any possible improvements on the current implementation.
BTW, what does scanf function return?


#include <stdio.h>


int
gcd(int
u,int
v)
{

int
t;

while(v
>
0)
{

if(u
>
v)
{

t
=
u;

u
=
v;

v
=
t;
}

v
=
v-u;
}

return
u;
}


int
main()
{

int
x,y;

printf("Enter x y to find their gcd:");

while(scanf("%d%d",&x, &y) !=
EOF)
{

if(x
>0
&&
y>0)

printf("%d
%d
%d\n",x,y,gcd(x,y));

printf("Enter x y to find their gcd:");
}

printf("\n");

return
0;
}

Also implement a C function similar to the above to find the GCD of 4 integers.


 

What's the output of the following program. (No, it's not 10!!!)


#include <stdio.h>


#define PrintInt(expr) printf("%s : %d\n",#expr,(expr))


int
main()
{

int
y
=
100;

int
*p;

p
=
malloc(sizeof(int));

*p
=
10;

y
=
y/*p; /*dividing y by *p */;

PrintInt(y);

return
0;
}


 

The following is a simple C program to read a date and print the date. Run it and explain the behaviour


#include <stdio.h>


int
main()
{

int
day,month,year;

printf("Enter the date (dd-mm-yyyy) format including -'s:");

scanf("%d-%d-%d",&day,&month,&year);

printf("The date you have entered is %d-%d-%d\n",day,month,year);

return
0;
}


 

The following is a simple C program to read and print an integer. But it is not working properly. What is(are) the mistake(s)?


#include <stdio.h>


int
main()
{

int
n;

printf("Enter a number:\n");

scanf("%d\n",n);


printf("You entered %d
\n",n);

return
0;
}