清华版C++教材的配套讲义

源代码在线查看: 9_9.h

软件大小: 839 K
上传用户: xukejia
关键词: 清华 教材 讲义
下载地址: 免注册下载 普通下载 VIP

相关代码

				//9_9.h
				#include 
				#include 
				#include 
				#include 
				using namespace std;
				
				enum Boolean {False, True};
				#include "9_8.h"	// 包含栈类模板定义文件
				class Calculator	//计算器类
				{
				    private:
				      Stack S;	// 操作数栈
				      void Enter(int num);	//将操作数num压入栈
				      //连续将两个操作数弹出栈,放在opnd1和opnd2中
				      Boolean GetTwoOperands(int& opnd1, int& opnd2);
				      void Compute(char op);	//执行由操作符op指定的运算
				    public:
				      Calculator(void);	//构造函数
				      void Run(void);   //运行计算器程序
				      void Clear(void);	//清空操作数栈
				};
				
				void Calculator::Enter(int num)	// 将操作数num压入栈
				{    S.Push(num);  }
				
				// 连续将两个操作数弹出栈,放在opnd1和opnd2中
				// 如果栈中没有两个操作数,则返回False 并输出相关信息
				Boolean Calculator::GetTwoOperands(int& opnd1, int& opnd2)
				{
				    if (S.StackEmpty())	// 检查栈是否空
				    {
				        cerr 				        return False;
				    }
				    opnd1 = S.Pop();	// 将右操作数弹出栈
				    if (S.StackEmpty())	// 检查栈是否空
				    {
				        cerr 				        return False;
				    }
				    opnd2 = S.Pop();	// 将左操作数弹出栈
				    return True;
				}
				
				void Calculator::Compute(char op)	// 执行运算
				{
				    Boolean result;
				    int operand1, operand2;
				
				    result = GetTwoOperands(operand1, operand2);   // 将两个操作数弹出栈
				
				    if (result == True)	// 如果成功,执行运算并将运算结果压入栈
					{
				        switch(op)
				        {
				            case '+':   S.Push(operand2+operand1);
				                        break;
				            case '-':   S.Push(operand2-operand1);
				                        break;
				            case '*':   S.Push(operand2*operand1);
				                        break;
				            case '/':   if (operand1 == 0)	//检查除数是否为0
				                        {
				                            cerr 				                            S.ClearStack();	//除数为0时清空栈
				                        }
				                        else
				                            S.Push(operand2/operand1);
				                        break;
				            case '^':   S.Push(pow(operand2,operand1));
				                        break;
				        }
				        cout				    }
				    else
				        S.ClearStack();	// 操作数不够,清空栈
				}
				
				Calculator::Calculator(void)	//构造函数
				{}
				
				void Calculator::Run(void)	// 读入并处理后缀表达式
				{
				    char c[20];
				            
				    while(cin >> c, *c != 'q')	// 读入表达式,遇'q'结束
				        switch(*c)
				        {
				          case 'c':  S.ClearStack();	//遇'c'清空操作数栈
				                     break;
				          case '-':	//遇'-'需判断是减号还是负号
				                     if (strlen(c)>1)	//若字符串长度>1,说明读到的是负数的负号
				                       Enter(atoi(c));	//将字符串转换为整数,压入栈
				                     else
				                       Compute(*c);	//若是减号则执行计算
				                       break;
				          case '+':	// 遇到其它操作符时
				          case '*':
				          case '/':
				          case '^':
				                     Compute(*c);	//执行计算
				                     break;
				          default:	// 若读入的是操作数,转换为整型后压入栈
				                     Enter(atoi(c));
				                     break;
				        }
				}
				
				void Calculator::Clear(void)	// 清空操作数栈
				{    S.ClearStack();  }
				
							

相关资源