C Отдельные операторы «if» не работают, но вложенные операторы «if» работают

#c #if-statement #nested

#c #if-оператор #вложенные #c #if-statement

Вопрос:

Я работаю над Принципами программирования и практикую использование C и столкнулся с проблемой с несколькими операторами «if» в операторе while. Короче говоря, я запускаю следующее, и последний оператор «if» выводит каждую итерацию независимо от входных данных:

 int main() {
    int i = 0;
    double a;
    double b;
    constexpr double ratio = (1.0/100);
    while (i<5) {
        cout << "Please enter two doublesn"
             << "> ";
        cin >> a >> b;
        if (a > b) {
            cout << "The smaller value is " << b << " and the larger value is " << a << ".n";
        }
        else if (a < b) {
            cout << "The smaller value is " << a << " and the larger value is " << b << ".n";
        }
        else if (a == b) {
            cout << "The numbers are equal.n";
        }

        if (((a-b) < ratio) || ((b-a) < ratio)) {
            cout << "Also, the numbers are almost equal.n";
        }
          i;
    }
...
  

Однако, если я изменю его, чтобы вместо этого использовать вложенные операторы «if», он будет работать так, как ожидалось:

 int main() {
    int i = 0;
    double a;
    double b;
    constexpr double ratio = (1.0/100);
    while (i<5) {
        cout << "Please enter two doublesn"
             << "> ";
        cin >> a >> b;
        if (a > b) {
            cout << "The smaller value is " << b << " and the larger value is " << a << ".n";
            if ((a - b) < ratio) {
                cout << "Also, the numbers are almost equal.n";
            }
        }
        else if (a < b) {
            cout << "The smaller value is " << a << " and the larger value is " << b << ".n";
            if ((b - a) < ratio) {
                cout << "Also, the numbers are almost equal.n";
            }
        }
        else if (a == b) {
            cout << "The numbers are equal.n";
        }
          i;
    }
...
  

Что здесь происходит? Я чувствую, что, возможно, я теряю входные данные, но я не могу понять, почему…

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

1. В некотором роде связанный: std::numeric_limits<T>::epsilon

2. Это не решает вопрос, но if (((a-b) < ratio) || ((b-a) < ratio)) содержит намного больше круглых скобок, чем нужно. if (a-b < ratio || b-a < ratio) означает то же самое, без всяких отвлекающих факторов.

Ответ №1:

Значение коэффициента равно 0.01. Любая единица из A-B или B-A приведет к отрицательному значению, которое в любом случае будет меньше ratio.

 if (((a-b) < ratio) || ((b-a) < ratio))

  

Возможно, вам потребуется изменить это условие на абсолютное значение.

 #include <cstdlib>  // for abs()function

if (abs(a-b) < ratio)) {
  cout << "Also, the numbers are almost equal.n";
}
  

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

1. Я вернулся и скорректировал, как вы предложили, и все работает отлично. Теперь я чувствую себя полным дураком, но я ценю ваш быстрый ответ!