计算机科学与工程系一、实验名称:汉明码二、实验环境软件环境:Windows2000,MicrosoftVisualC++6.0硬件环境:P4,2.4GHz,256内存,IBM-PC及兼容机三、实验目的了解汉明码的编码原理,纠错原理,译码原理;给定汉明码的监督矩阵,能够写出生成矩阵,能够通过监督矩阵或生成矩阵进行编码,能够通过监督矩阵进行校码与译码,会计算汉明码的错误概率以及导出增余汉明码等相关知识。四、实验内容在MicrosoftVisualc++6.0软件环境下,编写一个程序,使之实现汉明码以及增余汉明码的编码、检码、译码过程。1、通过对书本的学习,以及对课堂知识的掌握,了解汉明码的纠错原理,编写出汉明码的纠错程序。2、基于汉明码的编写,进一步完成对检码译码及增余汉明码的实现。3、实验验证程序的合理性,结果的正确性,和结构的完善性。五、实验过程与实验结果源程序:#includeiostream#includestringusingnamespacestd;#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();//汉明码校码计算机科学与工程系2voidChecking_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;ir+1;i++)H[i]=newint[n+1];for(i=0;ir;i++)for(j=0;jn;j++)cinH[i][j];//初始化增余项for(j=0;jn+1;j++)H[r][j]=1;for(i=0;ir;i++)H[i][n]=0;//为X分配存储单元X=newint[n+1];for(j=0;jn+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;in;i++){temp=;for(j=0;jr;j++){if(!H[j][i])temp+='0';计算机科学与工程系3elsetemp+='1';}H_Column[i]=temp;}H_Column[n]=000;}//获取增余监督矩阵的每一列,用于增余汉明码校码voidHMCoding::Get_H_Column_Z(){H_Column_Z=newstring[n+2];for(i=0;in+1;i++)H_Column_Z[i]=H_Column[i]+'1';H_Column_Z[n+1]=0000;}voidHMCoding::Show_H(intx,inty){for(i=0;ix;i++){for(j=0;jy;j++)coutH[i][j];coutendl;}}voidHMCoding::Get_G(){G=newint*[k];for(i=0;ik;i++)G[i]=newint[n];for(i=0;ik;i++)for(j=0;jk;j++){if(i==j)G[i][j]=1;elseG[i][j]=0;}for(i=0;ir;i++)for(j=0;jk;j++)G[j][i+k]=H[i][j];}voidHMCoding::Show_G(intx,inty){计算机科学与工程系4Get_G();for(i=0;ix;i++){for(j=0;jy;j++)coutG[i][j];coutendl;}}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*Peendl;}/*********************************编码模块*********************************///二进制序列合理性检测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;cinbinary_str;flag=Binary_Str_Check(binary_str);while(binary_str[binary_num]!='\0')binary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&&flag)/*序列所含码元个数不是k的整数倍,无法计算机科学与工程系5全部编码*/{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;ibinary_num;i=i+k){for(j=0;jk;j++)/*获取k位信息元*/{if(binary_str[i+j]=='0')X[j]=0;elseX[j]=1;}inttemp;stringpartial_str=;for(intt=0;tn;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/temp=0;for(j=0;jk;j++)temp+=X[j]*G[j][t];if(temp%2==0)partial_str+='0';elsepartial_str+='1';}code_str+=partial_str;}cout进行(n,k)汉明码编码后的二进制序列为:\ncode_strendl;}计算机科学与工程系6//增余汉明码编码voidHMCoding::Encoding_Z(){code_str=;A_Z:stringbinary_str;intflag;intbinary_num=0;cout请输入待编码的二进制序列:endl;cinbinary_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;ibinary_num;i=i+k){for(j=0;jk;j++)/*获取k位信息元*/{if(binary_str[i+j]=='0')X[j]=0;elseX[j]=1;}inttemp;stringpartial_str=;for(intt=0;tn;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/temp=0;计算机科学与工程系7for(j=0;jk;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;jn;j++)sum+=X[j];if(sum%2==0)partial_str+='0';elsepartial_str+='1';code_str+=partial_str;}cout进行(n+1,k)增余汉明码编码后的二进制序列为:\ncode_strendl;}/*********************************校码模块*********************************///利用汉明码校码voidHMCoding::Checking(){B:stringbinary_str;intflag;intbinary_num=0;cout请输入待译的二进制序列:endl;cinbinary_str;flag=Binary_Str_Check(binary_str);while(binary_str[binary_num]!='\0')binary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%n!=0&&flag)/*序列所含码元个数不是n的整数倍,无法全部译码*/{cout您输入的二进制序列存在冗余,请重新输入!\n;gotoB;计算机科学与工程系8}if(binary_num%n!=0&&!flag){cout您输入的二进