C++逻辑表达式运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++逻辑表达式运算相关的知识,希望对你有一定的参考价值。

逻辑表达式运算

问题描述
由大写英文字母和符号~、 *、+、()组成逻辑表达式,其中三个符号分别表示逻辑非、与、或运算,英文字母表示变量,变量有两种可能的取值,FALSE(0)或TRUE(1),~、*、+、括号()可改变表达式的运算次序,且可以嵌套。 编一个程序计算逻辑表达式的值。

【输入格式】

输入为若干行

第一行字符串s(1<=length<=200);
第二行为一个整数n(1<=n<=26);n表示上述逻辑表达式中逻辑变量的个数;
第3--2+n行为每个逻辑变量的值,其中变量名均为一个大写字母。

【输出格式】

输出一个逻辑值(TRUE 或 FALSE)

【输入输出样例】

输入文件名:stackc.in

(A+B)*(B+C)
3
A 1
B 0
C 0

输出文件名:stackc.out

FALSE

加上每一步的说明!!!!!
谢谢各位大仙了!!!!!

参考技术A #include <fstream>
using namespace std;

#define MAXSIZE 100
#define CHARNUM 26
//定义栈结构体
typedef struct _stack

char data[MAXSIZE];
int top;
stack;
//将输入逻辑表达式字符串转换为逆波兰式的字符串
void translate(const char *p,char *pout)

stack op;
op.top=-1;
int i=0;
while (*p!='\0')

switch (*p)

case '(':
op.data[++op.top]=*p;
*p++;
break;
case ')':
while (op.data[op.top]!='(')

pout[i++]=op.data[op.top];
op.top--;

op.top--;
*p++;
break;
case '~':
op.data[++op.top]=*p;
*p++;
break;
case '*':
case '+':
while ((op.top!=-1)&&(op.data[op.top]!='('))

pout[i++]=op.data[op.top];
op.top--;

op.data[++op.top]=*p;
*p++;
break;
case ' ':
break;
default:
pout[i++]=*p;
*p++;


while (op.top!=-1)

pout[i++]=op.data[op.top];
op.top--;

pout[i]='\0';

//逆波兰式的求解
bool calculator(const char* str)

stack st;
st.top=-1;
char ch0,ch1,c;
while (*str!='\0')

switch (*str)

case '0':
case '1':
st.data[++st.top]=*str;
break;
case '~':
ch0=st.data[st.top--];
c=!(ch0-'0')+'0';
st.data[++st.top]=c;
break;
case '+':
ch0=st.data[st.top--];
ch1=st.data[st.top--];
c=((ch0-'0')||(ch1-'0'))+'0';
st.data[++st.top]=c;
break;
case '*':
ch0=st.data[st.top--];
ch1=st.data[st.top--];
c=((ch0-'0')&&(ch1-'1'))+'0';
st.data[++st.top]=c;
break;
default:
break;

*str++;

return st.data[st.top]-'0';

int main()

char str[MAXSIZE]=0;
int chartab[CHARNUM]=0;
fstream infile;
fstream outfile;
int sum;
//打开输入和输出文件
infile.open("stackc.in",fstream::in);
outfile.open("stackc.out",fstream::out);
//获取第一行字符串
infile.getline(str,MAXSIZE);
//获取第二行整数
sum=infile.get()-'0';
infile.get();
//得到各个变量的值
for (int i=0;i<sum;i++)

char ch;
ch=infile.get();
infile.get();
chartab[ch-'A']=infile.get()-'0';
infile.get();

//将字符串中的变量用'0'和'1'字符来代替,便于计算
for (int j=0;j<strlen(str);j++)

if (str[j]>=65&&str[j]<=90)

str[j]=chartab[str[j]-'A']+'0';


char pout[MAXSIZE];
translate(str,pout);
bool flag=calculator(pout);
if (flag)

outfile<<"TRUE"<<endl;

else
outfile<<"FALSE"<<endl;

infile.close();
outfile.close();
return 0;

还有什么疑问可以继续跟帖~~~~
参考技术B 1,因此后面的语句没有执行;

参考:
短路求值
作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。这是这两个操作符的一个重要属性。假如expr1和expr2都是表达式,并且expr1的值为0,在下面这个逻辑表达式的求值过程中:

expr1 && expr2

expr2将不会进行求值,因为整个逻辑表达式的值已经可以确定为0。 类似地,如果expr1的值不是0,那么在下面的这个逻辑表达式的求值过程中:

expr1 || expr2

expr2将不会进行求值,因为整个逻辑表达式的值已经确定为1。
下面是一个简单的可能会出现短路求值的例子。假如我们需要处理的字符数量不超过5个。

int cnt =0;
while (++cnt<=5&&(c=getchar())!=EOF)

...

当表达式++cnt<=5的值是假时,下一个字符就不会被读取。

C++运算符

C++的运算符包含四种:

算术运算符:用于处理四则运算

赋值运算符:将表达式的值赋值给变量

比较运算符:用于表达式的比较,返回一个真值或者假值

逻辑运算符:用于根据表达式的值,返回一个真值或者假值

赋值运算:

| = | 赋值 | a=2; b=3;  | a=2; b=3; |
| += | 加等于   | a=0; a+=2; | a=2; |
| -= | 减等于   | a=5; a-=3; | a=2; |
| *= | 乘等于   | a=2; a*=2; | a=4; |
| /= | 除等于   | a=4; a/=2; | a=2; |
| %= | 模等于   | a=3; a%2;  | a=1; | 

比较运算:

| == | 相等于   | 4 == 3   | 0 |
| != | 不等于   | 4 != 3   | 1 |
| < | 小于 | 4 < 3 | 0 |
| \\> | 大于 | 4 > 3 | 1 |
| <= 0 4 | 小于等于 <="3" \\>= | 大于等于 | 4 >= 1   | 1 |

逻辑运算:

| ! | 非 | !a | 如果a为假,则!a为真;  如果a为真,则!a为假。 |
| && | 与 | a && b   | 如果a和b都为真,则结果为真,否则为假。 |
| \\|\\| | 或 | a \\|\\| b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |

算术运算符:

| + | 正号 | +3 | 3 |
| - | 负号 | -3 | -3 |
| + | 加 | 10 + 5 | 15 |
| - | 减 | 10 - 5 | 5 |
| * | 乘 | 10 * 5 | 50 |
| / | 除 | 10 / 5 | 2 |
| % | 取模(取余) | 10 % 3 | 1 |
| ++ | 前置递增   | a=2; b=++a; | a=3; b=3; |
| ++ | 后置递增   | a=2; b=a++; | a=3; b=2; |
| -- | 前置递减   | a=2; b=--a; | a=1; b=1; |
| -- | 后置递减   | a=2; b=a--; | a=1; b=2; |

 

以上是关于C++逻辑表达式运算的主要内容,如果未能解决你的问题,请参考以下文章

第二章 数据类型运算符和表达式

逻辑运算符和逻辑表达式

逻辑运算符 三目运算符

补充知识:三元运算和逻辑运算

03逻辑运算符

BigInteger中逻辑运算符&&怎么用