2017-02-26 240 views
-5
#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=%.2f\nAverage=%.2f\nStandard 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的答案。任何人都可以解释我的代码有什么问题吗?为什么我的代码返回0.00?

+2

请正确缩进您的代码。阅读逗号操作符所做的事情,您不会分配返回值;变量是按值传递的,因此在函数中改变它们根本没有帮助。 –

+1

当您逐步完成代码时,调试器会告诉您什么? –

+2

您的'数学'函数并不会返回您认为它的功能(请阅读[逗号运算符](http://en.cppreference.com/w/c/language/operator_other#Comma_o​​perator))。你可能需要[找到一个好的初学者书](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)并阅读更多关于函数以及参数和返回值价值观工作。 –

回答

1

TL; DR因为,您的代码调用undefined behavior并且没有理由可以推理输出。

为了阐述,首先,声明

return sum, avg, sd; 

不会做你觉得它在做什么。它不会将三个值返回到一起,而是由于使用了comma operator,它仅返回sd

也就是说,您没有收集函数调用的返回值,因此您无法从调用方中的函数调用返回任何有效的输出。

之后,你最终使用

printf("Sum=%.2f\nAverage=%.2f\nStandard Deviation=%.2f", sum, avg, sd); 

其中,提供的变量(自动,局部变量)仍然未初始化,主要想利用它调用undefined behavior不定值。

最后,对于托管环境,main()的符合签名应至少为int main(void)

解决方法:您需要或者

  • 指针传递的变量要在其中存储从被调用函数的结果,然后在调用者可以使用它们来检索更新后的值。

  • 形成一个包含所有要为其返回计算值的变量的结构,填充并返回结构。然后,在调用者中,将返回的值收集到另一个结构类型变量中,然后使用各个成员元素来打印该值。

+0

谢谢你的帮助。我刚刚开始编程几天前,我还没有研究过指针,所以我不知道如何使用它们。 –

+0

@MuneebAhmed Nopes,那更错了。 –

+0

我会尽量在几天内用指针重写这段代码。谢谢你的帮助! –

0

您的代码中很少有取点。

  1. 在C中,你不能从一个函数返回多于1的值。您尝试返回3个值,因为这些值是使用“逗号(,)”分隔的,所以只返回最后一个值。
  2. 两个函数的局部变量是有区别的。您不能将它们分配给1个函数,并且在没有正确参考的情况下将其用于其他函数
  3. 您的功能为“​​”(在链接中了解更多信息)。当你想改变值时,你应该使用“call by refernce”,它使用指针。

因此,最简单的修复方法是使用全局变量。

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=%.2f\nAverage=%.2f\nStandard Deviation=%.2f\n", 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); 
} 
+0

使用全局变量不是解决问题的好方法。有用;它甚至可能相当简单;尽管如此,这不是一个好习惯。该场景中还存在其他问题(而不是您原来的场景)。特别是,传递一个固定数量的值是奇数。一个更好的解决方案会将半任意数量的值读入数组中,并且函数中的代码将处理该数组。 –

相关问题