Есть ли способ перебрать с помощью четырех основных операций в C? - PullRequest
2 голосов
/ 26 сентября 2019

Я пытаюсь найти способ использовать циклы для вычисления результата каждой комбинации из 3 операторов и 4 целых чисел, и мне было интересно, есть ли способ запустить цикл 4 раза, каждый раз используядругой оператор.

Он предназначен для работы примерно так, но я не уверен, насколько это возможно.

int a = 2;
int b = 3;

for (int i = 0; i < 4; i++) {
   if (i == 0) {
      operator = '+';
   } else if (i == 1) {
      operator = '-';
   } else if (i == 2) {
      operator = '*';
   } else if (i == 3) {
      operator = '/';
   }

   printf("Result: %d\n", a operator b);
}

И вывод будет выводить результаты 5, -1, 6и 0 ...

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

Если бы кто-нибудь мог дать мне некоторое представление о том, как яможно было бы обойти это, было бы очень признательно!

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

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

#include <stdio.h>

#define OP_NUM 4

typedef int(*op_f)(int, int);

typedef struct _ops {
        op_f fp;
        char * ops;
}ops;

int add (int a, int b) {
        return a + b;
}

int sub (int a, int b) {
        return a - b;
}

int mul (int a, int b) {
        return a * b;
}

int dv (int a, int b) {
        return a / b;
}

int main (void) {
        ops st_op[OP_NUM] = {   {add, "+"},
                                {sub, "-"},
                                {mul, "*"},
                                {dv, "/"}
                            };

        int a = 2;
        int b = 3;

        for (int i = 0; i < OP_NUM; i++) {
                printf ("%d %s %d : %d\n", a, st_op[i].ops, b, st_op[i].fp(a, b));
        }
        return 0;
}

Вывод:

# ./a.out
2 + 3 : 5
2 - 3 : -1
2 * 3 : 6
2 / 3 : 0
1 голос
/ 26 сентября 2019

Безусловно, самый простой подход состоит в том, чтобы включить ваши операторы в строку символов, а затем выполнить цикл по каждому символу в строке, передавая каждый символ через оператор switch(), который оценивает ваше выражение на основе оператора, например,

#include <stdio.h>

int main (void) {

    int a = 2,
        b = 3;
    const char *ops = "+-*/";           /* constant string of operators */

    for (int i = 0; ops[i]; i++) {      /* loop over each operator (char) */
        int result = 0;

        switch (ops[i]) {               /* switch on each operator (char) */
            case '+': result = a + b;       /* addition */
                break;
            case '-': result = a - b;       /* subtraction */
                break;
            case '*': result = a * b;       /* multiplication */
                break;
            case '/': result = a / b;       /* division */
                break;
            default:
                fputs ("invalid operator.\n", stderr);  /* invalid operator */
                continue;                               /* go get next char */
        }
        /* output result */
        printf ("Result: %d %c %d = % d\n", a, ops[i], b, result);
    }
}

Пример использования / вывода

$ ./bin/switch_operator
Result: 2 + 3 =  5
Result: 2 - 3 = -1
Result: 2 * 3 =  6
Result: 2 / 3 =  0

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 26 сентября 2019

Если для вас важно разделить выбор операции и ее выполнение, вы можете использовать указатели на функции:

int add(int a, int b)
{
   return a + b;
}

int sub(int a, int b)
{
   return a - b;
}

int mul(int a, int b)
{
   return a * b;
}

int dv(int a, int b)
{
   return a / b;
}


int main()
{

   int (*op)(int, int);
   int a = 2;
   int b = 3;
   int i;
   for (i = 0; i < 4; i++) {
      if (i == 0) {
         op = add;
      } else if (i == 1) {
         op = sub;
      } else if (i == 2) {
         op = mul;
      } else if (i == 3) {
         op = dv;
      }
      printf("Result: %d\n", op(a, b));
   }

   return 0;
}

Или вы можете упростить цепочку if / else, используя массив указателей

typedef int (*OP)(int, int);
.............................
OP ops[] = {add, sub, mul, dv};
for (i = 0; i < 4; i++) {
   printf("Result: %d\n", ops[i](a, b));
}
...