自己开发计算器(4)-完成!源代码公开!

来源:未知 责任编辑:责任编辑 发表时间:2013-08-27 16:01 点击:

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

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

  • 自己开发计算器(0)-扩展巴科斯范式(EBNF)
  • 自己开发计算器(1)-准备开发环境
  • 自己开发计算器(2)-全新的操作方式
  • 自己开发计算器(3)-140行代码搞定Token解析

如果大家不想安装环境那么麻烦,可以从http://down.51cto.com/data/261231直接下载可执行文件。

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

表达式解析。

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

1.Interpreter设计模式

2.自己开发计算器(0)-扩展巴科斯范式(EBNF)

这里只提供最基本的线索

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分种可以搞定。

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

源代码,工程文件下载地址:http://down.51cto.com/data/263723

 

本文出自 “西尖山笔记” 博客,请务必保留此出处http://craftsman1970.blog.51cto.com/3522772/682896

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Android 完全退出程序
    • 原创:Android应用开发-Andorid歌词秀,含源码
    • android 屏幕保护
    • Android手机软件汉化教程---第四课 dex文件汉化
    • 众多Android 开源项目推荐,给力工作给力学习
    • Android Audio代码分析4
    • Android得到已安装的应用程序信息!
    • Android开发者指南(29) —— USB Host and Accessory
    • Android成长的幕后推手:工程师鲁宾
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1