首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正在用C构建一个基本的Stat头文件,并且有问题

我正在用C构建一个基本的Stat头文件,并且有问题
EN

Stack Overflow用户
提问于 2017-08-23 12:51:04
回答 1查看 167关注 0票数 0

这是我的第一篇文章,所以如果语法不正确,我很抱歉。我想要做的是构建一个基本的头文件来做一些统计分析。我宁愿用C写我自己的代码,也不愿用R或SPSS这样的美国程序。已经有几年了,我有点生疏了。

注意:我是一个相当初级的程序员,我依赖于许多在大学向我展示的工具。例如,在学校里,我的教授写了一个名为FPT.h的编译器和头文件。我不肯定里面有什么,我认为它主要是图形,但我还是把它添加到我所有的代码中。我认为我不会在下面的代码中使用它,所以您应该能够在没有问题的情况下将它注释掉。我还使用了他的编译器acom,我将把它添加到问题的底部。

以下是头文件,名为rd_stat.h

代码语言:javascript
运行
复制
#ifndef mdr_stat_stuff
#define mdr_stat_stuff 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <FPT.h>

typedef struct {
  double mean;
  double median;
  double mode;
  double stddev;
  double q1;
  double q3;
  double low;
  double hi;
} 
BSTAT;

void  sort_doubles  (double data[], int size);
double get_mean     (double data[], int size);
double get_median   (double data[], int size);
double get_q1 (double data[], int size);
double get_q3 (double data[], int size);
int    get_mode     (double data[], int size);
double get_stddev   (double data[], int size);

struct BSTAT init_bstat(double data[], int size);

#endif

下面是它的编译器朋友rd_stat.c:

代码语言:javascript
运行
复制
#ifndef mdr_stat_stuff
#define mdr_stat_stuff 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <FPT.h>
#include <rd_stat.h>

void sort_doubles(double data[],int size){
  int i, j;
  double temp;

  //Sorts the data in Ascending Order  
  for (i = 0; i < size; i++){
    for (j = 0; j < (size - i - 1); j++){
      if (data[j] > data[j + 1]){
    temp = data[j];
    data[j] = data[j + 1];
    data[j + 1] = temp;
      }
    }
  }
}

/////////////////////////////////////////////////////////////////////////

double get_mean(double data[], int size){//to get the mean we need the array and its length
  int i;
  double mean = 0;
  for(i = 0; i < size; i++){
    mean += data[i];
  }
  return mean / size;
}
/////////////////////////////////////////////////////////////////////////


double get_median(double data[], int size){
  //only returns one median even if SIZE is even
  //if SIZE is even, it finds both medians and takes the average of the two
  //DECISION because it is often done anyway when there are two Medians. Seems more practical. 
  int i, j;
  double temp;

  sort_doubles(data, size);

  /* if(size % 2 == 0){//even cases */
  /*   return (data[size / 2 - 1] + data[size / 2]) / 2; */
  /* }else{//odd cases */
  /*   return data[(size - 1) / 2]; */
  /* }  */

  printf("location for median is  %5.2lf\n", ((double)size-1) / 2);


  return (data[(int)floor(((double)size-1) / 2)] + data[(int)ceil(((double)size-1) / 2)]) / 2;
}

double get_q1(double data[], int size){
  int i, j;
  double temp;

  sort_doubles(data, size);

  printf("location for q1 is  %5.2lf\n", (double)size / 4);

  return (data[(int)floor((double)size / 4)] + data[(int)ceil((double)size / 4)]) / 2;
}

double get_q3(double data[], int size){
  int i, j;
  double temp;

  sort_doubles(data, size);

  printf("location for q3 is  %5.2lf\n", (double)(3*size-4) / 4);

  return (data[(int)floor((3*(double)size-4) / 4)] + data[(int)ceil((3*(double)size-4) / 4)]) / 2;
}


/////////////////////////////////////////////////////////////////////////

int get_mode(double data[],int size) {
  //Code augmented from other user:
  //https://www.tutorialspoint.com/learn_c_by_examples/mode_program_in_c.htm


  //Function assumes there is EXCATLY ONE Mode in the data. 
  //I don't like this

  int maxValue = 0, maxCount = 0, i, j;

   sort_doubles(data, size);

  //Finds Mode
   for (i = 0; i < size; ++i) {
      int count = 0;      
      for (j = 0; j < size ; ++j) {
         if (data[j] == data[i])
         ++count;
      }      
      if (count > maxCount) {
         maxCount = count;
         maxValue = data[i];
      }      
   } 
     return maxValue;
}
/////////////////////////////////////////////////////////////////////////
double get_stddev(double data[], int size){

  double mean = get_mean(data, size);
  int i;
  double sum=0;

  for(i = 0 ; i < size ; i++){
    sum += pow(data[i] - mean, 2);
  }
  return sqrt(sum / size);
}
/////////////////////////////////////////////////////////////////////////


