【问题标题】:how not to get an extra count in a while loop?如何不在while循环中获得额外的计数?
【发布时间】:2021-06-23 10:53:12
【问题描述】:

我有以下代码,每次运行它,我都会得到一个额外的计数。例如,我第一轮输入 8,然后下一轮输入 2,并以标记 -1 退出,总和将按预期为 10,但计数将为 3。我已经调试了程序,无论计数是否到来在 scanf() 之前或之后,我仍然得到一个 3 值。一种可能的解决方案是将计数初始化为 -1。但是,我觉得我不应该这样做,并且将计数设置为零应该可以。我必须将计数设置为 -1 吗?

#include <stdio.h>

void calculateAverage()
{
    int grade = 0, count, sum = 0;
    double average;
    
    count = 0;
    
    while(grade != -1)
    {
        
        sum += grade;
        count++;

        printf("input a grade: \n");
        scanf("%d", &grade);
        

    }
    
    average = (double)(sum)/(double)(count);
    printf("%.2lf", average);

    return;
}

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

    return 0;
}

【问题讨论】:

  • 循环的第一次迭代始终以包含在计数中的 0 级开始。看看do-while 循环,看看你是否能弄清楚它对你的算法有什么帮助。
  • 可能以count = -1 开头,而不是count = 0
  • 仔细阅读您的代码;)您在开始使用 scanf 输入值之前进入循环。这意味着您每次都会有一个额外的迭代。如果您是编程初学者,我建议您对算法中的变量进行跟踪,即拿起笔和纸,按照您的代码,并更新每个变量。这样,您将更多地了解哪些部分未按预期运行。就像@ChristianGibbons 所说,使用 do-while 循环
  • “我必须将计数设置为 -1 吗?” - 这有什么问题吗?

标签: c xcode loops counting function-definition


【解决方案1】:

您在输入 -1 之前递增计数。所以,它也算-1。只是增加的是如果它不是-1。

#include <stdio.h>

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

    while (grade != -1)
    {

        sum += grade;

        printf("input a grade (-1 - stop): ");
        scanf("%d", &grade);

        if (grade != -1) // Check this line
            count++;
    }

    average = (double)sum / count;
    printf("%.2lf\n", average, sum, count);

    return;
}

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

    return 0;
}

【讨论】:

    【解决方案2】:

    对于初学者来说,将变量 sum 声明为具有 int 类型没有太大意义,因为无论如何您都将其转换为 double 类型

    average = (double)(sum)/(double)(count);
    

    在用户输入内容之前,您正在增加变量count

    该函数可以通过以下方式定义,如下面的演示程序所示。

    #include <stdio.h>
    
    void calculateAverage( void )
    {
        const int Sentinel = -1;
        
        size_t count = 0;
        double sum = 0.0;
        
        printf( "input a grade (%d - stop): ", Sentinel );
    
        for ( int grade; scanf( "%d", &grade ) == 1 && grade != Sentinel; )
        {
            sum += grade;
            ++count;
    
            printf( "input a grade (%d - stop): ", Sentinel );
        }        
    
        double average = count == 0 ? sum  : sum / count;
        
        printf( "%.2lf", average );
    }
    
    int main(void) 
    {
        calculateAverage();
        
        return 0;
    }
    

    程序输出可能看起来像

    input a grade (-1 - stop): 1
    input a grade (-1 - stop): 2
    input a grade (-1 - stop): 3
    input a grade (-1 - stop): 4
    input a grade (-1 - stop): 5
    input a grade (-1 - stop): 6
    input a grade (-1 - stop): 7
    input a grade (-1 - stop): 8
    input a grade (-1 - stop): 9
    input a grade (-1 - stop): 10
    input a grade (-1 - stop): -1
    5.50
    

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多