| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 304 人关注过本帖
标题:请教下这个用C写的海明码算法错在哪了?
只看楼主 加入收藏
原野过客
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-4-15
收藏
 问题点数:0 回复次数:2 
请教下这个用C写的海明码算法错在哪了?
请教下这个用C写的海明码算法错在哪了?

#include <stdio.h>
#include <malloc.h>
#include <math.h>
#define M 100
#include <dos.h>
 struct node{
 int pLocation;
 struct node *next;
};//存放有数据为关联的校验位的节点信息

 struct data{
 int value;
 struct node *next;
}D[M];//存放数据位信息

 struct pdata{
  int value;
 }P[M];//存放校验位信息

 struct Hamming{
 int flag;
 int value;
}H[2*M];//存放海明码信息

int C[M];//存放检验位信息
int DC=0,PC=0,EC=0,HC=0,ERROR=0,ERROR1=0;//DC是数据的位数,PC是校验位的位数,不能在此更改这些数据的值,否则出错
showInf(){//显示信息
 printf("-------------------------------------------------------------------------------\n");
 printf("*****************************************海明码********************************\n");
 printf("***************************************输入格式如下:***************************\n");
 printf("*****************************如果要输入1101,需输入 1 1 0 1 2******************\n");
 printf("-----------------------------选择操作:----------------------------------------\n");
 printf("1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
  printf("请选择操作,只能输入一个数: ");

}
int inputData(){//返回输入的数据位数
  int data,i=0;
  scanf("%d",&data);
  if(data !=0&&data!=1){
  printf("\n输入格式不正确,第一位只能是0或1,请重新选择操作\n\n");
  return -1;
  }
  do{
  D[++i].value = data;
  D[i].next=NULL;
  scanf("%d",&data);
  }while(data!=2);
  return i;
}
inputHammingCode(){//输入海明码,把校验位存在校验数组中,把数据位存在海明码数组中,
 int p=1,m =1,data=1,h=1,d=1;
 scanf("%d",&data);
 if(data !=0&&data!=1){
  ERROR=1;//当输入的格式不正确时,会给据ERROR的值给出提示信息
  return ;
  }
 while(data!=2){
  if(h ==pow(2,m-1)){
  P[p++].value = data;
  H[h++].flag = 1;
  m++;
  PC++;
  }
  else{  
  D[d++].value=data;//把数据放到数据的结构体中,再求校验位的值时,会用到数据的结构体中的值,相关联的值互相异或
  H[h].flag=0;
  H[h++].value = data;
  D[DC++].next = NULL;
  }
  scanf("%d",&data);
 }
 if(PC+DC<3)
  ERROR=2;
}
int caculatePNum(int dc){//计算校验位的个数
 int pc=1;
 while(pow(2,pc)<pc + dc + 1)
  pc++;
 return pc;
}
caculateDNext(int dc,int pc){//计算每个数据位都与那些校验位有关,并通过单链表存储
  float temp;
  int i,k,m,n;
  struct node *p,*q;
  m=3;
  for(i = 1; i<=dc;i++){
  p=(struct node*)malloc(sizeof(struct node));
  D[i].next = p;//头结点
  for(n=pc;n>=1;n--)
  if(pow(2,n-1)<m){
  temp = pow(2,n-1);
  q=(struct node*)malloc(sizeof(struct node));
  q->pLocation=n;
  p->next=q;
  p = p->next;
  break;
  }  
  for(k=n;k>=1;k--){
  if(temp + pow(2,k-2)<m){
  temp = temp + pow(2,k-2);
  q=(struct node*)malloc(sizeof(struct node));
  q->pLocation=k-1;
  p->next=q;
  p = p->next;
  }
  if(temp + pow(2,k-2)==m){
  q=(struct node*)malloc(sizeof(struct node));
  q->pLocation=k-1;
  p->next=q;
  q->next = NULL;
  p=p->next;
  break;
  }
  }
  for(k = m+1; k<= pc + dc;k++){
  if(H[k].flag==0){
  m=k;
  break;
  }
  }   
  }
}
initialize(int dc,int pc){//单独输入数据时,对一些结构的初始化
  int i,k;
 for(i=1;i<=pc + dc;i++)
  H[i].flag = 0;
  for(i = 1; i<=pc ;i++){
  k=(int)pow(2,i-1);
  H[k].flag = 1;//1表示海明码数组的当前位置放的是校验码  
  }
/* www. */  
}
caculateHPValue(int dc,int pc){//计算校验位的值并把它存入海明码结构体数组中
 int i,k,temp=0,m;
 struct node *p;
 for(i = 1; i<=pc; i++){
  temp=0;
  for(k = 1; k<=dc; k++){
  p=D[k].next->next;
  while(p!=NULL){
  if(p->pLocation == i){
  temp = temp ^ D[k].value;
  break;
  }
  p=p->next;
  }
  }  
  m=(int)pow(2,i-1);
  H[m].value = temp;//输入P[i]的内容
 }
}
caculateC(int pc){//计算检验位的值
  int i,k;
  for(i=1;i<=pc;i++){
  k = (int)pow(2,i-1);
  C[i] = P[i].value^H[k].value;
  }
}
inputHDvalue(int dc,int pc){//把输入的数据放到海明码结构体中
 int i,j=1,m=3;
 for(i=m;i<=dc+pc;i++){
  if(H[i].flag==0){
  H[i].value=D[j++].value;
  m=i+1;
  }
 }
}
showHammingCode(int dc,int pc){//输入海明码结构体中的值
  int i;
  printf("\n海明码:\n");
  for(i=1;i<=dc + pc;i++){
  printf("第%d位:",i);
  printf(" %d\n",H[i].value);
  }
 printf("\n");
}
judge(int pc){//判断出哪一位出错
 int i , result =0,flag=0;
 for(i=1;i<=pc;i++){
  if(C[i]==1)
  flag++;
 }
 for(i=1;i<=pc;i++){
  if(flag==0)
  result = result + C[i]*pow(2,pc-i);
  else result = result + C[i]*pow(2,i-1);
 }
 if(result!=0){
  printf("\n\n第%d位出错,",result);
  EC=result;
  if(flag>=2)
  printf("这一位是数据位!\n\n");
  else printf("这一位是校验位!\n\n");
 }
 else printf("\n海明码正确!\n\n");
}
  mend(int hc){
  int i;
 if(EC==0){
  printf("\n海明码正确或者已经纠正或者海明码为空,请重新选择操作\n\n");
  return;
 }
 system("cls");
 printf("海明码第%d位有错误\n\n纠正前的海明码是:\n\n",EC);
 for(i=1;i<=hc;i++)
  printf("第%d位%d\n",i,H[i].value);
 H[EC].value= !(H[EC].value);
 printf("\n纠正后的海明码是:\n\n");
 for(i=1;i<=hc;i++)
  printf("第%d位%d\n",i,H[i].value);
 

}
 run(int command){//运行不同的操作模式
  int i;
  if(command==1){
  printf("\n\n请输入数据,以2做结束符:");
  DC = inputData();//返回输入的数据位数
  if(DC==-1) return ;
  PC= caculatePNum(DC);
  initialize(DC,PC);
  caculateDNext(DC,PC);
  caculateHPValue(DC,PC);
  inputHDvalue(DC,PC);
  showHammingCode(DC,PC);
  HC=PC + DC;
  DC=0;
  PC=0;
  }
  else {
  printf("\n\n请输入海明码,以2做结束符,只能有一位错误:");  
  inputHammingCode();  
  if(ERROR==1||ERROR==2) {
  printf("\n输入格式不正确,第一位只能是0或1,并且输入的位数要大于等于3。请重新选择操作\n\n");
  ERROR=0;
  PC=0;
  return ;
  }
  caculateDNext(DC,PC);
  caculateHPValue(DC,PC);
  caculateC(PC);
  judge(PC);
  HC=PC + DC;
  PC = 0;
  DC = 0;   
  }
 }
void main(){
  int function,flag =1,command,data,errorCount,back=0;
  showInf();
  scanf("%d",&function);
  while(flag){
   
  switch(function){
  case 1: command=1;
  run(command);
  break;
  case 2: command = 2;
  run(command);
  break;
  case 3: system("cls");
  //printf("1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
  break;
  case 4: mend(HC);
  EC=0;
  break;
  case 5: system("cls");
  back = 1;
  break;
  case 6:exit(1);
  default: printf("操作不正确,请重新选择!\n");
  break;
  }
  if(back==1){
  showInf();
  back=0;
  }
  else {
  printf("\n1 输入数据后生成海明码 2 输入海明码 3 清屏 4 纠正海明码 5 返回主页 6 结束程序\n\n");
  printf("请选择操作,只能输入一个数: ");
  }
  scanf("%d",&function);
  }
}

[ 本帖最后由 原野过客 于 2011-4-15 17:07 编辑 ]
搜索更多相关主题的帖子: 信息 include 
2011-04-15 17:06
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:0 
定义这么多函数,基本上没有返回值。

水平不咋地的我来试试吧!

o(∩∩)Linux & Python 群:187367181
2011-04-15 19:17
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:0 


唉~~恕我无能,改到一半,决定抓狂去………………

o(∩∩)Linux & Python 群:187367181
2011-04-15 19:38
快速回复:请教下这个用C写的海明码算法错在哪了?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037224 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved