写在前面:

前段时间微软在全球最大的同性交友网站GitHub上开源了微软计算器的C++代码:https://github.com/Microsoft/calculator。我在动手做这个计算器之前和大多数人都有着一样的观点:不就是一个计算器吗?这能有多难啊?(眼高手低 十分不屑.jpg)然而等到自己真正动手做起来的时候就会发现其实做一个计算器并没有想象中的那么简单。下面这张截图是我写的1.4版的计算器运行界面啦(GitHub:https://github.com/Don2025/MyCode/tree/master/calculator),前面几个版本的计算器代码太丑陋就不放上来了,就简述一下这些版本存在的bug以及修改的方法。

对了,附上我们老师做的计算器(GitHub:https://github.com/HBU/DataBase/tree/master/Csharp/Calculator),我的1.0版是在老师的基础上实现的(当时老师也还没支持键盘输入),but now哈哈哈哈我感觉我写的这个1.4版计算器的功能比老师的更强大。

版本简述:

1.0版  只有一行文本框,只能进行加减乘除运算。1.0版发现的第一个bug就是当除数为0时,结果会是∞。

1.1版  用一条if语句解决了除数为0时结果为∞的问题,若除数为0,计算器会提示“除数不能为0!”,且会在下一次计算开始前进行初始化(效果和按下AC键一样)。1.1版修改了左上角的图标、新增加了当前时间,但是我发现有俩个bug:①用户完成一次计算后,重新输入一串数字,文本框不会清空,而是会在上一次的计算结果后加数字;②用户在完成一次计算后,继续输入运算符和一串数字,计算器并不能够在上一次计算结果的基础上进行计算,计算器会直接奔溃;③当用户输入完一串数字和一个运算符后文本框会变为空,此时用户不输入下一串数字而是继续输入运算符,计算器就会直接奔溃。

1.2版  出现了俩行输入文本框,第一行显示计算式子,第二行显示计算结果。解决了1.1版的俩个问题:①在一次计算完成后,重新输入一串数字能够开始一次新的运算;②在上一次计算结束后直接输入运算符和一串数字,第二行结果会变到第一行并且完成计算。1.2版还是没能够解决用户连续输入多个运算符的问题,而且我发现它不能一次性进行多个运算符的运算,比如2×3+1。

1.3版 这个版本有俩个很重要的突破。首先是能支持键盘输入了(前面的版本都只能靠点击按钮),然后我也并没有像前面的版本一样对字符串进行分割开来再计算结果,而是用到了DataTable.Compute()这个函数来直接得出计算结果(代码如下所示)。这样一来就可以直接对用户在文本框中输入的字符串型计算式进行求值。

string str = "2*3+1";
var sum = new DataTable().Compute(str, null);
//这样能计算出来sum = 7;

1.4版  主要是做了一些界面上的优化,计算器的文本框应该是靠右显示的,于是我将textBox的属性TextAlign从Left改为了Right,还有就是AutoSizeMode属性设置为了GrowAndShrink,不允许用户自动调节窗体大小。然后新增加了回删功能,可以点击←或在键盘上按Backspace键进行回删。

private void ButtonBack_Click(object sender, EventArgs e)   //用于删除textBox的最后一个字符
{if (textBox1.Text.Length != 0){textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);}
}

1.4版还在界面上把乘号从"*"改成了"×",把除号从"/"改成了"÷",这样改了之后需要在计算之前对字符串进行一次替换。

string str = textBox1.Text.Replace('÷', '/').Replace('×', '*');  //替换一下乘号和除号       

1.4版目前还存在的一个小bug就是数字键的Enter不能实现等于号的功能。

C#代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1()    //默认构造函数{InitializeComponent();}bool isEqual = false;   //判断一次计算是否完成public void Initialize()   //初始化{textBox1.Text = "";textBox2.Text = "";isEqual = false;}private void Button0_Click(object sender, EventArgs e){if(isEqual){Initialize();isEqual = false;}textBox1.Text += "0";}private void Button1_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "1";}private void Button2_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "2";}private void Button3_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "3";}private void Button4_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "4";}private void Button5_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "5";}private void Button6_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "6";}private void Button7_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "7";}private void Button8_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "8";}private void Button9_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += "9";}private void ButtonDot_Click(object sender, EventArgs e){if (isEqual){Initialize();isEqual = false;}textBox1.Text += ".";}private void ButtonAdd_Click(object sender, EventArgs e){if(isEqual){textBox1.Text = textBox2.Text;textBox2.Text = "";isEqual = false;}textBox1.Text += "+";}private void ButtonSub_Click(object sender, EventArgs e){if(isEqual){textBox1.Text = textBox2.Text;textBox2.Text = "";isEqual = false;}textBox1.Text += "-";}private void ButtonMul_Click(object sender, EventArgs e){if(isEqual){textBox1.Text = textBox2.Text;textBox2.Text = "";isEqual = false;}textBox1.Text += "×";}private void ButtonDiv_Click(object sender, EventArgs e){if(isEqual){textBox1.Text = textBox2.Text;textBox2.Text = ""; isEqual = false;}textBox1.Text += "÷";}private void ButtonAC_Click(object sender, EventArgs e)   //全部清零{textBox1.Text = "";textBox2.Text = "";}private void ButtonBack_Click(object sender, EventArgs e)   //用于删除textBox的最后一个字符{if (textBox1.Text.Length != 0){textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);}}private void ButtonEquals_Click(object sender, EventArgs e){string str = textBox1.Text.Replace('÷', '/').Replace('×', '*');  //替换一下乘号和除号var sum = new DataTable().Compute(str, null);textBox2.Text = "";textBox2.Text += sum;if(textBox2.Text == "∞"){textBox2.Text = "除数不能为0!";}isEqual = true;}private void Form1_KeyDown(object sender, KeyEventArgs e){switch (e.KeyData){case Keys.D0: case Keys.NumPad0: Button0_Click(sender, e); break;case Keys.D1: case Keys.NumPad1: Button1_Click(sender, e); break;case Keys.D2: case Keys.NumPad2: Button2_Click(sender, e); break;case Keys.D3: case Keys.NumPad3: Button3_Click(sender, e); break;case Keys.D4: case Keys.NumPad4: Button4_Click(sender, e); break;case Keys.D5: case Keys.NumPad5: Button5_Click(sender, e); break;case Keys.D6: case Keys.NumPad6: Button6_Click(sender, e); break;case Keys.D7: case Keys.NumPad7: Button7_Click(sender, e); break;case Keys.D8: case Keys.NumPad8: Button8_Click(sender, e); break;case Keys.D9: case Keys.NumPad9: Button9_Click(sender, e); break;case Keys.Decimal: ButtonDot_Click(sender, e); break;case Keys.Add: ButtonAdd_Click(sender, e); break;case Keys.Subtract: ButtonSub_Click(sender, e); break;case Keys.Multiply: ButtonMul_Click(sender, e); break;case Keys.Divide: ButtonDiv_Click(sender, e); break;case Keys.Back: ButtonBack_Click(sender, e); break;case Keys.Oemplus: ButtonEquals_Click(sender, e); break;default: break;}}private void Timer1_Tick(object sender, EventArgs e){label2.Text = DateTime.Now.ToString();   //设置label2的文本为当前的系统时间}}
}

