#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)); //输出结果
}
#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)); //输出结果
}