C语言,while嵌套while循环,好像进入死循环了

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");
}

请问我这段代码哪里出了问题吗?完整代码和运行结果如下图,麻烦帮忙指出问题所在

img



img

你这是双层死循环,内外皆死。内层循环死的更惨。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;
 //...
}
类似的例子还可以举很多。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632