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参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
MFC版本
用MFC给程序做一个简单的窗口界面
将cmath中的sin、cos、tan参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
源码传送门
传送门:https://pan.baidu.com/s/1JJs9vbZahUCB6cQvXLgAVg?pwd=1111
这篇关于MFC表达式计算器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01巧用 TiCDC Syncpoint 构建银行实时交易和准实时计算一体化架构
- 2024-05-01银行核心背后的落地工程体系丨Oracle - TiDB 数据迁移详解
- 2024-04-26高性能表格工具VTable总体构成-icode9专业技术文章分享
- 2024-04-16软路由代理问题, tg 无法代理问题-icode9专业技术文章分享
- 2024-04-16程序猿用什么锅-icode9专业技术文章分享
- 2024-04-16自建 NAS 的方案-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数, 加上remote_src: yes 配置-icode9专业技术文章分享
- 2024-04-14ansible 检测远程主机的8080端口,如果关闭,则echo 进程已关闭-icode9专业技术文章分享
- 2024-04-14result 成功怎么写-icode9专业技术文章分享