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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++Builer 6.0]Коды Хэмминга 
:(
    Опции темы
Bondleha
Дата 17.4.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.4.2009

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



Вопрос такого плана как в билдере реализовать вот эту задачку:
1. Создать приложение, осуществляющее кодирование информации кодом Хэмминга значностью 11 с исправлением одиночной ошибки.
2. Создать   приложение,   осуществляющее   декодирование   информации   кодом Хэм-минга значностью 11 с исправлением одиночной ошибки.
За ранее спасибо!! Всю голову сломал!! Были наброски, но не то!!

PM MAIL   Вверх
t_gran
Дата 18.4.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Ну я так думаю если вам дать готовый алгоритм на С или С++, то вы GUI сами прикрутите? В общем если моё предположение верно, то вот моя реализация. Правда может немного кривовато, но писал на коленках, так что не обессудте.
Основные ф-ии GetSequence и CheckCRC. Первая готовит последовательность (вернее вставляет контрольные биты), а вторая возвращает позицию в которой имеется ошибка (если таковая имеется)
Код

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

//----------------------------------------------//
unsigned NextPos(bool reset)
{
   static unsigned cnt;
   
   cnt = reset ? 0 : cnt+1;
   
   return (pow(2, cnt) - 1);
}
//----------------------------------------------//
void GetSequence(bool *code, unsigned size, unsigned char key)
{
   unsigned pos = NextPos(true);
   
   unsigned i;
   unsigned crc = 0;
   for (i = 0; i < size; ++i)
   {
      if (pos == i)
      {
         code[i] = false;
         pos = NextPos(false);
      }
      else
      {
         code[i] = key & 0x1;
         if (code[i])
         {
            crc ^= i + 1;
         }
         key >>= 1;
      }
   }
   
   pos = NextPos(true);
   
   while (pos < size)
   {
      code[pos] = crc & 0x1;
      crc >>= 1;
      pos = NextPos(false);
   }
}
//----------------------------------------------//
unsigned CheckCRC(bool *code, unsigned size)
{
   unsigned i;
   unsigned crc = 0;
   
   for (i = 0; i < size; ++i)
   {
      if (code[i])
      {
         crc ^= i + 1;
      }
   }
   
   return crc;
}
//----------------------------------------------//
void PrintSequence(bool *code, unsigned size)
{
   unsigned index = size;
   while (index--)
   {
      printf("%d", code[index]);
   }
   printf("\n");
}
//----------------------------------------------//

int main(int argc, char **argv)
{
   bool code[12];
   unsigned size = sizeof(code) / sizeof(*code);

   unsigned char key;
   
   printf("key: ");
   key = getchar();
   
   GetSequence(code, size, key);
   
   printf("[%c] = ", key);
   PrintSequence(code, size);

   unsigned number = 0;
   printf("number bad bit: ");
   scanf("%u", &number);

   if (--number < size)
   {
      code[number] = !code[number];
   }
   
   printf("bad = ");
   PrintSequence(code, size);
   
   printf("crc = %d\n", CheckCRC(code, size));
   
   // system("pause");
   
   return 0;
}


user posted image

Бинарник с кодом ниже


Это сообщение отредактировал(а) t_gran - 18.4.2011, 10:49

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  hemming.zip 2,86 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Bondleha
Дата 18.4.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.4.2009

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



Огромное спасибо тебе добрый человек!! Да GUI Сам сделаю!! Буду разбираться!! Еще раз спасиб!

PM MAIL   Вверх
Bondleha
Дата 18.4.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.4.2009

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



t_gran, что сдесь не так??
Код

unsigned NextPos(bool reset)
{
   static unsigned cnt;

   cnt = reset ? 0 : cnt+1;

   return (pow(2, cnt) - 1);
}
void GetSequence(bool *code, unsigned size, unsigned char key)
{
   unsigned pos = NextPos(true);
   
   unsigned i;
   unsigned crc = 0;
   for (i = 0; i < size; ++i)
   {
      if (pos == i)
      {
         code[i] = false;
         pos = NextPos(false);
      }
      else
      {
         code[i] = key & 0x1;
         if (code[i])
         {
            crc ^= i + 1;
         }
         key >>= 1;
      }
   }
   
   pos = NextPos(true);
   
   while (pos < size)
   {
      code[pos] = crc & 0x1;
      crc >>= 1;
      pos = NextPos(false);
   }
}
//----------------------------------------------//
unsigned CheckCRC(bool *code, unsigned size)
{
   unsigned i;
   unsigned crc = 0;

   for (i = 0; i < size; ++i)
   {
      if (code[i])
      {
         crc ^= i + 1;
      }
   }
   
   return crc;
}
//----------------------------------------------//
void PrintSequence(bool *code, unsigned size)
{
   unsigned index = size;
   while (index--)
   {
     Memo1->Lines->Add(code[index]);
   }
 }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a=atoi(Edit1->Text.c_str());
int b=atoi(Edit2->Text.c_str());
   bool code[12];
   unsigned size = sizeof(code) / sizeof(*code);
   unsigned char key;
    a=key;
    GetSequence(code, size, key);
   
   Memo1->Lines->Add(key);
   PrintSequence(code, size);
   unsigned number = 0;

  b=number;
   if (--number < size)
   {
      code[number] = !code[number];
   }
   
   Memo1->Lines->Add("bad");
   PrintSequence(code, size);
   
  Memo1->Lines->Add(CheckCRC(code, size));
   
   // system("pause");

   return 0;
}
//---------------------------------------------------------------------------


