在用C编写方法时遇到问题,包括指针和类型

在用C编写方法时遇到问题,包括指针和类型,c,shell,pointers,gcc,compiler-errors,C,Shell,Pointers,Gcc,Compiler Errors,我正在用C编写一个basic程序,计算用户输入程序的5个不同等级的平均值、标准差和中位数。使用函数、引用和指针。看起来我的思路是正确的,但是我编写了标准偏差方法,就像我在Java中使用的那样,而不是在C中使用的那样: #include <stdio.h> #include <stdlib.h> #include <math.h> int* get_data(int num_grades); float calc_average(int num_grades

我正在用C编写一个basic程序,计算用户输入程序的5个不同等级的平均值、标准差和中位数。使用函数、引用和指针。看起来我的思路是正确的,但是我编写了标准偏差方法,就像我在Java中使用的那样,而不是在C中使用的那样:

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


int* get_data(int num_grades);
float calc_average(int num_grades, int grades[]);
void display_average(float ave);

int main(int argc, char* argv[])
{
    const int MAX_GRADE = 100;
    printf("enter number of grades: ");
    int num_grades;
    scanf("%d", &num_grades);

    int* result = get_data(num_grades);

    if(num_grades == 0)
    {
        printf("no grades to average\n");
    }
    else
    {
        float ave = calc_average(num_grades, result);
        display_average(ave);
        float standarddev = standard_deviation(num_grades, result);
        display_standarddeviation(standarddev);
    }

    free(result);
    return 0;
}

float calc_average(int num_grades, int grades[])
{
    float ave;
    int i;
    int sum = 0;
    for(i = 0; i < num_grades; i++)
    {
        sum += grades[i];
    }
    ave = (float)sum/num_grades;

    return ave;
}

float standard_deviation(int num_grades, int grades[])
{
    float standarddev;
    int i;
    int *formula = 0;
    for(i = 0; i < num_grades; i++)
    {
        formula += pow((grades[i] - calc_average(num_grades, grades[i])), 2);
    }
    float ave = (float)(1/num_grades)*formula;
    standarddev = (float)sqrt(ave);

    return standarddev;     
}


void display_average(float ave)
{
    printf("average: %.2f\n", ave);
}
void display_standarddeviation(float standarddev)
{
    printf("standard deviation: %.2f\n", standarddev);
}

int* get_data(int num_grades)
{
    int* a;
    a = malloc(num_grades * sizeof(int));
    int i;
    for(i = 0; i < num_grades; i++)
    {
        printf("enter a grade: ");
        int grade;
        scanf("%d", &grade);
        if(grade <= 100)
        {
            a[i] = grade;
        }
        else
        {
            printf("grade needs to be > 0 and <= 100\n");
            i--;
        }
    }

    return a;
}
我相信这些基本错误可以很容易地修复,但由于在SecureShell客户端中很容易出现打字错误,我很难找出哪一个是哪一个。哦,它没有指定在哪里放置像IDE那样的替换错误修复。因为我使用的是数学头,在我使用您的输入成功编译它之后,我会说gcc-o grades2.exe grades2.o-lm,其中-lm表示我使用数学头编译程序


请您帮我修复错误。

这将给出
0

(1/num_grades) * formula
换成

1.0 / num_grades * formula
前一个将采用整数除法,假设
abs(num_grades)>1
,则它将始终为
0

或者更好的方法是

((float)formula) / num_grades);
使用
sqrtf
而不是将
sqrt
转换为
float

仔细查看您的代码,会发现一些非常奇怪的事情,您将
formula
声明为

int *formula;
如果后续代码中的
+=
运算符没有按您所想的那样工作,则该函数的正确版本将是

float standard_deviation(int num_grades, int grades[])
{
    float standarddev;
    int i;
    float formula = 0.0f;
    float average = calc_average(num_grades, grades);
    for (i = 0; i < num_grades; i++)
    {
        formula += powf((grades[i] - average), 2);
    }
    float ave = formula / num_grades;
    standarddev = sqrtf(ave);

    return standarddev;
}
float标准偏差(整数等级,整数等级[])
{
浮动标准开发;
int i;
浮动公式=0.0f;
浮动平均值=计算平均值(数量等级、等级);
对于(i=0;i
您需要在
main()
之前为
standard\u deviation()
函数创建一个原型,或者将整个函数定义移动到
main()
之前


否则,juanchopanza你也会这样做。

这将给出
0

(1/num_grades) * formula
换成

1.0 / num_grades * formula
前一个将采用整数除法,假设
abs(num_grades)>1
,则它将始终为
0

或者更好的方法是

((float)formula) / num_grades);
使用
sqrtf
而不是将
sqrt
转换为
float

仔细查看您的代码,会发现一些非常奇怪的事情,您将
formula
声明为

int *formula;
如果后续代码中的
+=
运算符没有按您所想的那样工作,则该函数的正确版本将是

float standard_deviation(int num_grades, int grades[])
{
    float standarddev;
    int i;
    float formula = 0.0f;
    float average = calc_average(num_grades, grades);
    for (i = 0; i < num_grades; i++)
    {
        formula += powf((grades[i] - average), 2);
    }
    float ave = formula / num_grades;
    standarddev = sqrtf(ave);

    return standarddev;
}
float标准偏差(整数等级,整数等级[])
{
浮动标准开发;
int i;
浮动公式=0.0f;
浮动平均值=计算平均值(数量等级、等级);
对于(i=0;i
您需要在
main()
之前为
standard\u deviation()
函数创建一个原型,或者将整个函数定义移动到
main()
之前

否则,你也会发生什么事。

改变这一点:

(float)(1/num_grades)
为此:

(float)(1)/num_grades
当然,您可以简单地执行
1.0f/num_grades
,但我只想认可您对操作顺序的关注。使用
(float)(1/num\u grades)
,首先执行
1/num\u grades
(很可能产生
0
)的整数除法,然后将其强制转换为
float
(因此得到
0.0
)。

更改此项:

(float)(1/num_grades)
为此:

(float)(1)/num_grades

当然,您可以简单地执行
1.0f/num_grades
,但我只想认可您对操作顺序的关注。使用
(float)(1/num\u grades)
,您首先执行
1/num\u grades
整数除法(
1/num\u grades
)(这很可能产生
0
),然后才将其转换为
float
(因此您得到
0.0
)。

除了其他人指出的问题之外,第一个错误是因为在
main()
中使用标准偏差之前,您没有声明标准偏差。此省略意味着提供了一个隐式声明
int standard_deviation()
。这和您对同一函数的定义相冲突

将此行放在
main()之前。


除了其他人指出的问题外,第一个错误是因为在
main()
中使用标准偏差之前,您没有声明标准偏差。此省略意味着提供了一个隐式声明
int standard_deviation()
。这和您对同一函数的定义相冲突

将此行放在
main()之前。


事实上,如果没有括号,它也会起作用,即
(float)1/num_grades
事实上,如果没有括号,它也会起作用,即
(float)1/num_grades
什么是
int*formula
?为什么要将其声明为指针?什么是
int*formula
?为什么要将其声明为指针?如何修复最后两个错误?grades2.c:在函数–standard_deviation–grades2.c:58:警告:传递参数2–calc_average–从整数生成指针,而不使用强制转换grades2.c:37:注意:预期为–int*,但参数类型为–int–我将修复答案。。。不要在
for
循环中计算平均值,除了传递第i个值,它是
int
calc\u average
需要一个
int
指针。如何修复最后两个错误?grades2.c:在函数–standard_deviation–grades2.c:58:警告:传递–calc_average–的参数2会生成po