模拟计算器
qq_44726467:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define Maxlen 500
using namespace std;
int Flag; //对于最终结果的标志变量
void menu() //菜单栏函数
{
printf(" -------------- 欢迎使用全球最低端的计算器 --------------\n");
printf(" | 1.本计算器合法符号为'+'、'-'、'*'、'/'、'('、')'、'.' |\n");
printf(" | 'ABS()'、'SQR()',字母不区分大小写且可进行任意迭代。 |\n");
printf(" | 2.本计算器可以实现浮点数的计算,计算结果将保留6位小数。|\n");
printf(" | 3.本计算器比较低端,所以数据范围不能超double。 |\n");
printf(" | 4.本计算器比较低端,所以计算表达式的长度上限为500。 |\n");
printf(" | 5.输入'END'不包括引号,结束本程序。 |\n");
printf(" ----------------------------------------------------------\n");
}
double fabs(double x) //求绝对值,因为原型处理数字超过9位会出现错误
{
if(x'9')) //判断是否出现其他不合法符号
{
Flag=4;
return ;
}
if(p[i]=='(') sum+=1; //判断括号是否匹配
else if(p[i]==')') sum-=1;
if(sums; // 申明一个栈s,存运算符
i=0; // 初始化下标
while(p[i]!='\0') // 遍历字符串p
{
switch(p[i])
{
case'(': //将左括号入栈,f赋为1
s.push(p[i++]);
f=1;
break;
case')': //将右括号这一层内的所有运算符出栈存入q中
while(s.top()!='(')
{
q[j++]=s.top();
s.pop();
}
s.pop(); //这一层的左括号出栈
i++;
f=0;
break;
case'+':
if(f) //紧跟左括号,所以是取正运算,为了区分用"?"表示,将其入栈
{
s.push('?');
i++;
break;
}
while(!s.empty() && s.top()!='(') //加法运算,因为运算最低级,所以将这一层其他运算符全部出栈后再入栈
{
q[j++]=s.top();
s.pop();
}
s.push(p[i++]);
f=0;
break;
case'-':
if(f) //紧跟左括号,所以是取负运算,为了区分用"@"表示,将其入栈
{
s.push('@');
i++;
break;
}
while(!s.empty() && s.top()!='(') //减法运算,因为运算最低级,所以将这一层其他运算符全部出栈后再入栈
{
q[j++]=s.top();
s.pop();
}
s.push(p[i++]);
f=0;
break;
case'*':
case'/':
while(!s.empty() && (s.top()!='+' && s.top()!='-' && s.top()!='(')) //乘除法,将同级运算符全部出栈后再入栈
{
q[j++]=s.top();
s.pop();
}
s.push(p[i++]);
f=0;
break;
case's':
case'S':
s.push('s'); //开方,因为带括号所以最高级,用"s"表示入栈
i+=3;
f=0;
break;
case'a':
case'A': //取绝对值,因为带括号所以最高级,用"a"表示入栈
s.push('a');
i+=3;
f=0;
break;
default:
while(p[i]>='0' && p[i]='0' && p[i] |