常用C语言算法大集合.docx
- 文档编号:18493501
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:43
- 大小:24.13KB
常用C语言算法大集合.docx
《常用C语言算法大集合.docx》由会员分享,可在线阅读,更多相关《常用C语言算法大集合.docx(43页珍藏版)》请在冰点文库上搜索。
常用C语言算法大集合
常用C语言算法大集合
//CRC校验算法
unsignedcharS[130];//原始数据为128字节,CRC校验2字节
unsignedintCRC()//CRC校验算法(共130字节)
{
unsignedinti,j,m,n,p,q,c=0x1021;
m=S[0]*256+S[1];//首先取两个字节,拼成16位整数,作为基数
for(i=1;i<=64;i++){//其余128字节分64批处理,每批2字节
n=S[2*i]*256+S[2*i+1];//取两个字节,拼成16位整数
for(j=0;j<16;j++){//每批计算16次,每次处理1比特
p=m&0x8000;//保留基数的最高位
q=n&0x8000;//保留当前整数的最高位
m<<=1;n<<=1;//两者均左移一位
if(q)m++;//当前整数的最高位拼入基数
的最低位
if(p)m^=c;//如果基数移出的最高位为1,
则“减去”0x1021
}
}
returnm;//返回校验结果
}
main()
{
inti;
unsignedintc;
for(i=0;i<128;i++)S[i]=i;//设置128字节原始数据
S[128]=S[129]=0;//将最后两个字节设置为零
c=CRC();//进行CRC校验
S[128]=c/256;S[129]=c%256;//将校验结果装入最后两个字节
c=CRC();//再进行CRC校验,结果应该为零
S[4]^=0x20;//引入一个差错
c=CRC();//再进行CRC校验,结果不为零,发现差错
S[6]^=0xff;//再引入8个差错
c=CRC();//再进行CRC校验,结果不为零,发现差错
while
(1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果
}
//8比特汉明码模拟通讯程序
#define N 8 //原始数据的字节数
unsignedcharHM[16]={0x00,0x71,0xB2,0xC3,0xD4,0xA5,0x66,0x17,//编码表
0xE8,0x99,0x5A,0x2B,0x3C,0x4D,0x8E,0xFF};
unsignedcharerr[8]={0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//错误图样
unsignedcharS[N]={0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0};//原始数据
unsignedcharD[2*N];//原始数据的汉明码(发送的内容)
unsignedcharR[N];//解码结果(接收的内容)
voidTRANS( )//编码程序(模拟发送)
{
unsignedcharc1,c2;
inti,j;
for(i=0,j=0;i c1=S[i]/16;//c1为原始数据的高4位 c2=S[i]%16;//c2为原始数据的低4位 D[j++]=HM[c1];//按编码表对c1进行编码 D[j++]=HM[c2];//按编码表对c2进行编码 } } unsignedcharparity(unsignedcharch)//偶校验 { inti; unsignedchark=0; for(i=0;i<8;i++){ if(ch&0x01)k^=0x01; ch>>=1; } returnk; } unsignedcharUNHM(unsignedcharch)//汉明码解码算法 { unsignedcharc,p,q0,q1,q2; p =parity(ch);//保存全字节偶校验结果 q0=parity(ch&0x4d);//对D1、D3、D5、D7进行偶校验 q1=parity(ch&0x2b);//对D2、D3、D6、D7进行偶校验 q2=parity(ch&0x17);//对D4、D5、D6、D7进行偶校验 c=q0|q1<<1|q2<<2;//拼装校验结果,得到错误图样 ch^=err[c];//按错误图样进行纠错 ch&=0x0f;//取出4比特信息内容 if(c&&! p)ch+=0x20;//发现两个差错 returnch; } //将接收到的两字节信息解码拼装为一字节数据 intRECEV()//解码程序(模拟接收) { inti,j,k=1;//初始化解码成功标志 unsignedcharc1,c2; for(i=0,j=0;i c1=UNHM(D[j++]);//解码一字节 if(c1>16){k=0;c1&=0x0f;}//差错判断 c2=UNHM(D[j++]);//再解码一字节 if(c2>16){k=0;c2&=0x0f;}//差错判断 R[i]=c1*16+c2;//拼装为一字节数据 } returnk;//返回解码是否成功的信息 } main() { intf;//解码成功标志 TRANS();//对原始数据进行汉明编码(模拟发送) f=RECEV();//对没有干扰的数据进行解码(模拟接收),f=1,成功. D[5]^=0x20;//在接收数据中制造一比特差错 f=RECEV();//对有干扰的数据进行解码(模拟接收),f=1,成功. D[8]^=0x24;//在接收数据中制造两比特差错 f=RECEV();//对有干扰的数据进行解码(模拟接收),f=0,失败. while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } _//仪器系数自动标定算法。 //标定的结果: //系数: COEFF[3][3]={{4.287,-2.185,-0.1945}, // {-0.3181,10.56,-0.2134}, // {-0.3802,-0.1864,0.3893}} // //本底: cps0[3]={0.2782,0.1101,0.6737} floatformer[5][3]={{137.4,9.61,0.59}, {5.05,284.3,0.37}, {2.43,8.42,5.71}, {118.9,270.9,3.05}, {2.89,7.3,0.9}};//五个模型的含量数据(已知) floatcps[5][3]={{35.396,2.828,37.787}, {17.154,28.164,31.537}, {2.236,1.313,17.828}, {45.424,28.446,66.166}, {1.543,0.919,4.608}};//五个模型的测量数据(已知) floatcoef[3][3]; //9个小写字母系数(中间数据) floatCOEFF[3][3]; //9个大写字母系数(待标定) floatcps0[3]; //3个本底计数率(待标定) floatA[3][3];//存放三元一次方程组的系数矩阵 floatB[3];//存放三元一次方程组的常数项 floatX[3];//存放三元一次方程组的解: X1=1.537067,X2=- 0.896159,X3=3.592657 floatDETA()//行列式计算 { return(A[0][0]*A[1][1]*A[2][2]+A[1][0]*A[2][1]*A[0][2]+A[2][0]*A[0] [1]*A[1][2] -A[2][0]*A[1][1]*A[0][2]-A[0][0]*A[2][1]*A[1][2]-A[1][0]*A[0][1]*A [2][2]); } voidswap(intk)//常数项与k列系数交换 { inti; floatt; for(i=0;i<3;i++){ t=B[i]; B[i]=A[i][k]; A[i][k]=t; } } voidXYZ()//求解三元一次方程组 { floatd; d=DETA();//求系数行列式的值 swap(0);//将x1的系数与常数项交换 X[0]=DETA()/d;//解出x1 swap(0);//恢复原来的系数与常数项 swap (1);//将x2的系数与常数项交换 X[1]=DETA()/d;//解出x2 swap (1);//恢复原来的系数与常数项 swap (2);//将x3的系数与常数项交换 X[2]=DETA()/d;//解出x3 swap (2);//恢复原来的系数与常数项 } voidRTK(intk)//求解第k行的3个小写字母系数 { inti,j; for(i=0;i<3;i++)//准备方程组的系数 for(j=0;j<3;j++)A[i][j]=former[i][j]; for(i=0;i<3;i++)B[i]=cps[i][k]-cps0[k];//准备方程组的常数项 XYZ();//解出3个小写字母系数 for(i=0;i<3;i++)coef[k][i]=X[i];//保存3个小写字母系数 } voidconv()//将9个小写字母系数转换成9个大写字母系数 { floatd; inti,j; for(i=0;i<3;i++)//取9个小写字母系数 for(j=0;j<3;j++)A[i][j]=coef[i][j]; d=DETA();//求系数行列式的值 COEFF[0][0]=(A[1][1]*A[2][2]-A[2][1]*A[1][2])/d;//计算9个大写字母系数 COEFF[0][1]=(A[2][1]*A[0][2]-A[0][1]*A[2][2])/d; COEFF[0][2]=(A[0][1]*A[1][2]-A[0][2]*A[1][1])/d; COEFF[1][0]=(A[1][2]*A[2][0]-A[1][0]*A[2][2])/d; COEFF[1][1]=(A[0][0]*A[2][2]-A[2][0]*A[0][2])/d; COEFF[1][2]=(A[1][0]*A[0][2]-A[0][0]*A[1][2])/d; COEFF[2][0]=(A[1][0]*A[2][1]-A[1][1]*A[2][0])/d; COEFF[2][1]=(A[0][1]*A[2][0]-A[0][0]*A[2][1])/d; COEFF[2][2]=(A[0][0]*A[1][1]-A[0][1]*A[1][0])/d; } main() { inti,j,k=1; floatc; for(i=0;i<3;i++)cps0[i]=0;//3个本底计数率初始化为0。 for(i=0;i<5;i++){ //进行5次迭代运算。 for(j=0;j<3;j++)RTK(j);//计算9个小写字母系数 for(j=0;j<3;j++) //计算零值模型各道的净计数率 B[j]=coef[j][0]*former[4][0]+ coef[j][1]*former[4][1]+coef[j][2]*former[4][2]; for(j=0;j<3;j++)cps0[j]=cps[4][j]-B[j];//计算各道的本底 计数率 } conv();//将9个小写字母系数转换成9个大写字母系数。 for(i=0;i<3;i++) //计算混合模型各元素的含量 B[i]=COEFF[i][0]*(cps[3][0]-cps0[0])+ COEFF[i][1]*(cps[3][1]-cps0[1])+COEFF[i][2]*(cps[3][2]- cps0[2]); c=former[3][0]/B[0]; if(c<0.96||c>1.04)k=0;//铀含量误差超过百分之四,标定失败 c=former[3][1]/B[1]; if(c<0.94||c>1.06)k=0;//钍含量误差超过百分之六,标定失败 c=former[3][2]/B[2]; if(c<0.88||c>1.12)k=0;//钾含量误差超过百分之十二,标定失败 while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } //能剔除粗大误差样本的统计算法。 #include #defineN 200 //初始样本个数 floatd[N]={1.807,1.731,1.813,1.818,1.816,1.721,1.687,1.704,1.678,1.675,//初始 样本数据 1.828,1.703,1.760,1.798,1.770,1.749,1.757,1.769,1.766,1.771, 1.778,1.706,1.739,1.725,1.706,1.786,1.716,1.702,1.806,1.738, 1.806,1.722,1.680,1.736,1.824,1.671,1.780,1.668,1.831,1.682, 1.733,1.757,1.761,1.778,1.798,1.775,1.727,1.754,1.786,1.801, 1.683,1.753,1.714,1.809,1.683,1.656,1.694,1.656,1.736,1.767, 1.693,1.779,1.822,1.742,1.744,1.843,1.762,1.732,1.739,1.844, 1.720,1.660,1.773,1.841,1.694,1.801,1.854,1.852,1.736,1.747, 1.766,1.721,1.710,1.719,1.831,1.648,1.649,1.793,1.746,1.858, 1.748,1.770,1.742,1.776,1.793,1.795,1.707,1.763,1.803,1.664, 1.761,1.824,1.678,1.691,1.729,1.783,1.631,1.639,1.822,1.754, 1.743,1.732,1.714,1.719,1.811,1.766,1.676,1.750,1.847,1.631, 1.867,1.753,1.780,1.784,1.694,1.806,1.751,1.821,1.730,1.690, 1.750,1.771,1.791,1.870,1.599,1.734,1.778,1.738,1.831,1.889, 1.728,1.761,1.764,1.800,1.673,1.896,1.714,1.787,1.792,1.697, 1.651,1.762,1.786,1.733,1.803,1.210,1.350,1.110,1.749,2.350, 1.748,1.766,1.793,1.788,1.744,1.777,1.728,1.717,1.719,1.760, 1.771,1.753,1.711,1.703,1.780,1.711,1.720,1.788,1.833,1.739, 1.727,1.765,1.727,1.762,1.780,1.752,1.708,1.699,1.795,1.689, 1.806,1.702,1.721,1.744,1.732,1.746,1.792,1.800,1.711,1.769}; int n;//当前有效样本个数(最终结果为196个) floatave;//平均值(最终结果为1.7517) floats;//方差(最终结果为0.0535) floataverg()//计算平均值 { inti; floatsum; for(i=0,sum=0;i returnsum/n; } floattjs()//计算方差 { inti; floatsum,c; for(i=0,sum=0;i c=d[i]-ave; sum+=c*c; } returnsqrt(sum/(n-1)); } intdel()//剔除坏样本 { int i,k; floatlow,high; low=ave-3*s;//合理样本的下限 high=ave+3*s;//合理样本的上限 k=0;//初始化剔除标志 for(i=0;i if(i d[i]=d[n-1];//用最后一个样本来覆盖这个 坏样本 i--;//退回前一个位置,以便处理刚刚覆盖的 样本 } n--; //当前有效样本个数减一 k=1;//设置剔除操作标志 } returnk; } main() { n=N; //初始样本个数 while (1){//数据处理循环 ave=averg();//计算平均值 s=tjs();//计算方差 if(! del())break;//如果没有剔除坏样本,则处理完毕 } while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } //线性插值算法。 floatx0=1.5,y0=2.536;//第一个已知点的坐标 floatx1=1.6,y1=3.044;//第二个已知点的坐标 floatline(floatx)//“点斜式”线性插值算法 { return(y0+(y1-y0)*(x-x0)/(x1-x0)); } main() { floatx,y; x=1.573; y=line(x);//y=2.90684 x=1.532; y=line(x);//y=2.69856 while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } //抛物线插值算法。 floatx0=1.5,y0=2.536;//第一个已知点的坐标 floatx1=1.6,y1=3.044;//第二个已知点的坐标 floatx2=1.7,y2=3.487;//第三个已知点的坐标 floatline1(floatx)//过第一点和第二点的“点斜式”线性插值算法 { return(y0+(y1-y0)*(x-x0)/(x1-x0)); } floatline2(floatx)//过第一点和第三点的“点斜式”线性插值算法 { return(y0+(y2-y0)*(x-x0)/(x2-x0)); } floatqins(floatx)//以线性插值算法为基础的抛物线插值算法。 { return(line1(x)+(line2(x)-line1(x))*(x-x1)/(x2-x1)); } main() { floatx,y; x=1.573; y=qins(x);//y=2.91325 x=1.632; y=qins(x);//y=3.19283 while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } //三元一次方程组的行列式解法 //方程组的形式如下: //A11*X1+A12*X2+A13*X3=B1 //A21*X1+A22*X2+A23*X3=B2 //A31*X1+A32*X2+A33*X3=B3 floatA[3][3]={{3.273,-2.164,0.3582}, {0.3697,1.534,-6.762}, {-2.061,7.186,4.508}};//三元一次方程组的系数矩阵 floatB[3]={8.257,-25.10,6.588};//三元一次方程组的常数项 floatX[3];//三元一次方程组的解: X1=1.537067,X2=-0.896159,X3=3.592657 floatDETA()//行列式计算 { return(A[0][0]*A[1][1]*A[2][2]+A[1][0]*A[2][1]*A[0][2]+A[2][0]*A[0] [1]*A[1][2] -A[2][0]*A[1][1]*A[0][2]-A[0][0]*A[2][1]*A[1][2]-A[1][0]*A[0][1]*A [2][2]); } voidswap(intk)//常数项与k列系数交换 { inti; floatt; for(i=0;i<3;i++){ t=B[i]; B[i]=A[i][k]; A[i][k]=t; } } voidXYZ()//求解三元一次方程组 { floatd; d=DETA();//求系数行列式的值 swap(0);//将x1的系数与常数项交换 X[0]=DETA()/d;//解出x1 swap(0);//恢复原来的系数与常数项 swap (1);//将x2的系数与常数项交换 X[1]=DETA()/d;//解出x2 swap (1);//恢复原来的系数与常数项 swap (2);//将x3的系数与常数项交换 X[2]=DETA()/d;//解出x3 swap (2);//恢复原来的系数与常数项 } main() { XYZ(); while (1);//在这一行设置断点,中止程序运行,以便观察程序运行的结果 } //解线性方程组的主元消去法(有回代过程)。 //5阶线性方程组如下: //3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 语言 算法 集合