如何用C#开发的计算器小软件

简介:

计算器

   今天窝在床上一天,利用C#开发了个计算器软件,属于winform窗体的应用开发,大体的功能界面如图所示,简单的总结一下开发过程。

计算器的大体功能包括:一些基本运算,如加减乘除,开方和乘方,左边的四个按键的功能从上至下分别是:消除缓存,读取缓存,添加缓存,缓存的累加。

   在我想做这个小软件之前,自以为看起来貌似蛮简单,但如果实际自己动手操作,还有不少的细节值得我们思考,还遇到了不少的麻烦,经过反思,尝试及纠正调试,大概做出了个成型的小计算器。

开发过程:

首先,对软件可见话的部分做个简介,新建一个窗体,取名为Calculator。在开发环境中就会弹出一个大体的空白框架,想必绝大多数学VB的同学并不会陌生。弹出属性对话框,将Form的一个text属性改成“计算器”(及应用软件的名称),计算器三个字的左边是一个小猫咪的图片,那是ico小图标,在窗体的Icon属性可以任意设置软件的图标,由于这是一个小型应用软件,没必要让它具备放大对话框的属性,于是可以将它的MaximizeBox属性设置为False,这样窗体的放大按钮就虚化(不可用)了。上面三个词语是菜单文件,将工具箱点开,选择其中的菜单和工具栏选项,选择其中的StatusStrip,依次编辑三个导航,及“编辑”,“查看”和“帮助”字母下面的下划线是在text属性中多加上一个&即可。下面是一个长条TextBox,作为计算器上面的显示屏,在下面的左上角是一个Label,用于缓存临时数据,其他的都是一些Button按钮。将这些按钮控件分别取一些特定的名字,以便后台调用和开发。按钮上面有两种颜色的文字,蓝色和红色,将Button控件的ForeColor属性做适当的修改即可更改文字的颜色了。

其次,进入后台代码段。首先,想好自己的大体的框架,一个算法有两个变量,我们定义两个double变量为ValueF和ValueL,起初都设置为null,然后集中算法,如加减乘除,开方乘方等,我们定义一个枚举类型为 public enum CalcuType,里面的成员包括 None, Addition(加), Substraction(减), Multiplication(乘), Division(除), Involution(乘方), Square(开方)。

  0到9这十个数字键,代码都很类似,唯一不同的区别就是,上面的数字不一样,如果一般的程序员或许就会做好一个数字键的代码,然后分别复制一下,将其复制十遍,考虑到代码的优化,这样很不好,代码量看起来又多,如果其中一个代码打多了话,就要修改十处,很麻烦,这里我们可以用一个集中事件处理的技巧来办。

private voidbtnVal_Click(object sender, EventArgs e)

        {

            Button btn=(Button)sender;

            string numberStr = this.txtValue.Text;

            if (this._IsNew)

            {

                numberStr = btn.Text;

                this._ValueL = double.Parse(numberStr);

            }

            else

            {

                if (new string[] { "0","-0", "0.", "-0." }.Contains(numberStr))

                {

                    numberStr = "";

                }

                numberStr += btn.Text;

                this._ValueF = double.Parse(numberStr);

}

}

这一段代码是十个数字键的共同代码部分,但是用集中事件处理技巧,要在窗体首次加载的时候触发它们的Click事件

private voidForm1_Load(object sender, EventArgs e)

        {

            this.txtValue.Text = "0";

            btnVal0.Click += new EventHandler(btnVal_Click);

            btnVal1.Click += new EventHandler(btnVal_Click);

            btnVal2.Click += new EventHandler(btnVal_Click);

            btnVal3.Click += new EventHandler(btnVal_Click);

            btnVal4.Click += new EventHandler(btnVal_Click);

            btnVal5.Click += new EventHandler(btnVal_Click);

            btnVal6.Click += new EventHandler(btnVal_Click);

            btnVal7.Click += new EventHandler(btnVal_Click);

            btnVal8.Click += new EventHandler(btnVal_Click);

            btnVal9.Click += new EventHandler(btnVal_Click);

        }

 以这样短短的十几行代码取代了,上百行的代码,既增加的效率,又方便程序员的查错。

接下来,对各个不同的功能进行解述,各个逻辑符号的功能代码:

  等于号功能:private voidbtnResult_Click(object sender, EventArgs e)

        {

            switch (CalculateType)

            {

                case CalcuType.Addition:

                    this.txtValue.Text =(_ValueF + _ValueL).ToString();                  

                    break;

                case CalcuType.Substraction:

                    this.txtValue.Text =(_ValueF - _ValueL).ToString();                   

                    break;

                case CalcuType.Multiplication:

                    this.txtValue.Text =(_ValueF * _ValueL).ToString();                

                    break;

                case CalcuType.Division:

                    if (_ValueL != 0)

                    {

                        this.txtValue.Text =(_ValueF / _ValueL).ToString();

                    }

                    else

                    {

                        this.txtValue.Text = "语法错误,除数不能为0!";

                    }

                    break;

                case CalcuType.Involution:  //乘方

                    this.txtValue.Text = Math.Pow((double)_ValueF,(double)_ValueL).ToString();

                    break;

                case CalcuType.Square:      //开方

                    this.txtValue.Text = Math.Pow((double)_ValueF,1 / (double)_ValueL).ToString();

                    break;

            }

            this._ValueF = double.Parse(this.txtValue.Text);

        }

  加法功能:privatevoid btnAddition_Click(object sender, EventArgs e)

        {

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Addition;

            _IsNew = true;

        }

减法功能:private voidbtnSubstraction_Click(object sender, EventArgs e)

        {

            this.btnResult_Click(sender, e);

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Substraction;

            _IsNew = true;

        }

乘法功能:private voidbtnMultiplication_Click(object sender, EventArgs e)

        {

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Multiplication;

            _IsNew = true;

        }

除法功能:private voidbtnDivision_Click(object sender, EventArgs e)

        {

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Division;

            _IsNew = true;

        }

开方功能:private voidbtnSquare_Click(object sender, EventArgs e)

        {

 

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Square;

            _IsNew = true;

        }

乘方功能:private voidbtnInvolution_Click(object sender, EventArgs e)

        {

            this.btnResult_Click(sender, e);

            this.CalculateType = CalcuType.Involution;

            _IsNew = true;

        }

退格功能:private voidbtnBackspace_Click(object sender, EventArgs e)

        {

            if (txtValue.Text.Length>0)

            {

                this.txtValue.Text = txtValue.Text.Substring(0,txtValue.Text.Length - 1);

            }

        }

归零功能:private voidbtnClears_Click(object sender, EventArgs e)

        {

            this.txtValue.Text = "0";

            this._ValueF = null;

            this._ValueL = null;

            this.CalculateType = CalcuType.None;

          

        }

以上是一些简单的逻辑功能,还有别的缓存功能就不再详写了。虽然一天敲代码比较单调,但看出自己做出个东西出来还是蛮开心的。

这个计算器做的还不完善,还会有一些Bug,有待继续完善!



















本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366819,如需转载请自行联系原作者


相关文章
|
8天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
41 12
|
2月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
118 51
|
2月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
57 1
|
2月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
67 2
|
2月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
51 1
|
2月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
45 1
|
3月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
150 0
|
3月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
137 0