Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив1 / doc100 / 8_Приложение Б, В

.doc
Скачиваний:
24
Добавлен:
01.08.2013
Размер:
137.73 Кб
Скачать

Приложение Б

(обязательное)

Листинг программы

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("Назначение");

}

Приложение В

(справочное)

Библиографический список

  1. Чернега В.С., Василенко В.Н., Бондарев В.Н. Расчет и проектирование технических средств обмена и передачи информации: Учеб. Пособие для вузов – М.: Высш. шк., 1990, -224 с.: ил.

  1. Тутевич В.Н. Телемеханика: Учеб. Пособие для вузов спец «Автоматика и телемеханика». – 2-е изд., перераб. и доп. – М.: Высш. шк., 1985, - 423 с.: ил.

  1. Бармин И.Н. Проектирование системы передачи данных: методические указания по выполнению курсового проекта – 2007

  1. ГОСТ 17422-82. Скорости передачи данных и основные параметры помехоустойчивых циклических кодов

  1. Единая система программной документации.- М.: Изд. стандартов, 1982. - 128 с.

  1. Сергиенко А.Б. Цифровая обработка сигналов – Спб.: Питер, 2002. – 608 с.: ил.

  1. Электронный источник - http://www.intuit.ru/department/network/terminals/ 12/6.html

  1. Электронный источник – http://ru.wikipedia.org/wiki - частотная манипуляция

Лист

ТПЖА.230201.031.014 ПЗ

Изм

Лист

Документа

Дата

Подпись

Лист

56

Соседние файлы в папке doc100