首页 > 其他分享 >MFC表达式计算器

MFC表达式计算器

时间:2022-08-30 01:00:44浏览次数:83  
标签: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,表达式
From: https://www.cnblogs.com/codewriter/p/16637934.html

相关文章

  • C语言后缀表达式求值
    C语言后缀表达式求值从控制台输入一合法的后缀表达式,其中的运算符只包括+、一、*、/,运算数都是大于等于o的整数(除数不为零),按要求输出计算结果,或输出计算结和相对应的中缀......
  • # 关于C++20Concept(概念)及requires表达式的学习
    关于C++20Concept(概念)及requires表达式的学习Concept(概念)C++20引入了concept以在编译期检查模板实参是否满足指定的约束.如何不用concept进行约束template<typenam......
  • MFC技术之调试打印日志到控制台
    第一步:在pch.h或者stdafx.h中添加包含头文件,加载相关库。//pch.h:这是预编译标头文件。//下方列出的文件仅编译一次,提高了将来生成的生成性能。//这还将影响Intel......
  • EL表达式和EL运算符
    EL表达式1。概念:ExpressionLanguage表达式语言2.作用:替换和简化jsp页面中java代码的编写3,语法:$表达式}4,注意:"jsp默认支持el表达式的。如果要忽略el表达式1.设......
  • MFC学生成绩查询系统
    MFC学生成绩查询系统项目(五):学生成绩查询系统的设计设计内容:设计一个学生成绩查询系统。设计要求:利用VisualC++进行应用程序设计,程序应具有如下功能:(1)输入姓......
  • 正则表达式菜鸟教程
    地址: https://c.runoob.com/front-end/854一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9]......
  • Spring Boot - AOP(面向切面)-切入点表达式
    参考:https://www.cnblogs.com/li3807/p/9002683.htmlhttps://blog.csdn.net/ycf921244819/article/details/106599489/ 切入点指示符用来指示切入点表达式目的,在Spri......
  • leetcode 227. Basic Calculator II 基本计算器 II(中等)
    一、题目大意给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在[-23......
  • mfc中如何将多字节编码转为utf8编码
    新建mfc项目时可选多字节编码(MBCS)或者unicode编码,而有些第三方库用到了utf8编码,此时需要进行编码转换。以下是将多字节编码转换成utf8的mfc代码,注意CP_ACP和CP_UTF8的使......
  • 正则表达式
    创建方式构造器varreg1=newRegExp();console.log(reg1);字面量创建varreg1=//;console.log(reg1);使用varreg1=/use/;reg1.test('use');reg1.test......