简介

VS2019编写的计算器,支持括号和小数运算和进制转换
当进制发生转换时,如果表达式框内有表达式,会计算后转化,支持小数转换,如果表达式有误,将直接清空。

界面

实现方法

表达式框添加控制变量CString类型的m_sEquation,除了求值运算其他按键都可以认为是对字符串的操作

下面重点介绍值的运算,为此写了一个MyCalculator类,它有两个成员函数:

bool MyCalculator::Calc(CString Equation, CString &ans, int radix)
传入表达式Equation,和进制radix(默认为十进制),将计算结果存入ans中
当表达式有错误时,如"(1+1++1)","(1+6",函数返回值FALSE,否则返回TRUE
被除数为0时,ans赋值为"除0异常"

为了获取小数,需要下面的GetNum函数,传入表达式Eq,起始位置i,进制radix,注意这个函数不可以直接处理负数

  • 对于整数部分,和普通整数变换一样x=x∗10+Eq[i]−′0′x=x*10+Eq[i]-'0'x=x∗10+Eq[i]−′0′,但是现在不一定是十进制,换成∗radi*radi∗radix就可以;
  • 判断是否有小数点
  • 如果有,小数部分第i位要乘上1/radix1/radix1/radix的i次方
double GetNum(CString& Eq, int& i, int radix)
{double x = 0;while (i<Eq.GetLength() && IsNum(Eq[i])){x = x * radix + Eq[i] - '0';i++;}double rad = 1.0 / radix;if (i < Eq.GetLength() && Eq[i] == '.') {i++;while (i < Eq.GetLength() && IsNum(Eq[i])){x = x + (Eq[i] - '0') * rad;rad = rad / radix;i++;}}return x;
}

计算表达式的整体过程是通过表达式栈实现
num数字表达式
opt操作符表达式
因为有负数,已经要判断"2++3"之类错误,不方便直接判断某一位到底是数还是操作符,但是所有表达式都有一个特点:除了括号数字后面一定是操作符,操作符后面一定是数字,左括号左是操作符右是数字,右括号左是数字又是操作符,所以可以写以下循环

whilewhilewhile 表达式未处理完:

  • 判断左括号,可能没有
  • 得到数字(先判断符号再GetNum),入栈
  • 判断右括号,如果有,出栈至左括号
  • 得到操作符,把操作符栈顶优先级不比它低的出栈,自己入栈

最后所有操作符出栈

这里的出栈指取出操作符和两个操作数,运算后结果数入栈这一整个过程

bool MyCalculator::Calc(CString Equation, CString &ans, int radix)
{double num[MAXNUM];int ntop = 0;char opt[MAXOPT];int otop = 0;int Len = Equation.GetLength();for (int i = 0 ; i < Len; ){if (Equation[i] == '('){opt[++otop] = Equation[i++];if (i >= Len) return FALSE;}bool flag = false;if (Equation[i] == '-'){flag = true;i++;if (i >= Len) return FALSE;}if (!IsNum(Equation[i]))return FALSE;num[++ntop] = GetNum(Equation, i, radix) * (flag ? -1 : 1);if (i >= Len) break;if (Equation[i] == ')'){while (otop > 0 && opt[otop] != '(') {INT cas = GetOutSta(num, ntop, opt, otop);if (cas == -1) return FALSE;if (cas == 0) {ans = _T("除0异常");return TRUE;}}if (otop == 0) return FALSE;otop--;i++;if (i >= Len) break;}if (!IsOpt(Equation[i]))return FALSE;while (otop > 0 && opt[otop]!='(' && !Greater(Equation[i],opt[otop])) {INT cas = GetOutSta(num, ntop, opt, otop);if (cas == -1) return FALSE;if (cas == 0) {ans = _T("除0异常");return TRUE;}}opt[++otop] = Equation[i++];if (i >= Len) return FALSE;}//return 0;while (otop) {INT cas = GetOutSta(num,ntop,opt,otop);if (cas == -1) return FALSE;if (cas == 0) {ans = _T("除0异常");return TRUE;}}if (ntop != 1) return FALSE;ans.Format(_T("%g"), num[ntop]);if (radix != 10) {ConvertRad(ans, 10, radix);}return TRUE;
}

bool MyCalculator::ConvertRad(CString& Num, int radixFrom, int radixTo)
传入原数字Num,转换前的进制radixFrom,转换后的进制radixTo,转换失败时(Num不是数字)返回FALSE

首先用GeNum转换为double型dtmp

  • 如果是负数dtmp=-dtmp,ans加‘-’
  • 整数部分用自带的_itoa_s转换
  • 小数部分不断乘radixTo,顺序取整数位,默认最多转成8位小数
bool MyCalculator::ConvertRad(CString& Num, int radixFrom, int radixTo)
{int Len = Num.GetLength();int j = 0;bool flag = false;if (Num[j] == '-') {j++;flag = true;}double dtmp = GetNum(Num,j,radixFrom);if (j != Len) return FALSE;Num = "";if (flag) {Num = "-";}int itmp = (int)dtmp;char str[100];_itoa_s(itmp, str, 100, radixTo);Num += (CString)str;dtmp -= itmp;int dotLen = 0;if (dtmp > 1e-7) {Num += ".";while (dtmp > 1e-7 && dotLen <= 8) {dtmp *= radixTo;Num += static_cast<char>('0'+(int)dtmp);dtmp = dtmp - (int)dtmp;}}return TRUE;
}

