C# 简易计算器(三)

C#之简易计算器的制作 在一些问题中有时会用到计算器,今天我们可以用C#做一个简易的计算器 用到的开发工具为Visual Studio 2019(我用的是2019,其他版本的也可以) 1.首先新建一个项目文件. 2.在Form1.cs文件(Winform框架基础文件)中添加所用到的控件. 3.添加TextBox和ComboBox以及Button控件 4.对Button以及ComboBox进行一些简单的设置 ...... 阅读详情

C# 简易计算器(一)、C# 简易计算器(二)
完成了一些功能后我去网上找了找类似的代码,在这个过程中学到了很多,其中了解到设计模式这个词,以及《大话设计模式》这本书,第一章就是使用简单工厂设计模式来写计算器,因此,我花了一段时间,将原先的代码用简单工厂设计模式重新写了一遍。
功能上和之前是一样的,首先是计算类Operation

    class Operation
    {
        private double numberA = 0.0;
        private double numberB = 0.0;       

        public double NumberA
        {
            get{return numberA;}
            set { numberA = value; }
        }

        public double NumberB
        {
            get{return numberB;}
            set { numberB = value; }
        }
        //获得结果
        public virtual double getResult()
        {
            double result = 0.0;
            return result;
        }
        //添加小数点
        public virtual string addPoint(string str)
        {
            return str;
        }
        //正负号
        public virtual string posAndNeg(string str)
        {
            return str;
        }
    }

接着是四则运算以及开根号的类,继承Operation类;
加:

class OperationAdd : Operation
    {
        public override double getResult()
        {
            double result = 0.0;
            result = NumberA + NumberB;
            return result;
        }
    }

减:

class OperationSub : Operation
    {
        public override double getResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

乘:

class OperationMul : Operation
    {
        public override double getResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

除:

class OperationDiv : Operation
    {
        public override double getResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0!");
            result = NumberA / NumberB;
            return result;
        }
    }

开根号:

class OperationSquareRoot : Operation
    {
        public override double getResult()
        {
            double result;
            try
            {
                Regex reg = new Regex(@"(\+|\-)?(\d+)(\.\d+)?");
                var res = reg.Match(MainForm.calShow).Groups;

                if (res[1].ToString() == "-")
                {
                    throw new Exception("负数不能开根号!");
                }
                result = Math.Sqrt(Convert.ToDouble(MainForm.calShow));
                return result;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "警告");
                return 0;
            }     
        }

小数点:

    class OperationPoint : Operation
    {
        public override string addPoint(string str)
        {
            try
            {
                bool res = Regex.IsMatch(str, @"^(\-)?\d+$");//匹配纯数字
                bool res1 = Regex.IsMatch(str, @"^(\-)?\d+(\.\d+)?(\+|\-|\*|\/)\d+$");//匹配第二个操作数是否为整数
                if (res || res1)//满足其中一个则可以添加小数点
                {
                    str += ".";
                }
                return str;
            }
            catch (Exception)
            {
                MessageBox.Show("发生错误!", "警告");
                return str;
            }

        }
    }

正负号:

class OperationPosAndNeg : Operation
    {
        public override string posAndNeg(string str)
        {
            try
            {
                Regex reg = new Regex(@"^(\-)?");
                var res = reg.Match(str).Groups;
                if (res[1].ToString() == "")//正数
                {
                    str = "-" + str;
                }
                else//负数
                {
                    str = str.Substring(1, str.Length - 1);
                }
                return str;
            }
            catch (Exception)
            {
                MessageBox.Show("发生错误!", "警告");
                return str;
            }
        }
    }

接下来就是工厂类,需要啥就new啥

class OperationFactory
    {
        public static Operation createOperation(string operation)
        {
            Operation oper = null;
            switch (operation)
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
                case "*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
                case "SquareRoot":
                    oper = new OperationSquareRoot();
                    break;
                case ".":
                    oper = new OperationPoint();
                    break;
                case "+/-":
                    oper = new OperationPosAndNeg();
                    break;
                default:
                    break;
            }
            return oper;
        }
    }

窗体程序:
首先是数字键事件:

private void btnNum_Click(object sender,EventArgs e)
        {
            bool res = Regex.IsMatch(calShow, @"^0+$");//匹配全都是0的情况
            bool res1 = Regex.IsMatch(calShow, @"^(\-)?\d+(\.\d+)?(\+|\-|\*|\/)0+$");//匹配第二个操作数是否全都是0的情况
            if (res || res1)//满足其中一个则把前面的0删掉
            {
                btnDel.PerformClick();
            }
            if (equalStatus)//等于号按过之后点数字则直接清除原来的结果
            {
                equalStatus = false;
                calShow = "";
                resultDouble = 0.0;
                txtResual.Text = "";
            }
            Button btn = (Button)sender;
            calShow += btn.Name.ToString().Substring(btn.Name.ToString().Length-1);
            txtResual.Text = calShow;
            setBtnEnableMethon(true);
            btnEqual.Focus();
        }

