Где ошибка? Код Хэмминга (15,11) - C#
Формулировка задачи:
Ввожу 11-битовое кодовое слово, умножаю его на порождающую матрицу, получаю закодированное слово, затем ввожу это закодированное слово и он пишет, что есть ошибка, хотя такого быть не должно. Где ошибка в коде найти не могу.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Test
{
static void Main()
{
char[] data = new char[11];
int[] encoded = new int[15];
int[] edata = new int[15];
int[] syndrome = new int[12];
int[,] hmatrix = new int[4, 15]{{1,0,0,0,1,0,0,1,0,1,1,0,1,1,1},
{0,1,0,0,1,1,0,0,1,0,1,1,0,1,1},
{0,0,1,0,0,1,1,1,0,0,1,1,1,0,1},
{1,0,0,1,0,0,1,0,1,1,0,1,1,1,1}};
char[,] gmatrix = new char[11, 15] { { '1', '1', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' },
{ '0', '1', '1', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0' },
{ '0', '0', '1', '1', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0' },
{ '1', '0', '1', '1', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0' },
{ '0', '1', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0' },
{ '1', '0', '0', '1', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0' },
{ '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0' },
{ '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0' },
{ '1', '0', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0' },
{ '1', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0' },
{ '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1' }};
int i, j;
Console.Write("\nКод Хэмминга. Кодирование\n\nВведите 11-битовое слово: \n");
for (int d = 0; d < 11; d++)
{
data[d] = Convert.ToChar(Console.ReadLine());
}
//Console.Write("\nGenerator matrix enter\n");
/* for(i=0;i<11;i++){
for(j=0;j<15;j++){
Console.Write("{0},{1}",i,j);
gmatrix[i,j]=Convert.ToChar(Console.ReadLine());
}
Console.WriteLine();
}
*/
Console.Write("\nПорождающая матрица\n");
for (i = 0; i < 11; i++)
{
for (j = 0; j < 15; j++)
{
Console.Write("{0} \t|", gmatrix[i, j]);
}
Console.WriteLine();
}
Console.WriteLine("\nКодированные данные\n");
for (i = 0; i < 15; i++)
{
for (j = 0; j < 11; j++)
encoded[i] += ((data[j] - 0) * (gmatrix[j, i] - 0));
encoded[i] = encoded[i] % 2;
Console.Write("{0} |", encoded[i]);
}
Console.Write("\nКод Хэмминга. Декодирование\n\nВведите кодированные данные : \n");
for (i = 0; i < 15; i++)
edata[i] = Convert.ToChar(Console.ReadLine());
for (i = 0; i < 4; i++)
{
for (j = 0; j < 15; j++)
syndrome[i] += (edata[j] * hmatrix[i, j]);
syndrome[i] = syndrome[i] % 2;
}
for (j = 0; j < 15; j++)
if ((syndrome[0] == hmatrix[0, j]) && (syndrome[1] == hmatrix[1, j]) && (syndrome[2] == hmatrix[2, j]) && (syndrome[3] == hmatrix[3, j]))
break;
if (j == 15)
Console.Write("\nОшибок нет\n");
else
{
Console.Write("\nОшибка получена в {0} бите данных\n", j + 1);
edata[j] = 0;
Console.Write("\nДанные должны быть такими : ");
for (j = 0; j < 15; j++)
if (edata[j] == 48)
Console.Write("{0} |", 0);
else if (edata[j] == 49)
Console.Write("{0} |", 1);
else
Console.Write("{0} |", edata[j]);
}
Console.ReadKey();
}
}
}
Например я ввожу 10100101111. Получаю закодированное слово 100010100101111. Ввожу 100010100101111 и он пишет, что ошибка находится в 4 бите. Такого быть не должно.
Хэлпаните как-нибудь уже
Решение задачи: «Где ошибка? Код Хэмминга (15,11)»
textual
Листинг программы
Console.Write("\nДанные должны быть такими : ");
for (j = 0; j < 15; j++)
if (edata[j] == 48)
Console.Write("{0} |", 0);
else if (edata[j] == 49)
Console.Write("{0} |", 1);
else
Console.Write("{0} |", edata[j]);
}
Console.ReadKey();
}
}