为什么我的求和和计数值在每个循环中都丢失了?

时间:2018-10-10 05:42:48

标签: c

即使每个循环都应填充变量,我也会得到一个始终如一的被零除的错误。下面的代码:

#include <stdio.h>

 void calculateAverage()
{
int grade, count, sum;
double average;


sum = 0;
count = 0;
grade = 0;
average = 0.0;
int coolvalue = 0;

while (coolvalue==0)
{
    scanf("%d", &grade);
    if (grade == -1)
    {
        sum, sizeof(double);
        count, sizeof(double);
        average = (sum / count);
        printf("%lf", &average);
        break;
    }
    else
    {
        if ((grade > 100) || (grade < -1))
        {
            printf("Error, incorrect input.\n");
            break;
        }
        else
        {
            sum = +grade;
            count = count + 1;
            return count;
            return sum;
        }
    }
}
coolvalue = 1;
}

int main(void)
{
while (1)
calculateAverage();

while (1) getchar();
return 0;
}

即使在使用return时,我也无法正确地增加sum或count的值。

3 个答案:

答案 0 :(得分:4)

您的代码中存在多个问题。

scanf("%d", &grade);-您不检查scanf()返回的值。它返回成功读取的值的数量。如果输入字母字符串而不是数字,则scanf("%d")将返回0,并且不会更改grade的值。因此,代码将使用先前的grade值执行循环的其余部分。如果scanf()返回的值不是1,则应该重新启动循环:

if (scanf("%d", &grade) != 1) {
    continue;
}

假设您为10输入grade,该代码块将执行:

sum = +grade;
count = count + 1;
return count;
return sum;
  • sum = +gradesum = grade相同。 +前面的grade符号没有任何作用。它与0 + grade相同。

    您想将grade的值添加到sum,它的值应为sum += grade。这是sum = sum + grade的快捷方式。

  • return count使函数完成,并将count的值(此时为1)返回给调用者。调用方是函数main(),但它不以任何方式使用返回值。更重要的是,您的函数被声明为返回void(即什么也不返回),这使return count不正确(编译器应对此发出警告)。

  • return sum永远不会执行(编译器应警告您它已死代码),因为该函数已完成并且由于其上方的return count语句而将执行传递回调用方

    删除两个return语句。他们一定不能留在这里。

如果您为-1输入grade,则会执行以下代码块:

sum, sizeof(double);
count, sizeof(double);
average = (sum / count);
printf("%lf", &average);
break;
  • sum, sizeof(double)是一个没有任何作用的表达式;它采用sum的值,然后丢弃它,然后采用sizeof(double)的值(这是一个常数),也将其丢弃。编译器甚至不会为其生成代码。

  • 与上述count, sizeof(double)相同;

  • average = (sum / count);

    • 括号没用;
    • 因为sumcount都是整数,sum / count也是整数(sum / count的整数结果,其余部分被忽略)。

    • 您将average声明为double;要获得double的结果,您必须在除法上将其中一个值强制转换为doubleaverage = (double)sum / count;

    • 如果在程序启动时输入-1作为第一个值,则在执行此代码且除法失败(除以零)时,count0。 / p>

  • printf("%lf", &average);-您要打印average的值,但要在内存中打印其地址。删除&运算符; scanf()要求它(以知道将读取值放在何处)。 printf()不需要它;编译器生成代码,以将要打印的值传递给printf()
  • break;-它在最里面的switch或循环语句(dowhilefor)之后传递执行控制。这是正确的,并且使变量coolvalue无用。您只需删除coolvalue并改用while (1)

总而言之,您的函数应如下所示:

void calculateAverage()
{
    int sum = 0;
    int count = 0;
    int grade = 0;
    double average = 0.0;

    while (1) {
        if (scanf("%d", &grade) != 1) {
            // Invalid value (not a number); ignore it
            continue;
        }

        // A value of -1 signals the end of the input
        if (grade == -1) {
            if (count > 0) {
                // Show the average
                average = (double)sum / count;
                printf("Average: %lf\n", average);
            } else {
                // Cannot compute the average
                puts("You didn't enter any value. Cannot compute the average.\n");
            }
            // End function
            return;
        }

        if ((grade < -1) || (100 < grade)) {
            puts("Error, incorrect input.\n");
            // Invalid input, ignore it
            continue;
        }

        sum += grade;
        count ++;
    }
}

答案 1 :(得分:2)

需要进行一些更正。

  1. while函数中的calculateAverage()循环。这是一个无限循环的伙伴,因为您不会在内部的任何地方更改该coolValue变量的值,而是仅在它退出循环时才将其1设为它永远不会改变。 因此,使用while(1) {...},并在其中检查停止条件,即if (grade == -1) { ... },并在其中计算并打印averagereturn。这将自动断开while
  2. 您不检查输入grade是否实际上是有效的整数。为此,请检查scanf的值,即使用if (scanf("%d", &grade) != 1) { ... }
  3. 表达式sum = +grade;只是编写sum = 0+grade的另一种方式,而该文本又只不过是sum = grade。将此内容替换为sum += grade;。这是编写加法速记的正确方法。
  4. 两个return语句..一个非常错误的想法。首先,一个函数只能有一个return(以我的明显意思是一次)。其次,函数calculateAverage()具有返回类型void。无法从中返回double值。因此,请删除这两个语句。

我附上了下面的工作代码。还要检查我所附的输出。

代码:

#include <stdio.h>

void calculateAverage()
{
    int grade, count = 0, sum = 0;
    double average;
    printf("\nenter the grades... enter -1 to terminate the entries\n.");
    while (1) {
        printf("\nEnter the grade: ");
        if (scanf("%d", &grade) != 1) {
            printf("\nInvalid characters entered!!!");
            continue;
        }
        else if(((grade > 100) || (grade < -1))) {
            printf("\nInvalid grade entered!!!");
            continue;
        }
        else {
            if (grade == -1) {
                average = sum/count;
                printf("\nAverage value of grades: %.3lf",average);
                return;
            }
            else {
                sum += grade;
                count++;
            }
        }
    }
}

int main(void)
{
  calculateAverage();
  return 0;
}

输出:

  

输入成绩...输入-1以终止输入。

     

输入成绩:50

     

输入成绩:100

     

输入成绩:60

     

输入成绩:-1

     

平均成绩:70.000

答案 2 :(得分:-1)

函数最好是double类型而不是void类型。尽管这不是我最喜欢的解决方案,但它接近您想要的。

#include <stdio.h>
double  calculateAverage(void)
    {
        double average;
        int sum = 0, count=0, grade;
        while (1)
        {           
            scanf("%d", &grade);    
            if ((grade > 100) || (grade < -1))              
                printf("Error, incorrect input.\n");    
            else if (grade != -1)
                {sum = sum+ grade;  count = count + 1;}             
            else
                break;              
        }
        if (count==0) 
            average=-1.0; //none valid input. Notify the main()
        else    
            average=(double)sum/count;
        return average;  
     }

int main(void)
    {
        double result;
        result= calculateAverage();
        if (result!=-1.0)
            printf("\n average= %lf",result);
        else    
            printf("No grades to calculate average");
        getchar();
        return 0;
    }