【问题标题】:Find the average of an unknown number of inputs求未知数量输入的平均值
【发布时间】:2015-10-05 02:13:37
【问题描述】:

我需要编写一个 C 程序,使用函数计算用户输入的成绩的平均值。输入的等级数未知,所以我必须使用标记值 -1。

这是我的代码,它编译得很好,但是它没有告诉我平均值,并且 for 循环没有调用该函数四次。我错过了什么?

 #include <stdio.h>

 float calculateAverage (int sumofGrades, int numberofGrades);

 int main(void) {

 int i;
 int sumofGrades = 0;
 int numberofGrades = 0;
 int grade = 0;
 float average;

 for (i = 1; i <= 4; ++i) {

    calculateAverage(sumofGrades, numberofGrades);

 }
 return 0;
 }

float calculateAverage (int sumofGrades, int numberofGrades) {

float average;
int grade;

printf("Enter grades and -1 to stop: ");
scanf("%d", &grade);
while (grade <= 100 && grade != -1) {
    numberofGrades++;
    sumofGrades += grade;
    average = sumofGrades / numberofGrades;

}
printf("The average is %.2f", average);

return average;

}

更新

感谢您的帮助!但我还不能做对。对于作业,我需要程序要求我输入 4 次未知的分数,并且每次计算平均值。

另外,为什么在我输入 -1 后它不停止并给出平均值?

#include <stdio.h>

float calculateAverage(int sumofGrades, int numberofGrades);

int main(void) {
    int i;
    int sumofGrades = 0;
    int numberofGrades = 0;

    for (i = 1; i <= 4; ++i) {
        calculateAverage(sumofGrades, numberofGrades);
    }
    return 0;
}

float calculateAverage (int sumofGrades, int numberofGrades) {

    float average;
    int grade = 0;

    while (grade != -1 && grade >= 0 && grade <= 100) {
        printf("Enter grades and type -1 to stop: ");
        scanf("%d", &grade);

        if (grade != -1) {
            numberofGrades++;
            sumofGrades += grade;
        }
    }

    average = sumofGrades / numberofGrades;
    printf("The average is %.2f\n", average);

    return average;
}

更新

我仍然有问题!我无法让程序要求我输入四次成绩并每次计算平均值!我试过了,我试过了,这太令人沮丧了!!我做错了什么??

【问题讨论】:

  • 请注意,恶意用户可以输入 30 个 -100 的等级,您的程序不会反对。我怀疑得分的真实性。 (您应该比现在更仔细地检查分数是否有效。)在循环中计算平均值是没有意义的。你只知道最后的答案。不清楚为什么将数字零传递给函数;只要它们被正确初始化,它们作为局部变量(函数的局部变量,即不是main())都会更好。
  • 这一行:for (i = 1; i &lt;= 4; ++i) { 虽然在这个特定的实例中这不是问题,但在循环中使用“i”时会给您带来很多问题,特别是如果使用“i”来索引成一个数组。建议养成编写这样一个 for 循环的习惯:for (i = 0; i &lt; 4; ++i) {
  • 为了便于我们人类阅读,请始终缩进代码。
  • 我的作业要求我专门使用那个 for 循环..
  • 在调用系统函数:scanf()和函数族时,一定要检查返回值(不是参数值)以保证操作成功。

标签: c average


【解决方案1】:

输入一个有效成绩后,您的代码不会尝试读取另一个成绩:

printf("Enter grades and -1 to stop: ");
scanf("%d", &grade);
while (grade <= 100 && grade != -1) {
    numberofGrades++;
    sumofGrades += grade;
    average = sumofGrades / numberofGrades;
}

如果成绩有效,则进入无限循环。它还计算每个周期的平均成绩,这是不必要的。一次,在循环之后,就足够了。

也许你应该使用:

printf("Enter grades and -1 to stop: ");
while (scanf("%d", &grade) == 1 && grade <= 100 && grade >= 0)
{
    numberofGrades++;
    sumofGrades += grade;
}
if (numberofGrades == 0)
{
    fprintf(stderr, "Error: zero valid grades entered\n");
    average = 0.0;
}
else
{
    average = sumofGrades / numberofGrades;
    printf("The average is %.2f", average);
}
return average;

请注意,这会在使用成绩之前检查输入是否成功。

您也真的不需要将变量传递给函数。您最好让函数不接受任何参数,并将参数作为常规局部变量正确初始化为零。

您的主程序应该在返回后捕获平均值,而不是忽略它。或者也许函数毕竟不应该返回平均值。

【讨论】:

    【解决方案2】:

    首先,您要循环 4 次 calculateAverage 函数。你是故意这样做的吗?我认为你应该只做一次。

    其次,在你的 while 循环中

    while (grade <= 100 && grade != -1) {
        numberofGrades++;
        sumofGrades += grade;
        average = sumofGrades / numberofGrades;
    
    }
    

    你在无限循环。如果输入了 -1 以外的值,这将永远循环。这应该改为 if 语句。

    if (grade <= 100 && grade != -1)
    

    但是有更好的方法来编写这段代码(如果我猜你真正想要它做什么)

    #include <stdio.h>
    
    float calculateAverage (int sum, int size);
    
    int main(void) 
    {
    
        int input;
        int sum = 0;
        int count = 0;
        while (input != -1 && input >= 0 && input <= 100)
        {
           printf ("Enter a Grade: ");
           scanf ("%d", &input);
    
           if (input != -1)
           {
               sum += input;
               count++;
           }
        }
    
        float average = calculateAverage(sum, count);
        return 0;
    }
    
    float calculateAverage (int sum, int count) {
    
       // Do your average math here....
    }
    

    【讨论】:

    • 在标记为 C 的问题中使用 C++ 代码不是一个好主意。你的基本诊断没问题,但给出 C++ 代码就不行了。
    • 对不起,你是对的。我留下代码来表达基本思想。由于这可能是他的作业,这将使他仍然可以学习并将其翻译成c。
    • 感谢您的帮助!但我还不能做对。对于作业,我需要程序要求我输入 4 次未知的分数,并且每次都计算平均值。
    • 如果您需要有 4 个不同的输入时间。用 4 次 for 循环围绕 while 循环将起作用。退出第一个 while 循环后,您可以打印一条消息,说明时间已经结束。此外,您可以将 4 个平均值(和总和)存储在一个大小为 4 的数组中。
    • 我还是搞不定!!当我编译时,它要求我输入数字。一切顺利,直到我输入我的号码。它只给了我一次平均值,然后连续 4 次重复“输入成绩并键入 -1 停止”,计算出的平均值与我首先输入的数字相同!!
    【解决方案3】:

    鉴于发布的代码,子函数无法更新 main() 函数中的变量。

    建议将指针传递给变量并修改子函数以期望(并正确处理)这些指针

    【讨论】:

    • 是的,但由于 main 不会尝试打印它们,因此不会造成任何伤害。这很奇怪(正如我在评论和回答中所指出的那样),并且不是良好的编程习惯,但它实际上并没有破坏代码。
    • 我不明白...对不起,我真的是新人
    • 哪一部分是不好的编程习惯?我想改进。
    • @Cbeginner:编程习惯不好的部分是将两个参数传递给很可能是局部变量的函数。您总是将两个零传递给函数;函数中值的副本会更新,但更新不会影响main() 中的变量。
    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多