【C语言】MK趋势检验C语言代码
本帖最后由 wushaominkk 于 2018-5-21 21:09 编辑打开文件读数据的一段代码是从别人那里复制过来的,发表在CSDN上面的,后面的是自己编的。主要想做MK趋势检验,网上好多收费的,穷学生只好自己编一个了
代码处理一些数据是够了,,太多的可能需要分开来处理,自己试验的是一次处理1285行400列,多了就不可以,所以我的4w多行的数据用了40多次处理完,心塞#include <stdio.h>
#include <math.h>
void main()
{
FILE *fp;
char filename;
int i,j,k;//循环用
int h,l;//行、列
h=13;
l=400;
float da = {0};
int s={0};//存s值
float z={0};//存z值
float p={0};//存p值
int t={0};//存趋势
printf(" 输入文件名: ");
gets(filename);
fp=fopen(filename,"r"); // fp指针指向文件头部
for(i = 0 ;i < h ; i++)//行循环
{
for(j = 0 ;j < l ; j++)//列循环
{
fscanf(fp,"%f",&da);
fseek(fp, 1L, SEEK_CUR); /*fp指针从当前位置向后移动*/
}
}
//求s,正负数的总量
float a=0.0;//存储差
for(i=0;i<h;i++){
for(j=0;j<l-1;j++){
for(k=j+1;k<l;k++){
a=da-da;
if(a>0){
s+=1;
} else if(a<0){
s-=1;
}
}
}
//printf("%d\n",s);//这行当时检验用
}
//求z,为后面求p铺垫
float var;//存储方差
var=l*(l-1)*(2*l+5)/18;
var=sqrt(var);
for (i=0;i<h;i++){
if (s>0){
z=(s-1)/var;
} else if (s<0){
z=(s+1)/var;
} else {
z=0;
}
//printf("%f\n",z);//这行当时检验用
}
//求p,置信度
//这是单侧检验的p值,双侧检验需要把下面2.32和1.64的值换掉,,换成多少度娘一下,我忘了,也可以选择excel里面函数转换
for(i=0;i<h;i++){
if(fabs(z)>=2.32){
p=0.01;
}else if (fabs(z)>=1.64){
p=0.05;
} else {
p=0;
}
//printf("%d\t%.4f\t%.2f\n",s,fabs(z),p);//这行当时检验用
}
//求t,趋势,1是增加趋势,-1是减少趋势
for (i=0;i<h;i++) {
if(p!=0){
if(z>0){
t=1;
} else if(z<0){
t=-1;
}
}
//printf("%d\n",t);
}
//打印查看//这几行当时检验用
/*for(i=0;i<h;i++){
printf("%d %d\t%.3f\t%.2f\t%d\n",i+1,s,z,p,t);
} */
//FILE *fp;
fp=fopen("globe.xls","w");
for(i=0;i<h;i++){
fprintf(fp,"%d\t%.3f\t%.2f\t%d\n",s,z,p,t);
}
fclose(fp);//输出成excel,其中fp=fopen("globe.xls","w");中的globe.xls可以自己命名
} c free编译不通过 做这类东西不妨尝试使用 Python,语法上更简洁可以更专注算法而且调试修改更快。 君如兰 发表于 2018-5-20 21:00
c free编译不通过
我用的Dev C++ Hakon 发表于 2018-5-20 21:40
做这类东西不妨尝试使用 Python,语法上更简洁可以更专注算法而且调试修改更快。
嗯嗯,,最近正在学Python,当时数据量太大,手头唯一会的就是C语言,,然后就只用C语言编了下 贴主没有exit(0); 106lby9574972 发表于 2018-5-26 22:17
贴主没有exit(0);
C语言属于入门的入门阶段,,你说的exit我印象中没有接触过= = 易语言入门教程 tinacherry 发表于 2018-5-30 11:13
C语言属于入门的入门阶段,,你说的exit我印象中没有接触过= =
exit(0)是windows命令 建议R直接下成品包...用C来编算法也是醉了
页:
[1]
2