1、 void Initializing(int,int); void Show_H(int,int); void Get_G(); void Show_G(int,int); void HM_Efficiency_Analysing();/*对汉明码进行编码效率分析*/ int Binary_Str_Check(string); void Encoding();/汉明码编码 void Encoding_Z();/增余汉明码编码 void Decoding();/汉明码译码 void Decoding_Z();/增余汉明码译码 void Get_H_Column();/获取汉明码监督矩阵的每一列
2、void Get_H_Column_Z();/获取增余汉明码监督矩阵的每一列 void Get_Judge_Result();/获取汉明码校码结果 void Get_Judge_Result_Z();/获取增余汉明码校码结果 void Checking();/汉明码校码 void Checking_Z();/增余汉明码校码 void GOTO_HMCding_Z();HMCoding hmcoding;/全局变量/*初始化模块*/void HMCoding:Initializing(int _n,int _k) n=_n; k=_k; r=_n-_k; cout请给定(n,k)汉明码的监督矩阵
3、Hr:endl; H=new int *r+1; /初始化(n,k)汉明码监督矩阵 for(i=0;ir+1;i+) Hi=new intn+1;r; for(j=0;jHij; /初始化增余项 for(j=0;n+1; Hrj=1; Hin=0; /为X分配存储单元 X=new intn+1; Xj=0; Get_H_Column();/获取监督矩阵的每一列 Get_H_Column_Z();/进一步获取增余监督矩阵的每一列/获取监督矩阵的每一列,用于汉明码校码Get_H_Column() string temp; H_Column=new stringn+1; temp=; if(!Hji
4、) temp+=0 else1 H_Columni=temp; H_Columnn=000/获取增余监督矩阵的每一列,用于增余汉明码校码Get_H_Column_Z() H_Column_Z=new stringn+2; H_Column_Zi=H_Columni+ H_Column_Zn+1=0000Show_H(int x,int y)x;y; coutHij coutGet_G() G=new int *k;k; Gi=new intn; if(i=j) Gij=1; Gij=0; Gji+k=Hij;Show_G(int x,int y) Get_G();GijHM_Efficienc
5、y_Analysing()对()汉明码的评价如下:()汉明码的效率E=k/n*100%=k*1.0/n*100%)汉明码的错误概率P=n*(n-1)*Pe*Pe=n*(n-1)*Pe*Pebinary_str; flag=Binary_Str_Check(binary_str); while(binary_strbinary_num!) binary_num+;/*统计输入的二进制序列所含码元个数*/ if(binary_num%k!=0&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/您输入的二进制序列存在冗余,请重新输入!n goto A;!flag)您输入的二进制序列存在冗
6、余且含除0、1外的字符,请重新输入! if(binary_num%k=0&您输入的二进制序列含除0、1外的字符,请重新输入! code_str=binary_num;i=i+k)j+)/*获取k位信息元*/ if(binary_stri+j= Xj=0; Xj=1; int temp; string partial_str= for(int t=0;tt+) /*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/ temp=0; for(j=0; temp+=Xj*Gjt; if(temp%2=0) partial_str+= code_str+=partial_str;进行()
7、汉明码编码后的二进制序列为:code_strEncoding_Z()A_Z:string binary_str; goto A_Z; if(temp%2=0) Xj+k=0; else Xj+k=1; /生成增余汉明码最后一位 /监督规则:对原汉明码所有n个码元取模2和 int sum=0; sum+=Xj; if(sum%2=0) partial_str+= elsen+1)增余汉明码编码后的二进制序列为:/*校码模块*/利用汉明码校码Checking()B:请输入待译的二进制序列: if(binary_num%n!flag)/*序列所含码元个数不是n的整数倍,无法全部译码*/ goto B
8、; if(binary_num%n=0& code_num=binary_num/n;/统计n元码组的个数 check_code=new int*code_num;code_num; check_codei=new intn; /*每次取n个码元进行校正*/j+) check_codeij=binary_stri*n+j- Get_Judge_Result();/利用增余汉明码校码Checking_Z()B_Z: if(binary_num%(n+1)!flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/ goto B_Z; if(binary_num%(n+1)=0& code
9、_num_z=binary_num/(n+1);/统计n+1元码组的个数 check_code=new int*code_num_z;code_num_z; check_codei=new intn+2; /*每次取n+1个码元进行校正*/ check_codeij=binary_stri*(n+1)+j- Get_Judge_Result_Z();Get_Judge_Result() int temp; string partial_str;)汉明码校码结果如下:码组 状态 校正后 for(int t=0; flag=0; partial_str= for(i=0; temp+=Hij*ch
10、eck_codetj; /对partial_str进行判断i+) if(H_Columni=partial_str) flag=1; break; if(flag&n)/表示第i个码元出错,将其改正 coutcheck_codetj; 第i+1位错,可纠正 check_codeti=(check_codeti+1)%2;/1变0,0变1i=n)/表示全对 全对 Get_Judge_Result_Z()增余汉明码校码结果如下(注:* 表示无法识别的码元):n+2; if(H_Column_Zi=partial_str)n+1)/表示第i个码元出错,将其改正 check_codetn+1=1;/表示正确接收i=n+1)/表示全对 check_codetn+1=0;/表示两位出错并无法纠正 某两位出错,无法纠正 */* 表示无法正确识别的码元/*译码模块*/利用汉明码译码Decoding()汉明码译码结果为:check_codeij;/利用增余汉明码译码Decoding_Z()增余汉明码译码结果为(注: if(check_codein+1=1)check_codeij