一个简单的计算器的实现(C++)

本文介绍了使用C++设计一个简单的计算器的过程,包括采用MFC图形界面、栈的存储结构实现中缀表达式到后缀表达式的转换,以及计算结果。程序涉及栈的操作、运算符优先级比较,并提供了错误处理功能。
摘要由CSDN通过智能技术生成

 

一、目标

   (一)问题描述

在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以中缀式字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-、*、/,用#表示结束。

算法输出:表达式运算结果。

提示:参考上课时讲的如何得到后缀式(栈处理及分析操作符优先关系),再对后缀算术表达式求值就容易了。

(二)问题分析

 此课程设计的目的就是实现算术表达式的求值。为了更好地实现程序与用户之间的交互作用,我采用MFC程序设计来做此课程设计。用MFC的图形界面和鼠标来实现输入和输出(下面将会详细的描述)。

 (三)需求分析

    1)能够运算整数、浮点数等基本数据类型(也就是说可以进行小数运算)。

2)能够实现一定的报错功能。

3)能够实现撤销上一步操作的功能(也就是说,当你输入错误的时候可以重新的输入)。

4)实现表达式的输入、计算、输出的功能。

二、概要设计

 

(一)设计思想

此程序主要运用栈的存储结构,此外,我用CString类来存储算术表达式。我利用两个栈,一个为运算符栈operatorstack,一个为运算数栈operandstack,得到输入表达式后,从左到右扫描式子,若为运算数,压入operandstack,运算符则先与栈operatorstack栈顶元素进行优先级比较,若小于栈顶元素,则弹出该栈顶元素,并从栈operandstack中弹出两个操作数进行计算,结果压入operandstack中。

三、详细设计

  (一)源程序

       1)、栈的实现(#include”stack1.h”

             #include<iostream>

using namespace std;

template<class T>

class Stack

{public:

              T *data;

              int maxSize;

              int top;

              public:

                 Stack(int n)

                   {

                  data=new T[n];

                  if(data==NULL)

                          {cout<<"overflow!/n";exit(1);}

                    maxSize=n;

                    top=-1;

                       }

                 Stack(){}

                 ~Stack()

                   {

                        cout<<"Destroy!"<<endl;

                    }

//创建空栈

             void SetStack(int n);

//栈存在则栈被销毁

             void FreeStack();

//栈存在则返回栈的元素个数,即栈的长度

             int StackSize();

//判断栈是否为空

             bool StackEmpty();

//判断栈是否为满

             bool StackFull();

//栈存在且非空则返回栈的栈顶元素

             T Peek();

//栈存在则插入元素item为新的栈顶元素

             void Push(T item);

//栈 存在且非空则删除栈的栈顶元素并用e返回其值

             T Pop();

//栈存在则清为空栈

             void ClearStack();

             void PrintStack();

};

//顺序栈的实现stack1.cpp

//#include "stack1.h"

template<class T>

void Stack<T>::SetStack(int n)

{data=new T[n];

if(data==NULL)

                      {cout<<"overflow!/n";exit(1);}

 maxSize=n;

 top=-1;

}

template<class T>

void Stack<T>::FreeStack()

{free(data);}

template<class T>

int Stack<T>::StackSize()

{return(top+1);}

template<class T>

bool Stack<T>::StackEmpty()

{if(top==-1) return true;

                 return false;

}

template<class T>

bool Stack<T>::StackFull()

{if(top==maxSize-1)  

return true;

 return false;

}

template<class T>

T Stack<T>::Peek()

{if(top==-1)

                 {cerr<<"栈已空!/n";exit(1);exit(1);}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值