代写C++编程作业、代做C++程序作业、代写C++作业、代写留学生C++程序

时间:2021-05-07 21:56:35

代写C++编程作业、代做C++程序作业、代写C++作业、代写留学生C++程序
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <time.h>
using namespace std;
const int n=7,k=4,r=3;
class HMCoding{
private:
int H[r][n],**G;
string H_Column[n+1];
int source_num;
string binary_data,coded_data;
char*received_data,**check_code;

void Show_H(int , int);
void Get_G();
void Show_G(int,int);
void Get_H_Column();//获取汉明码监督矩阵的每一列

public:
HMCoding( int num, string str)
{
source_num= num;
binary_data=str;
};
~HMCoding()
{
delete[]G;
delete[]received_data;
delete[]check_code;
};
void Initializing();
void Encoding();//汉明码编码
void BSC();
void Checking();//汉明码校码
void Decoding();//汉明码译码
};

 


//汉明码算法初始化模块

 

void HMCoding::Initializing()
{
int h[r][n]={
1,1,1,0,1,0,0,
1,1,0,1,0,1,0,
1,0,1,1,0,0,1};
for(int i=0;i<r;i++)
for(int j=0;j<n;j++)
H[i][j]=h[i][j];

cout<<"监督矩阵 H["<<n-k<<"]["<<n<<"]为:"<<endl;
Show_H(n-k,n);
cout<<"该监督矩阵对应的生成矩阵 G["<<k<<"]["<<n<<"]为:"<<endl;
Show_G(k,n);

Get_H_Column();//获取监督矩阵的每一列
}

//获取监督矩阵的每一列,用于汉明码校码
void HMCoding::Get_H_Column()
{
int i,j;
string temp;
for(i=0;i<n;i++)
{
temp="";
for(j=0;j<r;j++)
{
if(!H[j][i])
temp +=(char)0;
else
temp +=(char)1;
}
H_Column[i]=temp;
}
temp="";
for(j=0;j<r;j++)
temp +=(char)0;
H_Column[n]=temp;
}
void HMCoding::Show_H(int x,int y)
{
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
cout<<H[i][j]<<" ";
cout<<endl;
}
}
void HMCoding::Get_G()
{
G=new int *[k];
for(int i=0;i<k;i++)
G[i]= new int[n];
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
{
if(i==j)
G[i][j]=1;
else
G[i][j]=0;
}
for(int i=0;i<r;i++)
for(int j=0;j<k;j++)
G[j][i+k]=H[i][j];
}
void HMCoding::Show_G(int x,int y)
{
Get_G();
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
cout<<G[i][j]<<"";
cout<<endl;
}
}


//汉明码模块

 

void HMCoding::Encoding()
{
cout<<"进行("<<n<<","<<k<<")汉明码编码前的二进制序列为:"<<endl;
for(int i=0;i<source_num*k;i++)
cout<<(int)binary_data[i];
cout<<endl;

int*X;
X=new int[n+1];
for(int j=0;j<n+1;j++)
X[j]=0;

coded_data="";
for(int i=0;i<source_num*k;i=i+k)
{
for(int j=0;j<k;j++) //获取k位信息元
{
if(binary_data[i+j]==0) //‘0’
X[j]=0;
else
X[j]=1;
}
int temp;
string partial_str="";
for(int t=0;t<n;t++)
{//用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组
temp=0;
for(int j=0;j<k;j++)
temp +=X[j]*G[j][t];
if(temp%2==0)
partial_str +=(char)0;//'0'
else
partial_str +=(char)1;//'1'
}
coded_data +=partial_str;
}
delete []X;

cout<<"进行("<<n<<","<<k<<")汉明码编码后的二进制序列为:"<<endl;
for(int i=0;i<source_num*n;i++)
cout<<(int)coded_data[i];
cout<<endl;
}

 

//利用汉明码校码


