汉明码实验报告Word文档下载推荐.docx
《汉明码实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汉明码实验报告Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
/*对汉明码进行编码效率分析*/
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["
vvrvv"
]["
vvnvv"
]:
v<
endl;
H=newint*[叶1];
//初始化(n,k)汉明码监督矩阵
for(i=0;
i<
r+1;
i++)
H[i]=newint[n+1];
r;
for(j=0;
j<
n;
j++)
cin>
>
H[i][j];
//初始化增余项
j<
n+1;
H[r][j]=1;
H[i][n]=0;
//为X分配存储单元
X=newint[n+1];
X[j]=0;
Get_H_Column();
〃获取监督矩阵的每一列
Get_H_Column_Z();
〃进一步获取增余监督矩阵的每一列
}
〃获取监督矩阵的每一列,用于汉明码校码
voidHMCoding:
Get_H_Column()
{一一
stringtemp;
H_Column=newstring[n+1];
i<
{
temp="
;
if(!
H[j][i])temp+='
0'
else
temp+='
1'
H_Column[i]=temp;
}_
H_Column[n]="
000"
〃获取增余监督矩阵的每一列,用于增余汉明码校码
Get_H_Column_Z()
{~~~
H_Column_Z=newstring[n+2];
H_Column_Z[i]=H_Column[i]+'
H_Column_Z[n+1]="
0000"
Show_H(intx,inty)
{_
x;
jvy;
cout<
H[i][j]<
Get_G()
G=newint*[k];
k;
G[i]=newint[n];
if(i==j)
G[i][j]=1;
else
G[i][j]=0;
G[j][i+k]=H[i][j];
Show_G(intx,inty)
Get_G();
y;
j++)cout«
G[i][j]vv"
cout«
HM_Efficiency_Analysing()
码的
对("
*<
,"
)汉明码的评价如下:
("
vvnvv"
vvkvv"
E=k/n*100%="
vvk*1.0/n*100<
v"
%"
vvendl;
n<
,"
)
P=n*(n-1)*Pe*Pe="
n*(n-1)*Pe*Pe<
/*********************************
*********************************/
〃二进制序列合理性检测
intHMCoding:
Binary_Str_Check(stringtemp)
intflag=1;
//先假设输入的消息串不含除0、1外的字符
for(inti=0;
temp[i]!
='
\0'
(temp[i]=='
||temp[i]=='
)){
flag=0;
break;
}returnflag;
〃汉明码编码
Encoding()
A:
stringbinary_str;
intflag;
intbinary_num=0;
coutvv"
请输入待编码的二进制序列:
cin>
binary_str;
flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
binary_num++;
/*统计输入的二进制序列所含码元个数*/
if(binary_num%k!
=O&
&
flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/
您输入的二进制序列存在冗余,请重新输入!
\n"
gotoA;
if(binary_num%k!
!
flag)
您输入的二进制序列存在冗余且含除0、1外的字符,请重新
输入!
if(binary_num%k==0&
您输入的二进制序列含除0、1外的字符,请重新输入!
gotoA;
code_str="
for(i=O;
binary_num;
i=i+k)
for(j=O;
j++)/*获取k位信息元*/
if(binary_str[i+j]=='
O'
X[j]=O;
X[j]=1;
inttemp;
stringpartial_str="
for(intt=O;
t<
n;
t++)
{/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元
码组*/
temp=O;
temp+=X[j]*G[j][t];
if(temp%2==O)
partial_str+='
code_str+=partial_str;
}一一
进行("
vv*v"
)汉明码编码后的二进制序列为:
vcode_strvvendl;
计算机科学与工程系
竺
Encoding_Z()
{_code_str="
A_Z:
stringbinary_str;
intbinary_num=O;
=0&
flag)/*序列所含码元个数不是k的整数倍,无法
全部编码*/
gotoA_Z;
gotoA_Z;
ivbinary_num;
jvk;
for(intt=0;
tvn;
码组*/temp=O;
for(j=0;
j++)temp+=X[j]*G[j][t];
if(temp%2==0){partial_str+='
X[j+k]=O;
}else{partial_str+='
X[j+k]=1;
//生成增余汉明码最后一位
//监督规则:
对原汉明码所有n个码元取模2和
intsum=0;
sum+=X[j];
if(sum%2==0)
n+1<
,"
)增余汉明码编码后的二进制序列为:
<
code_str<
/*********************************校*********************************/
〃利用汉明码校码
Checking()
B:
stringbinary_str;
请输入待译的二进制序列:
if(binary_num%n!
flag)/*序列所含码元个数不是n的整数倍,无法全部译码*/
gotoB;
if(binary_num%n!
flag){_
if(binary_num%n==0&
gotoB;
code_num=binary_num/n;
/统计n元码组的个数
check_code=newint*[code_num];
code_num;
check_code[i]=newint[n];
{/*每次取n个码元进行校正*/
j++){
check_code[i][j]=binary_str[i*n+j]-'
}Get_Judge_Result();
〃利用增余汉明码校码
Checking_Z()
B_Z:
stringbinary_str;
if(binary_num%(n+1)!
flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/-
gotoB_Z;
if(binary_num%(n+1)!
flag)
if(binary_num%(n+1)==0&
code_num_z=binary_num/(n+1);
/统计n+1元码组的个数
check_code=newint*[code_num_z];
code_num_z;
check_code[i]=newint[n+2];
{/*每次取n+1个码元进行校正*/
check_code[i][j]=binary_str[i*(n+1)+j]-'
Get_Judge_Result_Z();
}一一一
〃获取汉明码校码结果
Get_Judge_Result()
stringpartial_str;
("
)汉明码校码结果如下:
endl;
码组状态校正后
tvcode_num;
partial_str="
ivr;
temp=0;
jvn;
temp+=H[i][j]*check_code[t][j];
if(temp%2==0)
//对partial_str进行判断for(i=0;
i++){
if(H_Column[i]==partial_str){一一flag=1;
break;
if(flag&
n)〃表示第i个码元出错,将其改正
check_code[t][j];
第"
i+1<
位错,可纠正"
check_code[t][i]=(check_code[t][i]+1)%2;
//1变0,0变1for(j=0;
i==n)〃表示全对
j++)cout<
全对"
〃获取增余汉明码校码结果
Get_Judge_Result_Z()
{一一一
("
)增余汉明码校码结果如下(注:
*表示无法识别的码元):
jvn+1;
//对partial_str进行判断
n+2;
if(H_Column_Z[i]==partial_str)
{~~一
flag=1;
n+1)〃表示第i个码元出错,将其改正
check_code[t][n+1]=1;
〃表示正确接收for(j=0;
位错,可纠正
i==n+1)//表示全对
check_code[t][n+1]=0;
〃表示两位出错并无法纠正for(j=0;
某两位出错,无法纠正"
coutvv'
*'
//*表示无法正确识别的码元
〃利用汉明码译码
Decoding()
)汉明码译码结果为:
for(i=0;
check_code[i][j];
}cout«
〃利用增余汉明码译码
Decoding_Z()
表示无
n+1vv"
)增余汉明码译码结果为(注:
*法识别的码元):
{一一if(check_code[i][n+1]==1)
}else{for(j=0;
'
GOTO_HMCding_Z()
charchoice仁'
\n***************欢迎进入("
"
)增余汉明
码编码/校码/译码系统****************\n"
由汉明监督矩阵导出的增余监督矩阵H["
叶1vv"
vvn+1<
]
为: