Получить информацию из одного дела в другое - PullRequest
0 голосов
/ 12 апреля 2019

Я новичок в использовании C ++, и мне нужно передать некоторую информацию или значения из одного случая в другой в одном и том же переключателе.

Как будто у меня есть переключатель, и я назвал case 1 и case 2В случае 1 я собираюсь выполнить некоторые математические операции с переменной, которую пользователь мне даст.Например, если введено 5, я собираюсь добавить 6, тогда будет 11. И в случае 2 мне нужна эта информация, мне нужна сумма, которую уже рассчитал случай 1.Но я не знаю, как это сделать.Я предпочитаю не использовать switch внутри другого switch, idk, если он работает, но я не могу его использовать.Спасибо.

1 Ответ

1 голос
/ 12 апреля 2019

Я собираюсь предположить, что ваша мотивация для этого вопроса заключается либо в том, что вы хотите избежать написания избыточного / дублирующего кода, либо в том, что вы хотите минимизировать циклы ЦП, не выполняя одну и ту же математическую операцию более одного раза.Методы, описанные ниже, пытаются решить обе эти проблемы.

Первый вопрос: должен ли ваш код выполнять оба случая, один за другим?Если это так, вы можете сделать это с помощью функции «проваливать» оператора switch, то есть, опуская оператор break; в конце первого случая, вы можете позволить выполнению программы «провалиться» до следующегоcase сразу после выполнения первого case, например:

int x = 5;

switch(someVariable)
{
   case 1:
      x += 6;
   // fall through!
   case 2:
      cout << "x=" << x << endl;
   break;
}

Или, возможно, вам нужен более традиционный паттерн, где каждый case имеет break; в конце, и вы хотите выполнить только один изслучаи.В этом случае выполнение этого ...

int addSix(int x) {return x+6;} // helper function

[...]

int x = 5;

switch(someVariable)
{
   case 1:
      cout << "x=" << addSix(x) << endl;
   break;

   case 2:
      cout << "y=" << addSix(x) << endl;
   break;
}

... избавляет от необходимости писать избыточный код (т. Е. Вам нужно было только написать код внутри addSix(int) в одном месте), но это означает, чточто код внутри addSix(int) выполняется каждый раз, когда выполняется оператор switch.Для простых вычислений это хорошо, но что, если ваши вычисления были действительно вычислительно дорогостоящими, настолько, что вы хотите избегать их выполнения более одного раза, когда это возможно?Для этого вы можете использовать метод под названием memoization , который на самом деле просто хранит результат вычисления в переменной, а также устанавливает флаг при первом выполнении вычисления, чтобы вы могли помнить, что не делать этогов следующий раз:

void doReallyExpensiveCalculationOnce(int & x, bool & isCalculationValid)
{
   if (isCalculationValid == false)
   {
      x += 6;  // pretend this operation is really slow/expensive
      isCalculationValid = true;  // remember we already did the calculation
   }
}

bool isCalculationValid = false;
int x = 5;

for (int i=0; i<1000000; i++)
{
   switch(someVariable)
   {
      case 1:
         doReallyExpensiveCalculationOnce(x, isCalculationValid);
         cout << "x=" << x << endl;
      break;

      case 2:
         doReallyExpensiveCalculationOnce(x, isCalculationValid);
         cout << "y=" << x << endl;
      break;
   }
}

Обратите внимание, что хотя вышеприведенный цикл for приводит к выполнению оператора switch 1000000 раз, очень дорогие вычисления обновляют значение x выполняются (максимум) один раз.

...