思路:主要是处理乘除和加减的优先级问题,遍历字符串,如果是加减,直接把值加到结果sum中;如果是乘除,则需先计算乘除运算结果,用中间变量记录处理过程,不初始化即可做到连乘除,结果会加到sum。获取数字时,整数部分与小数部分分开处理。字符串算式以‘=’做为结束标志
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int Func(const char c)//把字符转换成目标字符
{
if(c >= '0' && c <= '9')//获得,0~9整数
return c -'0';
else if(c == '.' )//浮点型'.'
return -1;
else if (c == '*')//乘
return -2;
else if(c == '/' )//除
return -3;
else if(c == '-')//减
return -4;
else if(c == '+')//加
return -5;
else if(c == '=')//等于 ,结束标志
return -6;
else if(c == '%')//取余
return -7;
return -8;
}
//n字符处理起始位,a浮点型标记,str需要处理的字符
double Get_num(int &n,int &a,string &p)//把字符转成数
{
double num = 0.0,k = 0.0;
int i;
for(i = n; Func(p[i]) >= -1; i++)//小于-1是运算符
{
if(Func(p[i]) == -1)//浮点型
{
k = 10.0;//浮点型,控制'.'位
a=0;
continue;//获得'.'结束当次循环
}
if(k > 0)//浮点型
{
num = num + Func(p[i]) / k;//'.'点后位
k *= 10;
}
else
num = num * 10 + Func(p[i]);//整数部分
}
n = i;//处理到该位
return num;//返回所得数
}
int main()
{
string str;
double num = 0.0, sum = 0.0;
int m,k,a,flag = 0;
cin >> str;
if(Func(str[0]) == -4)//判断首位数字符号
k = -4;//负
else
k = -5;//正
for(int i = 0; str[i] != '\0'; i++)//遍历字符串
{
a=1;// 非浮点型标志
if( Func(str[i]) >= -1)//非运算符,即数字
num = Get_num(i,a,str);//获取数字
switch (Func(str[i])) {
case -2://乘法运算,num没有初始化,可连乘
num *= Get_num(++i,a,str);//++i,获得数字,而非运算符
i--;//处理置运符,退1位,
break;
case -3://乘法运算,num没有初始化,可连除
m = Get_num(++i,a,str);//++i,获得数字,而非运算符
if (fabs(m) < 1E-6)//除数不能为0
{
flag = 1;//非法运算标志
break;//非法,结束运算
}
num /= m;
i--;//处理置运符,退1位,
break;
case -4:
case -5:
case -6:
if(k == -4)//负数,即是加相反数
num = -num;
sum += num;
k = Func(str[i]);//获得下一个数的符号
num = 0.0;//初始化
break;
case -7://取余
if(a)//整型才能取余
{
m = Get_num(++i,a,str);//++i,获得数字,而非运算符
i--;//处理置运符,退1位,
if(a && m > 0)//整型才能取余 ,正数
num = (int)num % (int)m;
else
{
flag = 2;//非法运算标志
break;//非法,结束运算
}
}
else
{
flag = 2;//非法运算标志
break;//非法,结束运算
}
default:
break;
}
if(flag)//非法,结束运算
break;
}
if(!flag)
cout << "Result: " << sum << endl;//输出结果
else
cout << "Input error" << endl;//非法,输入错误
return 0;
}