#include <stdio.h>
#include <conio.h>

main ()
  {
  char c1[9],c2[13],r,contr;
  int lista0[]={2,4,5,6,8,9,10,11};
  int lista1[]={2,4,6,8,10};
  int lista2[]={2,5,6,9,10};
  int lista4[]={4,5,6,11};
  int lista8[]={8,9,10,11};
  int i,pari,acc;


  do         
    {
    clrscr();
    printf ("\n\n\n                                Codice di Hamming\n\n");
    printf ("1 - Codifica\n2 - Decodifica\nX - Uscita\n");
    r=getch();
    if (r=='1')
      {
      printf ("\nIntroduci il byte:\n");
      gets(c1);
      for (i=0;i<=7;i++)
	c2[lista0[i]]=c1[i];
      c2[12]=0;

      pari=0;
      for (i=0;i<=4;i++)
	if (c2[lista1[i]]=='1')
	  pari++;
      if (pari % 2)
	c2[0]='1';
      else
	c2[0]='0';

      pari=0;
      for (i=0;i<=4;i++)
	if (c2[lista2[i]]=='1')
	  pari++;
      if (pari % 2)
	c2[1]='1';
      else
	c2[1]='0';

      pari=0;
      for (i=0;i<=3;i++)
	if (c2[lista4[i]]=='1')
	  pari++;
      if (pari % 2)
	c2[3]='1';
      else
	c2[3]='0';

      pari=0;
      for (i=0;i<=3;i++)
	if (c2[lista8[i]]=='1')
	  pari++;
      if (pari % 2)
	c2[7]='1';
      else
	c2[7]='0';

      printf ("Codificato secondo Hamming: %s.",c2);
      while (!kbhit());
      }
    if (r=='2')
      {
      printf ("\nIntroduci la parola codificata secondo Hamming:\n");
      gets(c2);

      acc=0;
      pari=0;
      if (c2[0]=='1')
	pari++;
      for (i=0;i<=4;i++)
	if (c2[lista1[i]]=='1')
	  pari++;
      if (pari % 2)
	acc++;

      pari=0;
      if (c2[1]=='1')
	pari++;
      for (i=0;i<=4;i++)
	if (c2[lista2[i]]=='1')
	  pari++;
      if (pari % 2)
	acc=acc+2;

      pari=0;
      if (c2[3]=='1')
	pari++;
      for (i=0;i<=3;i++)
	if (c2[lista4[i]]=='1')
	  pari++;
      if (pari % 2)
	acc=acc+4;

      pari=0;
      if (c2[7]=='1')
	pari++;
      for (i=0;i<=3;i++)
	if (c2[lista8[i]]=='1')
	  pari++;
      if (pari % 2)
	acc=acc+8;

      if (!acc)
	printf ("La parola Š corretta.");
      else if (acc<=12)
	{
	if (c2[acc-1]=='0')
	  c2[acc-1]='1';
	else
	  c2[acc-1]='0';
	printf ("La parola contiene un errore nel bit #%d.\nCorretta Š: %s.",acc,c2);
	}
      else
	printf ("La parola Š errata e non pu• essere corretta.");
      while (!kbhit());
      }
    }
  while (r!='x');
  }
