表达式计算器类的设计1(表达式计算器4)

计算器的github下载地址:https://github.com/ljian1992/calculator

我们的最终目的是计算出表达式中的值,因此就需要定义一个抽象类用于计算表达式的值,该抽象类定义为:Node

下面所有的类图不使用UML建模语言画的,是通过visual studio自动生成的类关系图(自己用UML建模画的不小心被我删掉了)

Node的类图

clip_image001

它继承了个Noncpyable类,由于我们是要做面向对象的表达式计算器,所以呢,通过一个小小的手段,把拷贝给禁止掉。这个小小的手段就是让一个类继承一个把拷贝构造函数和赋值操作符重载设置为private权限的函数,把无参构造函数和析构函数设置为权限protected。

例如:

class Noncpyable

{

protected:

Noncpyable() {}

~Noncpyable() {}

private:

//子类继承后,并没有权限访问这两个函数,而子类的拷贝又需要调用到这两个函数,故把拷贝给禁止了。

Noncpyable(const Noncpyable &);

const Noncpyable& operator= (const Noncpyable &) const;

};

Noncpyable的类图

clip_image002

现在对运算符进行抽象,运算符可以分为一元运算符,二元运算符,

一元运算符:函数,取反(-)

二元运算符:加,减,乘,除,赋值运算

这样的话,我们应该把一元运算符和二元运算符定义成抽象类,而具体的运算符设置为具体类继承它们。当然它们都要继承Node。

一元运算符

clip_image003

二元运算符

clip_image004

 

这是表达式的BNF表示

Expr ::= Term{('+' | '-') Term }

Expr ::= Term = Expr

Term ::= Factor {('*' | '/') Factor }

factor ::=

        1.number

         2.identifier

              2.1.function

              2.2.variable

         3.'-'factor

         4.'('expression')'

现在我们需要支持蓝色字体中的特性,先来 Expr ::= Term{('+' | '-') Term } 、Term ::= Factor {('*' | '/') Factor }这两个吧

它们都要一个共同的特性:包含的为可重复0至无数次的项。因此设置一个抽象类MultipleNode来表示这种特性

对 Expr ::= Term{('+' | '-') Term }设置一个SumNode的类,Term ::= Factor {('*' | '/') Factor }设置一个ProductNode类

clip_image005

支持number,把设置一个NumberNode保存一个数字

clip_image006

支持variable,设置一个VariableNode保存变量信息

clip_image007

现在把所有的关于计算的类都设计完了,下面来个“完整的”的类图

clip_image008

转载于:https://www.cnblogs.com/Ljian1992/p/4287144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单计算器设计与实现 2.4 代码部分 #include #include #define TRUE 1 #define FALSE 0 #define MAXNUM 100 typedef int DataType; struct SeqStack { DataType s[MAXNUM]; int t; }; typedef struct SeqStack *PSeqStack; PSeqStack createEmptyStack_seq() { PSeqStack pastack; pastack=(PSeqStack)malloc(sizeof(struct SeqStack)); if (pastack==NULL) { printf("超出空间!!\n"); } else { pastack->t=-1; } return pastack; } int isEmptyStack_seq(PSeqStack pastack) { return pastack->t==-1; } void push_seq(PSeqStack pastack, DataType x) { if (pastack->t >= MAXNUM - 1) printf("溢出!\n"); else { pastack->t = pastack->t+1; pastack->s[pastack->t]=x; } } void pop_seq(PSeqStack pastack) { if (pastack->t==-1) { printf("未溢出!\n"); } else { pastack->t = pastack->t-1; } } DataType top_seq(PSeqStack pastack) { return pastack->s[pastack->t]; } int infixtoSuffix(const char* infix, char* suffix) { /*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/ int state_int = FALSE; /*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的不是数字字符, 设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/ char c, c2; PSeqStack ps = createEmptyStack_seq(); /*运算符栈*/ int i, j = 0; if(infix[0]=='\0') { return FALSE; /*不允许出现空表达式*/ } for(i=0; infix[i]!='\0';i++) { c=infix[i]; switch(c) { case ' ': case '\t': case '\n': if(state_int== TRUE) { suffix[j++]=' ';/*状态从true转换为false时输出一个空格*/ } state_int= FALSE; break; /*遇到空格或制表符忽略*/ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': state_int =TRUE; suffix[j++]=c; /*遇到数字输出*/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值