数据结构课上学习栈结构的时候 根据老师的实验要求用VC++6.0平台写了这段代码除了加减乘除乘方,稍微自己加了一些好玩的小功能,比如计算阶乘"!",三角函数,比如正弦 "sin",对数"log"与"ln",常量pi(圆周率),自然对数底数"e"也加进去了,算是初步模仿中学用的科学计算器吧~~~~可惜有一个小缺陷,就是减号与负号没法区别T_T 只好投机取巧用"-"表示减号,用下划线"_"表示负号^_^用我们老师的话说,我这太不地道了……有没有哪位高手可以告诉我怎么样可以变“地道”的????跪求教。可能还有好多bug没发现呢~~大家多多找茬哦~~谢谢~~~~
算式计算器.cpp
#include<iostream>
#include<cmath>
#include<string>
#include<iomanip>
using namespace std;
void menu();//位于calculate函数后面的菜单函数声明
void guide();//位于主函数后面的指导函数的声明
double D_Operate(double x,char op,double y)//双目运算符的运算定义
{
double a;//计算结果
switch(op)
{
case'+': a=x+y;break;
case'-': a=x-y;break;
case'*': a=x*y;break;
case'/': a=x/y;break;
case'^': a=pow(x,y);break;//幂运算包括乘方和开方
}//因为都是利用double进行运算 因此不定义取模运算
return a;
}
double S_Operate(char op,double x)//前缀单目运算符的运算定义
{
double a;//计算结果
switch(op)
{
case's': a=sin(x);break;
case'c': a=cos(x);break;
case't': a=tan(x);break;
case'l': a=log10(x);break;//以10为底的对数
case'n': a=log(x);break;//以e(2.718281828)为底的对数
case'_': a=-x;break;//取负用下划线代替负号 定义为一元运算
}
return a;
}
char Precede(char op1,char op2) //判断符号的优先级 op1在返回的结果符的左边 op2在右边
//用于判定运算符的优先级 以决定是把运算符压栈 还是把栈内的运算符弹出来进行计算
{
if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='='))||/
((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='))/
||(op1=='^'&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='||op2=='s'||op2=='c'||op2=='t'||op2=='_'||op2=='l'||op2=='n'))/
||((op1=='_'||op1=='s'||op1=='c'||op1=='t'||op1=='l'||op1=='n')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='||op2=='s'||op2=='c'||op2=='t'||op2=='_'||op2=='l'||op2=='n')))
return '>';//上述情况下 栈顶运算符优先级高于待定运算符 需弹栈
if((op1=='('&&op2==')')||(op1=='='&&op2=='='))
return '=';
else
return '<';
}
int illegal_char(string s,int i)//非法输入字符判定函数
{
int j=0;
while(j<i)
{
if(s[j]>='0'&&s[j]<='9')
j++;
else if(s[j]=='+'||s[j]=='-'||s[j]=='*'||s[j]=='/'||s[j]&