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

时间:2015-01-24 18:21:20

标签: c shell pointers gcc compiler-errors

我正在用C编写一个基本程序,用于计算用户输入程序的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;
}

当我编译这个程序时,因为我在Secure Shell Client中编写它,并使用gcc -g -c grades2.c编译它,然后我收到此错误消息:

grades2.c:49: error: conflicting types for âstandard_deviationâ
grades2.c:27: note: previous implicit declaration of âstandard_deviationâ was here
grades2.c: In function âstandard_deviationâ:
grades2.c:56: warning: passing argument 2 of âcalc_averageâ makes pointer from integer without a cast
grades2.c:35: note: expected âint *â but argument is of type âintâ
grades2.c:56: error: invalid operands to binary + (have âint *â and âdoubleâ)
grades2.c:58: error: invalid operands to binary * (have âfloatâ and âint *â)
grades2.c: At top level:
grades2.c:69: warning: conflicting types for âdisplay_standarddeviationâ
grades2.c:28: note: previous implicit declaration of âdisplay_standarddeviationâ was here

这些是我认为可以轻松解决的基本错误,但由于在Secure Shell Client中输入拼写错误并输入错误非常容易,因此我很难找到哪一个错误。哦,它没有指定将替换错误修复程序放在IDE的哪个位置。由于我使用Math头,在我设法用你的输入成功编译之后,我会说gcc -o grades2.exe grade2.o -lm,带-lm意味着我用数学头编译程序。

请你帮我解决错误。

3 个答案:

答案 0 :(得分:2)

除了其他人指出的问题外,第一个错误是因为在standard_deviation中使用 main()之前,您尚未宣布 int standard_deviation()。这种省略意味着提供了隐式声明main()。这与您对同一函数的定义冲突。

将此行放在float standard_deviation(int num_grades, int grades[]); 之前:

{{1}}

答案 1 :(得分:1)

这将给0

(1/num_grades) * formula

将其更改为

1.0 / num_grades * formula

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

或者更好的方法是

((float)formula) / num_grades);

而不是将sqrt投射到float使用sqrtf

仔细查看代码,发现一些非常奇怪的内容,您将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;
}

并且您需要在standard_deviation()之前使用main()函数的原型,或者在main()之前移动整个函数定义。

否则,你会发生什么 juanchopanza

答案 2 :(得分:1)

改变这个:

(float)(1/num_grades)

对此:

(float)(1)/num_grades

当然,您可以简单地执行1.0f/num_grades,但我只想支持您对操作顺序的关注。使用(float)(1/num_grades),您首先执行1/num_grades整数除法(最有可能产生0),然后才将其转换为float (所以你得到0.0)。