我已经为解决这个问题而奋斗了几天。
我必须编写一个递归代码来计算语句的真值(我也可以在函数中使用循环);
例如-
对于语句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 ...
答案 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;
}
注意:我曾经使用过幼稚的方法来尝试对其进行重构。