Приложение Б
(обязательное)
Листинг программы
cdc.cpp
#include <vcl.h>
#pragma hdrstop
#include "cdc.h"
#pragma package(smart_init)
int codec:: change_poly(bool * pla, int d) //изменение полинома
{
//освобождение памяти занятой массивом
delete [] poly;
if(d>0) //произвольный массив или из файла
{
//выделение под новый
degr = d;
poly = new bool [degr+1];
for(int i = 0; i<=degr; i++) poly[i] = pla[i];
}
if(d==0) //полином по заданию
{
//выделение памяти под новый
degr = 16;
poly = new bool [17];
//заполнение стандартного полинома
for(int i = 0;i<15;i++) poly[i] = 0;
poly[16] = 1;
poly[15] = 1;
poly[2] = 1;
poly[0] = 1;
}
return degr;
}
bool * codec:: code(bool * inf)
{
//формирование копии информационного массива
copy = new bool [88 + degr];
for(int i = 0; i<88; i++) copy[i] = inf[i];
for(int i = 88; i<88 + degr; i++) copy[i] = 0; //сдвиги в регистре
for(int i = 0; i<88 ; i++)
{
if(copy[i]) //деление на многочлен
{
for(int j=i; j<=i+degr; j++) copy[j]= copy[j]^poly[j-i];
}
}
//занести остаток в регистр
reg = new bool [degr];
for(int i = 0; i<degr; i++) reg[i] = copy[i+88];
//удаление массива-копии
delete [] copy;
return reg;
}
bool codec::decode(bool * rec) //декодирование сообщения
{
for(int i = 0; i<=88; i++)
{
if(rec[i]) //деление на многочлен
{
for(int j=i; j<=i+degr; j++) rec[j]= rec[j]^poly[j-i];
}
}
//занести остаток в регистр
syn = new bool [degr];
for(int i = 0; i<degr; i++) syn[i] = rec[i+87];
//поиск единиц в синдроме
for(int i = 0; i<degr; i++) { if(syn[i] == true) return 1; } //возврат при ошибке
return 0; //нет ошибок
}
cdc.h
class codec {
private:
int degr; //степень полинома
bool * poly; //адрес полинома
bool * reg; //адрес остатка
bool * syn; //адрес синдрома
bool * copy;
public:
int change_poly(bool *, int); //изменение полинома
bool * code(bool *); //кодирование
bool decode(bool *);
bool * get_reg() { return reg;}
bool * get_poly() { return poly;} //возврат адреса полинома
bool * get_syn() {return syn;} //возврат синдрома
int get_degr() {return degr;}
codec() //конструктор
{
degr = 16;
poly = new bool [17];
//заполнение стандартного полинома
for(int i = 0;i<15;i++) poly[i] = 0;
poly[16] = 1;
poly[15] = 1;
poly[2] = 1;
poly[0] = 1;
}
};
Codec.h
//---------------------------------------------------------------------------
#ifndef codecH
#define codecH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <Stdio.h>
#include "cdc.h"
#include <io.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TGroupBox *GroupBox2;
TGroupBox *GroupBox3;
TGroupBox *GroupBox4;
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TEdit *Edit1;
TLabel *Label1;
TStringGrid *polyTable;
TBitBtn *zap;
TBitBtn *op;
TBitBtn *sf1;
TStringGrid *infTable;
TStringGrid *errTable;
TBitBtn *sf2;
TStringGrid *recTable;
TLabel *Label2;
TButton *polyfromfile;
TButton *Gen;
TLabel *Label3;
TButton *code;
TStringGrid *regTable;
TLabel *Label4;
TButton *recieve;
TLabel *Label5;
TOpenDialog *OpenDialog1;
TOpenDialog *OpenDialog2;
TSaveDialog *SaveDialog1;
TSaveDialog *SaveDialog2;
TBitBtn *BitBtn1;
void __fastcall RadioButton1Click(TObject *Sender);
void __fastcall RadioButton2Click(TObject *Sender);
void __fastcall zapClick(TObject *Sender);
void __fastcall GenClick(TObject *Sender);
void __fastcall infTableSelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect);
void __fastcall codeClick(TObject *Sender);
void __fastcall errTableSelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect);
void __fastcall recieveClick(TObject *Sender);
void __fastcall polyfromfileClick(TObject *Sender);
void __fastcall opClick(TObject *Sender);
void __fastcall sf1Click(TObject *Sender);
void __fastcall sf2Click(TObject *Sender);
void __fastcall BitBtn1Click(TObject *Sender);
private: codec * first;
bool * ptr;
bool * inf; //адрес массива информации
bool * err; //адрес массива ошибки
bool * rec; //адрес массива принятого сообщения
bool * pla; //вспомогательный массив для смены полинома
TFileStream * information;
TFileStream * message;
TFileStream * polynom;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Codec.cpp
#include <vcl.h>
#pragma hdrstop
#include "codec.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
first = new codec; //выделение памяти под объект класса кодек
//Загрузка стандартного полинома
ptr = first->get_poly();
inf = NULL; //обнуление указателей на массивы информации,
err = NULL; // вектора ошибки,
rec = NULL; // принятого сообщения
for(int i = 0; i <= 16; i++) //вывод в таблицу порождающего полинома
{
polyTable->Cells[i][0] = IntToStr(polyTable->ColCount - i-1);
polyTable->Cells[i][1] = IntToStr(ptr[16-i]);
}
}
//--------Полином по заданию----------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
Edit1->Text = "16"; //вывод степени полинома
zap->Visible = false;
polyfromfile->Visible = false;
//Заполнение массива полинома
polyTable->ColCount = first->change_poly(NULL, 0) + 1;
//Заполнение таблицы
ptr = first->get_poly();
for(int i = 0; i <= polyTable->ColCount; i++)
{
polyTable->Cells[i][0] = IntToStr(polyTable->ColCount - i-1);
polyTable->Cells[i][1] = IntToStr(*(ptr+16-i));
}
}
//--------Полином произвольный--------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
zap->Visible = true;
polyfromfile->Visible = true;
//Очистка таблицы
polyTable->ColCount = 1;
polyTable->Cells[0][0] = "";
polyTable->Cells[0][1] = "";
}
//-------Заполнить случайно-----------------------------------------------------
void __fastcall TForm1::zapClick(TObject *Sender)
{
//выделение динамической памяти под полином
pla = new bool [StrToInt(Edit1->Text)+1];
//заполнение массива произвольного полинома
Randomize();
for(int i = StrToInt(Edit1->Text)-1; i>=0; i--) pla[i] = random(2);
pla[StrToInt(Edit1->Text)] = 1;
pla[0] = 1;
// запись полинома в кодек
first->change_poly(pla, StrToInt(Edit1->Text));
//Вывод полинома в таблицу
polyTable->ColCount = StrToInt(Edit1->Text) + 1;
ptr = first->get_poly();
for(int i = 0; i <= polyTable->ColCount; i++)
{
polyTable->Cells[i][0] = IntToStr(polyTable->ColCount - i-1);
polyTable->Cells[i][1] = IntToStr(*(ptr+i));
}
//освобождение памяти занятой массивом
delete [] pla;
}
//----------Сформировать случайным образом информационную последовательность----
void __fastcall TForm1::GenClick(TObject *Sender)
{
infTable->Visible = true;
regTable->Visible = true;
code->Visible = true;
//в блоке 88 бит, подлежащих кодированию
if(!inf) { inf = new bool [88];} //выделение памяти под массив информации
//заполнение массива информации
Randomize();
for(int i = 0; i < 88; i++) inf[i] = random(2);
//вывод в таблицу
for(int i = 0; i < 88; i++) infTable->Cells[i][0] = IntToStr(inf[i]);
regTable->ColCount = polyTable->ColCount;
//заполнение вектора ошибки и вывод в таблицу
if(!err) {err = new bool [88];}
for(int i = 0; i < 88; i++) {err[i] = 0;
errTable->Cells[i][0] = IntToStr(err[i]); }
//Передача фокуса на кнопку 'кодировать'
code->SetFocus();
}
//--Инверсия бита информационной последовательности при выборе клетки таблицы---
void __fastcall TForm1::infTableSelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
inf[ACol]=StrToInt(infTable->Cells[ACol][0])^1;
infTable->Cells[ACol][0]=IntToStr(inf[ACol]);
}
//-----Кодирование информации и извлечение проверочной комбинации---------------
void __fastcall TForm1::codeClick(TObject *Sender)
{
ptr = first->code(inf);
for(int i = 0; i < regTable->ColCount-1; i++)
regTable->Cells[i][0] = IntToStr(ptr[i]);
}
//--Инверсия бита в векторе ошибки при выборе клетки таблицы--------------------
void __fastcall TForm1::errTableSelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
err[ACol]=StrToInt(errTable->Cells[ACol][0])^1;
errTable->Cells[ACol][0]=IntToStr(err[ACol]);
}
//-----Принять сообщение--------------------------------------------------------
void __fastcall TForm1::recieveClick(TObject *Sender)
{
sf2->Visible = 1;
if(!rec) rec = new bool [88+first->get_degr()+1];
//наложение вектора ошибки
for(int i = 0; i < 88; i++) {rec[i] = inf[i]^err[i];
recTable->Cells[i][0] = IntToStr(rec[i]); }
ptr = first->get_reg();
//дополнение проверочной комбинацией
for(int i = 88; i <88 + first->get_degr()+1; i++) {rec[i] = ptr[i-88];
recTable->Cells[i][0] = IntToStr(rec[i]); }
//декодирование
if(first->decode(rec)) Label5->Caption = "Сообщение принято с ошибкой";
else Label5->Caption = "Сообщение принято без ошибок";
sf2->SetFocus();
}
//-----Загрузка полинома из файла-----------------------------------------------
void __fastcall TForm1::polyfromfileClick(TObject *Sender)
{
if(OpenDialog1->Execute())
{
polynom = new TFileStream(OpenDialog1->FileName.c_str(),fmOpenRead);
if (polynom)
{
//Выделение памяти под вспомогательный массив полинома
pla = new bool [polynom->Size];
//запись из файла
polynom->ReadBuffer(pla, polynom->Size);
for(int i = 0; i<polynom->Size;i++) pla[i]-=48;
first->change_poly(pla, polynom->Size-1); //загрузка полинома в кодек
Edit1->Text = IntToStr(polynom->Size-1);
delete [] pla; //освобождение памяти под вспомогательным массивом полинома
delete polynom;
//Заполнение таблицы полинома
polyTable->ColCount = StrToInt(Edit1->Text) + 1;
ptr = first->get_poly();
for(int i = 0; i <= polyTable->ColCount; i++)
{
polyTable->Cells[i][0] = IntToStr(polyTable->ColCount - i-1);
polyTable->Cells[i][1] = IntToStr(*(ptr+i));
}
}
}
}
//-----Загрузка информации из файла---------------------------------------------
void __fastcall TForm1::opClick(TObject *Sender)
{
if(OpenDialog2->Execute())
{
information = new TFileStream(OpenDialog2->FileName.c_str(),fmOpenRead);
if (information)
{
//Выделение памяти под массив
if(!inf) {inf = new bool [88];}
//запись из файла
information->ReadBuffer(inf, 88);
delete information;
//Заполнение таблицы
for(int i = 0; i < 88; i++) infTable->Cells[i][0] = IntToStr(inf[i]);
infTable->Visible = true;
regTable->Visible = true;
code->Visible = true;
//заполнение вектора ошибки и вывод в таблицу
if(!err) {err = new bool [88];}
for(int i = 0; i < 88; i++) {err[i] = 0;
errTable->Cells[i][0] = IntToStr(err[i]); }
code->SetFocus();
}
}
}
//------сохранение информации в файл--------------------------------------------
void __fastcall TForm1::sf1Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
//если сохраняемого файла нет, то он создается
information=new TFileStream(SaveDialog1->FileName.c_str(), fmOpenWrite| fmCreate);
if (information)
{
//запись в файл
information->WriteBuffer(inf, 88);
delete information;
}
}
}
//---Сохранение полученного сообщения-------------------------------------------
void __fastcall TForm1::sf2Click(TObject *Sender)
{
if(SaveDialog2->Execute())
{
message=new TFileStream(SaveDialog2->FileName.c_str(),fmOpenWrite|fmCreate);
if (message)
{
//запись из файла
message->WriteBuffer(rec, 88+first->get_degr()+1);
delete message;
}
}
}
//---------------Вызов файла справки---------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Application->HelpJump("Назначение");
}
Приложение В
(справочное)
Библиографический список
-
Чернега В.С., Василенко В.Н., Бондарев В.Н. Расчет и проектирование технических средств обмена и передачи информации: Учеб. Пособие для вузов – М.: Высш. шк., 1990, -224 с.: ил.
-
Тутевич В.Н. Телемеханика: Учеб. Пособие для вузов спец «Автоматика и телемеханика». – 2-е изд., перераб. и доп. – М.: Высш. шк., 1985, - 423 с.: ил.
-
Бармин И.Н. Проектирование системы передачи данных: методические указания по выполнению курсового проекта – 2007
-
ГОСТ 17422-82. Скорости передачи данных и основные параметры помехоустойчивых циклических кодов
-
Единая система программной документации.- М.: Изд. стандартов, 1982. - 128 с.
-
Сергиенко А.Б. Цифровая обработка сигналов – Спб.: Питер, 2002. – 608 с.: ил.
-
Электронный источник - http://www.intuit.ru/department/network/terminals/ 12/6.html
-
Электронный источник – http://ru.wikipedia.org/wiki - частотная манипуляция
Лист
ТПЖА.230201.031.014
ПЗ
Изм
Лист № Документа
Дата Подпись Лист