TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
 Specialized Dev Zones Research Center eBook Library .NET Java C++ Web Dev Architecture Database Security Open Source Enterprise Mobile Special Reports 10-Minute Solutions DevXtra Blogs Slideshow

 Home » Tip Bank » C++ » Algorithms
Language: C++
Expertise: Beginner
Oct 29, 2015

# Generating Gray Codes in C

This is C source code, written in the GCC platform (Ubuntu, 14.04 LTS, Linux).

The code generates Gray Codes. At first a palindrome number is being generated. If we Push n elements in the stack, then it generates a palindrome number of length (2^n) -1. This is the special property. Then it can generate Gray code of maximum n bit. Note that, you have to Push elements sequentially in decreasing order (e.g 4,3,2,1). It generates 121312141213121. It can generate grey code of maximum 4 bit. The code:

``````/*
This is a Process of generating Palindrome number from some given numbers.
This is a Process of generating Grey code from some given numbers.
It actually takes the help of palindrome generation.
*/

#include <stdio.h>
#define max 10
#define maxim 300
#define maxr 550
#define maxc 9

int pushA (int[], int*, int*);
int cpyAC (int[], int[], int*);
int palgen (int[], int[], int[], int*, int*);
void display (int[], int*);
void displayA (int[], int*);
int greycode (int A[maxr][maxc], int*, int*, int[], int*);
void grycddisp (int A[maxr][maxc], int*, int*);

//----------------------------------------------------

int pushA (int a[max], int *top, int *item)
{

printf("\n\tEnter element: ");
scanf("%d", &(*item));
a[++(*top)] = (*item);
printf("\n\tPush is successful...\n");
return (*top);

}

//----------------------------------------------------

int cpyAC (int a[max], int c[max], int *top)
{

int i= -1, j= -1, toc;
while (j < *top)
c[++i] = a[++j];
toc= i;
return (toc);

}

//----------------------------------------------------

int palgen (int a[max], int b[maxim], int c[max], int *top, int *toc)

{

int i, j, k, tob, x;
j= -1;
i= (*top);
k= (*toc);

while (k > -1)
{

b[++j] = c[k];

(*toc)--;
k= (*toc);

while (b[j] != a[i])
{
i--;
}

while (i <= (*top))
{

c[++k] = a[++i];
(*toc)++;

i+= 0;
}

(*toc)--;
k = (*toc);
k+= 0;

}
tob= j;
return (tob);

}

//---------------------------------------------------

int greycode (int A[maxr][maxc], int *row, int *col, int b[maxim], int *tob)
{

printf("\n\n\t\tRow= %d, Col= %d\n\n", *row, *col);					//create co-ordinate
int i=0, j, value, k;

while (i < (*row))
{
j=(*col);
while (j >0 )
{
j--;
}
i++;
}

//greycode generation
i= 0;
j= (*col);
while (j > 0)
{
A[i][j] = 0;
j--;
}

while (i< (*row)-1 )
{
i++;
j=(*col);

while (j>0)
{
A[i][j] = A[i-1][j];
j--;
}

k= (*tob);
value = b[k];
(*tob)--;

j= value;

//   printf("\n\t*tob = %d\tb[k]= %d\tvalue= %d\t\ti= %d\tj= %d", *tob, b[k], value, i,j);

if (A[i][j] == 0)
A[i][j] = 1;
else
A[i][j] = 0;

i+=0;
}

}

//------------------------------------------------------------

void grycddisp (int A[maxr][maxc], int *row, int *col)
{

int i= 0, j;

while (i < (*row))
{
j=(*col);
while (j >0 )
{
printf("\t\t%d", A[i][j]);
j--;
}
printf("\n");
i++;
}

}

//------------------------------------------------------------

void displayA (int a[max], int *top)
{

int i;
printf("\n\tYou entered...\n");
i= (*top);
while (i >= 0)
{
printf("\n\t%d", a[i--]);
}

}

//---------------------------------------------------

void display (int b[maxim], int *tob)
{

int i;
printf("\n\tThe items of Stack are shown...{B}\n");
i= (*tob);
printf("\n\n\t\t");
while (i >= 0)
{
printf("%d", b[i--]);
}
}

//----------------------------------------------------

void main (void)
{

int a[max], b[maxim], c[max], item=0, top =(-1), toc, tob;
int A[maxr][maxc], row =1, col =0, bit =0;
char ch;
system ("clear");
printf ("\n\tThis is a Process of generating Grey Code of n-bit.\n\tPlease insert n numbers in decreasing order.\n\te.g 4,3,2,1 for 4-bit grey code.\n\n");

if (top == -1)
printf("\n\tInitially Stack is empty...\n");

printf("\n\tYou have to give data, please start insertion.\n\tPress 'y' for insert, 'n' for exit.\n\n");
ch= getchar();
while (ch == 'y')
{
top= pushA (a, &top, &item);
printf("\n\t'y' :insert\n\t'n' :exit.\n");
getchar();
ch= getchar();
getchar();
if( top == (max-1) )
{
printf("\n\tSorry...\n\tStack is full.\n\tPush operation is not possible...\n\n");
break;
}
}

system("clear");
displayA (a, &top);

if(top == -1)
printf("\n\tSorry...\n\tStack is empty...\n\tCopy is done...\n\n");
else
toc= cpyAC (a, c, &top);

tob= palgen (a, b, c, &top, &toc);

if(tob == -1)
printf("\n\tSorry...\n\tStack is empty...\n\n");
else
display (b, &tob);

//-------------------------------------------------------

printf("\n\tEnter the bit number of Grey code: ");
scanf("%d", &bit);

col= bit;
while (bit > 0)
{
row= (row*2);
bit --;
}

greycode (A, &row, &col, b, &tob);
grycddisp (A, &row, &col);

printf ("\n\n\tT  H  A  N  K    Y  O  U\n\n");

}``````
Arup Goswami

 Submit a Tip Browse "C++" Tips Browse All Tips
Thanks for your registration, follow us on our social networks to keep up-to-date