c++实现的完整功能计算器Word文件下载.docx
《c++实现的完整功能计算器Word文件下载.docx》由会员分享,可在线阅读,更多相关《c++实现的完整功能计算器Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
![c++实现的完整功能计算器Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/bd2d1ba5-b247-4bd3-b196-3aed19b3db05/bd2d1ba5-b247-4bd3-b196-3aed19b3db051.gif)
string>
cmath>
queue>
#definepi3.141592654
doublecalculate(std:
:
string);
intmain(){
//输入式子,存于s中
std:
strings;
getline(std:
cin,s);
//抛出异常
try{
//判断是否有异常字符
conststd:
stringjubge="
1234567890tansincos+-*/^%(|)loglnlgsqrtpi!
"
;
for(constauto&
i:
s)
if(jubge.find(i)==-1)
throw1;
////抛出异常
//将三角函数名化为数字与&
字符,便于识别和计算
//以及将对数函数·
·
//以及阶乘·
//以及开方·
//将pi/π化为数字
size_tn=0;
while((n=s.find("
sin"
))!
=-1)
s.replace(n,3,"
1&
);
cos"
2&
tan"
3&
ln"
s.replace(n,2,"
4&
lg"
5&
sqrt"
s.replace(n,4,"
6&
log"
@"
!
s.replace(n,1,"
$7"
pi"
s.replace(n,2,std:
to_string(pi));
//去除括号
while(s.find("
("
)!
=-1||s.find("
)"
)!
=-1){
std:
ostringstreamuout;
//存储未处理字符
autoleft=s.begin();
//记录左括号位置
autoright=s.begin();
//记录右括号位置
while(right!
=s.end()){//处理最里层括号里的字符
if(*right=='
('
){
if(*left=='
for(autoi=left;
i!
=right;
++i)
uout<
<
*i;
}
left=right;
}
elseif(*right=='
)'
if(*left!
='
)throw2;
uout<
calculate(std:
string(left+1,right));
break;
elseif(*left!
)
*right;
else;
++right;
}
if(*left=='
&
right==s.end())throw3;
for(autoi=right+1;
=s.end();
++i)//输出剩余未处理符
uout<
s=uout.str();
//将处理一对括号后的字符串赋给s
}
//计算最后结果
doubleresult=calculate(s);
//输出结果
std:
cout<
result<
endl;
}
catch(inte){//捕获并处理异常
usingstd:
cout;
cout<
"
InputError!
<
endl;
switch(e){
case1:
式子中有异常字符!
break;
case2:
缺左括号!
case3:
缺右括号!
case4:
运算符相连或对数等复活写错!
default:
system("
pause"
return0;
}
strings){
//将数字和运算符分别装入双向队列和队列适配器中
deque<
double>
number;
queue<
char>
symbol;
istringstreamuin(s);
symbol.push('
+'
//添加加号为第一个运算符
doubletpn;
chartpc;
while(uin>
>
tpn>
tpc)
number.push_back(tpn),symbol.push(tpc);
if(!
uin.eof())throw4;
number.push_back(tpn);
//添加最后一个数字
//计算乘方
for(inti=0,n=number.size();
i<
n;
++i){
tpc=symbol.front();
symbol.pop();
//取出运算符
tpn=number.front();
number.pop_front();
//取出数字
if(tpc=='
^'
){//计算乘方
doubletemp=number.back();
number.back()=pow(temp,tpn);
else{
symbol.push(tpc);
//放回队列,置于最后
number.push_back(tpn);
//计算三角函数以及对数
'
){//计算乘方以及对数
switch(int(number.back())){
case1:
number.back()=sin(tpn);
case2:
number.back()=cos(tpn);
case3:
number.back()=tan(tpn);
case4:
number.back()=log(tpn);
case5:
number.back()=log10(tpn);
case6:
number.back()=sqrt(tpn);
default:
elseif(tpc=='
@'
){//计算对数
number.back()=log(tpn)/log(temp);
$'
){//计算阶乘
intn=number.back();
number.back()=1;
for(inti=1;
=n;
number.back()*=i;
//计算乘除以及取模运算
||tpc=='
-'
*'
number.back()*=tpn;
//计算乘
/'
number.back()/=tpn;
//计算除
else{//取模运算
temp=int(temp)%int(tpn);
number.back()=temp;
//计算加减得出结果
doubleresult=0;
)//+
result+=tpn;
else//-
result-=tpn;
returnresult;