MFC表达式计算器

2022/8/30 6:25:01

本文主要是介绍MFC表达式计算器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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



这篇关于MFC表达式计算器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程