BSTAT init_bstat(double data[], int size){

  BSTAT a;
  a.mean = get_mean(data, size);
  a.q1 = get_q1(data, size);
  a.median = get_median(data, size);
  a.q3 = get_q3(data, size);
  a.mode = get_mode(data, size);
  a.stddev = get_stddev(data, size);

  sort_doubles(data, size);
  a.low = data[0];
  a.hi = data[size - 1];


  return a;

}


#endif

下面是我正在尝试启动的程序test_bstat.c:*注意:在我将函数init_bstat()放入头文件及其编译器之前,我用test_bstat.c编写了以确保其工作正常。一旦得到所有的平方,我就将其复制到rd_stat.c中,并将其声明添加到rd_stat.h中。问题就是从那时开始的。

代码语言:javascript
运行
复制
#include <FPT.h>
#include <rd_stat.h>



/* BSTAT init_bstat(double data[], int size){ */

/*   BSTAT a; */
/*   a.mean = get_mean(data, size);        */
/*   a.median = get_median(data, size); */
/*   a.mode = get_mode(data, size); */
/*   a.stddev = get_stddev(data, size); */

/*   sort_doubles(data, size); */
/*   a.low = data[0]; */
/*   a.hi = data[size - 1]; */
/*   a.q1 = get_q1(data, size); */
/*   a.q3 = get_q3(data, size); */

/*   return a; */
/* } */



int main(){

  int size = 10;
  int i = 0;
  double scores[10];

  for(i = 0 ; i < size ; i++){
    scores[i] = floor(15*drand48() + 80);
  }

  for(i = 0 ; i < size ; i++){
    printf("Scores[%d] = %.2lf\n", i, scores[i]);
  }


  BSTAT LEANN;

 LEANN = init_bstat(scores, size);

  printf("Mean = %5.1lf Median = %5.1lf Mode = %5.0lf\n", LEANN.mean, LEANN.median, LEANN.mode);
  printf("Low = %5.1lf Hi = %5.1lf Stddev = %5.1lf Q1 = %5.1lf Q3 = %5.1lf\n", LEANN.low, LEANN.hi, LEANN.stddev, LEANN.q1, LEANN.q3);

}

我的编译方式都是通过我教授的编译器acom:

代码语言:javascript
运行
复制
acom test_bstat.c rd_stat.c -I. rd_stat.h

在编译时,收到以下错误:

代码语言:javascript
运行
复制
user@OptiPlex-780:~/CS/FOOTBALL$ acom test_bstat.c rd_stat.c -I. rd_stat.h
test_bstat.c: In function ‘main’:
test_bstat.c:44:2: error: invalid use of undefined type ‘struct BSTAT’
  LEANN = init_bstat(scores, size);
  ^
rd_stat.c:126:1: error: unknown type name ‘BSTAT’
 BSTAT init_bstat(double data[], int size){
 ^
rd_stat.c: In function ‘init_bstat’:
rd_stat.c:128:3: error: unknown type name ‘BSTAT’
   BSTAT a;
   ^
rd_stat.c:129:4: error: request for member ‘mean’ in something not a structure or union
   a.mean = get_mean(data, size);
    ^
rd_stat.c:130:4: error: request for member ‘q1’ in something not a structure or union
   a.q1 = get_q1(data, size);
    ^
rd_stat.c:131:4: error: request for member ‘median’ in something not a structure or union
   a.median = get_median(data, size);
    ^
rd_stat.c:132:4: error: request for member ‘q3’ in something not a structure or union
   a.q3 = get_q3(data, size);
    ^
rd_stat.c:133:4: error: request for member ‘mode’ in something not a structure or union
   a.mode = get_mode(data, size);
    ^
rd_stat.c:134:4: error: request for member ‘stddev’ in something not a structure or union
   a.stddev = get_stddev(data, size);
    ^
rd_stat.c:137:4: error: request for member ‘low’ in something not a structure or union
   a.low = data[0];
    ^
rd_stat.c:138:4: error: request for member ‘hi’ in something not a structure or union
   a.hi = data[size - 1];
    ^

它似乎没有认识到struct是一个有效的返回类型,我不知道为什么。有线索知道为什么会这样吗?

另外,如果有人知道一个开放源码文件,其中有一些/大部分/所有这些功能可用,这也会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 13:02:39

  1. 使用#include "..."的正确语法。您的编译器也可以在您的主目录中搜索,但是#include <...>用于在使用-I选项添加的系统和目录中进行搜索。
  2. .c文件中移除保护程序。它防止您的.h文件被编译(它的内容被忽略了)。
  3. 我建议传递和返回指向结构的指针,而不是结构本身;这样大的指针会在每次调用和返回时增加巨大的开销。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45840266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档