Код хемминга программа на си

Самокоррекция — это исправление ошибок в пакетах данных, возникающих при передаче.

  1. Актуальность алгоритма кода Хемминга
  2. Смысл алгоритма кодирования по Хеммингу
  3. Программа, демонстрирующая самокорректирующие возможности
  4. Матрица для схемы (64, 7)
  5. Работа с файлами

Код хемминга программа на си

Почитал Вики о проверке бита, понял о чём Вы, но как реализовать не совсем понял.
Мне нужно что-то вроде цикла:

for (i = 2; i < pow(2,k); i++) < for (j = 1; j /*Сдвигаем в числе бит влево */ > >

Интуиция подсказывает мне, что можно сделать это как-то проще, но я не знаю как. Да и такой цикл я не смогу записать, потому что не знаю как представить число в двоичной записи.
—————————
Апдейт: написал

i=1; i

По-моему, программа должна была три раза сдвинуть бит влево, но ничего не произошло, единица осталась единицей.

Пол-жизни сидючи, в монитор глядючи.
Последний раз редактировалось Last; 27.11.2011 в 16:04 .
Пользователь
Регистрация: 22.02.2010
Сообщений: 71
А где результат сохраняется?

Код Хэмминга


Может попробовать так:
В прострации
Форумчанин
Регистрация: 13.01.2009
Сообщений: 239
Выложу своё поделие, може кому понадобится =)

Пакет реализован в виде консольного приложения под Windows. Принцип работы – command-line utility, т.е. утилита, весь интерфейс которой заключён в параметрах, передаваемых при вызове.
Формат вызова:
hm
Команды:
h — помощь
e — закодировать сообщение
d — декодировать сообщение

//Алгоритм программы в книге «Дискретная математика для программистов», автор — Ф. Новиков #include #include #include #include #include #include #include #define MAX_BUFFER 1024 typedef struct list_t < int d; struct list_t *next; >list; int GetLength(char *s) < int i = 0; while (s[i] != ‘’) ++i; return i; >void pl(list *p) < while (p->next != NULL) < printf(«%i «, p->d); p = p->next; > printf(«n»); > int Summ(list *p, int *b, int n, int flag)// если флаг — 1, то начинаем суммировать со второго элемента списка, иначе — с первого < int x; if ((p->next != NULL) (flag == 1)) p = p->next; x = b[p->d — 1]; if (p->next != NULL) p = p->next; while (p != NULL) < if (p->d — 1 d — 1]; p = p->next; > return x; > list *Add2List(list *p, int n) < list *l = p; if (p == NULL) < p = (list*)malloc(sizeof(list)); p->d = n; p->next = NULL; > else < while (l->next != NULL) l = l->next; l->next = (list*)malloc(sizeof(list)); l = l->next; l->d = n; l->next = NULL; > return p; > list **GetList(int k, int n) < list **v = (list**)calloc(k, sizeof(list*)); int i, t, x; for (i = 0; i < k; i++) < v[i] = NULL; >for (i = 1; i 0) v[t] = Add2List(v[t], i); x = x > return v; > int *Geta(char *str, int length) < int i, *a = (int*)calloc(length, sizeof(int)); for (i = 0; i < length; i++) < if (str[i] == 48) a[i] = 0; else a[i] = 1; >return a; > int CalcK(int n) < int i = 0, t = 0 ; while (t == 0) < if (pow(2,i) >= n + 1) t = 1; else ++i; if (n — i return i; > void FreeList(list *v) < list *temp = v; while (temp != NULL) < v = v->next; free(temp); temp = v; > > void MyFree(list **v, int k) < int i; for (i = 0; i < k; i++) FreeList(v[i]); free(v); >int Encode(char *arg1, char *arg2) < int m, *a, *b, i, t, x, n, k; list **v; FILE *in, *out; char *str = (char*)malloc(MAX_BUFFER); in = fopen(arg1, «r»); out = fopen(arg2, «w»); fgets(str, MAX_BUFFER, in); m = strlen(str); a = Geta(str, m); for (i = 0; i < m; i++) if ((a[i] != 0) (a[i] != 1)) return 1; //1 — в исходном файле содержатся не только нули и единицы t = 0; i = 0; while (t == 0) < if (pow(2,i) >= m + i + 1) t = 1; else ++i; > k = i; n = m + k; b = (int*)malloc(n * sizeof(int)); v = GetList(k, n); t = 0; x = 0; for (i = 0; i < n; i++) < if ((i + 1) == pow(2, t)) < b[i] = -1; t++; >else < b[i] = a[x]; x++; >> t = 0; for (i = 0; i < n; i++) if (b[i] == -1) < b[i] = Summ(v[t], b, n, 1); t++; >for (i = 0; i < n; i++) fprintf(out, «%i», b[i]); fclose(in); fclose(out); free(a); free(b); free(str); MyFree(v, k); return 0; >int Decode(char *arg1, char *arg2) < int m, *c, *b, i, t, n, k, *j, J; list **v; FILE *in, *out; char *str = (char*)malloc(MAX_BUFFER); in = fopen(arg1, «r»); out = fopen(arg2, «w»); fgets(str, MAX_BUFFER, in); n = strlen(str); c = Geta(str, n); k = CalcK(n); J = 0; if (k == -1) return 1; m = n — k; j = (int*)malloc(k*sizeof(int)); v = GetList(k, n); for (i = 0; i < k; i++) < j[i] = Summ(v[i], c, n, 0); if (j[i] != 0) J = J + pow(2, i); >if (J != 0) c[J-1] = !c[J-1]; t = 0; for (i = 0; i < n; i++) < if ((i+1) == pow(2, t)) t++; else fprintf(out, «%i», c[i]); >fclose(in); fclose(out); free(c); free(str); free(j); MyFree(v, k); return 0; >
Мэйн не влез.
Пол-жизни сидючи, в монитор глядючи.
В прострации
Форумчанин
Регистрация: 13.01.2009
Сообщений: 239
main(int argc, char *argv[]) < int i = 0; char *command, *arg1, *arg2; if (argc < 3) < printf(«You must input 3 parameters!n»); return 0; >command = (char*)malloc(strlen(argv[1]) + 1); arg1 = (char*)malloc(strlen(argv[2]) + 1); arg2 = (char*)malloc(strlen(argv[3]) + 1); strcpy(command, argv[1]); strcpy(arg1, argv[2]); strcpy(arg2, argv[3]); switch (command[0]) < case ‘h’: printf(«nUse syntax «%%command%% %%input file%% %%output file%%»n» «Command list: n» «h — helpn» «e — encode filen» «d — decode filen»); break; case ‘e’: i = Encode(arg1, arg2); if (i == 1) printf(«Error! Only 1 and 0 are allowed in source file!n»); else printf(«Encoding has finished successfuly.n»); break; case ‘d’: i = Decode(arg1, arg2); if (i == 1) printf(«Error! File must contain n+log(2,n) symbols!n»); else printf(«Decoding has finished successfuly.n»); break; default: printf(«Wrong syntax, use h for help.n»); break; >free(command); free(arg1); free(arg2); return 0; >
Пол-жизни сидючи, в монитор глядючи.
Регистрация: 31.05.2017
Сообщений: 1
Всем привет. есть кто живой. нужна помощь.

