我有以下代码,每次运行它时,我都会得到一个额外的计数。例如,假设我在第一轮输入8,然后在下一轮输入2,然后用sentinel-1退出,总数将如预期的那样为10,但计数将为3。我已经调试了这个程序,无论count是在scanf((之前还是之后,我仍然得到一个3的值。一种可能的解决方案是将计数初始化为-1。然而,我觉得我不应该这样做,将count设置为零应该有效。我必须将count设置为-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;
}
对于初学者来说,将变量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
在输入-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("%.2lfn", average, sum, count);
return;
}
int main()
{
while (1)
calculateAverage();
return 0;
}