#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. Я вернулся и скорректировал, как вы предложили, и все работает отлично. Теперь я чувствую себя полным дураком, но я ценю ваш быстрый ответ!