完整代码

CSDN下载

码云

MFC实现浮点/进制转换计算器相关推荐

  1. 使用Android Studio做一个简易进制转换计算器

    Android Studio简易进制转换计算器 1.问题描述. 设计并实现一个数制转换器,能够对输入的任- -进制类型的数值转换为指定的数制类型的数值.必须实现的数制类型有二进制.八进制.十进制和十六 ...

  2. 计算机进制转换界面,进制转换计算器

    进制转换计算器是一款超级好用的进制转换工具.用户们可以利用进制转换计算器来进行轻松的文本.数字.字母的转换.干净整洁的界面也会加速大家的操作. 进制转换计算器特色: 1.如果要将二进制转换为十进制,请 ...

  3. Java实现任意进制转换拓展进制转换计算器

    JAVA实现蓝桥杯基础练习十六进制转换八进制-----------拓展进制转换计算器 这个题目我浏览了大量的道友的文章发现十分麻烦,但仍然从其中收益菲薄,所以在这里分享一下我认为最好的代码 impor ...

  4. 万能进制转换计算器_这7款计算器APP一定会让你感到惊艳!

    " 现在的手机基本都会有自己内置的计算器,功能各有千秋,但是总会有些功能缺失,让人非常遗憾,也因此会有非常好用的计算器APP被开发出来,这里就推荐几个非常不错的计算器APP. 1.小米计算器 ...

  5. 怎么用计算机的计算器转换进位制,计算机进制换算(进制转换计算器)

    我想知道进制的转换方法, 8 16 10进制转换成2进制都是除2. 但其他进制之间. 进数转换:1.二进制数.十六进制数转换为十进制数(按权求和) 二进制数.十六进制数转换为十进制数的规律是相同的.把 ...

  6. 二进制转四进制计算机,二进制换算(进制转换计算器)

    二进制数01011010扩大2倍之后是多少?急求~ 先把它转换成为 10进制 变成90 变180 然后再转换成为2进制 10110100 我看了一下像是一道二进制的题 有谁知道答案帮帮忙 谢谢了 问着 ...

  7. HTML编写2进制转换计算器,jQuery实现可以计算进制转换的计算器

    本文实例为大家分享了jQuery实现可以计算进制转换的计算器,供大家参考,具体内容如下 在案例8的基础上增加了进制转换功能 动画效果: 计算器 *{ margin: 0; padding: 0; } ...

  8. 计算机13E怎么转换成十进制,十六进制换算(进制转换计算器)

    把下面的16进制转为10进制b35de1f058c72a7430241461cd504839dc27438e. 16进制转10进制16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第 ...

  9. php实现进制转换计算器,利用php怎么实现一个进制转换功能

    利用php怎么实现一个进制转换功能 发布时间:2020-12-14 16:29:23 来源:亿速云 阅读:69 作者:Leah 本篇文章为大家展示了利用php怎么实现一个进制转换功能,内容简明扼要并且 ...

最新文章

  1. 从C语言的角度重构数据结构系列(四)-静态链表动态链表
  2. Vue-router 的使用 (vue3.x版本)
  3. sql取日期的年月_机油检测美版银美孚5W30,生产日期20年1月
  4. 运维前线:一线运维专家的运维方法、技巧与实践3.1 数据中心搬迁准备
  5. 解微分方程数值解法(理论部分)
  6. 关于计算机软件系统的知识,会计电算化知识点:计算机软件系统
  7. bin文件python读取
  8. 360极速浏览器如何设置ie8兼容模式
  9. 10个空手套白狼案例:不花一分钱为自己赚大钱
  10. ifconfig/docker删除虚拟网卡
  11. java无法验证发布者_Win10弹出无法验证发布者怎么解决?
  12. js 混合排序(同时存在数字、字母、汉字等)
  13. html从入门到精通胡菘,高职电商网页设计教学实践(共2831字).doc
  14. mootools 选择器_MooTools中的Sizzle和Peppy选择器引擎
  15. 宋宝华- KVM最初的2小时(KVM从入门到入不了门)
  16. 一个屌丝程序猿的人生(一百零五)
  17. 复杂推理的进展与挑战——从LSAT讲起
  18. uniapp 分享缩略图过大怎么办_新版本微信下,如何设置分享到朋友圈的缩略图?...
  19. js方法在ie浏览器不起作用
  20. 210807算法日记:文件后缀数据点的生成洛谷数据点的上传

热门文章

  1. Python 文件的读写模式
  2. 初识C语言之详解char类型
  3. 如何使用群晖nas快速收集多份文件?
  4. 一个大神的twitter
  5. iOS安全–看了这个,你还敢用分身版微信吗?
  6. LSA/LSI算法原理和实践
  7. [C++]接口继承与实现继承
  8. java中的方法重写
  9. docker修改服务器参数怎么办,Docker(32)- 如何修改 docker 容器的启动参数
  10. 如何利用长尾关键词挖掘推广口红?