#include #include void main() { /*G:生成矩阵 H:校验矩阵 HT:校验矩阵对应的转置矩阵*/ /*M:输入信息序列 C:编码输出序列 Input:输入接收码序列 B:译码输出序列 S: 伴随式*/ int Q,N;/*定义开始*/ int i,j,s,r,k,t,p,u,m; int G[3][6]={{1,0,0,1,1,1},{0,1,0,1,1,0},{0,0,1,1,0,1}}; int IR[3][3]={{1,0,0,},{0,1,0},{0,0,1}}; int H[3][6], C[10][6],M[10][3],B[20][6],Input[100],HT[6][3],P[10],S[100][3];/*定义结束*/ printf("\n您好!欢迎使用线性分组码编译器!\n"); printf("\n\n本编译器针对(6,3)码,所采用的生成矩阵G=\n"); for(i=0;i<3;i++) { for(j=0;j<6;j++) printf(" %d",G[i][j]); printf("\n"); } printf("编译码过程都是针对二进制码组,除了系统要求选择功能,其他情况下禁止输入 除0,1以外的数。请在使用的过程中严格按照编译器要求的格式输入数据。\n\n"); printf("现在请输入您所选择的编译器所对应的序号,按回车键继续:\n"); printf("\n1.编码器 2.译码器 3.退出\n"); printf("\n请选择:"); scanf("%d",&Q); if(Q==0) Q+=3; while(Q) { if(Q==1||Q==2||Q==3)break; else { printf("对不起,您输入有误,请重新输入"); scanf("%d",&Q); } } while(Q==1||Q==2||Q==3) { if(Q==1)/*编码程序*/ {printf("\n请输入您需要编码的信息组数"); scanf("%d",&N); printf("\n\n请输入您需要编码的%d组三位二进制信息组,码组间用空格分开, 按回车键确认。\n",N);/*输入信息码*/ printf("\n信息组m="); for(i=0;i2;i--)/*输出编码结果*/ C[j][i]=M[j][i-3]; printf("\n您所输入的信息组编码结果c="); for(j=0;j=0;i--) printf("%d",C[j][i]); printf("\n\n"); printf("\n接下来您想:\n\n");/*选择功能*/ printf("1.用编码器 2.用译码器 3.退出\n\n"); printf("我想:"); scanf("%d",&Q); } else if(Q==2)/*译码程序*/ { for(i=0;i<3;i++)/*求监督矩阵*/ { for(j=0;j<3;j++) H[i][j]=G[j][i+3]; for(j=3;j<6;j++) H[i][j]=IR[i][j-3]; } printf("\n校验矩阵H=\n");/*输出监督矩阵*/ for(i=0;i<3;i++) { for(j=0;j<6;j++) printf(" %d",H[i][j]); printf("\n"); } t=1; while(t!=2)/*输入接收码组*/ { p=1; printf("\n请输入总位数为6的倍数的接收码组,每位用空格隔开,每组位数为6的倍数,以十进制2作为结束标志!按回车键确认\n"); while(p) { for(i=0;;i++) { scanf("%d",&Input[i]); if(Input[i]==2)break; } k=i%6; if(k==0){p=0;t=2;} else { p=1; k=-k+6; printf("您接收到的码组丢失了%d位,系统不能判断丢失位的具体 位置,请重新输入\n",k); } } } u=i/6; i=0; for(r=0;r=0;j--,i++) B[r][j]=Input[i]; } printf("\n将接收码组每六位分为一个码组,如下:\n"); for(i=0;i=0;i--) printf(" %1d",S[j][i]); printf("\n");} printf("\n"); for(i=0;i=0;j--) printf("%1d",B[i][j]); printf("请您再次确认!"); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 2: { B[i][0]=1^B[i][0]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 3: { B[i][1]=1^B[i][1]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 4: { B[i][3]=1^B[i][3]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 5: { B[i][2]=1^B[i][2]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 6: { B[i][3]=1^B[i][3]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 7: { B[i][5]=1^B[i][5]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } case 8: { B[i][5]=1^B[i][5]; printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--; for(j=5;j>=0;j--) printf("%1d",B[i][j]); printf("译出的信息序列为:"); for(j=5;j>2;j--) printf("%d",B[i][j]);break; } } } printf("\n\n总的译码结果为:"); for(i=0;i2;j--) printf("%1d",B[i][j]); printf("\n\n接下来您想:\n\n");/*继续选择功能*/ printf("1.用编码器 2.用译码器 3.退出\n\n"); printf("我想:"); scanf("%d",&Q); if(Q==0) Q=Q+3; while(Q) { if(Q==1||Q==2||Q==3)break; else { printf("对不起,您输入有误,请重新输入"); scanf("%d",&Q); } } } else if(Q==3)/*退出程序*/ { printf("\n谢谢您的使用,欢迎再次使用!\n"); Q=0; } } }