📄 calculator.cpp
字号:
//MY HONOUR IS MY LIFE!
//FOR GLORY!
// 我真诚地保证:
// 我自己独立地完成了整个程序从分析、设计到编码的所有工作。
// 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中
// 详细地列举我所遇到的问题,以及别人给我的提示。
// 我的程序里中凡是引用到其他程序或文档之处,
// 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,
// 我都已经在程序的注释里很清楚地注明了引用的出处。
// 我从未没抄袭过别人的程序,也没有盗用别人的程序,
// 不管是修改式的抄袭还是原封不动的抄袭。
// 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。
// 0113325 杨剑锋
#include"calculator.h"//#include <stack>#include<iostream>#include<ctype.h>using namespace std;int calculator::lp(char op)/* 返回左边操作符优先权 */ { switch (op) { case '+': return 3;break; case '-': return 3;break; case '*': return 5;break; case '/': return 5;break; case '(': return 1;break; case ')': return 6;break; case '#': return 0;break; default: return -1; break; } }int calculator::rp(char op)/* 返回右边操作符优先权 */ { switch (op) { case '+': return 2;break; case '-': return 2;break; case '*': return 4;break; case '/': return 4;break; case '(': return 6;break; case ')': return 1;break; case '#': return 0;break; default: return -1; break; } }
bool calculator::istheta(char ch)const
//判断是否为运算符
{
switch(ch)
{case '+':
return true;break;
case '-':
return true;break;
case '*':
return true;break;
case '/':
return true;break;
default :
return false;break;
}
}
bool calculator::isA(char ch)const
//判断输入字符是否为字母
{
if((!isdigit(ch))&&(ch!='.')&&(!isop(ch))&&(ch!='#'))
{return true;
}
else return false;
}double calculator::operate(char theta, double a, double b)/* 对操作数进行计算 */ { switch (theta) { case '+': return a+b;break; case '-': return a-b;break; case '*': return a*b;break; case '/': if(b==0){cout<<"输入有误"<<endl;return-1;} return a/b;break; default : return -1; break; }}bool calculator::evaluate()
//扫描计算式,并判断检查是否正确{ char ch,op,theta,pre; double val,a,b,res; int point=0; cout << "请输入您要计算的表达式:" << endl; cin>>ch; op='#'; while((ch!='#')||(op!='#')) { if(isdigit(ch)||ch=='.') {if(ch=='.') {point=point+1; if(point==1)
//输入数字含两个以上小数点则报错 {cout<<"输入有误"<<endl; return true;} } pre=ch;
//记录当前输入为后面非正常输入作准备 cin.putback(ch); cin>>val; opnd.push(val); point=0; cin>>ch;
//继续扫描
while(isA(ch)){cin>>ch;}
if (ch=='('){cout<<"输入有误"<<endl;
return true;} } else if(isop(ch)&&(lp(op)<rp(ch)))
//是运算符并后输入的优先级大
{pre=ch;
//记录当前输入为后面非正常输入作准备
if((lp(op)==0)&&(rp(ch)==1))
//运算符‘#’与‘)’错
{cout<<"输入有误"<<endl;
return true;}
//错误处理
else {
optr.push(ch);
//将后输入的压入运算符栈
cin>>ch;
while(isA(ch)){cin>>ch;}
if(ch=='#'){cout<<"输入有误"<<endl;
return true;}
else if(istheta(pre)&&istheta(ch)){cout<<"输入有误"<<endl;
return true;}
}
//继续扫描
}
else if(isop(ch)&&(lp(op)==rp(ch)))
//是运算符并与输入的优先级相等
{ pre=ch;
//记录当前输入为后面非正常输入作准备
if(lp(op)==6)
//前运算符是‘)’错
{
cout<<"输入有误"<<endl;
return true;}
//错误处理
else
{optr.pop();
//将前-‘(’运算符出栈,后‘)’不入栈
cin>>ch;
//继续扫描
while(isA(ch)){cin>>ch;}
if(isdigit(ch)||ch=='.'||ch=='('){cout<<"输入有误"<<endl;
return true;}
}
//继续扫描
}
else if(isop(ch)&&(lp(op)>rp(ch)))
//是运算符并后输入的优先级小
{pre=ch;
//记录当前cin为后面非正常输入作准备
if(lp(op)==1)
//前运算符是‘(’后运算符是‘#’错
{cout<<"输入有误"<<endl;
return true;}
//错误处理
else
{
theta=optr.top();optr.pop();
//取出栈顶运算符
if(!opnd.empty())
//有运算数
{
b=opnd.top();
opnd.pop();
//取出后-个运算数并出栈
if(!opnd.empty())
//有运算数
{a=opnd.top();opnd.pop();
//取出前-个运算数并出栈
opnd.push(operate(theta,a,b));
//将结果压入运算数栈
}
else {
cout<<"输入有误"<<endl;
return true;}
//无后-个运算数出错
}
else {
cout<<"输入有误"<<endl;
return true;
}
//无前-个运算数出错
}
}
else {if(isop(pre))
//非运算符并非运算数处理
cin>>ch;
//前-个是运算符,继续扫描
else{cin>>ch;
//前-个是运算数,继续扫描后-个
if(isdigit(ch)){
//扫描后-个是运算数出错
cout<<"输入有误"<<endl;
return true;}
//错误处理
}
}
op=optr.top();
//运算符赋值
if (lp(op)==6){ //')'不出现在前运算符
cout<<"输入有误"<<endl;
return true;}
//错误处理
}
if(optr.top()!='#'){cout<<"输入有误"<<endl;
return true;}
//错误处理
res=opnd.top();opnd.pop();
if(!opnd.empty()){
//还有运算数出错
cout<<"输入有误"<<endl;
return true;}
//错误处理
else {cout<<"="<< res <<endl;
return true;}
//输出结果}bool calculator::isop(char ch)const
//防止出现非法字符输入{ switch(ch) {case '#': return true; break; case '*': return true; break; case '/': return true; break; case '+': return true; break; case '-': return true; break; case '(': return true; break; case ')': return true; break; default : return false; break;}}void calculator::run()
//计算器运行程序 { help(); bool run=true; do { char command = get_command(); switch(command) { case 'e': clearS(); run=evaluate();break; case 'h': run=help();break; case 'q': clearS(); run=false;break; default: run=true;break; } }while(run); }bool calculator::help()/* 输出帮助信息 */ { cout << "这是帮助信息,请您在使用本计算器前仔细阅读。 "<< endl;
cout << "您可用的操作键为Q,E,H。"<<endl; cout << "Q 表示退出,E表示进行计算,H 表示需要帮助。"<<endl; cout << "注意在选择操作键后按下回车键<ENTER>确定."<<endl;
cout << "在进行计算时请在您输入的表达式后输入'#'表示结束。"<<endl; return true; }char calculator::get_command()
//接收并返回用户所选操作 { char command; bool waiting=true; cout << "Select command and press <ENTER>: "; while(waiting) { cin >> command; command = tolower(command); if(command =='q' || command == 'e' || command == 'h') waiting = false; } return command; }void main()
//主程序 { calculator c; c.run(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -