即使每个循环都应填充变量,我也会得到一个始终如一的被零除的错误。下面的代码:
#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的值。
答案 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 = +grade
与sum = 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);
:
因为sum
和count
都是整数,sum / count
也是整数(sum / count
的整数结果,其余部分被忽略)。
您将average
声明为double
;要获得double
的结果,您必须在除法上将其中一个值强制转换为double
:average = (double)sum / count;
如果在程序启动时输入-1
作为第一个值,则在执行此代码且除法失败(除以零)时,count
为0
。 / p>
printf("%lf", &average);
-您要打印average
的值,但要在内存中打印其地址。删除&
运算符; scanf()
要求它(以知道将读取值放在何处)。 printf()
不需要它;编译器生成代码,以将要打印的值传递给printf()
。break;
-它在最里面的switch
或循环语句(do
,while
或for
)之后传递执行控制。这是正确的,并且使变量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)
需要进行一些更正。
while
函数中的calculateAverage()
循环。这是一个无限循环的伙伴,因为您不会在内部的任何地方更改该coolValue
变量的值,而是仅在它退出循环时才将其1
设为它永远不会改变。
因此,使用while(1) {...}
,并在其中检查停止条件,即if (grade == -1) { ... }
,并在其中计算并打印average
和return
。这将自动断开while
。grade
是否实际上是有效的整数。为此,请检查scanf
的值,即使用if (scanf("%d", &grade) != 1) { ... }
sum = +grade;
只是编写sum = 0+grade
的另一种方式,而该文本又只不过是sum = grade
。将此内容替换为sum += grade;
。这是编写加法速记的正确方法。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;
}