#include<bits/stdc++.h>
const int maxn=1e6+7;
char s[maxn];
int len;
// 开全局变量
// 这个函数能够返回表达式中乘除 的位置,如果没有就返回-1
int local1() {
int pos=-1;
for(int i=1 ; i<=len ; i++) {
if(s[i]=='*'||s[i]=='/') {
pos=i;
break;
}
}
return pos;
}
// 这个函数能够返回表达式中加减的位置,如果没有就返回-1
int local2() {
int pos=-1;
for(int i=1 ; i<=len ; i++) {
if(s[i]=='+'||s[i]=='-') {
pos=i;
break;
}
}
return pos;
}
//这个函数能够 把 字符串数组中的 pos1到pos2位置的 数字 转化成int 类型 方便加减乘除的计算
int f(int pos1,int pos2) {
int sum=0;
for(int i=pos1 ; i<=pos2 ; i++) {
if(s[i]<='9'&&s[i]>='0') sum=sum*10+(s[i]-'0');
}
return sum;
}
// 这个函数能够返回一个整数有多少位
int g(int x) {
int sum=0;
while(x>0) {
sum++;
x/=10;
}
return sum;
}
int main() {
while(1)
{
printf("请输入计算表达式:\n");
scanf("%s",s+1);//输入计算表达式 , 字符串形式全部输入
// s+1 使字串的起始位置的索引为1
while(1) {
len=strlen(s+1);
// strlen函数统计字符串s 的长度
int pos=local1();
if(pos==-1) break; // 说明 表达式中不含有乘除号了
int pos1=0,pos2=len+1; // 这里一定要初始化,因为可能超过边界
// 从这个符号的位置往前,找到另一个符号,。 这两个符号中间一定夹着一个整数
for(int i=pos-1 ; i>=1 ; i--) {
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
pos1=i;
break;
}
}
for(int i=pos+1 ; i<=len ; i++) {
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
pos2=i;
break;
}
}
int temp;
int temp1=f(pos1,pos); // 转化成int类型
int temp2=f(pos,pos2); // 转化成int类型
if(s[pos]=='*') temp=temp1*temp2;
else if(s[pos]=='/') temp=temp1/temp2;
printf("\n= ");
// 没有用到的原封不动的输出
for(int i=1 ; i<=pos1 ; i++) {
if(s[i]==' ') continue;
printf(" %c ",s[i]);
}
printf(" %d ",temp);
// 没有用到的原封不动的输出
for(int i=pos2 ; i<=len ; i++) {
if(s[i]==' ') continue;
printf(" %c ",s[i]);
}
//这里我们动了pos1,pos2之间的部分 所以字符串整体要变化
int zheng[10],cnt=0;
// 把这个整数的每一位存在数组里
while(temp>0) {
zheng[++cnt]=temp%10;
temp/=10;
}
for(int i=pos1+1 ; i<=pos2-1 ; i++) {
// 把这个整数的每一位转化回字符类型放回字符串中
if(cnt>0) {
s[i]='0'+zheng[cnt];
cnt--;
} else s[i]=' ';
}
}
// 下面这个找加减的和上面的一摸一样
while(1) {
len=strlen(s+1);
int pos=local2();
if(pos==-1) break;
int pos1=0,pos2=len+1;
for(int i=pos-1 ; i>=1 ; i--) {
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
pos1=i;
break;
}
}
for(int i=pos+1 ; i<=len ; i++) {
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
pos2=i;
break;
}
}
int temp;
int temp1=f(pos1,pos);
int temp2=f(pos,pos2);
if(s[pos]=='+') temp=temp1+temp2;
else if(s[pos]=='-') temp=temp1-temp2;
printf("\n= ");
for(int i=1 ; i<=pos1 ; i++) {
if(s[i]==' ') continue;
printf(" %c ",s[i]);
}
printf(" %d ",temp);
for(int i=pos2 ; i<=len ; i++) {
if(s[i]==' ') continue;
printf(" %c ",s[i]);
}
int zheng[10],cnt=0;
while(temp>0) {
zheng[++cnt]=temp%10;
temp/=10;
}
for(int i=pos1+1 ; i<=pos2-1 ; i++) {
if(cnt>0) {
s[i]='0'+zheng[cnt];
cnt--;
} else s[i]=' ';
}
}
printf("\n计算完成\n");
}
return 0;
}