while((scanf("%d", &num)) == 1)
{
while( num != 0)
{
if(num % 2 == 0)
{
e_num += num;
i++;
}
else
{
o_num += num;
j++;
}
}
printf("The numbers of odd number are:%d, average of odd numbers is:%f\n", j, (float)o_num / j);
printf("The numbers of odd number are:%d, average of odd numbers is:%f\n", i, (float)e_num / i);
printf("Please enter another numbers(0 to quit):\n");
}
请问我这段代码哪里出了问题吗?完整代码和运行结果如下图,麻烦帮忙指出问题所在
你这是双层死循环,内外皆死。内层循环死的更惨。while的条件是num不为0,但循环内并没有修改num值,那么只要输入一个不为0的num,这个循环就死循环了。
所以你整个双循环逻辑是不对的
#include <stdio.h>
int main()
{
int e_num,o_num,i,j,num;
while((scanf("%d", &num)) == 1)
{
e_num = 0;
o_num = 0;
i = j = 0;
while( num != 0)
{
if(num % 2 == 0)
{
e_num += num;
i++;
}
else
{
o_num += num;
j++;
}
scanf("%d",&num);
}
printf("The numbers of odd number are:%d, average of odd numbers is:%f\n", j, (float)o_num / j);
printf("The numbers of odd number are:%d, average of odd numbers is:%f\n", i, (float)e_num / i);
printf("Please enter another numbers(0 to quit):\n");
}
return 0;
}
while((scanf("%d", &num)) == 1)
不满足最外层的条件才会结束循环。
if( num != 0) { // 需要处理等于0时的逻辑,else
if(num % 2 == 0) {
e_num += num;
i++;
}else{
o_num += num;
j++;
}
scanf("%d",&num);
}else{
break;
}
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
while (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!