Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Код Хеминга 
:(
    Опции темы
pograp
  Дата 14.11.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.10.2006
Где: Россия, Москва

Репутация: нет
Всего: нет



У меня такая интересная задача! Написать программу определения ошибок по методу Хеминга. Принцип такой: мы вводим информацию(биты или слова) которую отправляем, за тем эту информацию прога переиначивает в код Хеминговский , потом мы вводим набор битов, который мы получили и он высчитывает сколько у нас ошибок. ПОМОГИТЕ ПОЖАЛУЙСТА!!!!!!!! smile  smile  smile 
PM MAIL ICQ   Вверх
comtat
Дата 14.11.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



Код

uses crt;

const
  data_len = 7;

type
  PTBlock = ^TBlock;
  TBlock = array[1 .. maxint] of byte;

function is_power(x: byte): boolean;
var bits: byte;
begin
  bits := 0;
  while x > 0 do begin

    if (x and $01) = $01 then inc(bits);
    x := x shr 1;

  end;
  is_power := (bits = 1);
end;

procedure print_block(X: PTBlock; const n: byte);
var i: byte;
begin
  for i := n downto 1 do begin
    if is_power(i) then textcolor(lightred)
    else textcolor(lightgray);

    write(X^[i]:4);
  end;
  writeln;
  textcolor(lightgray);
end;

var
  ctrl_bits: byte;
  block: PTBlock;

  s: string;
  check, i, pos: byte;

begin
  ctrl_bits := 0;
  repeat
    inc(ctrl_bits);
  until (data_len + ctrl_bits + 1) <= (1 shl ctrl_bits);

  writeln('p = ', ctrl_bits);

  GetMem(block, (data_len + ctrl_bits)*sizeof(byte));
  FillChar(block^, (data_len + ctrl_bits)*sizeof(byte), 0);
  Write('sent data [', data_len, '] bits: '); ReadLn(s);

  pos := 1;
  for i := 1 to data_len do begin
    while is_power(pos) do inc(pos);
    block^[pos] := (ord(s[data_len - i + 1]) - ord('0')); inc(pos);
  end;

  check := $00;
  for i := 1 to (data_len + ctrl_bits) do
    if block^[i] = 1 then check := check xor i;

  i := 1;
  while check > 0 do begin
    block^[i] := (check and $01);
    check := check shr 1;
    i := 2 * i
  end;
  print_block(block, (data_len + ctrl_bits));

  { Проверка правильности }
  check := $00;
  for i := 1 to (data_len + ctrl_bits) do
    if block^[i] = 1 then check := check xor i;
  writeln('checking error status [0 = no error]: ', check);

  writeln;
  Write('received data [', data_len + ctrl_bits, '] bits: '); ReadLn(s);
  check := $00;
  for i := 1 to (data_len + ctrl_bits) do
    if s[(data_len + ctrl_bits) - i + 1] = '1' then check := check xor i;
  writeln('checking error status [0 = no error]: ',
    (data_len + ctrl_bits) - check + 1);

  FreeMem(block, (data_len + ctrl_bits)*sizeof(byte));
  ReadLn;
end.

При старте программы вводится последовательность бит, которые должны быть переданы. Программа кодирует их по Хэммингу, и выводит результат - последовательность бит, готовую к передаче (при этом красным цветом выделены "избыточные" биты, не несущие информации, а используемые только для отслеживания ошибки).

Затем вводится строка битов, полученная приемником информации, и после ее анализа выводится результат - есть ли ошибка, и в какой именно бите... (биты нумеруются СЛЕВА НАПРАВО (!!!) начиная с единицы).
Идея программы взята отсюда: Код Хеминга

Вот лог работы программы:
Цитата

sent data [7] bits: 1110011
  1  1  1  1  0  0  1  1  1  1  0
checking error status [0 = no error]: 0

received data [11] bits: 11111011110
checking error status [0 = no error]: 5



--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
volvo877
Дата 14.11.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



comtat, я бы попросил приводить ссылки на источник... Код взят отсюда:
http://forum.pascal.net.ru/index.php?s=&am...ost&p=49014

Кстати, автор топика видел этот код и ему что-то не понравилось... Видно, не разобрался, как данные вводить...

Это сообщение отредактировал(а) volvo877 - 14.11.2006, 23:52
PM MAIL   Вверх
comtat
Дата 15.11.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



Хорошо приму к сведению   smile 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
pograp
Дата 23.11.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.10.2006
Где: Россия, Москва

Репутация: нет
Всего: нет



а другой код есть? проверка на 1 ошибку или что-то вроде этого и объясните как вообще ищутся ошибки в битах
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0933 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.