《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.支持整数和小数运算
完成类似如下界面所示的表达式求值软件,输入包含加﹑减﹑乘﹑除﹑括号等运算符和0-9数字的表达式,输出表达式计算结果。
(1)表达式包含多位整数甚至是小数,如(2.5+3.15)/0.69;
(2)表达式包含特定函数,如: 1+sin(5+2/3)*3;
程序源代码(含注释)﹑程序报告文档,打包成压缩文件在课程网站上按规定时间提交。
如有需要,程序可方便扩展对如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; }
将cmath中的sin、cos、tan参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
用MFC给程序做一个简单的窗口界面
将cmath中的sin、cos、tan参数由角度转换成弧度后再计算,以下符合数学表达式的求值结果:
传送门:https://pan.baidu.com/s/1JJs9vbZahUCB6cQvXLgAVg?pwd=1111