计算陈述的真值

时间:2019-04-26 08:12:57

标签: c recursion

我已经为解决这个问题而奋斗了几天。

我必须编写一个递归代码来计算语句的真值(我也可以在函数中使用循环);

  • 连接器:“&”(和)和“ |” (或)
  • 值: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 :(得分:0)

  

问题是,书面形式不允许使用指针,结构和树   功能。

考虑到您的上述限制。

下面的代码通过将每个(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;
}
  

注意:我曾经使用过幼稚的方法来尝试对其进行重构。