Как сделать "если ... тогда, но и если .... тогда, но если ни то, ни другое ...." - PullRequest
1 голос
/ 11 ноября 2019

Я сделал простое приложение, чтобы поиграть в игру FizzBuzz на c ++, хотя это не обязательно вопрос c ++, как лучше всего сделать оператор if, так что он делает следующее:

if(x) затем: a,
если (y), то: b,
, если (x) и if (y), то: a и b,
, если ни то, ни другое:

thisмой нынешний подход:

#include <iostream>
using namespace std;

int main ()
{
    int factor1 = 7;
    int factor2 = 15;
    bool found = false;
    string factor1_word = "Fizz";
    string factor2_word = "Buzz";
    int n = 1000;
    for (int i = 1; i < n+1; i++)
    {
        if (i % factor1 == 0)
        {
            cout << factor1_word;
            found = true;
        }
        if (i % factor2 == 0)
        {
            cout << factor2_word;
            found = true;
        }
        if (found == 0)
        {
            cout << i;
        }
        cout << endl;
        found = false;
    }
    return 0;
}

, который работает, но я чувствую, что это не самый читаемый и не лучший способ сделать это.

Любой совет был бы великолепен, спасибо.

Ответы [ 3 ]

1 голос
/ 11 ноября 2019

Вы хотите достичь этого «if (x) then: a, if (y) затем: b, if (x) и if (y) затем: a и b, если ни то, ни другое:». Очевидно, вы подразумеваете, однако, что вы НЕ хотите, чтобы «а» -реакция в случае «x & y» была в верхней части реакции специально для этого случая;и что вам, как правило, нужна только одна реакция.

Вот и все, закодируйте ее в точности так.

if     (x && !y)  { a(); }
else if(y && !x)  { b(); }
else if(x &&  y)  {a(); b(); /* or maybe a_and_b() to make sense */}
else {/* nothing */}

&& ! реализует "но не если ...". Обратите внимание на логический оператор AND && вместо битового оператора & (который я изначально ошибся, более или менее опечатка), который в некоторых случаях случайно получает желаемое поведение. else s делают "всегда только один".
Последний else {} без if превращает "ничего не делать для" ни x, ни y "" в
"ничего не делать для любого случаяявно не охвачено ". Это практика, которую я рекомендую, чтобы всегда явно кодировать «все остальное», чтобы иметь возможность заметить, когда вы фактически не все возможные случаи.

Для получения всех (в этом случае двух двоичных входов четыре) дела были тщательно разобраны, прочитайте диаграммы Карно Вейча (https://en.wikipedia.org/wiki/Karnaugh_map) и соответствующие логические оптимизации.

0 голосов
/ 12 ноября 2019

for (int i = 0; i

всегда начинаются с нуля, поскольку 0 является начальным индексом в большинстве структур данных, таких как массивы или вектор, и пытается сохранить ваш кодпростой и легкий для чтения способ, который вы сделали, является наиболее эффективным способом сделать это, потому что эффективность цикла for будет порядка o (n), в любом случае

вы можете использовать (! найдено) вместо (найдено == 0)

0 голосов
/ 11 ноября 2019

for (int i = 0; i

всегда начинаются с нуля, поскольку 0 является начальным индексом в большинстве структур данных, таких как массивы или вектор, и пытается сохранить ваш кодпростой и легкий для чтения способ, который вы сделали, является наиболее эффективным способом сделать это, потому что эффективность цикла for будет порядка o (n), в любом случае

вы можете использовать (! найдено) вместо (найдено == 0)

...