Читайте также:
12 для решения каких задач обработки изображений используются векторные программы

Занятие 34. Код Хэмминга (7,4) и его применение

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++Builder Коды Хэмминга bondleha Помощь студентам 3 18.04.2011 18:01
Сокращение расстояния Хэмминга Molotoff Общие вопросы C/C++ 1 14.01.2011 11:48
Код Хэмминга 0479 Помощь студентам 12.11.2010 10:32
растояние Хэмминга semennn Помощь студентам 06.05.2009 19:11

Источник: www.programmersforum.ru

Декодирование кода Хэмминга

Пример программы, выполняющей декодирование кода Хэмминга, приведен ниже.

#include
#include

// буфер ввода
char input[1024];
int len;

int find_mistake()
<
int i, mistake = 0;
for (i = 0; i < len; i ++)
if (input[i] == ‘1’)
mistake ^= i + 1;
return mistake;
>
// главная функция
int main()
<
int i, mistake = 0;
char info[1024];
int info_pos = 0;
int b = 1;

// ввод исходных данных
printf(«Enter code: «);
scanf(«%s», input);
len = strlen(input);
for (i = 0; i < len; i++)
// проверка на корректность
if (input[i] != ‘0’ input[i] != ‘1’)
<
printf(«Invalid code.n»);
return -1;
>
// поиск ошибок
mistake = find_mistake();
if (mistake)
<
input[mistake — 1] ^= ‘0’ ^ ‘1’;
mistake = find_mistake();

if (mistake)
<
printf(«Invalid code.n»);
return -1;
>
>
// вывод результата
printf(«Fixed code: %sn», input);
for (i = 0; i < len; i++)
if (i + 1 == b)
b else
info[info_pos++] = input[i];
info[info_pos] = ‘’;
printf(«Informational string: %sn», info);
return 0;
>

Источник: tdoc.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru