计组4117301田志阳.docx
- 文档编号:25945166
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:16
- 大小:141.37KB
计组4117301田志阳.docx
《计组4117301田志阳.docx》由会员分享,可在线阅读,更多相关《计组4117301田志阳.docx(16页珍藏版)》请在冰豆网上搜索。
计组4117301田志阳
实验四数据的校验(两学时)
专业班级:
软工1512
姓名:
田志阳
学号:
2015117301
任课教师:
王峰
1.了解数据的校验机制。
*2.掌握海明码校验实施过程(选做)。
*3.掌握循环冗余码校验实施过程(选做)。
2、实验要求:
1.设计一个程序模拟奇偶校验实施过程(提示:
主函数、发送函数、传输函数、校验函数)。
*2.设计一个程序模拟海明码校验实施过程(提示:
主函数、发送函数、传输函数、校验函数、纠错函数)。
*3.设计一个程序模拟循环冗余码校验实施过程(提示:
主函数、发送函数、传输函数、
校验函数、纠错函数)。
3、实验报告:
给出源程序和执行结果。
1、设计一个程序模拟奇偶校验实施过程(提示:
主函数、发送函数、传输函数、校验函数)。
#include
#include
#include
voidproduct();//产生一个随机的八位二进制的数
voidtrans();//设置传输出错一位或者没有出错的情况
voidpop();//判断有无出错的情况
intp1,p2;
inta[8]={0};
intmain()
{
product();//产生一个随机的八位二进制的数
trans();//设置传输出错一位或者没有出错的情况
pop();//判断有无出错的情况
return0;
}
voidproduct()
{
inti,data;
intcount1=0;
srand((unsigned)time(0));
data=0+rand()%128;//产生0-127的随机数
printf("随机的产生一个128以内的十进制数为%d\n",data);
for(i=0;i<7;i++)//在数组内循环
{
a[i]=data%2;
data=data/2;
}
for(i=0;i<7;i++)
{
if(a[i]==1)
count1++;
}
if(count1%2==0)//奇校验奇数个1校验位为0,偶数个1为1
a[7]=1;
else
a[7]=0;
p1=a[7];
printf("初始二进制校验位放在最高位它为:
%d\n",p1);
printf("产生随机二进制数为");
/*
while(i>=0)
printf("%d",a[--i]);*/
for(i=7;i>=0;--i)
{
printf("%d",a[i]);
}
printf("\n");
}
voidtrans()
{
inti;
srand((unsigned)time(0));
i=0+rand()%9;//产生0-8的随机数
if(i==0)
printf("机器内部设置传输过程中没有出错\n");
else
{
a[i-1]=(a[i-1]==0)?
1:
0;
printf("传输过程将机器内部的数据进行了一位改动,改动位为%d\n",i);
}
}
voidpop()
{
inti,count2=0;
printf("接收数据为:
");
for(i=7;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
//求接收数据的偶校验位
for(i=6;i>=0;i--)
{
if(a[i]==1)
count2++;
}
if(count2%2==0)
p2=1;
else
p2=0;
printf("接收数据计算出的校验位为:
%d\n",p2);
if(p2!
=a[7])
printf("通过校验位P1与P2的比较得出传输过程中数据出错了。
\n");
else
printf("通过校验位P1与P2的比较得出在传输的过程中数据没有出错!
\n");
}
2、海明码的校验程序
源代码为:
#include
#include
#include
//N代表待编码数据的上限位数?
#defineN100
intHmLength(intk);//计算海明码校验位位数?
voidInCode(char*data,char*c,intk,intr);//计算海明码每个校验位的数值?
?
intmain()
{
intk=0,r=0,dnum=0,cnum=0;
chardata[N];
charc[N];
//clrscr();
printf("NowpleaseinputthedatayouwanttoIncode:
");
for(k=0;k { data[k]=getche(); if(data[k]! ='0'&&data[k]! ='1') { break; } } printf("\n__________________________________________________________\n"); r=HmLength(k);//求取校验位数 printf("k=%dr=%dThelengthofHammingcode=%d\n",k,r,r+k);//输出海明码相关位数信息 InCode(data,c,k,r);//计算海明码 printf("TheHammingcodeis: "); for(intj=1;j { if(j==(int)pow(2,cnum)) { printf("%c",c[cnum]); cnum++; } else { printf("%c",data[dnum]); dnum++; } } getch(); }/* *@func: 计算校验码 *@param: data待编码数据,c校验码,k数据长度,r校验码位数*codebyzxf*/ voidInCode(char*data,char*c,intk,intr) { for(inti=0;i { intsum=0,dnum=0,cnum=0; for(intj=1;j { if(j==(int)pow(2,cnum))//去掉矩阵的全零行 { cnum++;//记录校验码循环位数 } else { intx=0,y=0; x=pow(2,i); y=j%(x*2); x=y/x;//通过取余取商计算获取矩阵第r-i列第j行元素的值 sum+=data[dnum]*x;//累加乘积 dnum++;//记录数据的循环位数 } } c[i]=sum%2==0? '0': '1';//通过结果的奇偶设置校验位的值 } } /* *@func: 计算校验码的位数*@param: k数据长度*@return: 校验码位数*codebyzxf*/ intHmLength(intk) { intr=0,flag=1; while(flag! =0)//循环到2^r-1>=r+K时即得到校验码的位数 { inttemp=0; temp=pow(2,r); temp=temp-1; flag=(temp-r-k<0); r++; } returnr-1; } 3、设计一个程序模拟循环冗余码校验实施过程(提示: 主函数、发送函数、传输函数、 源代码为: #include #include #include //N代表待编码数据的上限位数 #defineN100 voidInputBinary(char*data);//输入二进制 intDelZero(char*data);//去掉二进制字符串前面的零位 intDiv(char*data,char*div);//进行一次模2除法 intmain(){ chardatacpy[N]; chardata[N]; chardiv[N]; charres[N]; intreslen=0; printf("nowpleaseinputthedata: "); InputBinary(data);//输入M printf("\nnowpleaseinputthediv: "); InputBinary(div);//输入除数 DelZero(data); DelZero(div);//取得有效的M和除数 strcpy(datacpy,data);//备份M printf("\nTheeffectivedatais: %s",data); printf("\nTheeffectivedivis: %s",div); for(inti=0;i { data[strlen(data)]='0'; } data[strlen(data)]='\0'; res[reslen]='0'; while(Div(data,div))//进行模2除法 { inti=DelZero(data); res[reslen]='1';//记录商 reslen++; if(strlen(data)>=strlen(div))//记录零商 { for(intj=0;j { res[reslen]='0'; reslen++; } } } res[reslen]='\0'; while(strlen(data) { for(inti=strlen(data);i>0;i--) { data[i]=data[i-1]; } data[0]='0'; } //输出结果 printf("\n_______________________________________________________________"); printf("\nThedivresultis: %s",res); printf("\nTheFCSis: %s",data); printf("\nThedatawishFCSis: %s%s",datacpy,data); getch();} /* *@func: 二进制输入 *@param: data用于存储输入数据的字符串*codebyzxf*/ voidInputBinary(char*data) { for(inti=0;i { data[i]=getche(); if(data[i]! ='0'&&data[i]! ='1') { data[i]='\0'; break; } } }/* *@func: 删除二进制串的起始'0'*@param: data待处理字符串*@return: 返回删除零的个数-1*codebyzxf*/ intDelZero(char*data) { intres=-1; while(data[0]=='0')//如果data第一位为'0'继续前移字符串 { for(inti=0;i { data[i]=data[i+1]; } res++; } returnres; } /* *@func: 进行一次模2除法 *@param: data被除数,div除数 *@return: 返回0: 被除数小于除数,返回1: 成功进行了一次模2除法*codebyzxf*/ intDiv(char*data,char*div) { intres=0; if(strlen(data) else { for(inti=0;i { data[i]=data[i]==div[i]? '0': '1'; } res=1; } returnres; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 4117301 田志阳