C распознает входное значение 0

#c #input

#c #ввод

Вопрос:

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

 int main()
{


float n1 = 0.0, n2 = 0.0, quotent = 0.0;

int firstNumberRead = 0;

int secondNumberRead = 0;



firstNumberRead = scanf("%f", amp;n1);

secondNumberRead = scanf("%f", amp;n2);

//check that the attempt to read the number was successful
if (firstNumberRead amp;amp; secondNumberRead == 1)
{
    //divide the first number by the second number
    quotent = (n1 / n2);

    //print quotent
    printf("%f", quotent);enter code here
}
else if (firstNumberRead || secondNumberRead == 0)
{
    printf("invalid input - divide by zero is not allowed");
}
else
{
    printf("invalid input");
}
scanf("%f", amp;n1);
return (0);
 

}

Комментарии:

1. firstNumberRead amp;amp; secondNumberRead == 1 скорее всего, это не то, что вы на самом деле намереваетесь. Посмотрите, как условия работают в C .

Ответ №1:

С этим кодом связано множество проблем.

 if (firstNumberRead amp;amp; secondNumberRead == 1)
 

Вероятно, вы ошибаетесь в отношении того, как условия работают в C , проверьте свой учебник для подробного объяснения. Вы, скорее всего, хотели сказать

 if(firstNumberRead == 1 amp;amp; secondNumberRead == 1)
 

Это только проверит, что обоим scanf вызовам удалось прочитать значение. Затем вам нужно проверить фактическое значение внутри if выражения.

Другими проблемами была проверка неправильных переменных 0 в знаменателе и числителе (вы проверили firstNumberRead и secondNumberRead снова. Вы должны проверить n1 и n2 вместо этого:

 if (n1 == 0 || n2 == 0)
 

Обычно использовать operator == для переменных с плавающей запятой — плохая идея, но вы можете возразить, что это имеет смысл для знаменателя (все остальные состояния являются законными с точки зрения арифметики). Но вы, возможно, захотите заглянуть внутрь std::abs и проверить, не меньше ли он какого-нибудь эпсилона. Например:

 if (abs(n1) < 0.001 || abs(n2) < 0.001)
 

Наконец, вы, вероятно, хотите чего-то подобного:

 if (firstNumberRead == 1 amp;amp; secondNumberRead == 1)
{
    if (n1 == 0 || n2 == 0)
    {
        printf("invalid input - divide by zero is not allowed");
    }
    else
    {
        //divide the first number by the second number
        quotent = (n1 / n2);

        //print quotent
        printf("%f", quotent);
    }
}
else 
{
    printf("invalid input");
}
 

Комментарии:

1. @SeanCampbell Пожалуйста, примите ответ, если он решит вашу проблему. Вы можете сделать это, нажав на значок галочки под голосами за этот ответ.