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
加上每一步的说明!!!!!
谢谢各位大仙了!!!!!
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++逻辑表达式运算的主要内容,如果未能解决你的问题,请参考以下文章