C语言;计算表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言;计算表达式相关的知识,希望对你有一定的参考价值。
形如12+23*(4-5)类的表达式的计算程序,用char型数组存储,
char a[n];
a[n]=12,'+',23,'*'....;用这个数组计算带入某函数fun(a[]),然后能得出整形结果;
但是
char a[n];
for(i=0;i<n;i++)
cin>>a[i];这样赋值,结果就不正确了,是个字符;
而且若
int a[n];
for(i=0;i<n;i++)
cin>>a[i];结果也不对,是-812841251之类的数,请问如何将字符串中的
数字和字符区分开,求一个实现第一种赋值的输入方法;
a[n]=1,'+',2,......用a[i]-48就行,但是
a[n]=123,'+',23......还能行得通么?
如果是运算符,直接赋值到数组a里面
如果是连续的数字,应该做一下处理的,把它们组合成数值
关键代码如下:
int i,num;
char ch,flg;
i=0;
num=0;
flg=0;//表示num没有接受赋值
while((ch=getchar())!='\n')
if(ch=='+'||ch=='-'||ch=='*'
||ch=='/'||ch=='('||ch==')')
if(flg)
a[i++]=num;
num=0;
flg=0;
a[i++]=ch;
else if(ch<='9' && ch>='0')
num=num*10+ch-'0';
flg=1;
else
//ERROR
需要注意的是,输入的数,不能超过255
因为要赋值到char类型的数组中本回答被提问者采纳 参考技术B 加几行语句:
int In(char c)
/* 判断c是否为运算符*/
switch(c)
case'+':
case'-':
case'*':
case'/':
case'(':
case')':return 1;
default:return 0;
//运算符的判断
if(!In(a[i])) a[i]=a[i]-48;//将以字符类型输入的数字转化为对应的数值 参考技术C 第一种方法输入之后,再a[i] -= '0'
(C语言中)逆波兰算法(及计算器)
Q.1: 用reverse Polish notation 表示12+3 是否是 "123+" ? 如果是, 不是和1 + 23的表示 相冲? (为了防止相冲,各个数字间是否需要特定符号隔开?)
Q.2: (Q.1 得到答复后再问)
非常感谢!
12+3应该表达为12 3+。(实际无空格,为了好看)
先解决一个问题,就是123+会不会认为是1和23或者1和2和3,其实是不会的。一般后缀式都是用栈存储的,你在定义栈的时候里面的elemtype e(当然也可以用别的就是举例),这个elemtype是重命名的int。scanf或者cin输入的时候,你先输入12,这个就被存在栈的第一空里面(因为是%d嘛),再输入3就被存在第二空里面了。这个不会混淆。
逆波兰算法是这么工作的:在后缀式中扫描,可能会扫描到一堆数字,但是这时候如果扫描到了一个运算符(加减乘除等),这时候提取运算符并提取运算符前面紧挨着的那两个数字(注意是紧挨),然后这两个数字和这一个运算符进行运算。比如123+,扫描得12,扫描得3,扫描得+(电脑得到了+这个运算符),紧接着取前面紧挨的12和3,进行运算,就是12+3了。如(2+1) * 3就是21+3*。扫描得2,扫描得1,扫描得+,ok这时候2+1=3,3入栈,重新while扫描。扫描得3(刚才算出来刚入栈的那个),扫描得3,扫描得*,ok这时候3*3=9。
1+23这种后缀式是表达不出来的。后缀它的意义就在于两个数,他们的运算符关系紧挨在他们后面。这个1+只有一个数,还原算是就是+1,无意义。 参考技术A a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。本回答被提问者采纳 参考技术B 我是来围观的
以上是关于C语言;计算表达式的主要内容,如果未能解决你的问题,请参考以下文章