【问题标题】:Cannot figure out the output in this C program for calculation of sum and average using functions无法计算此 C 程序中的输出以使用函数计算总和和平均值
【发布时间】:2017-10-09 18:19:41
【问题描述】:

我在 Windows 7 64 位机器上使用 Dev-C++(MinGW 编译器)。我编写了一个简单的程序来查找 5 个整数的总和和平均值(假设平均值将是一个 int)。代码如下:

/*Sum and average of 5 integers*/
#include <stdio.h>

main()
{
    int a,b,c,d,e,sm,av;
    printf ("Enter any 5 integers:\n");
    scanf ("%d%d%d%d%d", &a,&b,&c,&d,&e);
    sumavg(a,b,c,d,e);
    printf ("\nSum = %d", sm);
    printf ("\nAverage = %d", av);
    getch();
}

sumavg(n,w,o,b,h)
{
     int sm = n+w+o+b+h;
     int av = sm/5;
     return(sm,av);
}

出于某种奇怪的原因,无论 5 个整数的值是多少,输出都是 Sum = 2 和 Average = 27。即使平均值不准确(因为理想情况下它将是浮点数),至少返回的总和值应该是准确的。我究竟做错了什么?谢谢...

【问题讨论】:

  • 有什么魔法可以为sm 赋值?不说其他一些无意义的结构......请拿一本现代 C 书阅读。
  • return(sm,av); 不返回 2 个值,它返回 av
  • main 中的av 与sumavg 中的av 不同,后者在函数退出时被遗忘。函数sumavg 尝试返回一个值:它依赖于过时的假设,并且无论如何main 都不会收集该值。
  • main()?对不起,你是过去的人吗?
  • 不要编写 K&R(准标准)C 函数。始终使用具有显式类型和完整功能原型的现代(如过去 28 年)表示法。 (@Geoff:main() 的问题比sumavg() 要小。)

标签: c


【解决方案1】:

你调用一个你声明的函数,然后给sm和av一个值。但是这些变量是局部变量,它们与main() 中的变量无关。如果你在一个函数中声明了一个变量,然后在另一个函数中声明了另一个变量,那么这两个变量在任何情况下都是不相同的,即使它们具有相同的名称。就像人一样:你可能和别人同名,但这并不意味着你是同一个人,绝对不是。

要使用您在main 中声明的变量,您可以将指向它们的指针作为函数的参数传递。这是您将拥有的原型:

void    sumavg(int a, int b, int c, int d, int e, int *sum, int *av)

您还可以使用 2 个不同的函数来计算所有整数的总和或平均值,然后将结果直接返回到 main 的变量中:

int    main(void)
{
    int a, b, c, d, e, sm, av;

    printf ("Enter any 5 integers:\n");
    scanf ("%d%d%d%d%d", &a, &b, &c, &d, &e);
    sm = get_sm(a, b, c, d, e);
    av = get_av(a, b, c, d, e);
    printf ("\nSum = %d", sm);
    printf ("\nAverage = %d", av);
    return (0);
}

例如:

int    get_sum(int a, int b, int c, int d, int e)
{
    return (a + b + c + d + e);
}

int    get_av(int a, int b, int c, int d, int e)
{
    return((a + b + c + d + e) / 5);
}

【讨论】:

    【解决方案2】:

    C 需要向它解释的东西。它不会做出许多语言会做出的推论。此外,语法错误。让我列举一下问题(在这种情况下,并非所有这些都是绝对必要的,但你应该这样做):

    1. 声明函数的返回类型。 int main() 和 sumavg 将我们带到第 2 位。

    2. C 不允许以这种方式返回多个值。通过该语法,sm 将被丢弃(您在 return 语句中使用逗号运算符)。您可能应该将int sum() 和int avg() 声明为两个独立的函数。

    3. 声明参数的类型。 int sum(int n, int w, int o, int b, int h)

    4. 函数应该在调用之前声明。您可以通过在顶部放置一个“原型”来做到这一点(函数的签名,主体替换为分号,参数可能未命名):int sum(int,int,int,int,int);

    5. 由于名称相同,返回值不会传递给调用函数。您需要明确分配它们,即sm = sum(a,b,c,d,e);

    【讨论】:

    • 使用带有参数名称的原型声明是完全合法的:int sum(int v1, int v2, int v3, int v4, int v5); 可以工作,int sum(int n, int w, int o, int b, int h); 也可以。
    • 您的评论没有提到“可选”;它说原型不能命名参数。如果您说“并且可能使用未命名的参数”(或类似的内容),我们将不会进行此讨论。
    • 已修复。不应该这么快写出来。
    • 好。不过,我只能投票一次。我们要删除这些 cmets 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多