Неважно, если условие истинно, если всегда выполняется в C ++ - PullRequest
2 голосов
/ 24 февраля 2020

Может кто-нибудь исправить этот код, пожалуйста.

#include <iostream>
using namespace std;

int main()
{
    int a;
    int b;
    int c;
    double d;
    double e;
    double f;
    double g;
    f = a / b;
    g = b / a;
    c = 0;
    cin >> a;
    cin >> b;
    f = a / b;
    g = b / a;
    if (a == b)
    {
        cout << a << endl;
        return 0;
    }
    else if (f == int(f))
    {
        cout << a << endl;
        return 0;
    }
start:
    while (a * b > c)
        c = c + 1;
    d = c / a;
    e = c / b;
    if (d == int(d))
        if (e == int(e))
        {
            cout << c << endl;
            return 0;
        }
        else if (d != int(d))
            goto start;
        else if (e != int(e))
            goto start;
    if (a * b <= c)
        cout << a * b << endl;
}

Независимо от того, какой код

else if(f==int(f))

всегда выполняется. Например. Я вставил 3 и 5, и хотя 3/5 дает десятичную дробь, в противном случае всегда выполняется и выводит 3. ЧТО Я ПРОЧУ ЗДЕСЬ?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2020

Основной ошибкой в ​​вашем коде, приводящей к проблеме с оператором if, является целочисленное деление. Чтобы выполнить деление с плавающей запятой, вы должны привести операнды к двойным числам:

cin >> a;
cin >> b;
f = double(a) / double(b);
g = double(b) / double(a);

Есть и другие проблемы, которые необходимо устранить, но именно эта проблема приводит к вашему вопросу.

2 голосов
/ 24 февраля 2020

Эти выражения, хотя они присваиваются двойным переменным, вычисляют целочисленные деления.

f = a / b;
g = b / a;
d = c / a;
e = c / b;

Т.е. то, что присваивается двойным значениям, является целочисленными значениями.

Ваши условия if в основном проверяют целочисленные значения и, следовательно, всегда оценивают как истинные.

Чтобы избежать целочисленного деления и получить действительные значения с плавающей запятой, присвоенные значениям типа double, вам необходимо сделать рано уверен, что компилятор интерпретирует их соответственно. Например:

f = (1.0*a) / b;
g = (1.0*b) / a;
d = (1.0*c) / a;
e = (1.0*c) / b;

И, как отмечается в комментарии, лучше всегда инициализировать все ваши переменные (даже если здесь a, b, c будет достаточно).

int a=1;
int b=1;
int c01;
double d=1.0;
double e=1.0;
double f=1.0;
double g=1.0;
1 голос
/ 24 февраля 2020

Вам просто нужно определить тип a и b как double not int .

...