算术表达式求值 C语言

算术表达式求值
(1)用户可通过键盘输入四则运算的表达式
(2)判断表达式是否正确
(3)对正确的表达式,计算该表达式的值

clude<iostream.h>
//#define MaxLen 100//存储空间
int tran(char str[], char expr[]) //将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)//原来表达式,后缀表达式
{
int st[100]; //转化过程使用的过度栈
char ch;
int i=0,exindex=0,stindex=-1; //i是str下标,exindex是expr下标,stindex是st下标
while((ch=str[i++])!='\0')
{
if(ch>='0' && ch<='9') //判断是数字
{
expr[exindex]=ch; //压栈
exindex++; //栈顶指针上移
while((ch=str[i++])!='\0' && ch>='0' && ch<='9') //其它位依次入栈
{
expr[exindex]=ch;
exindex++;
}
i--; //str原算术表达式栈向下遍历
expr[exindex]='#'; //以特殊字符“#”表示结束
exindex++;
}
else if(ch=='(') //判断为左括号
{
stindex++;
st[stindex]=ch;
}
else if(ch==')') //判断为右括号
{
while (st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--; //依次弹出
exindex++;
}
stindex--;//'('出栈
}
else if(ch=='+' || ch=='-')//判断为加减号
{
while(stindex>=0 && st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
else if (ch=='*' || ch=='/')//判断为乘除号
{
while(st[stindex]=='*' || st[stindex]=='/')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
}
while (stindex>=0)//将栈中所有运算符依次弹出存入expr栈中
{
expr[exindex]=st[stindex];
exindex++;
stindex--;
}
expr[exindex]='\0';
return 1;
}
int compvalue(char expr[],int *n)
{
int st[100],d; //st为数栈
char ch;
int exindex=0,stindex=-1; //exindex是expr下标,stindex是st的下标
while((ch=expr[exindex++])!='\0')
{
if(ch>='0'&&ch<='9')//将数字字符转换成数字
{
d=0;
do
{
d=10*d+ch-'0';
}
while((ch=expr[exindex++])!='#');
stindex++;
st[stindex]=d;//数字进栈
}
else//运算符操作
{
switch(ch)
{
case'+':st[stindex-1]=st[stindex-1]+st[stindex];
break;
case'-':st[stindex-1]=st[stindex-1]-st[stindex];
break;
case'*':st[stindex-1]=st[stindex-1]*st[stindex];
break;
case'/':
if(st[stindex]!=0)
{ st[stindex-1]=st[stindex-1]/st[stindex]; }
else return 0; //除0错误!
break;
}
stindex--;
}
}
(*n)=st[stindex];
return 1;
}

void main()
{
char str[100]; //存储原来算术表达式
char expr[100]; //存储转换成的后缀表达式
int n;
cout<<"输入算术表达式:"<<endl;
cin>>str;
if(tran(str,expr)==0)
{
cout<<"原算术表达式不正确!"<<endl;
}
else
{
cout<<"转换成后缀表达式输出:"<<endl<<expr<<endl;
if(compvalue(expr,&n)==1)
{
cout<<"表达式求值:"<<endl<<n<<endl;
}
else
{
cout<<"计算错误!"<<endl;
}

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-29
polish问题吗,我资料里有联系方式本回答被网友采纳

算术表达式求值 C语言
clude<iostream.h> \/\/#define MaxLen 100\/\/存储空间 int tran(char str[], char expr[]) \/\/将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)\/\/原来表达式,后缀表达式 { int st[100]; \/\/转化过程使用的过度栈 char ch;int i=0,exindex=0,stindex=-1; \/\/i是str下标,...

C语言 表达式求值
最终 1||1 得 1.总之,不管是关系运算符还是逻辑运算符的结果都只有“真、假”两种,C语言用1代表真,用0代表假。

c语言 表达式求值
inlcude<stdlib.h> void main(){ char str[20][201],*p0,*p1;int t,i,s,f,loop;scanf("%d",&t); if ( t>20 ) t=20;for ( i=0;i<t;i++ ) scanf("%s",str[i]);for ( i=0;i<t;i++ ){ p0=p1=str[i]; s=0; f=1; loop=1;while ( loop ){ while ( (*p...

C语言 表达式求值
a *= a ; \/\/即 a = 3*3 此时a 的值为9 a -= (a*=a) ; \/\/即 a -= a ,即 a = 9 - 9 ,此时a的值为0 a += (a-=a*=a) ;\/\/ 即 a =+ a ,即 a = 0+0 ,此时a的值还是0

C语言~A\/B\/C,它是算术运算是怎么样的?
&&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断。在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。赋值表达式则规定先对右边的表达式求...

C语言关于表达式求值
这是我以前做的一个表达式求值的程序,要求和实现的功能是一样的:include<stdio.h> include <string.h> include <conio.h> define PLUS 0 define MINUS 1 define POWER 2 define DIVIDE 3 define LEFTP 4 define RIGHP 5 define STARTEND 6 define DIGIT 7 define POINT 8 define NUM 7 defi...

C语言编程:1. 100以内任意数的阶乘。 2 。表达式求值
确保所有有效位都被输出。最后,使用getchar()函数读取输入缓冲区的剩余字符,以避免后续输入影响程序的执行。该程序通过TURBO C环境进行调试,并成功通过。综上所述,此C语言程序可以实现输入100以内任意整数并计算其阶乘的功能,通过TURBO C环境调试验证。程序设计合理,逻辑清晰,可以满足需求。

C语言一个简单的表达式求值
ch=‘A’,ch=(ch>='A'&&ch<='Z')?(ch+32):ch意思是ch>=‘A’和ch>='Z'都成立则ch=ch+32,否则ch=ch,因为都成立,所以ch=ch+32,A=65,所以ch=65+32=97=a够详细了吧,哈哈。

c语言基本符号
一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值。7.表达式 表达式是由运算符连接常量、变量、函数所组成的式子。每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定...

C语言:!(x+y)+z-1 && y+z\/2 跪求高手解答 不胜感激。 谢谢!!
先算(x+y),再算(x+y)-z,再算(x+y)-z-1。若(x+y)-z-1的结果为非零数,则!(x+y)-z-1的值为0。(x+y)-z-1的值为0,则!(x+y)-z-1的值为1。先算z\/2,再算y+z\/2。若y+z\/2的值为0,那么整个表达式的值为0。若左边(x+y)-z-1的结果为1 ,y+z\/2...

相似回答