void HMCoding::Checking()
{
int i,j;
check_code=new char*[source_num];
for(i=0;i<source_num;i++)
check_code[i]=new char[n];
for(i=0;i<source_num;i++)
{//每次取n个码元进行校正
for(j=0;j<n;j++)
{
check_code[i][j]=received_data[i*n+j];
}
}

int temp;
int flag;
string partial_str;
cout<<"("<<n<<","<<k<<")汉明码校码结果如下:"<<endl;
cout<<"接受码组 状态 校正后"<<endl;
for(int t=0;t<source_num;t++)
{
flag=0;
partial_str="";
for(i=0;i<r;i++)
{
temp=0;
for(j=0;j<n;j++)
temp +=H[i][j]*check_code[t][j];
if(temp%2==0)
partial_str +=(char)0;
else
partial_str +=(char)1;
}
//对partial_str进行判断
for(i=0;i<n+1;i++)
{
if(H_Column[i]==partial_str)
{
flag=1;
break;
}
}
if(flag&&i<n)//表示第i个码元出错,将其改正
{
for(j=0;j<n;j++)
cout<<(int)check_code[t][j];
cout<<" 第"<<i+1<<"位错,可纠正 ";
check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1
for(j=0;j<n;j++)
cout<<(int)check_code[t][j];
}
if(flag&&i==n)//表示全对
{
for(j=0;j<n;j++)
cout<<(int)check_code[t][j];
cout<<" 全对 ";
for(j=0;j<n;j++)
cout<<(int)check_code[t][j];
}
cout<<endl;
}
}
//译码
void HMCoding::Decoding()
{
int i,j;
int *decode_data=new int[source_num];

cout<<"("<<n<<","<<k<<")汉明码译码结果为:"<<endl;
for(i=0;i<source_num;i++)
{
decode_data[i]=0;
for(j=0;j<k;j++)
{
cout<<(int)check_code[i][j];
decode_data[i] += check_code[i][j]<<(k-1-j);
}
}
cout<<endl;

for (i=0;i<source_num;i++)
cout<<hex<<decode_data[i];
cout<<endl;
delete[]decode_data;
}

 

//模拟信道错误

 

void HMCoding::BSC()
{
int r_num=source_num*n;
received_data=new char[r_num];

srand((unsigned)time(NULL));
for(int i=0;i<r_num;i++)
if((rand()/(double)RAND_MAX)<0.07) //误码率为7%
received_data[i]=(~coded_data[i])&0x01; //若有错,则0变1,1变0
else
received_data[i]=coded_data[i];
}

 


int main()
{
int count=0;
string s="";

char filename[80];
cout<<"请输入要传输的源文件:";
cin>>filename;
int x;
char c;
ifstream ifile(filename,ios::binary);
while(ifile>>c)
{//简单的信源编码,从文件中读取字符,把ASCII码转化为数。
if(c>='0'&&c<='9')
x=c-0x30;
else if(c>='A'&&c<='F')
x=c-0x41+10;
else if(c>='a'&&c<='f')
x=c-0x61+10;
else
{
x=-1;
cout<<"跳过非法字符";
}

if(x>=0)
{
cout<<hex<<x;
count ++;
for(int i=0;i<k;i++)
{//每一位0~a的数用4bit表示,构造一个二进制序列。
int n=x;
n=n>>(k-1-i);
s +=n&0x01;
}
}
}
cout<<endl;
if(count<=0)
{
cout<<"输入文件不正确,没有读取到合法字符"<<endl;
return 0;
}

HMCoding hm74(count,s);
hm74.Initializing();

cout<<endl<<"使用汉明码的情况:对文件中的内容进行编码->模拟信道(可能有错误)->对接收到的内容进行纠码、译码"<<endl<<endl;
hm74.Encoding();
hm74.BSC();
hm74.Checking();
hm74.Decoding();
system ("pause");
return 0;
}http://www.6daixie.com/contents/13/1498.html

 

 

 

因为专业,所以值得信赖。如有需要,请加QQ99515681 或邮箱:99515681@qq.com 

微信:codinghelp