汉明码C++源码(完整版)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#include<iostream>#include<string>usingnamespacestd;#definePe0.0001classHMCoding{private:intn,k,r;//汉明码参数inti,j;//用于指示循环次数int**H,*X,**G,**check_code;string*H_Column,*H_Column_Z,code_str;intcode_num,code_num_z;public:voidInitializing(int,int);voidShow_H(int,int);voidGet_G();voidShow_G(int,int);voidHM_Efficiency_Analysing();/*对汉明码进行编码效率分析*/intBinary_Str_Check(string);voidEncoding();//汉明码编码voidEncoding_Z();//增余汉明码编码voidDecoding();//汉明码译码voidDecoding_Z();//增余汉明码译码voidGet_H_Column();//获取汉明码监督矩阵的每一列voidGet_H_Column_Z();//获取增余汉明码监督矩阵的每一列voidGet_Judge_Result();//获取汉明码校码结果voidGet_Judge_Result_Z();//获取增余汉明码校码结果voidChecking();//汉明码校码voidChecking_Z();//增余汉明码校码voidGOTO_HMCding_Z();};HMCodinghmcoding;//全局变量/*********************************初始化模块*********************************/voidHMCoding::Initializing(int_n,int_k){n=_n;k=_k;r=_n-_k;cout<<"请给定("<<n<<","<<k<<")汉明码的监督矩阵H["<<r<<"]["<<n<<"]:"<<endl;H=newint*[r+1];//初始化(n,k)汉明码监督矩阵for(i=0;i<r+1;i++)H[i]=newint[n+1];for(i=0;i<r;i++)for(j=0;j<n;j++)cin>>H[i][j];//初始化增余项for(j=0;j<n+1;j++)H[r][j]=1;for(i=0;i<r;i++)H[i][n]=0;//为X分配存储单元X=newint[n+1];for(j=0;j<n+1;j++)X[j]=0;Get_H_Column();//获取监督矩阵的每一列Get_H_Column_Z();//进一步获取增余监督矩阵的每一列}//获取监督矩阵的每一列,用于汉明码校码voidHMCoding::Get_H_Column(){stringtemp;H_Column=newstring[n+1];for(i=0;i<n;i++){temp="";for(j=0;j<r;j++){if(!H[j][i])temp+='0';elsetemp+='1';}H_Column[i]=temp;}H_Column[n]="000";}//获取增余监督矩阵的每一列,用于增余汉明码校码voidHMCoding::Get_H_Column_Z(){H_Column_Z=newstring[n+2];for(i=0;i<n+1;i++)H_Column_Z[i]=H_Column[i]+'1';H_Column_Z[n+1]="0000";}voidHMCoding::Show_H(intx,inty){for(i=0;i<x;i++){for(j=0;j<y;j++)cout<<H[i][j]<<"";cout<<endl;}}voidHMCoding::Get_G(){G=newint*[k];for(i=0;i<k;i++)G[i]=newint[n];for(i=0;i<k;i++)for(j=0;j<k;j++){if(i==j)G[i][j]=1;elseG[i][j]=0;}for(i=0;i<r;i++)for(j=0;j<k;j++)G[j][i+k]=H[i][j];}voidHMCoding::Show_G(intx,inty){Get_G();for(i=0;i<x;i++){for(j=0;j<y;j++)cout<<G[i][j]<<"";cout<<endl;}}voidHMCoding::HM_Efficiency_Analysing(){cout<<"对("<<n<<","<<k<<")汉明码的评价如下:"<<endl;cout<<"("<<n<<","<<k<<")汉明码的效率E=k/n*100%="<<k*1.0/n*100<<"%"<<endl;cout<<"("<<n<<","<<k<<")汉明码的错误概率P=n*(n-1)*Pe*Pe="<<n*(n-1)*Pe*Pe<<endl;}/*********************************编码模块*********************************///二进制序列合理性检测intHMCoding::Binary_Str_Check(stringtemp){intflag=1;//先假设输入的消息串不含除0、1外的字符for(inti=0;temp[i]!='\0';i++){if(!(temp[i]=='0'||temp[i]=='1')){flag=0;break;}}returnflag;}//汉明码编码voidHMCoding::Encoding(){A:stringbinary_str;intflag;intbinary_num=0;cout<<"请输入待编码的二进制序列:"<<endl;cin>>binary_str;flag=Binary_Str_Check(binary_str);while(binary_str[binary_num]!='\0')binary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/{cout<<"您输入的二进制序列存在冗余,请重新输入!\n";gotoA;}if(binary_num%k!=0&&!flag){cout<<"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";gotoA;}if(binary_num%k==0&&!flag){cout<<"您输入的二进制序列含除0、1外的字符,请重新输入!\n";gotoA;}code_str="";for(i=0;i<binary_num;i=i+k){for(j=0;j<k;j++)/*获取k位信息元*/{if(binary_str[i+j]=='0')X[j]=0;elseX[j]=1;}inttemp;stringpartial_str="";for(intt=0;t<n;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/temp=0;for(j=0;j<k;j++)temp+=X[j]*G[j][t];if(temp%2==0)partial_str+='0';elsepartial_str+='1';}code_str+=partial_str;}cout<<"进行("<<n<<","<<k<<")汉明码编码后的二进制序列为:\n"<<code_str<<endl;}//增余汉明码编码voidHMCoding::Encoding_Z(){code_str="";A_Z:stringbinary_str;intflag;intbinary_num=0;cout<<"请输入待编码的二进制序列:"<<endl;cin>>binary_str;flag=Binary_Str_Check(binary_str);while(binary_str[binary_num]!='\0')binary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/{cout<<"您输入的二进制序列存在冗余,请重新输入!\n";gotoA_Z;}if(binary_num%k!=0&&!flag){cout<<"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";gotoA_Z;}if(binary_num%k==0&&!flag){cout<<"您输入的二进制序列含除0、1外的字符,请重新输入!\n";gotoA_Z;}for(i=0;i<binary_num;i=i+k){for(j=0;j<k;j++)/*获取k位信息元*/{if(binary_str[i+j]=='0')X[j]=0;elseX[j]=1;}inttemp;stringpartial_str="";for(intt=0;t<n;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/temp=0;for(j=0;j<k;j++)temp+=X[j]*G[j][t];if(temp%2==0){partial_str+='0';X[j+k]=0;}else{partial_str+='1';X[j+k]=1;}}//生成增余汉明码最后一位//监督规则:对原汉明码所有n个码元取模2和intsum=0;for(j=0;j<n;j++)sum

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功