ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC表达式计算器

2022-08-30 01:00:08  阅读:198  来源: 互联网

标签:std MFC error list 计算器 求值 include 表达式


MFC表达式计算器

《mfc表达式计算器》
该程序应该是一个mfc窗口程序,应该基于对话框。
1、支持基本运算符:括号()、+,-,*,/。
2、支持复杂运算符:三角函数-sin(x)/cos(x)/tan(x)/atan(x)、对数-ln(x)/log(x)、开方sqrt(x),乘方xx,x2,阶乘n!。
3.有可以直接利用进行计算的自然常数e,π。
4.有清空窗口内容和仅删除一个字符的功能。
6.可进行计算符、括号与函数多层嵌套计算。此计算器应该支持直接输入计算表达式,并直接计算出结果。
7.计算结果与计算表达式不共用一个编辑框。
8.支持整数和小数运算

C++表达式求值

表达式求值问题:

完成类似如下界面所示的表达式求值软件,输入包含加﹑减﹑乘﹑除﹑括号等运算符和0-9数字的表达式,输出表达式计算结果。
(1)表达式包含多位整数甚至是小数,如(2.5+3.15)/0.69;
(2)表达式包含特定函数,如: 1+sin(5+2/3)*3;

提交:

程序源代码(含注释)﹑程序报告文档,打包成压缩文件在课程网站上按规定时间提交。

功能要求:

  • 编程语言:C/C++
  • 支持的特定函数:sin、cos、tan等
  • 实现含括号优先级、四则混合运算、数值可以是负数的表达式求值

C++实现表达式求值

  • 支持运算符:加、减、乘、除、左括号、右括号
  • 支持操作数:多位数值、负数、小数
  • 支持函数:sin、cos、tan
  • 当发生除0、括号不匹配,或运算符、操作数不合法将给出错误提示

如有需要,程序可方便扩展对如sqrt、pow、log等其他函数的支持。

算法原理

采用数据结构的栈特性,将中缀表达式转换成后缀表达式(逆波兰表达式)再进行计算求值。

表达式求值类源码(部分)

/**********************************
* 表达式求值
*
* - 支持运算符:+、-、*、/、(、)
* - 支持操作数:多位数值、负数、小数
* - 支持函数:sin、cos、tan
*
**********************************/
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <sstream>
#include <cmath>
#include <cctype>

//表达式求值类
class ExpCalculation {
private:
    using TokenList = std::vector<std::string>;
    using TokenStack = std::stack<std::string>;
    using ValueStack = std::stack<double>;

public:
    ExpCalculation() {

    }

public:
    //传入表达式,求值成功返回true,否则返回false,可通过error获取错误原因
    bool evaluate(const std::string& expression, double& result) {
        TokenList token_list;
        TokenList postfix_list;
        if (!parseToken(expression, token_list, error_)) return false;
        if (!postfixToken(token_list, postfix_list, error_)) return false;
        convertTokenListToString(postfix_list, postfix_);
        if (!evaluateToken(postfix_list, result, error_)) return false;
        return true;
    }

    //获取表达式转换的后缀表达式文本串
    const std::string& postfix() const {
        return postfix_;
    }

    //获取求值错误原因
    const std::string& error() const {
        return error_;
    }

命令行版本的测试案例

//测试表达式求值
void testing(const std::string& expression) {
    double result;
    std::string error;
    ExpCalculation exp;
    std::cout << "----------------------" << std::endl;
    std::cout << expression << std::endl;
    if (exp.evaluate(expression, result)) {
        std::cout << "postfix: " << exp.postfix() << std::endl;
        std::cout << "result = " << result << std::endl;
    } else {
        std::cout << "error: " << exp.error() << std::endl;
    }
}

int main() {
    system("title 表达式求值 (源码联系作者小企鹅 1561968262)");
    std::cout << "# 表达式求值程序 #" << std::endl;
    std::cout << "- 支持运算符:+、-、*、/、(、)" << std::endl;
    std::cout << "- 支持操作数:多位数值、负数、小数" << std::endl;
    std::cout << "- 支持函数:sin、cos、tan" << std::endl;
    //案例测试
    testing("(5+55.55)*(666/3.2+67)-4");
    testing("sin(56 * cos(7 * 3.14159) / (tan(66 - 52 * 0.7)) - (52*6))");
    testing("(2.5+3.15)/0.69");
    testing("1+sin(5+2/3)*3");
    testing("-3.14+cos(-75+-2*63)/-5");
    return 0;
}

C++版本

将cmath中的sin、cos、tan参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
命令行(正确).png

MFC版本

用MFC给程序做一个简单的窗口界面
将cmath中的sin、cos、tan参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
MFC表达式求值(正确).gif

源码传送门

传送门:https://pan.baidu.com/s/1JJs9vbZahUCB6cQvXLgAVg?pwd=1111

标签:std,MFC,error,list,计算器,求值,include,表达式
来源: https://www.cnblogs.com/codewriter/p/16637934.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有