【问题标题】:Why is the number declared in the double function not used? (C)为什么没有使用 double 函数中声明的数字? (C)
【发布时间】:2021-03-16 16:50:10
【问题描述】:
#include <stdio.h>

double calculate_average (int number)
{
    static int numberInput = 0; //counter
    static int sum = 0;
    sum = sum + numberInput;
    numberInput++;
    return sum / numberInput;
    // calculate and return average so far.
}
int main(void)
{
    double average;
    while (1)
    {
        int number;
        scanf("%d", &number);
        if (number == 0)
            break; //stops if number == 0
        else
            average = calculate_average(number);
    }
    printf("%.1f\n", average);
    return 0;
}

正如我个人所说,该函数正在尝试计算平均值。但是为什么main函数在calculate_average函数中没有使用number呢?

【问题讨论】:

  • 您是如何确认这一点的?
  • 您知道sum / numberInput 是整数除法,并且会向0 舍入吗?函数试图返回 double 的事实为时已晚。
  • “电话号码”是什么意思?您认为缺少什么?目前还不清楚。你给这个程序什么输入?它产生什么输出?为什么这是错的? Edit 包括样本输入、所需输出、当前输出以及差异/问题的描述。

标签: c


【解决方案1】:

正如所写,您的calculate_average 函数不使用其给定的number 参数,因为在该函数中无处,您是否指示它这样做。最有可能的是,您的 sum = sum + numberInput; 应该真的是 sum = sum + number;(因此将给定的数字添加到运行总数中)。

其他几点:

  1. 你应该初始化你的 average 变量(到 0.0),否则如果你给你的程序一个空列表你会得到一个疯狂的结果(即,给零作为第一个条目)。
  2. 由于您的函数返回double,最好将sum 变量也作为double;否则,您将在计算中执行整数运算,所有返回值将被截断为整数(丢失任何小数部分)。
  3. 其他人可能会指出您应该始终检查您的scanf 调用返回的值(如果读取操作成功,它将是1)并添加代码来处理任何错误;但是,恕我直言,这里解决这一点超出了这个问题的“范围”,但请参阅this answerHow validate user input when the expected value is of type int and the entered value is not of type int?

这是一个可能的工作版本:

#include <stdio.h>

double calculate_average(int number)
{
    static int numberInput = 0; //counter
    static double sum = 0.0;
    sum = sum + number;
    numberInput++;
    return sum / numberInput;
    // calculate and return average so far.
}

int main(void)
{
    double average = 0.0; // Always best to initialize variables!
    while (1)     {
        int getal;
        scanf("%d", &getal);
        if (getal == 0)
            break; //stops if getal == 0
        else
            average = calculate_average(getal);
    }
    printf("%.1f\n", average);
    return 0;
}

请随时要求任何进一步的解释和/或澄清。

【讨论】:

  • 我很欣赏这个答案,这对理解出了什么问题有很大帮助。整个问题实际上是我完全破坏的总和计算。所以修复确实是 sum = sum + number;
  • 第 3 点非常重要——正如所写的那样,如果用户在任何时候输入非数字(非空白)字符,代码可能会挂起(进入无限循环)。不好。至少if (scanf("%d", &amp;getal) != 1) break; 会更好,它至少会在无效(非数字)输入上终止循环。
  • 哇,我刚刚检查过了。它确实使它无限。谢谢。现在必须注意这些类型的事情。
  • @ChrisDodd 确实如此。但是链接的答案(有点)解决了这个问题,我真的不想重复其他 SO 帖子(我敢肯定有一些)。
  • @Heeko scanf 系列函数的设计初衷似乎是“绊倒”C 初学者(和其他人)
猜你喜欢
  • 2012-07-16
  • 2012-11-23
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多