标签:依次 string getc put 函数 ring 查看 temp 读一行
由于笔者目前正在上计算机网络的课,老师要我们编一下crc的循环检测过程,所以我想着刚好在学c,那就随便看看写不写的了,首先百度了一下网上资料,基本都是用位移运算符实现的,由于本人懒得去看一下位移运算,就用数组存储1,0,凑合一下,采用元素整体往前移1位的思想,看看能不能实现,最后似乎是写出来了,但是写的很杂乱。别人用几十行写的,用了位移运算符,我没用,而是用其它方式实现,写了几百行,虽然说几百行,里面的代码复用率也很高了,没有去封装成一个函数来调用是本次实验的一大不足。现在就在此记录一下我的浅陋的代码,供我以后查看。
如被各位前辈看到,就当没看见吧,因为实在惨不忍睹……
#include "stdio.h" #include <string.h> #define max 50 char data[max]; int data_10[max];//定义是数据的10进制数组 int data_2[max];//定义数据的2进制数组 int redata_2[max];//定义加上余数的数据的2进制数组 int data_2_del[max];//定义保存除数的2进制数组 int data_2_yushu[max];//定义保存余数的2进制数组 int i, sum_10;//sum_10是10进制数组里面各个数字的和 int strLength;//定义数据长度 int strLength_2;//定义数据二进制长度 int restrLength_2;//定义拼接余数的数据二进制长度 int strLength_del;//定义除数二进制长度 int x, n, index = 0;//定义x,用来接收十进制和sum_10 int pow(int a, int b);//定义乘方函数 int input();//定义输入函数 void change_two();//定义转二进制函数 void div_2();//定义模2运算 int main() { input();//输入函数 change_two();//数据转二进制 div_2(); } //乘方函数 int pow(int a, int b) { int SUM=1; for (int i = 1; i <= b;i++) { SUM= a * SUM; } return SUM; } //定义输入函数 int input() { printf("请输入一组数据:"); //这里使用gets才可以计算空格的字符串长度,使用scanf的话,遇到空格就结束了,而gets一次读一行。确保使用strlen时计算正确 gets(data); for (i = 0; i < 50; i++) {//因为ASCII码就是以10进制的方式表示的,所以直接赋值给整型数组 data_10[i] = data[i]; } //获取字符数组里面的存储长度,赋值给strLength strLength = strlen(data); printf("字符串的长度为:%d\n", strLength); printf("您输入的字符对应的ASCII码为:"); for (i = 0; i < strLength; i++) { printf("%d,", data_10[i]); //将字符数组存储到整型数组里面,再逐个输出 sum_10 = sum_10 + data_10[i]; } return 1; } //定义十进制转二进制的函数 void change_two() { x = sum_10; n = 2; int data_2_zhenxu[50]; for (i = 0; i < 50; i++) { data_2[i] = 0;//初始化数据data,使其全部为0 } printf("\AsCII码总和为:%d,对应的%d进制为:", x, n); // n=2,表示二进制 while (x > 0) { data_2[index] = x % n; x = x / n; index++; } int Index = index; for (i = 0; i <= Index - 1; i++) { data_2_zhenxu[i] = data_2[index-1]; index--; } for (i = 0; i <=Index - 1; i++) { data_2[i] = data_2_zhenxu[i]; } for (i = 0; i <= Index - 1; i++) { redata_2[i] = data_2_zhenxu[i]; } for (i = 0; i <=Index - 1; i++) printf("%d", data_2[i]); strLength_2 = Index; printf("\n"); } //模2运算,采用数组方式存储1,0数字 /*1.进行模二运算前,先比较除数长度,必须小于输入的数据长度才可以运算 *2.每次运算数据的二进制长度都-1,然后依次比较数组的第一位到第strLength_del位,strLength_del是除数的二进制个数 *3.输出计算后的余数,再拼接到原数据上 *4.用拼接后的数据的二进制数再次于除数做模二运算,若余数为0,输出数据结果正确 */ void div_2() { /*for (i = index - 1; i >= 0; i--) printf("%d", data_2[i]);*/ restrLength_2 = strLength_2; int Max = max;//把50赋值给Max int z; int *tempdata;//为什么定义整型指针来实现整型数组 int tempArry[max]; printf("请输入除数的二进制数个数(请观察数据的二进制长度,必须长度小于数据的长度):"); scanf("%d", &z); tempdata = (int*)malloc(sizeof(int)*z); getchar(); for (i = 0; i < z; i++) { printf("\n请输入第%d个数字:", i + 1); scanf("%d", &tempdata[i]); getchar(); } printf("您输入的二进制为:"); for (i = 0; i < z; i++) { printf("%d", tempdata[i]); } for (int i = 0; i <z; i++) { data_2_del[i] = tempdata[i]; } strLength_del = z; for (i = strLength_2; i < (strLength_2 + z-1); i++) { data_2[i] = 0; } int hmy = (strLength_2 + z ); printf("\n重新生成后的数据为:"); for (i = 0; i < (strLength_2 + z - 1); i++) { printf("%d", data_2[i]); } printf("\n除数二进制位长度:%d\n", strLength_del); printf("除数二进制位:"); for (int i = 0; i < strLength_del; i++) { printf(":%d", data_2_del[i]); } for (int i = 0; i < strLength_del; i++) { tempArry[i] = 0; } if (strLength_del > (strLength_2 + z )) { printf("除数不合法,请重新输入!\n"); div_2(); } else { printf("下面开始进行模二运算!\n"); printf("----------------------------------------------\n"); while (hmy >=strLength_del) { int strLength_del2 = strLength_del ; int dataSum = 0;//定义数据前几位拼成的整型数据大小; int del_Sum = 0;//定义除数前几位拼成的整型数据大小 //每次进行模2运算前,都要比较前几位拼成的整数大小 for (int j = 0; j < strLength_del; j++) { strLength_del2--; dataSum += data_2[j] * pow(10, strLength_del2); del_Sum += data_2_del[j] * pow(10, strLength_del2); printf("strLength_del2=%d\n", strLength_del2); printf("datasum=%d,delsum=%d\n", dataSum, del_Sum); } /*printf("datasum=%d,delsum=%d", dataSum, del_Sum);*/ if (dataSum >= 0) { int count = 0; for (; count < strLength_del; count++) { if (data_2[count] == data_2_del[count]) { data_2[count] = 0; if ((count+1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { data_2[i] = data_2[i + 1];//数组数据前移 } Max--; hmy--;//数据实际长度-1 printf("测试\n"); } } else { data_2[count] = 1; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { data_2[i] = data_2[i + 1]; } Max--; hmy--;//数据实际长度-1 printf("测试\n"); } } }// } else { /*printf("datasum<del_sum;");*/ int count = 0; for (; count < strLength_del; count++) { if (tempArry[count] == data_2_del[count]) { data_2[count] = 0; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { data_2[i] = data_2[i + 1];//数组数据前移 } Max--; hmy--;//数据实际长度-1 printf("测试\n"); } } else { data_2[count] = 1; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { data_2[i] = data_2[i + 1]; } Max--; hmy--;//数据实际长度-1 printf("测试\n"); } } }// } } //输出余数二进制 for (int i = 0; i < max; i++) { data_2_yushu[i] = data_2[i]; } printf("余数二进制为:"); for(i=0;i< strLength_del-1;i++) printf("%d", data_2_yushu[i]); } int j; int HMY = restrLength_2 + z; for (i = (restrLength_2),j=0; i < (restrLength_2+z-1);j++, i++) { redata_2[i] = data_2_yushu[j]; } printf("拼上余数后的数据为:"); for (i = 0; i < (restrLength_2+z-1); i++) { printf("%d",redata_2[i]); } printf("\n除数二进制位:"); for (int i = 0; i < strLength_del; i++) { printf(":%d", data_2_del[i]); } printf("/n下面进行循环冗余检测:/n"); printf("***************************************************\n"); while (HMY>= strLength_del) { int strLength_del2 = strLength_del; int dataSum = 0;//定义数据前几位拼成的整型数据大小; int del_Sum = 0;//定义除数前几位拼成的整型数据大小 //每次进行模2运算前,都要比较前几位拼成的整数大小 for (int j = 0; j < strLength_del; j++) { strLength_del2--; dataSum += redata_2[j] * pow(10, strLength_del2); del_Sum += data_2_del[j] * pow(10, strLength_del2); printf("strLength_del2=%d\n", strLength_del2); printf("datasum=%d,delsum=%d\n", dataSum, del_Sum); } /*printf("datasum=%d,delsum=%d", dataSum, del_Sum);*/ if (dataSum >= 0) { int count = 0; for (; count < strLength_del; count++) { if (redata_2[count] == data_2_del[count]) { redata_2[count] = 0; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { redata_2[i] = redata_2[i + 1];//数组数据前移 } Max--; HMY--;//数据实际长度-1 printf("测试\n"); } } else { data_2[count] = 1; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { redata_2[i] = redata_2[i + 1]; } Max--; HMY--;//数据实际长度-1 printf("测试\n"); } } }// } else { /*printf("datasum<del_sum;");*/ int count = 0; for (; count < strLength_del; count++) { if (tempArry[count] == data_2_del[count]) { redata_2[count] = 0; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { redata_2[i] = redata_2[i + 1];//数组数据前移 } Max--; HMY--;//数据实际长度-1 printf("测试\n"); } } else { redata_2[count] = 1; if ((count + 1) % strLength_del == 0) { for (int i = 0; i < Max - 1; i++) { redata_2[i] = redata_2[i + 1]; } Max--; HMY--;//数据实际长度-1 printf("测试\n"); } } }// } } int crcSum = 0; printf("检测后的数据为:"); for (i = 0; i < max; i++) { printf("%d", redata_2[i]); crcSum += redata_2[i]; } if (crcSum==0) { printf("\n"); printf("\nCRC检测无误!><!!!!!!!!!"); } }
标签:依次 string getc put 函数 ring 查看 temp 读一行
原文地址:https://www.cnblogs.com/hmy-666/p/11967236.html