C# 加减乘除计算器相关推荐

  1. 在线分数加减乘除计算器

    在线分数加减乘除计算器 在线分数加减乘除计算器 分数计算器是一款在线计算分数与有理数之间的计算器,它可以计算分数加法.分数减法.分数乘法.分数除法等运算. https://tooltt.com/fra ...

  2. php加减法计算器程序,用php简单实现加减乘除计算器

    用php实现加减乘除计算器.代码很简单哦! 复制代码 代码如下: header("content-type:text/html;charset=utf-8"); session_s ...

  3. 用php实现加减乘除计算器,利用php怎么编写一个加减乘除计算器

    利用php怎么编写一个加减乘除计算器 发布时间:2021-01-16 11:22:55 来源:亿速云 阅读:99 作者:Leah 利用php怎么编写一个加减乘除计算器?很多新手对此不是很清楚,为了帮助 ...

  4. 两位数的加减乘除计算器

    两位数的加减乘除计算器 package com.bing.method; import java.util.Scanner;public class Demo {//两位数的加减乘除计算器public ...

  5. 使用C# winform 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器

    一:成果物     不多展示,,,我们开始吧.. 二: 窗体包含内容 2.1 显示屏部分组成 显示屏部分由两个组件组成,一个是方便操作的panel控件位于顶部,且为了使其显示屏在改变窗体大小时一直位于 ...

  6. 静态html加减乘除计算器代码,html+js实现简单的计算器代码(加减乘除)

    下面小编就为大家带来一篇html+js实现简单的计算器代码(加减乘除).小编觉得挺不错的,现在就分享给大家,也给大家做个参考. html+js实现简单的计算器代码(加减乘除) function set ...

  7. 基于tkinter的简易加减乘除计算器

    from tkinter import * from tkinter import ttk # 整个窗体的GUI是一个类class Calculator(Tk):def __init__(self): ...

  8. 【227】基本计算器II--无括号的加减乘除计算器

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例 1: 输入:s = "3+2*2" 输出:7 示例 2: 输入:s = &q ...

  9. c++加减乘除计算器

    #include <iostream> #include <conio.h> #include <string> void main() {char str[0xF ...

最新文章

  1. python如何读取txt文件-如何在python中读取文件夹中的txt文件列表
  2. 3dContactPointAnnotationTool开发日志(二二)
  3. 计算机网络查看路由表命令,如何查看、添加、修改、删除路由器内部的路由表项?...
  4. Android P 调用隐藏API限制原理
  5. vsftp的被动模式
  6. 简单的动态JavaScript Ajax函数
  7. 2.nginx 配置
  8. C语言编译插桩,深度解析编译插桩技术(二)AspectJ
  9. 纪念愚人节微博禁止评论
  10. 计算机视觉中的论文常见单词总结
  11. PHP Startup: Unable to load dynamic library -找不到指定模块解决方法
  12. Mysql孤儿文件_PostgreSQL中的孤儿文件(orphaned data files)
  13. 【5GC】什么是5G切片?5G切片如何工作?
  14. 玩转教育计算机二级,全国计算机等级考试二级msoffice高级应用教材《玩转office轻松过二级》配套模拟软件使用说明.doc...
  15. python 均匀分布_python 实现生成均匀分布的点
  16. 计算机病毒占内存吗,蠕虫病毒占多少内存
  17. 关于QT中“崩溃”问题
  18. 如何隐藏CAD图纸中的部分图形对象?CAD局部隐藏
  19. 在C#程序中三菱PLC读写数据
  20. api平台支持的格式

热门文章

  1. RO、RW和ZI的区别
  2. 偏最小二乘回归(PLSR)和主成分回归(PCR)
  3. Python地理位置信息库geopy的使用(一):基本使用
  4. 网盘修复版新增qq支付仿城通网盘115网盘源码下载
  5. 计算机网络--串行传输与并行传输
  6. DYNAMIC MOVEMENT PRIMITIVES PART 1: THE BASICS
  7. 存储过程报错:Error converting data type varchar to bigint.
  8. m蜂窝移动通信系统中越区切换的matlab仿真分析
  9. 【BZOJ30472125】Freda的传呼机
  10. 面向对象设计原则实践:之四.里氏代换原则