接着是运算符按键事件:
这里用Button btn = sender as Button;将参数传进来,这些按钮都绑定到btnOperation_Click这一个事件,就不会每一个按钮都需要生成一个事件函数,不方便管理。

private void btnOperation_Click(object sender, EventArgs e)
        {  
            Button btn = sender as Button;
            Operation oper;
            switch (btn.Name)
            {
                case "btnAdd":
                    equalStatus = false;
                    multiDeal();
                    calShow += "+";
                    txtResual.Text = calShow;
                    setBtnEnableMethon(false);
                    break;
                case "btnSub":
                    equalStatus = false;
                    multiDeal();
                    calShow += "-";
                    txtResual.Text = calShow;
                    setBtnEnableMethon(false);
                    break;
                case "btnMul":
                    equalStatus = false;
                    multiDeal();
                    calShow += "*";
                    txtResual.Text = calShow;
                    setBtnEnableMethon(false);
                    break;
                case "btnDiv":
                    equalStatus = false;
                    multiDeal();
                    calShow += "/";
                    txtResual.Text = calShow;
                    setBtnEnableMethon(false);
                    break;
                case "btnEqual":
                    equalStatus = true;
                    multiDeal();
                    break;
                case "btnPoint":
                    if (equalStatus)//等于号按过之后点数字则直接清除原来的结果
                    {
                        equalStatus = false;
                        calShow = "";
                        resultDouble = 0.0;
                        txtResual.Text = "";
                    }
                    oper = OperationFactory.createOperation(".");
                    calShow = oper.addPoint(calShow);
                    txtResual.Text = calShow;
                    setBtnEnableMethon(true);
                    break;
                case "btnDel":
                    if (calShow.Length != 0)
                    {
                        calShow = calShow.Substring(0, calShow.Length - 1);//删除最后一个字符
                    }
                    txtResual.Text = calShow;
                    setBtnEnableMethon(true);
                    break;
                case "btnClear":
                    calShow = "";
                    resultDouble = 0;
                    txtResual.Text = "";
                    break;
                case "btnSquareRoot":
                    multiDeal();//先得出前面表达式的值
                    oper = OperationFactory.createOperation("SquareRoot");   
                    resultDouble = oper.getResult();
                    calShow = resultDouble.ToString();
                    txtResual.Text = calShow;
                    break;
                case "btnPosAndNeg":
                    multiDeal();//先计算结果,再来加正负号
                    oper = OperationFactory.createOperation("+/-");
                    calShow = oper.posAndNeg(calShow);
                    txtResual.Text = calShow;
                    break;
                default:
                    break;
            }
        }

最后修改一下运算的函数:

private void multiDeal()
        {
            try
            {
                //将前面的表达式的值计算出来
                Regex reg = new Regex(@"(\+|\-)?(\d+)(\.\d+)?(\+|\-|\*|\/)(\+|\-)?(\d+)(\.\d+)?");
                var res = reg.Match(calShow).Groups;
                //res[0]    整个匹配的表达式
                //res[1]    第一个操作数的符号
                //res[2]    第一个操作数的整数部分
                //res[3]    第一个操作数的小数部分
                //res[4]    操作符
                //res[5]    第二个操作数的符号
                //res[6]    第二个操作数的整数部分
                //res[7]    第而个操作数的小数部分
                Operation oper;
                switch (res[4].ToString())
                {
                    case "+":
                        oper = OperationFactory.createOperation("+");
                        oper.NumberA = Convert.ToDouble(res[1].ToString() + res[2].ToString() + res[3].ToString());               
                        oper.NumberB = Convert.ToDouble(res[5].ToString() + res[6].ToString() + res[7].ToString());
                        resultDouble = oper.getResult();
                        calShow = resultDouble.ToString();
                        break;
                    case "-":
                        oper = OperationFactory.createOperation("-");
                        oper.NumberA = Convert.ToDouble(res[1].ToString() + res[2].ToString() + res[3].ToString());
                        oper.NumberB = Convert.ToDouble(res[5].ToString() + res[6].ToString() + res[7].ToString());
                        resultDouble = oper.getResult();
                        calShow = resultDouble.ToString();
                        break;
                    case "*":
                        oper = OperationFactory.createOperation("*");
                        oper.NumberA = Convert.ToDouble(res[1].ToString() + res[2].ToString() + res[3].ToString());
                        oper.NumberB = Convert.ToDouble(res[5].ToString() + res[6].ToString() + res[7].ToString());
                        resultDouble = oper.getResult();
                        calShow = resultDouble.ToString();
                        break;
                    case "/":
                        oper = OperationFactory.createOperation("/");
                        oper.NumberA = Convert.ToDouble(res[1].ToString() + res[2].ToString() + res[3].ToString());
                        oper.NumberB = Convert.ToDouble(res[5].ToString() + res[6].ToString() + res[7].ToString());
                        if (oper.NumberB == 0)
                            throw new Exception("除数不能为0!");
                        resultDouble = oper.getResult();
                        calShow = resultDouble.ToString();
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "警告");
            }
            txtResual.Text = calShow;
        }