PM MAIL   Вверх
t_gran
Дата 20.4.2011, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Bondleha, это не вопрос. Конкретнее можно.

А у меня работает:

maiin.h
Код

#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "CSPIN.h"
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
   __published:    // IDE-managed Components
        TCSpinEdit *spinedit;
        TMemo *memo;
        TEdit *edit;
        TButton *button;
        TLabel *labelDigit;
        TLabel *labelBadBit;
        void __fastcall buttonClick(TObject *Sender);

   private:    // User declarations
       unsigned NextPos(bool reset);
       void GetSequence(bool *code, unsigned size, unsigned char key);
       unsigned CheckCRC(bool *code, unsigned size);
       void PrintSequence(bool *code, unsigned size);

   public:    // User declarations
        __fastcall TMainForm(TComponent* Owner): TForm(Owner) {};
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif


main.cpp
Код

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

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
unsigned TMainForm::NextPos(bool reset)
{
   static unsigned cnt;
   cnt = reset ? 0 : cnt+1;
   return (pow(2, cnt) - 1);
}
//---------------------------------------------------------------------------
void TMainForm::GetSequence(bool *code, unsigned size, unsigned char key)
{
   unsigned pos = NextPos(true);
   
   unsigned i;
   unsigned crc = 0;
   for (i = 0; i < size; ++i)
   {
      if (pos == i)
      {
         code[i] = false;
         pos = NextPos(false);
      }
      else
      {
         code[i] = key & 0x1;
         if (code[i])
         {
            crc ^= i + 1;
         }
         key >>= 1;
      }
   }
   
   pos = NextPos(true);
   
   while (pos < size)
   {
      code[pos] = crc & 0x1;
      crc >>= 1;
      pos = NextPos(false);
   }
}
//---------------------------------------------------------------------------
unsigned TMainForm::CheckCRC(bool *code, unsigned size)
{
   unsigned i;
   unsigned crc = 0;
   for (i = 0; i < size; ++i)
   {
      if (code[i])
      {
         crc ^= i + 1;
      }
   }
   
   return crc;
}
//---------------------------------------------------------------------------
void TMainForm::PrintSequence(bool *code, unsigned size)
{
   AnsiString str;
   unsigned index = size;
   while (index--)
   {
     str += IntToStr(code[index]);
   }
   memo->Lines->Add(str);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::buttonClick(TObject *Sender)
{
   memo->Lines->Clear();

   unsigned char key = (unsigned char) atoi(edit->Text.c_str());
   unsigned number = (unsigned) spinedit->Value;

   bool code[12];
   unsigned size = sizeof(code) / sizeof(*code);

   GetSequence(code, size, key);

   PrintSequence(code, size);

   if (--number < size)
   {
      code[number] = !code[number];
   }

   PrintSequence(code, size);

   memo->Lines->Add(CheckCRC(code, size));
}
//---------------------------------------------------------------------------


user posted image



Это сообщение отредактировал(а) t_gran - 20.4.2011, 07:37

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  Hemming.zip 237,60 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Bondleha
Дата 20.4.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.4.2009

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



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

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


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

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

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

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


 




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


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

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