Расчет истинности значения утверждения - PullRequest
0 голосов
/ 26 апреля 2019

Я несколько дней пытался решить эту проблему:

Я должен написать рекурсивный код, который вычисляет истинное значение оператора (я также могу использовать циклы в функции);

  • Разъемы: «&» (и) и «|» (Или)
  • значения: 1 и 0
  • Функция должна возвращать либо «1», либо «0»

Например -

  • Для оператора 1 функция должна вернуть 1

  • Для оператора 0 функция должна вернуть 0

  • Для оператора (1 и 1) функция должна вернуть 1

  • Для оператора (0 | 1) функция должна вернуть 1

Так что в основном 0 & 0 \ 1 = 0, 1 | 1 \ 0 = 1

А для более сложных высказываний

  • (1 & (1 | 0)); (1 | 0) равно 1, то есть (1 & 1) равно 1

  • ((1 | 0) & (0 & 1)); (1 | 0) = 1, (0 & 1) = 0 -> (1 & 0) = 0

(оператор определяется как строка)

int st_value (char statement[], int length, int i) /* this can be changed*/
{
if (length == 1)
  return statement[0];
if (statement[i]=='(' && statement[length-1]==')')
            return st_val(statement, length--, i++);
else if (statement[i]=='(')
            return st_val(statement, length, i++);
if (statement[i]=='0' || statement[i]=='1')
   {
     if (a[i+1] == '|')
         return st_val(statement, length, i+2);
   .....
   }
if (statement[i]=='&')
.....
}

Если бы мне пришлось следовать этому, код был бы слишком длинным и имел бы много дыр, например, когда какая-то часть кода возвращает 0 ...

1 Ответ

0 голосов
/ 26 апреля 2019

Проблема в том, что указатели, структуры и трессы не допускаются при написании функции.

С учетом указанных выше ограничений.

Ниже код решает выражение, обрабатывая каждое (exp) как отдельное выражение и, наконец, объединяет результат.

int parse(char str[])
{

  int i = 0;
  int value = 0;

  for (i = 0; str[i]; i++)
  {
     if (str[i] == '&')
     {
         i++;
         if (str[i] == '('){
              value = value && parse(&str[i+1]);
              int brackCount = 1;
              while(brackCount)
             {
                 if (str[i] == '(') brackCount++;
                 else if (str[i] == ')') brackCount--;
                 i++;
              }
              i--;
         }
         else {
             value = value && (str[i]-'0');
         }
     }
     else if (str[i] == '|')
     {
         i++;
         if (str[i] == '('){
              value = value || parse(&str[i+1]);
              int brackCount = 1;
              while(brackCount)
             {
                 if (str[i] == '(') brackCount++;
                 else if (str[i] == ')') brackCount--;
                 i++;
              }
              i--;
         }
         else {
             value = value || (str[i]-'0');
         }
     }
     else if (str[i] == '(') {
          i++;
          value = parse(&str[i]);

          int brackCount = 1;
          while(brackCount)
          {
             if (str[i] == '(') brackCount++;
             else if (str[i] == ')') brackCount--;

             i++;
          }
          i--;
     }
     else if (str[i] == ')')
     {
       return value;
     }
     else value = str[i]-'0';
  }

  return value;
}

Примечание. Я использовал наивный подход, пытаясь реорганизовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...