Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №3 / Циклические коды / Decoder / Main
.cpp#include <vcl.h>
#include <dir.h>
#include <math.h>
#include <stdio.h>
#pragma hdrstop
#include "Main.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
InputFile = "";
N = 12;
};
void TfrmMain::ShowBits(TMemo *Memo, int **bits, int len, int count)
{
for (int i=0;i<=len;i++)
{
AnsiString temp="";
for (int j=1;j<=count;j++)
temp += IntToStr(bits[i][j]);
Memo->Lines->Add(temp);
}
}
int xor(int x, int y)
{
if ((!x)&&(!y)) return 0;
if ((!x)&&(y)) return 1;
if ((x)&&(!y)) return 1;
if ((x)&&(y)) return 0;
}
void MoveArray(int *bits, int N, int insert)
{
for(int i=1;i<=N;i++)
{
bits[i-1]=bits[i];
}
bits[N]=insert;
};
int *XorArrays(int *array1, int *array2,int N)
{
int *res = new int [N+1];
for (int i=0;i<=N;i++)
res[i]=xor(array1[i],array2[i]);
return res;
};
int **crcMethod(int **bits,int len, int count)
{
int **res = new int *[len+1];
for (int i=0;i<=len;i++)
res[i] = new int[5];
for(int i=0;i<=len;i++)
for(int j=0;j<=4;j++)
res[i][j]=0;
int *polynom = new int [5];
polynom[1]=1;
polynom[2]=0;
polynom[3]=1;
polynom[4]=1;
for (int i=0; i<=len; i++)
{
int *tmp = new int [5];
tmp[1] = bits[i][1];
tmp[2] = bits[i][2];
tmp[3] = bits[i][3];
tmp[4] = bits[i][4];
int current = 5;
while (current <= count)
{
tmp = XorArrays(tmp,polynom,4);
while ((tmp[1]==0)&&(current<=count))
{
MoveArray(tmp,4,bits[i][current]);
current++;
}
}
res[i] = tmp;
}
return res;
}
int **InvertBit(int **bits,int Length, int N)
{
int **invert;
invert = new int *[Length+1];
for (int i=0;i<=Length;i++)
{
invert [i] = new int[N+1];
for (int j=1;j<=N;j++)
invert[i][1+N-j] = bits[i][j];
}
return invert;
}
void __fastcall TfrmMain::btnOpenClick(TObject *Sender)
{
if ((OpenDialog->Execute())&&(FileExists(OpenDialog->FileName)))
InputFile = OpenDialog->FileName;
mmInput->Lines->LoadFromFile(InputFile);
FILE *file;
file = fopen(InputFile.c_str(),"r");
Length = mmInput->Lines->Count;
Length--;
crc = new int *[Length+1];
errors = new int *[Length+1];
char ch;
for (int i=0;i<=Length;i++)
{
crc[i] = new int [N+1];
crc[i][0] = 0;
int j=0;
do
{
fscanf(file,"%c",&ch);
if (ch=='0') crc[i][j+1] = 0;
if (ch=='1') crc[i][j+1] = 1;
j++;
}
while ((ch!='\n')&&(!feof(file)));
}
errors = crcMethod(crc,Length,N);
ShowBits(mmResult,errors,Length,4);
fclose(file);
}
void __fastcall TfrmMain::btnCloseClick(TObject *Sender)
{
Close();
}