stddev / mean的C程序

时间:2013-10-24 20:09:29

标签: c

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

#define MAX 100

void calc(float**, int, float*, float*);

int main( int argc, char* argv[] )
{
  float *array[MAX];
  float *MEAN;
    float *SD;
    int array_size, i;

    array_size = argc;

    for( i = 0; i < argc ; ++i )
        {
      *array = (float *) malloc( argc*(sizeof(float)));
           *array[i] = atof(argv[i]);
        }

    calc(array, array_size, MEAN, SD);
    return 0;
}

void calc(float* arr[] , int arr_size, float* mean, float* stdev)
{
  int sum, i;

    for ( i = 0; i < arr_size ; ++i )
        {
            sum += *arr[i];
        }

    *mean = sum / arr_size;

    printf("%.2f", *mean);

       for ( i = 0; i < arr_size ; ++i )
        {
      sum += pow((*arr[i]-*mean), 2);
        }

    *stdev = sqrt((sum/arr_size));

    printf("%.2f", *stdev);

}

该代码应该确定许多用户输入浮动的平均值和标准偏差。尝试编译时,我一直遇到分段错误。我尝试释放malloc,但它为代码产生了更多问题,所以我只是保留原样 - 尽管它可能是内存分发的问题。

谢谢

4 个答案:

答案 0 :(得分:1)

有几个问题:

  • float *array[MAX];是指向浮点数组的指针。你应该 使用浮点数组或指针。因为你正在使用 malloc,你可以使用这样的指针:float *array;
  • 不要为每个浮点调用malloc,而是为整个数组调用一次
  • 如果您将MEANSD定义为指针,则必须使用 他们malloc。最好将它们声明为仅浮动并使用 他们的地址(通过&MEAN&SD)。
  • sum变量应该是float,您应该初始化它 到0。在计算0之前,您还应将其设置为stdev
  • 请记住,argv[0]包含程序的名称,所以 你应该忽略它。
  • 另请记得使用free为您分配的任何内容致电malloc 当你完成它。

代码的修改版本:

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

void calc(float*, int, float*, float*);

int main( int argc, char* argv[] ) {
    float *array;
    float MEAN;
    float SD;
    int array_size, i;
    array_size = argc-1;
    array = (float *) malloc( array_size*sizeof(float));
    for( i = 0; i < array_size ; ++i ) {
        array[i] = atof(argv[i+1]);
    }
    calc(array, array_size, &MEAN, &SD);
    free (array);
    return 0;
}

void calc(float* arr , int arr_size, float* mean, float* stdev) {
    float sum=0;
    int i;
    for ( i = 0; i < arr_size ; ++i ) {
        sum += arr[i];
    }
    *mean = sum / arr_size;
    printf("%.2f ", *mean);
    sum=0;
    for ( i = 0; i < arr_size ; ++i ) {
        sum += pow((arr[i]-*mean), 2);
    }
    *stdev = sqrt((sum/arr_size));
    printf("%.2f", *stdev);
}

答案 1 :(得分:0)

您正在错误地分配和访问array。应该是这样的:

for( i = 0; i < argc ; ++i )
{
    array = malloc( argc * sizeof(*array));
    array[i] = atof(argv[i]);
}

同样在calc()内部功能将*arr[i]更改为arr[i]无处不在。

答案 2 :(得分:0)

这绝对是错误的:

*array = (float *) malloc( argc*(sizeof(float)));

在声明数组后,您正在分配一个浮点数组。这根本不符合逻辑。然后你错误地取消引用这些值。此外,在您的代码中,您正在尝试将程序名称(argv[0])转换为int类型。

这可能是你想要做的事情:

float * array = NULL;  

array = malloc( (argc-1)*(sizeof(float))); 

for (i=1; i<argc; ++i)
    array[i]=atof(argv[i]); 

此代码在大小为(argc-1)*float的堆中保留一个内存位置,并使用指定为命令行参数的值对其进行初始化。 argc为1时应插入支票。

答案 3 :(得分:0)

你有几个问题,

  • 检查您是否至少有一个参数
  • 您将数组声明为浮动指针数组,使用array[]*array
  • 您的数组只需分配一次
  • 分配一个数字samples*sizeof(float)的数组,一次,在循环之前
  • 将读取的值存储到array[ndx]个位置(atof很好)
  • argv从程序名称开始,存储为array[n]argv[n+1]转换的值
  • MEAN和SD需要空间,您声明了指针,更改为值,并传递地址(&amp;)

这是修订后的main(),

int main( int argc, char* argv[] )
{
    //float array[MAX];
    float *array;
    float MEAN;
    float SD;
    int array_size, ndx;

    if(!(argc>0)) { printf("please give 1 or more arguments\n"); exit(1); }

    array_size = argc-1; //don't count the program name
    array = (float*) malloc(array_size*(sizeof(float)));
    for( ndx = 1; ndx<argc ; ++ndx )
    {
        array[ndx-1] = atof(argv[ndx]);
        printf("[%d] %f\n",ndx-1,array[ndx-1]);
    }

    calc(array, array_size, &MEAN, &SD);
    free(array); array=NULL; //always clean up after yourself
    return 0;
}

您的统计计算需要有效,但这至少可以编译并运行,

  • 你需要链接libmath(见下文),
  • 你的总和没有初始化,在任何一个循环之前,
  • pow和sqrt返回双 - 阅读C数学函数并传递double,
  • 您的array_size需要仔细设置

下面,

void calc(float arr[] , int arr_size, float* _mean, float* _stdev)
{
    double sum, mean, stddev;
    int i;

    sum=0.0;
    for ( i = 0; i < arr_size ; ++i )
    {
        sum += arr[i];
        //printf("[%d] %f\n",i,arr[i]);
    }
    printf("sum %f\n",sum);
    *_mean = mean = sum / arr_size;
    printf("mean %f\n",mean);
    printf("%.2f\n", *_mean);

    sum=0.0;
    for ( i = 0; i < arr_size ; ++i )
    {
        sum += pow((arr[i]-mean), 2);
        //printf("[%d] %f\n",i,arr[i]);
    }
    printf("sum^2 %f\n",sum);
    *_stdev = stddev = sqrt((sum/arr_size));
    printf("stddev %f\n",stddev);
    printf("%.2f\n", *_stdev);
}

哦,你想链接到l​​ibmath,

cc stddev.c -lm -o stddev

运行时,

$ ./stddev 1 2 3 4 5
[0] 1.000000
[1] 2.000000
[2] 3.000000
[3] 4.000000
[4] 5.000000
sum 15.000000
mean 3.000000
3.00
sum^2 10.000000
stddev 1.414214
1.41

此外,你需要释放malloc'ed(数组)的内存。这是一个好习惯,虽然这个小程序不需要。