这是我的第一篇文章,所以如果语法不正确,我很抱歉。我想要做的是构建一个基本的头文件来做一些统计分析。我宁愿用C写我自己的代码,也不愿用R或SPSS这样的美国程序。已经有几年了,我有点生疏了。
注意:我是一个相当初级的程序员,我依赖于许多在大学向我展示的工具。例如,在学校里,我的教授写了一个名为FPT.h的编译器和头文件。我不肯定里面有什么,我认为它主要是图形,但我还是把它添加到我所有的代码中。我认为我不会在下面的代码中使用它,所以您应该能够在没有问题的情况下将它注释掉。我还使用了他的编译器acom,我将把它添加到问题的底部。
以下是头文件,名为rd_stat.h
#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:
#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中。问题就是从那时开始的。
#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:
acom test_bstat.c rd_stat.c -I. rd_stat.h在编译时,收到以下错误:
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是一个有效的返回类型,我不知道为什么。有线索知道为什么会这样吗?
另外,如果有人知道一个开放源码文件,其中有一些/大部分/所有这些功能可用,这也会有帮助。
发布于 2017-08-23 13:02:39
#include "..."的正确语法。您的编译器也可以在您的主目录中搜索,但是#include <...>用于在使用-I选项添加的系统和目录中进行搜索。.c文件中移除保护程序。它防止您的.h文件被编译(它的内容被忽略了)。https://stackoverflow.com/questions/45840266
复制相似问题