表达式求值

#include<stdio.h>
#include<string.h>
#define N 50     //表达式长度
#define M 10     //括号个数
#define L 10     //局部结果长度
int operate(char s[])
{
char opera_tor[N];
char ch ;
int opera_nd[N];
int i , j , t , m , k = 0 , sum = 0 ;
for(i=0,j=0;s[i]!='\0';i++)   //操作数存到opera_nd[],操作符存到OPera_tor[]
{
t=j;
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
{
opera_tor[j]=s[i];
j++;
}
if(t==j)
{
ch = s[i] - '0' ;
sum = sum * 10 + ch ;
}
if(t!=j)
{
opera_nd[k++] = sum ;
sum = 0;
}
}
opera_nd[k] = sum ;  
//现在有k个运算符,k+1一个操作数
for(t=0 ; t < k ; t++)
{     
if(opera_tor[t]=='*')
{
opera_nd[t  ] = opera_nd[t] * opera_nd[t+1];
opera_nd[t+1] = opera_nd[t] ;
}
if(opera_tor[t]=='/')
{
opera_nd[t  ] = opera_nd[t] / opera_nd[t+1];
opera_nd[t+1] = opera_nd[t] ;
}
}//遇到*或/,则计算,并且两元素全都变为结果
for( m = t-1;(opera_tor[m]=='*'||opera_tor[m]=='/')&&m>=0 ; m--)
opera_nd[m] = opera_nd[m+1] ; //遇到连着的*和/,则把相关元素全变成结果
sum = opera_nd[0];
for(t=0;t<k;t++)
{
if(opera_tor[t]=='+')
sum=sum+opera_nd[t+1];
if(opera_tor[t]=='-')
sum=sum-opera_nd[t+1];
}
return sum;
}
void main()
{
char s[N],sec[N] ,result[L];
int m[M] ;
int i ,j , a , p , b , c ;
printf("请输入表达式:\n");
gets(s);
while(1)
{
i=0; 
j=0;
while(s[i]!='\0')//循环,找到第一个“)”
{
if(s[i]=='(')
m[j++] = i ;
if(s[i]==')')
{
m[j] = i ;
break;
}
i++;
}
if(j==0)       //表达式不含(),则退出循环
break;
i = m[j-1]+1;       
for(a=0 ; s[i]!=')' ; )   //截取最先运算的“块”,把其中的表达式赋给sec[]
sec[a++]=s[i++];
sec[a]='\0';             //detail
p = operate(sec);         //计算出“块”的结果
for(a=0;p!=0;a++)         //把结果p各个数位上的数分离
{
result[a]=p%10+'0';
p=p/10;
}
for(b=m[j-1];a>0;)       //把"块"的结果插入原始表达式
s[b++]=result[--a];
for(c=m[j]+1 ; s[c]!='\0';)//把"块"的后面的东西前移
s[b++]=s[c++];
s[b]='\0';             //detail
        printf("=%s\n",s);      //输出计算“一次”后的表达式
}
printf("=%d\n",operate(s));   //输出结果
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值