一维统计程序

时间:2016-03-09 01:34:55

标签: c statistics

所以我在程序中遇到一些问题,我正在编写计算任意数量的数据的统计数据。您可能知道,C没有基于用户输入生成数组的本机方式,所以我做了一个。我对指针不太熟悉,因为我还没有学过它们。但是,我遇到的主要问题是我的程序不允许输入超过16个数字。关于为什么的任何想法?

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

float getMin(float arr[], int size)
{
int i;
float minimum = arr[0];

for (i=1; i < size; i++) {
    if (arr[i] < minimum) {
        minimum = arr[i];
    }
}

return(minimum);
}

float getMax(float arr[], int size)
{
int i;
float maximum;

for(i=0; i<size; i++) {
    if (arr[i] > maximum) {
        maximum = arr[i];
    }
}

return(maximum);
}

float getAverage(float arr[],int size)
{
int i;
float avg, sum;

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

avg = sum/size;

return avg;
}

float getVar(float arr[], int size, float average)
{
int i;
float var, diff[size], sq_diff[size], sum;

for(i=0; i<size; i++) {
    diff[i] = arr[i] - average;
}

for(i=0; i<size; i++)
{
    sq_diff[i] = pow(diff[i], 2);
}

var=getAverage(sq_diff, size);

return(var); 
}

float getStdDev(float var)
{
float std_dev = sqrt(var);

return(std_dev);
}

int main(void)
{
int n=0, i=0;
float array[n], x;

printf("This program computes 1-D statistics.");
printf("\nEnter a negative number to stop input.\n");

do {
    printf("Number %d: ", i+1);
    scanf("%f", &x);

    n++;

    array[i] = x;

    i++;

}while(x >= 0);

float avg = getAverage(array, n-1);
float var = getVar(array, n-1, avg);

printf("\nMinimum: %f", getMin(array, n-1));
printf("\nMaximum: %f", getMax(array, n));
printf("\nAverage: %f", getAverage(array, n-1));
printf("\nVariance: %f", getVar(array, n-1, avg));
printf("\nStandard Deviation: %f", getStdDev(var));

return(0);
}

1 个答案:

答案 0 :(得分:0)

我担心你对C和编程语言的工作方式有一些普遍的错误理解。编程与数学不完全相同。如果你声明一个变量n和一个数组myarr [n],你的数组就会随着n的增长而增长。数组将在您声明它的位置取值n并将使用它。同样声明这样的数组也许不是一个好主意,我不认为许多C编译器会编译出人们期望的内容。在你的情况下,你声明一个大小为0的数组,它似乎最多可以处理16个数字,这完全取决于系统。您不能指望这种行为在不同的系统/编译器上保持一致。

相反,如果你真的需要它,你应该做的是使用动态内存。我已经写了一个很快你可以使用的简单例子。这绝不是一个完整的,但对于你的需求它应该足够好。每当您创建一个新的增长数组时,请使用initArr(&amp; arr)。例如,如果你有一个名为arr的MyArr类型的数组,你可以像这样arr.data [i]获得数组的数据,同时你可以获得数组的长度(有意义的数据),如arr.len。最后,您可以像这样arr.size获取数组的当前最大大小。请注意,您只应使用addElement(&amp; arr,x)添加新元素,因为此函数将负责数组增长。使用完阵列后,可以使用destrArr(&amp; arr)释放内存。即使你的程序退出内存时,这也是一种很好的做法。

最后请查看您的功能。我没有通过你的逻辑,但要记住,你永远不应超越界限。例如,您不应该尝试访问数组[-1]或数组[size_of_array],其中size_of_array是数组的总大小。请记住,声明为float arr [100]的数组只能安全地用于区域arr [0]到arr [99]。 sum + = x也相当于sum = sum + x。如果不初始化,请考虑sum的初始值。实际上它取决于但可能包含垃圾值。

尝试查看编译器警告并修复它们。值得了解它们并且很少值得忽视。如果你使用gcc,请尝试-Wall标志,它可能会给你一些值得关注的警告。

我希望这有用而且不会太混乱。在任何情况下,请查看以下代码并添加您的函数和库。这应该是开箱即用的。

祝你好运! :)

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

#define INIT_SIZE 2

typedef struct MyArr {
    float *data;
    int size;
    int len;
} MyArr;

int initArr(MyArr *arr) {
    arr->data = (float *)malloc(INIT_SIZE*sizeof(float));
    if (arr->data == NULL) {
        printf("OUT OF MEMORY\n");
        return -1;
    }
    arr->size = INIT_SIZE;
    arr->len = 0;
    return 1;
}

int addElement(MyArr *arr, float x) {
    if (arr->len == arr->size) {
        int i;
        float *tmp = (float *)malloc(2*arr->size);
        if (tmp == NULL) {
            printf("OUT OF MEMORY\n");
            return -1;
        }
        for (i = 0; i < arr->size; ++i) {
            tmp[i] = arr->data[i];
        }
        free(arr->data);
        arr->data = tmp;
        arr->size = 2*arr->size;
    }
    arr->data[arr->len] = x;
    arr->len++;
    return 1;
}

void destrArr(MyArr *arr) {
    free(arr->data);
    arr->size = 0;
    arr->len = 0;
}

int main(void)
{
int n=0, i=0;
float x;
MyArr array;
initArr(&array);

printf("This program computes 1-D statistics.");
printf("\nEnter a negative number to stop input.\n");

do {
    printf("Number %d: ", i+1);
    scanf("%f", &x);

    n++;

    addElement(&array, x);

    i++;

}while(x >= 0);

float avg = getAverage(array.data, n-1);
float var = getVar(array.data, n-1, avg);

printf("\nMinimum: %f", getMin(array.data, n-1));
printf("\nMaximum: %f", getMax(array.data, n));
printf("\nAverage: %f", getAverage(array.data, n-1));
printf("\nVariance: %f", getVar(array.data, n-1, avg));
printf("\nStandard Deviation: %f", getStdDev(var));

destrArr(&array);
return(0);
}
相关问题