C++ 简易计算器 只要能计算加减乘除和混合运算 输入算式就出结果的那种 可以连续运算 单独输入“=”时结束这个图片就是原题了 相信大家能看懂 急!
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/06 13:04:22
![C++ 简易计算器 只要能计算加减乘除和混合运算 输入算式就出结果的那种 可以连续运算 单独输入“=”时结束这个图片就是原题了 相信大家能看懂 急!](/uploads/image/z/5258245-13-5.jpg?t=C%2B%2B+%E7%AE%80%E6%98%93%E8%AE%A1%E7%AE%97%E5%99%A8+%E5%8F%AA%E8%A6%81%E8%83%BD%E8%AE%A1%E7%AE%97%E5%8A%A0%E5%87%8F%E4%B9%98%E9%99%A4%E5%92%8C%E6%B7%B7%E5%90%88%E8%BF%90%E7%AE%97+%E8%BE%93%E5%85%A5%E7%AE%97%E5%BC%8F%E5%B0%B1%E5%87%BA%E7%BB%93%E6%9E%9C%E7%9A%84%E9%82%A3%E7%A7%8D+%E5%8F%AF%E4%BB%A5%E8%BF%9E%E7%BB%AD%E8%BF%90%E7%AE%97+%E5%8D%95%E7%8B%AC%E8%BE%93%E5%85%A5%E2%80%9C%3D%E2%80%9D%E6%97%B6%E7%BB%93%E6%9D%9F%E8%BF%99%E4%B8%AA%E5%9B%BE%E7%89%87%E5%B0%B1%E6%98%AF%E5%8E%9F%E9%A2%98%E4%BA%86+%E7%9B%B8%E4%BF%A1%E5%A4%A7%E5%AE%B6%E8%83%BD%E7%9C%8B%E6%87%82+++%E6%80%A5%21)
C++ 简易计算器 只要能计算加减乘除和混合运算 输入算式就出结果的那种 可以连续运算 单独输入“=”时结束这个图片就是原题了 相信大家能看懂 急!
C++ 简易计算器 只要能计算加减乘除和混合运算 输入算式就出结果的那种 可以连续运算 单独输入“=”时结束
这个图片就是原题了 相信大家能看懂 急!
C++ 简易计算器 只要能计算加减乘除和混合运算 输入算式就出结果的那种 可以连续运算 单独输入“=”时结束这个图片就是原题了 相信大家能看懂 急!
#include
#include
#include
#include
using namespace std;
const char NUM[]={'0','1','2','3','4','5','6','7','8','9','.'};
const char OPERATION[]={'+','-','*','/'};
const double PI=3.14159265358979;
const double EE=2.71828182818281;
class Fun //处理系统数学函数的类
{
public:
Fun(string o,int t,double l=0.0,double r=0.0):op(o),type(t),lvalue(l),rvalue(r){}
static string FUN[];
double calc();
private:
int type; //666 0 1 sin90 2 3! 3 3C2
string op; //函数类型
double lvalue; //函数左边的值
double rvalue; //函数右边的值
static int FunNum;
};
int Fun::FunNum=8;
string Fun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^"};
/*
函数说明:
1:log是以10为底的工程对数
2:ln 是以e为底的自然对数
3:C 计算组合数 输入规则 如计算 3取2的组合 输入表达式 3C2
4:A 计算排列数 输入规则 如计算 3取2的排列 输入表达式 3A2
5:! 计算阶乘
6:^ x的y次方 输入 x^y
*/
int factorial(int n) //阶乘函数
{
int i,s=1;
for(i=1;iGetValue();
rvalue=Right->GetValue();
Expression=0;
char op=GetOperation();
switch(op)
{
case '+':
return lvalue+rvalue;
case '-':
return lvalue-rvalue;
case '*':
return lvalue*rvalue;
case '/':
return lvalue/rvalue;
default:
return 0;
}
}
else
return value;
}
bool Isnum(char c)
{
for(int i=0;iPre=temp;
}
else //其他的当做函数处理
{
string function="";
while(iNext=new Unit(pri,' ',function,0,2);
p=p->Next;
p->Pre=temp;
}
}
}
return head;
}
Unit * Calc(Unit * head) //计算双向链表基本单元的值
{
Unit * p=head;
while(p!=NULL)
{
if(p->Type!=0) //非操作符
{
string temp=p->Code;
string op;
double lvalue=0,rvalue=0;
int l_point=0,r_point=0;
int i=0,type=0;
char ch;
while(iNext;
}
return head;
}
Node * Tree(Unit * head) //生成表达式树
{
Node * root=NULL,* proot=NULL,* pbranch=NULL;
Unit * p=head;
int now_pri; //当前优先级
bool hadop=false;
while(p!=NULL)
{
if(p->Type==0) //如果是一个操作符
{
hadop=true;
if(root==NULL)
{
proot=new Node(p->Operation,p->PRI,1);
root=proot;
pbranch=root;
now_pri=p->PRI;
proot->Left=new Node(' ',0,0,p->Pre->value);
proot->Right=new Node(' ',0,0,p->Next->value);
}
else
{
if(p->PRIPRIOperation,p->PRI,1); //新的树根
proot->Left=root; //根的变换
proot->Right=new Node(' ',0,0,p->Next->value);
root=proot;
pbranch=proot; //右树枝的变换
//pbranch->Right=new Node(' ',0,0,p->Pre->value); //树枝右边取值
}
else
{
Node * temp;
temp=new Node(p->Operation,p->PRI,1);
pbranch->Right=temp;
temp->Head=pbranch;
pbranch=pbranch->Right;
pbranch->Left=new Node(' ',0,0,p->Pre->value);
pbranch->Right=new Node(' ',0,0,p->Next->value);
}
now_pri=p->PRI;
}
}
p=p->Next;
}
if(! hadop)
root=new Node(' ',0,0,head->value);
return root;
}
int main()
{
string exp;
while(getline(cin,exp,'='))
{
if(exp=="") return 0;
Unit * h=Analyse(exp);
h=Calc(h);
Node * root=Tree(h);
cout