为什么我在C中得到了错误的平均值?

为什么我在C中得到了错误的平均值?,c,C,我是新手,有点麻烦。我试图找到用户输入的分数的平均值,但我意识到,如果你在任何分数中使用小数点,它的计算就像它们是整数一样 #include <stdio.h> int main(void) { unsigned int counter; float grade; int total; float average; int number; total = 0; counter = 1; printf

我是新手,有点麻烦。我试图找到用户输入的分数的平均值,但我意识到,如果你在任何分数中使用小数点,它的计算就像它们是整数一样

#include <stdio.h>

int main(void)
{
    unsigned int counter;
    float grade;
    int total;
    float average;
    int number;
    
    total = 0;
    counter = 1;
    
    printf("Number of scores to enter:\t");
    scanf("%d", &number);

    printf("\n");
    
    while (counter <= number) {
        printf("%s%d%s", "Enter the score for Lab ", counter, ":\t");
        scanf("%f", &grade);
        total = total + grade;
        counter = counter + 1;
    }
    
    printf("\n");
    
    average = (float) total / number;
    
    printf("Average lab score: %.1f\n", average);
    
    if (grade>=90) {
        puts("Letter grade: A");
    }
    else if (grade>=80) {
        puts("Letter grade: B");
    }
    else if (grade>=70) {
        puts("Letter grade: C");
    }
    else if (grade>=60) {
        puts("Letter grade: D");
    }
    else {
        puts("Letter grade: F");
    }

    return 0;
}
#包括
内部主(空)
{
无符号整数计数器;
浮子等级;
整数合计;
浮动平均;
整数;
总数=0;
计数器=1;
printf(“要输入的分数:\t”);
scanf(“%d”和编号);
printf(“\n”);
而(计数器=90){
看跌期权(“字母等级:A”);
}
否则,如果(等级>=80){
看跌期权(“字母等级:B”);
}
否则,如果(等级>=70){
看跌期权(“字母等级:C”);
}
否则,如果(等级>=60){
看跌期权(“字母等级:D”);
}
否则{
看跌期权(“字母等级:F”);
}
返回0;
}

您正在捕获
scanf(“%f”、&grade)作为浮点数,然后计算<代码>总数=总数+等级

您已经定义了
int-total。您需要将其定义为
float total


您正在将一个浮点变量移动到一个整数中,该整数将截断您以前输入的小数。

无需预先询问将输入多少数据点。事实上,这是一种反模式。只需做如下操作:

#include <stdio.h>

int
main(void)
{
        unsigned int count = 0;
        float grade;
        float total = 0.0;
        float average;

        while( scanf("%f", &grade) == 1 ) {
                total += grade;
                count += 1;
        }
        average = total / (float) count;
        printf("Average lab score: %.1f\n", average);
        fputs("Letter grade: ", stdout);
        putchar( average >= 90.0 ? 'A' : average >= 80.0 ? 'B' :
                average >= 70.0 ? 'C' : average >= 60.0 ? 'D' : 'F');
        putchar('\n');

        return average >= 60.0;
}

$ echo 78.2 96.5 80 | ./a.out
Average lab score: 84.9
Letter grade: B
#include <stdio.h>

int
main(void)
{
        unsigned int count = 0;
        float grade;
        float total = 0.0;
        float average;

        while( scanf("%f", &grade) == 1 ) {
                total += grade;
                count += 1;
        }
        average = total / (float) count;
        int s = 'A' + (99 - (int)average) / 10;
        printf("Average lab score: %.1f\n", average);
        printf("Letter grade: %c\n", s > 'D' ? 'F' : s);

        return average >= 60.0;
}

total
是一个
int
,因此您的浮点值在制表过程中会四舍五入。需要执行
(float)total
提示有问题。您正在将分数累积到变量
total
,该变量的类型为
int
。每次分配给该变量时,都会删除任何小数部分。
total
不是四舍五入,而是截断。不完全一样。但仍然不是你想要的。你转换成字母等级的部分使用的是输入的最后一个等级,而不是平均值。如果
s
s中的
等级
是最后一个实验的分数。