在 C 中编写方法时遇到问题,包括指针和类型
Having trouble writing a method in C, including pointers and types
我正在用 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;
}
当我编译这个程序时,因为我在安全 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
这些是我认为可以轻松修复的基本错误,但由于在安全 Shell 客户端中很容易出现错别字和输入错误,所以我很难找出是哪个错误。哦,它没有指定在哪里放置替换错误修复程序,如 IDE。由于我使用的是 Math header,在我设法使用您的输入成功编译它之后,我会说 gcc -o grades2.exe grades2.o -lm,其中 -lm 表示我' m 用数学 header 编译程序。
能否请你帮我修正错误。
这将得到 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;
}
并且您需要 main()
之前的 standard_deviation()
函数原型,或者将整个函数定义移动到 main()
.
之前
不然,什么juanchopanza你也会这样
改变这个:
(float)(1/num_grades)
为此:
(float)(1)/num_grades
当然,你可以直接1.0f/num_grades
,但我只是想赞同你注意操作顺序。使用 (float)(1/num_grades)
,您首先执行 1/num_grades
的 整数除法 (这很可能产生 0
),然后才将其转换为 float
(所以你得到 0.0
)。
除了其他人指出的问题外,第一个错误是因为您在main()
中使用之前没有声明 standard_deviation
。此省略意味着提供了隐式声明 int standard_deviation()
。这与您对同一函数的定义冲突。
将此行放在 main()
之前:
float standard_deviation(int num_grades, int grades[]);
我正在用 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;
}
当我编译这个程序时,因为我在安全 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
这些是我认为可以轻松修复的基本错误,但由于在安全 Shell 客户端中很容易出现错别字和输入错误,所以我很难找出是哪个错误。哦,它没有指定在哪里放置替换错误修复程序,如 IDE。由于我使用的是 Math header,在我设法使用您的输入成功编译它之后,我会说 gcc -o grades2.exe grades2.o -lm,其中 -lm 表示我' m 用数学 header 编译程序。
能否请你帮我修正错误。
这将得到 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;
}
并且您需要 main()
之前的 standard_deviation()
函数原型,或者将整个函数定义移动到 main()
.
不然,什么juanchopanza你也会这样
改变这个:
(float)(1/num_grades)
为此:
(float)(1)/num_grades
当然,你可以直接1.0f/num_grades
,但我只是想赞同你注意操作顺序。使用 (float)(1/num_grades)
,您首先执行 1/num_grades
的 整数除法 (这很可能产生 0
),然后才将其转换为 float
(所以你得到 0.0
)。
除了其他人指出的问题外,第一个错误是因为您在main()
中使用之前没有声明 standard_deviation
。此省略意味着提供了隐式声明 int standard_deviation()
。这与您对同一函数的定义冲突。
将此行放在 main()
之前:
float standard_deviation(int num_grades, int grades[]);