Можно ли в коде изменить математический знак (только знак) по выбранному условию?

 
Есть несколько функций, содержимое которых в общем-то одинаково, за исключением названий переменных и математических операций между ними. Хочу попробовать объединить их все в одну функцию и если названия переменных можно занести в параметры общей функции, то как быть с математическими операциями?

Например есть 4 функции и внутри каждой из них прописано лишь одно из следующих условий:
a + b
a - b
a * b
a / b

Задача состоит в том, чтобы внутри одной ОБЩЕЙ функции написать только:

a ... b

где вместо трёх точек по какому либо условию из параметров этой общей функции менялся бы только математический знак.

Ну то есть, чтобы не переписывать названия переменных каждый раз. Потому что это в этом упрощенном варианте это просто сделать, а с более сложным кодом замучаешься копипастить, да и вероятность ошибок по невнимательности ввиду этого способа довольно высокая. 

При этом больше всего напрягает даже не это, а то, что при любом задуманном изменении... для каждой отдельной функции нужно каждый раз отслеживать заново всю ее логику. И это тоже как минимум провоцирует новые ошибки, не считая лишнего затраченного времени.  В общем можно такие случаи как-то унифицировать?

 

в параметре функции пропишите необходимое действие

и в зависимости от этого параметра...

ну в общем дальше надеюсь понятно

 
Renat Akhtyamov #:

в параметре функции пропишите необходимое действие

и в зависимости от этого параметра...

ну в общем дальше надеюсь понятно

Нет, не понятно. В зависимости от этого параметра что?

Переписывать заново все блоки полностью все 4 раза меняя в каждом их них лишь один знак?
Эти 4 повтора и хотелось бы превратить в один блок, в котором по условию из параметров менялся бы лишь операционный знак.  

 
leon_17 #:

Нет, не понятно. В зависимости от этого параметра что?

Переписывать заново все блоки полностью все 4 раза меняя в каждом их них лишь один знак?
Эти 4 повтора и хотелось бы превратить в один блок, в котором по условию из параметров менялся бы лишь операционный знак.  

это называется функция

 
Renat Akhtyamov #:

это называется функция

Вы прикалываетесь? Нет решения, так и скажите.

 
leon_17 #:

Вы прикалываетесь? Нет решения, так и скажите.

Создайте функцию, принимающую три параметра (а, b, тип операции). В зависимости от типа операции возвращайте нужное значение

 
Yevhenii Levchenko #:

Создайте функцию, принимающую три параметра (а, b, тип операции). В зависимости от типа операции возвращайте нужное значение

Как вы предлагаете передачу типа операции?

 
Alexey Viktorov #:

Как вы предлагаете передачу типа операции?

Вопрос не мне, но отвечу.
Вообще без проблем: присвоить каждой операции целочисленное значение, например:

  • 0 - сложение
  • 1 - вычитание
  • 2 - умножение
  • 3 - деление
  • и т.д. 

В функции через switch или if распознать тип операции.
По сути OP_BUY, OP_SELL и  другие закодированы таким же образом через именованные константы.

П.С. Как вариант можно передать и как string ("add", "subtruct", "multiply" ...) для большей ясности.
 
Еще можно подумать в направлении перегрузки операторов.
 
Alexander Sevastyanov #:

Вопрос не мне, но отвечу.
Вообще без проблем: присвоить каждой операции целочисленное значение, например:

  • 0 - сложение
  • 1 - вычитание
  • 2 - умножение
  • 3 - деление
  • и т.д. 

В функции через switch или if распознать тип операции.
По сути OP_BUY, OP_SELL и  другие закодированы таким же образом через именованные константы.

П.С. Как вариант можно передать и как string ("add", "subtruct", "multiply" ...) для большей ясности.

Хорошо, допустим 0 это + И что мне это даёт?
Какая разница как я обустрою условие смены знака?

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

//+------------------------------------------------------------------+
//| ОСНОВНОЙ КОД                                                                 |
//+------------------------------------------------------------------+
void OnStart()
  {

   double a = function(1);
   double b = function(2);
   double c = function(3);
   double d = function(4);

  }
//< 1 >--------------------------------------------------------------+
//|            Функция, которую хотелось бы иметь                    |
//+------------------------------------------------------------------+
double function(int param)
/*
   1 - сложение
   2 - вычитание
   3 - умножение
   4 - деление
*/
  {
   ТИП_ЗНАКА <math_sign> // некая переменная в которой хотелось бы менять математический знак

   if(param == 1)
      math_sign = +;

   if(param == 2)
      math_sign = -;

   if(param == 3)
      math_sign = *;

   if(param == 4)
      math_sign = /;

// дальше идет БОЛЬШОЙ код,
// ниже строка только для примера использования математического знака

   double result = a <math_sign> b;

   return (result)
  }

//< 2 > -----------------------------------------------------------------------------+
//| Функция, со стандартным решением, которая требует множественного дублирование кода
//+----------------------------------------------------------------------------------+
double function(int param)
  {
   if(param == 1)
      result = a + b;  // на практике БОЛЬШОЙ код вместо одной строки

   if(param == 2)
      result = a - b; // на практике БОЛЬШОЙ код вместо одной строки

   if(param == 3)
      result = a * b; // на практике БОЛЬШОЙ код вместо одной строки

   if(param == 4)
      result = a / b; // на практике БОЛЬШОЙ код вместо одной строки

// Примечание: БОЛЬШОЙ код одинаков для ВСЕХ случаев, кроме операционных знаков

   return (result)
  }
//+------------------------------------------------------------------+
 
Ihor Herasko #:
Еще можно подумать в направлении перегрузки операторов.

Там разве не надо также переписывать весь код ради смены знака?