Почему я получаю "исключение с плавающей запятой (ядро сброшено)"?

Поэтому, когда я ввожу ввод положительных или положительных и отрицательных значений, код работает нормально, но просто ввод отрицательных значений приводит к ошибке с плавающей запятой, я знаю, что деление на ноль приведет к этому, но я погружаюсь на количество входов

#include <stdio.h>
int main()
{
    int integer, pos, neg;
    int poscounter, negcounter;
    integer = 0;
    pos = 0;
    neg = 0;
    poscounter = 0;
    negcounter = 0;

    do {
        printf("Please enter an integer:");

        scanf("%d", &integer);

        if (integer > 0) {
            pos += integer;
            poscounter++;
        }
        else
            neg += integer;
        negcounter++;

    } while (integer != 0);

    printf("Positive average: = %d", pos / poscounter);
    printf("Negative average: = %d", neg / negcounter);
}

Таким образом, результат ввода -3 -2 -1 0 должен привести к "Отрицательному среднему значению: -2"

3 ответа

if (integer > 0) никогда не выполняется, так poscounter никогда не увеличивается, поэтому, наконец, деление pos / poscounter не может работать

#include <stdio.h>
int main()
{
    int integer, pos, neg;
    int poscounter, negcounter;
    integer = 0;
    pos = 0;
    neg = 0;
    poscounter = 0;
    negcounter = 0;

    do {
        printf("Please enter an integer:");

        scanf("%d", &integer);

        if (integer > 0) {
            pos += integer;
            poscounter++;
        }
        else if(integer < 0)    // Added else if for the logic as it was considering 0 as negative
        {
            neg += integer;
            negcounter++;
        }

    } while (integer != 0);
    printf("posc = %d\n", poscounter);      // Printed for confirmation
    printf("negc = %d\n", negcounter);      // Printed for confirmation

    /* Added these two ifs so that it can check any of the counters is not zero and it will not give (core dumped) */

    if(poscounter)
        printf("Positive average: = %d\n", pos / poscounter);
    if(negcounter)
        printf("Negative average: = %d\n", neg / negcounter);

        return 0;       // Adding this is a good practice
}

Привет, в логике была небольшая проблема: когда положительный / отрицательный не встречались, выражение делилось на 0. Более того, оно рассматривало 0 как отрицательное целое число. Пожалуйста, просмотрите комментарии, это может помочь

Это сбой при вводе -3,-2,-1,0, потому что если (целое число> 0) всегда ложно, то poscounter не будет увеличиваться в любое время, поэтому poscounter будет нулевым после цикла while.

printf ("Положительное среднее: = %d", pos / poscounter); вызовет сбой программы из-за операции, решенной нулем.

Лучше иметь проверку if для знаменателя и удостовериться, что он не равен нулю, прежде чем использовать его в делении:

if (0 != poscounter)
     printf("Positive average: = %d", pos / poscounter);

Это обеспечит выполнение printf только в тех случаях, когда poscounter имеет ненулевое значение.

Другие вопросы по тегам