#include <stdio.h>
#include <math.h>
float math(int, int, int, int, int, float, float, float);
main() {
int a, b, c, d, e;
float sum, avg, sd;
printf("Enter Five Integers->");
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
math(a, b, c, d, e, sum, avg, sd);
printf("Sum=%.2fnAverage=%.2fnStandard Deviation=%.2f", sum, avg, sd);
}
float math(int a, int b, int c, int d, int e, float sum, float avg, float sd) {
sum = a + b + c + d + e;
avg = (sum) / 5;
sd = pow(
((pow(a - avg, 2) + pow(b - avg, 2) + pow(c - avg, 2) + pow(d - avg, 2),
pow(e - avg, 2)) /
5),
0.5);
return sum, avg, sd;
}
我的程序总是返回答案0.00。谁能解释我的代码问题是什么?
tl; dr ,因为,您的代码调用了不确定的行为,并且无法做出合理的理由。
要详细说明语句
return sum, avg, sd;
不做您认为正在做的事情。它不会一起返回三个值,而是由于逗号运算符的使用,它仅返回sd
。
也就是说,您没有在代码中任何地方收集函数调用的返回值,因此您无法从呼叫者中的函数调用中返回任何有效的输出。
之后,您最终使用
printf("Sum=%.2fnAverage=%.2fnStandard Deviation=%.2f", sum, avg, sd);
在哪里,所提供的变量(自动,本地变量)仍然是不可传统的,本质上是试图利用调用不确定行为的不确定值。
最后,对于托管环境,main()
的符合签名至少应为int main(void)
。
解决方案:您需要
将指针传递到要存储来自调用函数的结果的变量,然后,在呼叫者中,您可以使用它们来检索更新的值。
形成一个结构,其中包含您希望返回,填充和返回结构的所有变量。然后,在呼叫者中,在另一个结构类型变量中收集返回的值,然后使用单个成员元素打印值。
您的代码中很少有要点。
- 在C中,您不能从函数中返回超过1个值。您正在尝试返回3个阀
- 两个函数的局部变量之间存在差异。您不能在1个函数中分配它们,并在没有适当参考的情况下将其分配。
- 您将功能作为"按值调用"(在链接中阅读更多有关它的信息)。当您想要更改的值时,您应该使用使用指示器的"引用"。
因此,最简单的修复程序将使用全局变量。
void math(int, int, int, int, int); //Changed function declareation
double sum,avg,sd; //New global variables
int main()
{
int a, b, c, d, e;
printf("Enter Five Integers->");
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
math(a, b, c, d, e); //Changed function calling
printf("Sum=%.2fnAverage=%.2fnStandard Deviation=%.2fn", sum, avg, sd);
return 0;
}
void math(int a, int b, int c, int d, int e)
{
sum = a + b + c + d + e;
avg = (sum) / 5;
double result = (pow(a - avg, 2) + pow(b - avg, 2) + pow(c - avg, 2) + pow(d - avg, 2) + pow(e - avg, 2) ) / 5;
sd = pow(result , 0.5);
}