您的位置:首页 > 编程语言 > C#

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

2012-02-26 20:15 190 查看


今天窝在床上一天,利用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,有待继续完善!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息