其他的没有变化,通过这次作业和后续的改进,我接触到很多,对于面向对象有了新的理解,记得上学期老师说过:你们学过一学期java面向对象程序后,我还是看不出你们有使用面向对象,还是C语言的面向过程。
任重而道远啊~
代码:https://github.com/headwindf/Calculator-

C#计算器的制作 C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。一. 开发工具的介绍和安装这里用的是VS2022,可以去官网下载安装(链接如下)Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器。 阅读详情

相关推荐

用c#实现简易的计算器功能

由于今天在网上搜了一下c#写的计算器,发现大多都太繁琐了,很多没必要并且不容易理解的东西就专门写了这个博客 1.首先新建一个windows窗体应用的项目。执行文件-新建-项目-windows窗体应用 2.在工具箱中拖出一个textbox用于输入和显示,再拖出21个button按钮用来当计算器的按键,改一下按钮的text属性 3.双击数字按钮进入代码界面(数字只用一个事件即可,运算符也是用一个事件,...

meng鱼的博客 4万+

c#实现计算器

供学习参考,希望能大家一点点小小的帮助

m0_58520840的博客 9949

C#简易计算器

欢迎开始学习使用Visual Studio 2022制作一个简易的计算器应用程序。本项目将通过创建一个包含加减乘除功能的计算器应用程序来帮助你学习使用C#语言和Windows窗体应用程序进行开发。在数字化日益普及的今天,计算器作为我们日常生活和学习中不可或缺的工具,其重要性不言而喻。从简单的算术运算到复杂的科学计算,计算器以其高效、准确的特点,极大地提升了我们处理数字信息的能力。

nm10133的博客 2035

C# 制作简易计算器

8、其他的3456789按钮可以按住shift全部选中在右边属性窗口选择事件,在事件栏中的Click中选择继承b1的按钮处的代码。以按钮1为例可修改Name为b1(方便在代码界面查错) text为1。2、选择Windows窗体应用(.net Framework)3、进入配置新项目界面(项目名称和位置可自行修改)点击创建。1、打开vs2022后,右边导航栏选择创建新项目。4、窗体From1即为我们要要编辑的位置。6、并在对应的属性窗口为其修改对应的属性。5、在窗体中添加对应的工具。

m0_49616873的博客 1万+

用Visual Studio C#做一个简易计算器

/定义第一个数、第二个数、结果//运算符比之前用Java做计算器简单太多了,但是这此只是个简单实验,没有考虑除零之类的其他问题。

ahcbhs的博客 3033

C#: 简易计算器

在窗体设计器中,您可以拖放按钮和文本框等控件来创建您的计算器界面。您将看到一个带有数字按钮、操作符按钮和一个文本框的计算器界面。它获取文本框中的表达式,将其传递给EvaluateExpression函数进行计算,并将结果显示在文本框中。在本文中,我将向您展示如何使用C#编写一个简单的计算器应用程序。在上面的代码中,我们定义了一个名为CalculatorForm的窗体类。在构造函数中,我们初始化窗体并绑定按钮的Click事件处理程序。在实际的应用程序中,您可能需要添加更多的功能和错误检查。

PixelProX的博客 756

C#实践(三)--------创建一个控制台应用程序的简易计算器

