简单的模拟计算器程序

  • 格式:doc
  • 大小:75.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学数学院的一份模拟计算器程序

一、实验目的、内容

设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。

二、实验程序设计及结构

定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。

该计算器的基本思路是把字符串转化为数字和运算符,然后把数字和运算符分别压入两个栈,number 和symbolt

Calculator类包含以下函数

void cal(string s);是主要的计算函数

void express();用以输出结果,弹出栈顶

int legal(string w);判断运算符是否合法

void calculator::push();该函数的作用是记录此运算符,相当于压栈

void calculator::pop()/;在已进行优先级判断的情况下进行合法运算,该函数作用之后两个栈内的字符变少了,表面上是p减小了

int calculator::StringToNumber(string aStr)把字符串转化为数字,这个函数应该是可以优化的,记得有一个专用的字符与数字转化的函数。

void calculator::cal(string w);主要的计算引擎,由一个大循环内套三个小循环组成,第一个循环的作用是依次读出字符串中的字符,第二个循环压入数字,把字符改为数字第三个循环是主要计算的,其中加入了对括号优先计算的判断。

三、设计过程

加入了对运算符是否合法的判断,加深了对类的理解。

四、设计的特点和结果

运行结果如下

参考文献

附录

#include

#include

#include

using namespace std;

class calculator

{

public:

void cal(string s);

void express();

int legal(string w);

private:

void push();

void pop();

bool can();

int StringToNumber(string aStr);

int number[1000];

char symbolt[1000];

string s,t;

int i,j,p;

};

void calculator::push()

{

p++;

symbolt[p]=s[i];

}

void calculator::pop()

{

p--;

switch (symbolt[p+1])

{

case'+':{number[p]+=number[p+1];break;}

case'-':{number[p]=number[p]-number[p+1];break;} case'*':{number[p]=number[p]*number[p+1];break;} case'/':{number[p]=number[p]/number[p+1];break;} }

}

bool calculator::can()

{

if (((s[i]=='+')||(s[i]=='-'))&&(symbolt[p]!='(')) return true;

if (((s[i]=='*')||(s[i]=='/'))&&((symbolt[p]=='*')||(symbolt[p]=='/'))) return true;

return false;

}

int calculator::StringToNumber(string aStr)

{

int number = 0;

for (int i=0;i

{

number = number*10 + aStr[i]-48;

}

return number;

}

void calculator::cal(string w)

{

s='('+w+')';

i=0;

p=0;

while (i<=s.length()-1)

{

while (s[i]=='(')

{

push();

i++;

}

j=i;

do

{

i++;

}

while ((s[i]>='0')&&(s[i]<='9'));

int m;

t="";

int h=0;

for(m=j;m

number[p] = StringToNumber(t);

do

{

if (s[i]==')')

{

while (symbolt[p]!='(') pop();

p--;

number[p]=number[p+1];

}

else

{

while (can()) pop();

push();

}

i++;

}

while ((i<=s.length())&&(s[i-1]==')'));

}

}

void calculator::express()

{

cout<

}

int calculator::legal(string w)

{

int k=0;

for(i=0;i

{

if(!(w[i]=='+'||w[i]=='-'||w[i]=='*'||w[i]=='/'||w[i]=='('||w[i]==')'||(w[i]>='0'&&w[i]< ='9')))

k++;

}

if(k)

cout<<"error:含有非法字符"<

return k;

}

int main(int argc, char* argv[])

{

while(1){

string w;

cout<<"input your string:";

cin>>w;

calculator MyCal;

if(!MyCal.legal(w))

{

MyCal.cal(w);

MyCal.express();

}

char chose;

cout<<"是否继续[Y/N]"<

cin>>chose;

if (chose=='n'||chose=='N')