我已经为解决这个问题而努力了几天:

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


连接器:“&”(和)和“ |” (要么)
值: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时...

最佳答案

问题是,指针,结构和树无法书面形式使用
  功能。


考虑到您的上述限制。

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



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

09-07 09:12