tinacherry 发表于 2018-5-20 20:14

【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可以自己命名
}

君如兰 发表于 2018-5-20 21:00

c free编译不通过

Hakon 发表于 2018-5-20 21:40

做这类东西不妨尝试使用 Python,语法上更简洁可以更专注算法而且调试修改更快。

tinacherry 发表于 2018-5-26 14:31

君如兰 发表于 2018-5-20 21:00
c free编译不通过

我用的Dev C++

tinacherry 发表于 2018-5-26 14:32

Hakon 发表于 2018-5-20 21:40
做这类东西不妨尝试使用 Python,语法上更简洁可以更专注算法而且调试修改更快。

嗯嗯,,最近正在学Python,当时数据量太大,手头唯一会的就是C语言,,然后就只用C语言编了下

106lby9574972 发表于 2018-5-26 22:17

贴主没有exit(0);

tinacherry 发表于 2018-5-30 11:13

106lby9574972 发表于 2018-5-26 22:17
贴主没有exit(0);

C语言属于入门的入门阶段,,你说的exit我印象中没有接触过= =

vbdkgj 发表于 2018-5-31 11:21

易语言入门教程

106lby9574972 发表于 2018-7-21 12:00

tinacherry 发表于 2018-5-30 11:13
C语言属于入门的入门阶段,,你说的exit我印象中没有接触过= =

exit(0)是windows命令

tI颖 发表于 2018-7-24 11:42

建议R直接下成品包...用C来编算法也是醉了
页: [1] 2
查看完整版本: 【C语言】MK趋势检验C语言代码