经过国庆节期间的调试,终于可以给大家看真正的而不是图片了。

关于这个软件的来龙去脉,大家可以参照:

如果大家不想安装环境那么麻烦,可以从直接下载可执行文件。

下面对软件中剩下的技术点做一下简单的说明。

表达式解析。

下图是本程序中,表达式解析,计算相关的类。在理解代码之前建议大家读一下:

1.Interpreter设计模式

2.

这里只提供最基本的线索

1.表达式解析通过buildExpr实现

2.表达式计算通过evaluate实现。

如何扩展自己的函数

计算器功能强大与否,主要是看函数功能是否强大。所以在设计的最初就把能够简单的扩展函数功能作为关键的设计目标之一。有没有做到呢?实际看一下代码应该最能说明问题。

先是头文件。

 
  1. #ifndef ACOSDFUN_H  
  2. #define ACOSDFUN_H  
  3.  
  4. #include"calculatefunction.h"  
  5.  
  6. class AcosdFun : public CalculateFunction  
  7. {  
  8. public:  
  9.     AcosdFun();  
  10.  
  11.     virtual QString getName();  
  12.     virtual QString getInstruction();  
  13.     virtual bool execute(QList<double> paraList, double& result, QString& message);  
  14. };  
  15.  
  16. #endif // ACOSDFUN_H 

代码是16行,实际上需要动的,只有类名和防止重复引用的宏定义,算4行吧。

然后是实现部分。

 
  1. #include "acosdfun.h"  
  2. #include "functionmanager.h"  
  3.  
  4. #include <math.h>  
  5.  
  6. static FunctionManager::FunctionRegister acosRegister(new AcosdFun());  
  7.  
  8. AcosdFun::AcosdFun()  
  9. {  
  10. }  
  11.  
  12. QString AcosdFun::getName()  
  13. {  
  14.     return "acosd";  
  15. }  
  16.  
  17. QString AcosdFun::getInstruction()  
  18. {  
  19.     QString strInstruction;  
  20.     strInstruction += "acosd(x) -\r\n";  
  21.     strInstruction += "Arccosine (inverse cosine) function. Result in degrees.\r\n";  
  22.     strInstruction += "Argument type and attributes\r\n";  
  23.     strInstruction += "x must be of type real. Its value must satisfy the inequality |X| <= 1.\r\n";  
  24.     return strInstruction;  
  25. }  
  26.  
  27. bool AcosdFun::execute(QList<double> paraList, double& result, QString& message)  
  28. {  
  29.     if(paraList.count() != 1)  
  30.     {  
  31.         message = "Acosd:Invalid parameter count";  
  32.         return false;  
  33.     }  
  34.     double para = paraList.first();  
  35.     clearError();  
  36.     result =acos(para) * 180 / M_PI;  
  37.     return checkError(message);  

这个类是角度单位的反余弦函数的实现。空行算在内也只有38行。

第6行可能比较费解,是用来登录函数的。有了这一行,就能在函数列表中看到自己定义的函数了。

如果是简单的函数的话,相信15分种可以搞定。

只要在工程文件加入两个文件就可以扩展函数功能,不能再简单了吧。

源代码,工程文件下载地址: