c - 使用指针函数的程序方差和标准差

标签 c arrays function pointers variance

所以我正在尝试制作标准偏差和方差函数,但我无法真正弄清楚为什么它不起作用。我想在案例 3 中调用方差,在案例 4 中调用 SD。程序中的其他所有内容都有效。如果您发现任何不对劲的地方,请告诉我。

#include <stdio.h>
#include <math.h>
#define Max_Nums 20

void sortNums(float nums[], int size);
float meanValue(float nums[],int size);
float medianValue(float nums[], int size);
void var_stdDev(float nums[],int size,float *var,float *stdDev);
float sqrtf(float);

int main (void)

{   

    int NumValue = 0;
    float array[Max_Nums];
    int i=0;
    int choice=0;
    float avg=0;
    float median=0;

    printf("How many numbers do you wish to enter (Max of 20): ");
    scanf("%d",&NumValue);

    while (NumValue<1 || NumValue>Max_Nums)
    {
        printf("Invalid response. You must enter a value between 1 and 20.\n");
        scanf("%d",&NumValue);
    }
    printf("Enter %d real numbers: ",NumValue);

    for (i=0;i<NumValue;i++)
    {
        scanf("%f", &array[i]);
    }

    do
    {
        sortNums(array,NumValue);
        printf("-----Menu-----\n\a");
        printf("Enter 1 for mean value\n");
        printf("Enter 2 for median value\n");
        printf("Enter 3 for variance\n");
        printf("Enter 4 for standard deviation\n");
        printf("Enter 5 to exit the program\n");
        scanf("%d",&choice);

        switch(choice)
        {
            case 1:
                avg=meanValue(array,NumValue);
                printf("The mean is:%.2f\n",avg);
                break;
            case 2:
                median=medianValue(array,NumValue);
                printf("The median is:%.2f\n",median);
                break;
            case 3:
                //printf("The variance is:%.2f",variance);
                //break;
            case 4:
                //printf("The standard deviation is:%.2f\n");
                //break;
            case 5:
                printf("Exiting the program\n");
                break;
            default:
                printf("\nInvalid, try again");
                break;
        }
    }while (choice!=5);


return 0;
}

void sortNums(float nums[], int size)
{
    int x;
    int y;
    float z;

    for(x=0;x<(size-1);x++)
    {
        for(y=0;y<size-x-1;y++)
        {
            if(nums[y]>nums[y+1])
            {
                z=nums[y];
                nums[y]=nums[y+1];
                nums[y+1]=z;
            }
        }
    }
}

float meanValue(float nums[],int size)
{
    int i;
    float avg;
    float sum;

    for(i=0;i<size;i++)
    {
        sum+=nums[i];
    }
    avg = (sum/size);
    return avg;
}

float medianValue(float nums[], int size)
{
    float EvenMed;
    float Med;
    void sortNums(float nums[], int size);
    if (size%2==0)
    {
        EvenMed=(nums[size/2]+nums[size/2-1])/2;
        return EvenMed;
    }
    else
    {
        Med=nums[size/2];
        return Med;
    }

}

void var_stdDev(float nums[],int size,float *var,float *stdDev)
{
    int i;
    float sum;
    float meanValue(float nums[],int size);
    for(i=0;i<size;i++)
    {
        sum+=pow((nums[i]-meanValue,2);
    }
    *var=sum/(float)size;
    *stdDev=sqrt(*var);



} 

最佳答案

这一行是错误的:

    sum+=pow((nums[i]-meanValue,2);

这是试图从一个数字中减去一个函数指针,这是没有意义的。您需要调用 meanValue 函数来获取平均值,然后将其减去。

此外,您在添加之前没有初始化 sum

void var_stdDev(float nums[],int size,float *var,float *stdDev)
{
    int i;
    float sum = 0;
    float mean = meanValue(nums, size);
    for(i=0;i<size;i++)
    {
        sum+=pow((nums[i]-mean,2);
    }
    *var=sum/(float)size;
    *stdDev=sqrt(*var);
} 

不需要在 var_stdDev 中声明 meanValue,文件顶部的声明自始至终都是为了这个目的。

medianValue() 中,您有一个 sortNums() 声明,但您从未调用它,所以数字没有排序(看起来您没有'了解原型(prototype)和调用之间的区别)。

float medianValue(float nums[], int size)
{
    float EvenMed;
    float Med;
    sortNums(nums, size);
    if (size%2==0)
    {
        EvenMed=(nums[size/2]+nums[size/2-1])/2;
        return EvenMed;
    }
    else
    {
        Med=nums[size/2];
        return Med;
    }
}

关于c - 使用指针函数的程序方差和标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38002252/

相关文章:

python - 为任何需要重复两次的东西写一个函数总是最好的主意吗?

javascript - node.js:console.log() 是一个函数吗?

python - 在 Windows 上构建 pjsua python

c - 给定 10 个输入数字并存储在一个数组中,我如何检查下一个值是否与上一个不同?

php - 在php中发布二维数组

javascript - 在javascript中使用堆栈的前缀计算器

C : POSIX threads library test-suite

c - 使用 C 在 Windows 中使用 PFX/P12 证书签署字符串

arrays - 如何在不排序的情况下找到数组中最小的数字?

C++ 无法专门化函数模板