题目: 创建一个控制台应用程序的简易计算器, 功能: (1) 实现两个double型数的加减乘除和求余运算; (2) 允许用户反复计算,直到用户选择“退出”功能。 (3) 带异常处理。 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test1_3_js1742_29_赵国庆 { clas

qq_43556844的博客 1574

GD32H7系列SRAM优化配置实战指南

本文详细解析了GD32H7系列MCU的SRAM架构,包括ITCM、DTCM、AXI SRAM等关键内存区域的特点与性能差异。通过实战指南,指导开发者如何通过配置寄存器和链接脚本,优化内存布局以提升系统性能,并重点探讨了DMA操作与CPU缓存一致性的解决方案,帮助充分发挥GD32H7的高性能潜力。

weixin_29169899的博客 519

SYSU-SSE 3D游戏编程与设计:unity实现简易计算器

通过这个简易计算器的例子,我们展示了如何在游戏开发中实现数据和逻辑的分离。使用类似ECS或MVC的模式,可以提高游戏的可维护性和扩展性,使得开发者能够更轻松地进行功能扩展或界面优化。希望这个例子能对你的游戏开发有所启发!自制计算机哔哩哔哩bilibili。

weixin_74801088的博客 1574

手把手教你搞定国民技术N32G031的Keil开发环境(附Pack包和JLink配置)

本文详细指导如何搭建国民技术N32G031的Keil开发环境,包括Keil MDK安装与激活、Pack包导入、JLink调试器配置等关键步骤。特别针对新手常见问题提供解决方案,帮助开发者快速上手N32G031系列MCU的开发工作。

cuangu9341的博客 426

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 357

2018年暑期第六周进度总结报告

转眼暑期已经过去,所剩无几的日子里,又陷入了不舍离家和憧憬校园的状态。总是这样,在时光飞逝以后再去回想到底这段时间做了什么。 在第六周里,我艰难的完成着c#的任务,因为我确实是听说过但从来都没有学过怎么去写。在同学的帮助下我终于在哔哩哔哩找到了简易计算机的教程并且通过教程大致了解了如何去写出这样一个实用性程序。在课余时间完成了科目三的道路联系,这一个暑假也就把空闲...

weixin_30907523的博客 87

双层优化入门(1)—基本原理与求解方法(附matlab代码)

双层优化问题(Bilevel Programming Problems),也被称为双层规划,最早由Stackelberg与1934年在经济学相关研究中提出,因此也被称为Stackelberg问题。双层规划问题一般具有层次性、独立性、冲突性、优先性和自主性等特点。 本文介绍了双层优化的原理与求解方法,并提供了相应的matlab代码供参考学习。

配电网和matlab的博客 5万+

别再死记硬背了!用这3个C#变量实战小项目,轻松掌握int、string、bool

本文通过三个实战项目(简易计算器、用户登录系统和游戏状态切换器)深入讲解C#中int、string和bool变量的核心用法。从基础语法到高级技巧,帮助开发者摆脱枯燥的理论学习,在实战中掌握变量交互、类型推断和调试方法,提升编程效率和应用能力。

weixin_42683394的博客 359

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 331

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

实例2--C# 简易计算器

在开发简易计算器应用时,C#的事件处理、数据转换和异常处理是关键技术点。通过使用Windows Forms,我们能够快速设计出用户友好的图形界面,同时利用C#语言的强大功能来处理运算逻辑和用户输入。 项目开发过程中,界面设计和事件逻辑处理是两大重要任务,异常处理确保了程序的稳定性,用户输入的验证保证了系统的可靠性。完成该项目后,可以加深对C#编程、GUI设计以及运算逻辑实现的理解和应用。

weixin_40978412的博客 2199

什么是 SAPGUI 里的 Logon Group/Server

这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1069

简易计算器的设计_C#课程设计

内附源代码 C#实现简易计算器_课程设计

qq_58259102的博客 4497

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#的简单计算器

using System; /// <summary> /// Class1 的摘要说明 /// </summary> public class Class1 { public Class1() { static void Main(String args[]) { double first,second;//第一个和第二...

qq_28979869的博客 284

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# Visual studio 简易计算器

前几天老师讲的,今天才想起来完善一下。 发现Visual Studio有那么点小好用~ Visual Studio的简易用法 1.添加组件:直接将工具箱中的组件直接到框架中 2.更改名称文本等:单击组件,右下角的属性中进行更改 3.添加动作事件:双击组件,进入代码页面,输入相应代码。 简易计算器 我是根据我手机上的小米计算器制作的页面: 全部代码如下: using System; using S...

fu_GAGA的博客 4956

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java课设-百行代码实现简易计算器

Java程序设计 工程实践——简易计算器的设计院、 系 计算机与软件学院 专业 信息安全 姓 名 指导教师2022年 6 月 11 日目录: 一、 设计简介 2 1、 设计背景 2 2、 开发工具及环境 2 (1)开发工具及介绍 2 (2)开发环境 2 二、 相关工作 2 1、设计基础 2 2、功能需求 2 3、系统设计 3 三、 设计原理 3 1、包和类的说明 3 2、简易计算器的源代码清单 3 四、 实现结果 6 1、程序界面 6 2、测试用例 7 3、运行结果 7 五、 设计心得 9一、

qq_57150526的博客 1万+

C#——简易计算器的实现

使用C#完成一个简易计算器

fish_dream 868
上一篇: C# 简易计算器(二)
下一篇: 利用scrapy框架爬取互动百科的词条--存成json
headwind_
博客等级 码龄10年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值