admin 管理员组

文章数量: 1086019


2024年4月26日发(作者:11个重要的数据库设计原则)

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

一、实验目的、内容

设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、

=、以及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<();i++)

{

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

}

return number;

}

void calculator::cal(string w)

{

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

i=0;

p=0;

while (i<=()-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[i-1]==')'));

}

}

void calculator::express()

{

cout<

}

int calculator::legal(string w)

{

int k=0;

for(i=0;i<();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(!(w))

{

(w);

s();

}

char chose;

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

cin>>chose;

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

break;

}

return 0;

}

教师评语及计分


本文标签: 数字 计算 运算符 结果 判断