【问题标题】:Code not executing after the end of the loop; cant find the reason why the prints are not working after the loop is ended or not started even循环结束后代码未执行;无法找到循环结束后打印不工作的原因或什至没有开始
【发布时间】:2021-05-16 05:09:39
【问题描述】:

//计算输入的N个数字,奇数和偶数的个数,所有数字和偶数的平均值

int N, nEven=0,      nOdd=0,    generalSum,      evenSum;

float   evenAverage=0,      generalAverage=0;

printf("enter as many values as needes -- insert 0 to exit \n");
N = -1;

while(N != 0){
    scanf("%d", &N);
    generalSum += N;
    
    if((N % 2 == 0) && (N != 0)){
        nEven++;
        evenSum += N;
        
    }
    if((N % 2 != 0) && (N != 0)){
        nOdd++;
    }
}

evenAverage = evenSum / nEven;
generalAverage = generalSum / (nEven + nOdd);
    

printf("number of even   -- %d \n", nEven);
printf("number of odd    -- %d \n", nOdd);
printf("even average     -- %f \n", evenAverage);
printf("general average  -- %f \n", generalAverage);

【问题讨论】:

  • 进行基本调试。在调试器中运行程序并逐行逐行查看它在做什么。如果您仍需要帮助,请提供完整的代码 minimal reproducible example 以及准确的测试输入。

标签: c loops printing


【解决方案1】:
  • 如果变量generalSumevenSum 是局部变量,或者它们的初始值是不确定的并且使用这些不确定的值会调用未定义的行为,则必须先初始化变量evenSum。。李>
  • 您应该注意不要被零除。
  • 您应该检查scanf() 是否成功读取预期内容。
/* initialize generalSum and evenSum */
int N, nEven=0,      nOdd=0,    generalSum = 0,      evenSum = 0;

float   evenAverage=0,      generalAverage=0;

printf("enter as many values as needes -- insert 0 to exit \n");
N = -1;

while(N != 0){
    /* check if scanf() succeeded */
    if (scanf("%d", &N) != 1) break;
    generalSum += N;
    
    if((N % 2 == 0) && (N != 0)){
        nEven++;
        evenSum += N;
        
    }
    if((N % 2 != 0) && (N != 0)){
        nOdd++;
    }
}

/* avoid divisions by zero */
if(nEven != 0){
    evenAverage = evenSum / nEven;
}
if((nEven + nOdd) != 0){
    generalAverage = generalSum / (nEven + nOdd);
}

printf("number of even   -- %d \n", nEven);
printf("number of odd    -- %d \n", nOdd);
printf("even average     -- %f \n", evenAverage);
printf("general average  -- %f \n", generalAverage);

另请注意,evenSum / nEvengeneralSum / (nEven + nOdd) 的除法是整数除法,其结果将被截断为整数。如果您不希望它们被截断,您应该(至少)将其中一个操作数转换为 float

【讨论】:

  • 我尝试将其中一个除法变量初始化为浮点数,但我仍然无法正常工作,我认为问题可能是除以 0,我会尝试修复它
  • @AndreDoreaMendes,您是否尝试在代码的第一行将 generalSum 和 evenSum 变量初始化为零。我试图在我的 shell 上执行它,它似乎工作正常。你能试一次吗
【解决方案2】:

我完全同意 MikeCat,你需要在使用它之前初始化变量,否则它会选择一些垃圾值。 为了给你一个实例,我尝试在编译器上运行它,我将在下面分享输出:-

#include <stdio.h>

int main()
{
    int N, nEven=0,      nOdd=0,    generalSum,      evenSum;
    
    float   evenAverage=0,      generalAverage=0;
    
    printf("enter as many values as needes -- insert 0 to exit \n");
    N = -1;
    
    while(N != 0){
    scanf("%d", &N);
    generalSum += N;
    
    if((N % 2 == 0) && (N != 0)){
        nEven++;
        evenSum += N;
        
    }
    if((N % 2 != 0) && (N != 0)){
        nOdd++;
    }
    }
    
    evenAverage = evenSum / nEven;
    generalAverage = generalSum / (nEven + nOdd);
    
    
    printf("number of even   -- %d \n", nEven);
    printf("number of odd    -- %d \n", nOdd);
    printf("even average     -- %f \n", evenAverage);
    printf("general average  -- %f \n", generalAverage);
    
    return 0;
}

相同代码的第一次运行结果:-

enter as many values as needes -- insert 0 to exit 
12
13
09
0
number of even   -- 1 
number of odd    -- 2 
even average     -- 32777.000000 
general average  -- 604796096.000000 

我重新运行了相同的代码,您可以看到平均值的结果是不同的,因为 generalSum 和 evenSum 变量的垃圾值被拾取:-

enter as many values as needes -- insert 0 to exit 
12
13
09
0
number of even   -- 1 
number of odd    -- 2 
even average     -- 32778.000000 
general average  -- 257441200.000000 

使用前请先在c中初始化变量。

希望这有帮助 如果需要进一步说明,请在 cmets 中联系

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多