2015-01-24 2 views
0

Я пишу основную программу на C, которая вычисляет среднее стандартное отклонение и медиану из 5 различных классов, которые пользователь вкладывает в программу. Используются функции, ссылки и указатели. Кажется, что я на правильном пути, но я написал стандартный метод отклонения, как я имел бы в Java, а не C:Не удается написать метод в 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 Client Shell и собрать его с помощью 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 grades2.o -lm, с -lm означает, что я компилирую программу с помощью математического заголовка ,

Помогите мне исправить ошибки.

+0

что 'INT * formula'? почему вы объявляете его указателем? –

ответ

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 тоже произойдет.

+0

Как исправить последние две ошибки? grades2.c: В функции âstandard_deviationâ: grades2.c: 58: warning: передающий аргумент 2 из âcalc_averageâ делает указатель из целого без литого grades2.c: 37: note: ожидается âint * â, но аргумент имеет тип âintâ –

+0

I исправит ответ ... Не вычисляйте среднее значение в цикле 'for', кроме того, что вы передаете i-ое значение, которое является' int' и 'calc_average', ожидает указатель' int'. –

+0

Теперь я делаю. Я нажал галочку. –

1

Изменить это:

(float)(1/num_grades) 

Для этого:

(float)(1)/num_grades 

Конечно, вы могли бы просто сделать 1.0f/num_grades, но я просто хотел, чтобы поддержать ваше внимание на порядок действий.С (float)(1/num_grades), вы первым выполнением целочисленное деление из 1/num_grades (который, скорее всего, дает 0), и только потом приводился его float (так что вы получите 0.0).

+0

действительно, с круглыми скобками, которые он также работал бы, например, '(float) 1/num_grades' –

2

Помимо проблем указывалось другими, первая ошибка, потому что вы не объявилиstandard_deviation перед его использованием в main(). Это упущение означает неявное объявление int standard_deviation(). Это связано с определением той же функции.

Разместите эту строку перед main():

float standard_deviation(int num_grades, int grades[]);