⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.cpp

📁 一个计算器程序
💻 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 + -