简单的模拟计算器程序
- 格式:doc
- 大小:75.50 KB
- 文档页数:5
中南大学数学院的一份模拟计算器程序
一、实验目的、内容
设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及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')