汉明码实验报告内附C++源码.docx
- 文档编号:3779630
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:28
- 大小:310.24KB
汉明码实验报告内附C++源码.docx
《汉明码实验报告内附C++源码.docx》由会员分享,可在线阅读,更多相关《汉明码实验报告内附C++源码.docx(28页珍藏版)》请在冰点文库上搜索。
汉明码实验报告内附C++源码
一、实验名称:
汉明码
二、实验环境
软件环境:
Windows2000,MicrosoftVisualC++6.0
硬件环境:
P4,2.4GHz,256内存,IBM-PC及兼容机
三、实验目的
了解汉明码的编码原理,纠错原理,译码原理;给定汉明码的监督矩阵,能够写出生成矩阵,能够通过监督矩阵或生成矩阵进行编码,能够通过监督矩阵进行校码与译码,会计算汉明码的错误概率以及导出增余汉明码等相关知识。
四、实验内容
在MicrosoftVisualc++6.0软件环境下,编写一个程序,使之实现汉明码以及增余汉明码的编码、检码、译码过程。
1、通过对书本的学习,以及对课堂知识的掌握,了解汉明码的纠错原理,编写出汉明码的纠错程序。
2、基于汉明码的编写,进一步完成对检码译码及增余汉明码的实现。
3、实验验证程序的合理性,结果的正确性,和结构的完善性。
五、实验过程与实验结果
源程序:
#include
#include
usingnamespacestd;
#definePe0.0001
classHMCoding{
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<<"请给定("< "< H=newint*[r+1]; //初始化(n,k)汉明码监督矩阵 for(i=0;i H[i]=newint[n+1]; for(i=0;i for(j=0;j cin>>H[i][j]; //初始化增余项 for(j=0;j H[r][j]=1; for(i=0;i H[i][n]=0; //为X分配存储单元 X=newint[n+1]; for(j=0;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 { temp=""; for(j=0;j { if(! H[j][i]) temp+='0'; else temp+='1'; } H_Column[i]=temp; } H_Column[n]="000"; } //获取增余监督矩阵的每一列,用于增余汉明码校码 voidHMCoding: : Get_H_Column_Z() { H_Column_Z=newstring[n+2]; for(i=0;i H_Column_Z[i]=H_Column[i]+'1'; H_Column_Z[n+1]="0000"; } voidHMCoding: : Show_H(intx,inty) { for(i=0;i { for(j=0;j cout< cout< } } voidHMCoding: : Get_G() { G=newint*[k]; for(i=0;i G[i]=newint[n]; for(i=0;i for(j=0;j { if(i==j) G[i][j]=1; else G[i][j]=0; } for(i=0;i for(j=0;j G[j][i+k]=H[i][j]; } voidHMCoding: : Show_G(intx,inty) { Get_G(); for(i=0;i { for(j=0;j cout< cout< } } voidHMCoding: : HM_Efficiency_Analysing() { cout<<"对("< "< cout<<"("< cout<<"("< } /*********************************编码模块*********************************/ //二进制序列合理性检测 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<<"请输入待编码的二进制序列: "< 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 { for(j=0;j { if(binary_str[i+j]=='0') X[j]=0; else X[j]=1; } inttemp; stringpartial_str=""; for(intt=0;t {/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/ temp=0; for(j=0;j temp+=X[j]*G[j][t]; if(temp%2==0) partial_str+='0'; else partial_str+='1'; } code_str+=partial_str; } cout<<"进行("< \n"< } //增余汉明码编码 voidHMCoding: : Encoding_Z() { code_str=""; A_Z: stringbinary_str; intflag; intbinary_num=0; cout<<"请输入待编码的二进制序列: "< 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 { for(j=0;j { if(binary_str[i+j]=='0') X[j]=0; else X[j]=1; } inttemp; stringpartial_str=""; for(intt=0;t {/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/ temp=0; for(j=0;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 sum+=X[j]; if(sum%2==0) partial_str+='0'; else partial_str+='1'; code_str+=partial_str; } cout<<"进行("< \n"< } /*********************************校码模块*********************************/ //利用汉明码校码 voidHMCoding: : Checking() { B: stringbinary_str; intflag; intbinary_num=0; cout<<"请输入待译的二进制序列: "< cin>>binary_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; } if(binary_num%n! =0&&! flag) { cout<<"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入! \n"; gotoB; } if(binary_num%n==0&&! flag) { cout<<"您输入的二进制序列含除0、1外的字符,请重新输入! \n"; gotoB; } code_num=binary_num/n;//统计n元码组的个数 check_code=newint*[code_num]; for(i=0;i check_code[i]=newint[n]; for(i=0;i {/*每次取n个码元进行校正*/ for(j=0;j check_code[i][j]=binary_str[i*n+j]-'0'; } } Get_Judge_Result(); } //利用增余汉明码校码 voidHMCoding: : Checking_Z() { B_Z: stringbinary_str; intflag; intbinary_num=0; cout<<"请输入待译的二进制序列: "< cin>>binary_str; flag=Binary_Str_Check(binary_str); while(binary_str[binary_num]! ='\0') binary_num++;/*统计输入的二进制序列所含码元个数*/ if(binary_num%(n+1)! =0&&flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/ { cout<<"您输入的二进制序列存在冗余,请重新输入! \n"; gotoB_Z; } if(binary_num%(n+1)! =0&&! flag) { cout<<"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入! \n"; gotoB_Z; } if(binary_num%(n+1)==0&&! flag) { cout<<"您输入的二进制序列含除0、1外的字符,请重新输入! \n"; gotoB_Z; } code_num_z=binary_num/(n+1);//统计n+1元码组的个数 check_code=newint*[code_num_z]; for(i=0;i check_code[i]=newint[n+2]; for(i=0;i {/*每次取n+1个码元进行校正*/ for(j=0;j check_code[i][j]=binary_str[i*(n+1)+j]-'0'; } } Get_Judge_Result_Z(); } //获取汉明码校码结果 voidHMCoding: : Get_Judge_Result() { inttemp; intflag; stringpartial_str; cout<<"("< "< cout<<"码组状态校正后"< for(intt=0;t { flag=0; partial_str=""; for(i=0;i { temp=0; for(j=0;j temp+=H[i][j]*check_code[t][j]; if(temp%2==0) partial_str+='0'; else partial_str+='1'; } //对partial_str进行判断 for(i=0;i if(H_Column[i]==partial_str) { flag=1; break; } } if(flag&&i { for(j=0;j cout< cout<<"第"< check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1 for(j=0;j cout< } if(flag&&i==n)//表示全对 { for(j=0;j cout< cout<<"全对"; for(j=0;j cout< } cout< } } //获取增余汉明码校码结果 voidHMCoding: : Get_Judge_Result_Z() { inttemp; intflag; stringpartial_str; cout<<"("< *表示无法识别的码元): "< cout<<"码组状态校正后"< for(intt=0;t { flag=0; partial_str=""; for(i=0;i { temp=0; for(j=0;j temp+=H[i][j]*check_code[t][j]; if(temp%2==0) partial_str+='0'; else partial_str+='1'; } //对partial_str进行判断 for(i=0;i if(H_Column_Z[i]==partial_str) { flag=1; break; } } if(flag&&i { check_code[t][n+1]=1;//表示正确接收 for(j=0;j cout< cout<<"第"< check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1 for(j=0;j cout< } if(flag&&i==n+1)//表示全对 { check_code[t][n+1]=1;//表示正确接收 for(j=0;j cout< cout<<"全对"; for(j=0;j cout< } if(! flag) { check_code[t][n+1]=0;//表示两位出错并无法纠正 for(j=0;j cout< cout<<"某两位出错,无法纠正"; for(j=0;j cout<<'*';//*表示无法正确识别的码元 } cout< } } /*********************************译码模块*********************************/ //利用汉明码译码 voidHMCoding: : Decoding() { cout<<"("< "< for(i=0;i { for(j=0;j cout< } cout< } //利用增余汉明码译码 voidHMCoding: : Decoding_Z() { cout<<"("< *表示无法识别的码元): "< for(i=0;i { if(check_code[i][n+1]==1) { for(j=0;j cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汉明码 实验 报告 C+ 源码