c#:使用面向对象的编程思想和窗体实现计算器(二目运算)


最近一直在学面向对象的编程思想,什么封装呀、继承呀、枚举呀什么的,但是不会在实例中应用,那么接下来我们就用面向对象的编程思想结合窗体来给大家做一个小小的案例——计算器,希望你们能够从这个案例体会到面向对象的好处,并且会使用这个思想。

一、使用窗体设计界面

前端这个没啥说的,就是拖拉textBox、Buttom控件,并设置文本以及大小,

1、用Button按钮主要是实现数字区域以及运算符区域,并且按下控件的事件—在textBox中显示运算结果和式子

2、用textBox控件就是主要显示数字、运算符、以及运算结果,其中上边的是显示式子,下边的是显示结果

1、窗体的加载事件:

 private void Form1_Load(object sender, EventArgs e){this.Text = "计算器";this.Opacity = 0.9;//设置窗体的不透明度this.MaximizeBox = false;//窗体最大化按钮不可用this.CenterToScreen();//设置窗体在显示器中居中显示}

2、数字区域:

//数字嘛就是0-9,然后他们都是按钮,也就是说当按下某个数字就在textBox1和textBox2中显示,为了使数字不被替换使用‘+’链接         #region 数字0-9#region 数字1private void button1_Click(object sender, EventArgs e){textBox1.Text += 1;textBox2.Text += 1;}#endregion#region 数字2private void button2_Click(object sender, EventArgs e){textBox1.Text += 2;textBox2.Text += 2;}#endregion#region 数字3private void button3_Click(object sender, EventArgs e){textBox1.Text += 3;textBox2.Text += 3;}#endregion#region 数字4private void button4_Click(object sender, EventArgs e){textBox1.Text += 4;textBox2.Text += 4;}#endregion#region 数字5private void button5_Click(object sender, EventArgs e){textBox1.Text += 5;textBox2.Text += 5;}#endregion#region 数字6private void button6_Click(object sender, EventArgs e){textBox1.Text += 6;textBox2.Text += 6;}#endregion#region 数字7private void button7_Click(object sender, EventArgs e){textBox1.Text += 7;textBox2.Text += 7;}#endregion#region 数字8private void button8_Click(object sender, EventArgs e){textBox1.Text += 8;textBox2.Text += 8;}#endregion#region 数字9private void button9_Click(object sender, EventArgs e){textBox1.Text += 9;textBox2.Text += 9;}#endregion#region 数字0private void button10_Click(object sender, EventArgs e){textBox1.Text += 0;textBox2.Text += 0;}#endregion#endregion

3、运算符区域:

​ (1)运算符就是+、-、×、÷、%嘛,但是我们先不急着链接运算符,

​ (2)存储第一个数字:当按下某个运算符的时候,先要将上次输入的数字(就是第一个数存储到Number中,这个Number是我实例化对象中封装的属性,具体的我写在了下边)

​ (3)链接运算符到第一个显示区域textBox1,然后就要将第二个显示区域textBox2中的文本清空

​ (4)**重点:**改变枚举属性中的值(这个枚举属性值我也放在下边说)

​ (5)因为属性Number是double类型的,所以要将textBox2中的文本转换为double类型

​ (6)如果说客户刚上去输入的就是运算符或等号,程序就会直接出错,所以就是使用try—cath处理异常,当出现异常我们要给可以弹出提示。

        #region 运算符:+private void button13_Click(object sender, EventArgs e){try{num.Number1 = double.Parse(textBox2.Text);//先获取第一个数textBox1.Text += "+";textBox2.Text = "";num.Ysf = Ysf.jia;//改变num对象下Ysf枚举属性的值}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#region 运算符:-private void button14_Click(object sender, EventArgs e){try{num.Number1 = double.Parse(textBox2.Text);//先获取第一个数textBox1.Text += "-";textBox2.Text = "";num.Ysf = Ysf.jian;//改变num对象下Ysf枚举属性的值}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#region 运算符:×private void button15_Click(object sender, EventArgs e){try{num.Number1 = double.Parse(textBox2.Text);//先获取第一个数textBox1.Text += "×";textBox2.Text = "";num.Ysf = Ysf.cheng;//改变num对象下Ysf枚举属性的值}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#region 运算符:÷private void button16_Click(object sender, EventArgs e){try{num.Number1 = double.Parse(textBox2.Text);//先获取第一个数textBox1.Text += "÷";textBox2.Text = "";num.Ysf = Ysf.chu;//改变num对象下Ysf枚举属性的值}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#region 运算符“%private void button17_Click(object sender, EventArgs e){try{num.Number1 = double.Parse(textBox2.Text);textBox1.Text += "%";textBox2.Text = "";num.Ysf = Ysf.yu;//改变num对象下Ysf枚举属性的值}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#endregion

4、其他区域

​ (1)就是点、‘=’以及清除CE

​ (2)点肯定是和数字使用的,当客户上去直接输入点,那肯定是不符合逻辑的,所以就要判断(如果textBox1中的文本是空的,那么就直接给用户弹出提示,否则就是正确的)

​ (3)当输入“=”的时候当然就要给出结果了,按照以往的思路,我们会在等号事件中要有计算过程,但是今天我们用了面向对象的编程思想,那么就要将这个计算的过程封装到一个类中,因为在用户输入运算符的时候我们就已经改变了Ysf枚举属性的对应值,所以在这里我们就可以直接调用运算结果Jg方法(这个方法可以直接将运算后的数字带过,转换后赋值给textBox2的文本) 当然,要在方法调用之前存储用户输入的这个数字,存储到我们封装的这个属性Number2中,并且要在textBox1中链接“=”,以显示完整的公式。这里也涉及到属性赋值,所以也要使用处理异常try—catch

​ (4)“CE”清除,这个就是清除textbox1和textBox2中文本的值

     #region 杂项:点、=、CE#region 点private void button12_Click(object sender, EventArgs e){if (string.IsNullOrWhiteSpace(textBox1.Text)){MessageBox.Show("请输入有效的数字");}else{textBox1.Text += ".";textBox2.Text += ".";}}#endregion#region 结果:=private void button18_Click(object sender, EventArgs e){try{num.Number2 = double.Parse(textBox2.Text);textBox1.Text += "=";textBox2.Text = num.Jg().ToString();}catch (Exception){MessageBox.Show("请输入有效的数字");}}#endregion#region 清除private void button11_Click(object sender, EventArgs e){textBox1.Text = "";textBox2.Text = "";}#endregion#endregion}

5、设计外观如下:

二、类的封装

​ (1)创建一个Count类,并在外部实例化,要在全局变量中

​ (2)定义两个double类型字段并封装属性来存储用户输入的两个数字

//字段
double number1;
double number2;
#region 封装的属性
public double Number1 { get => number1; set => number1 = value; }
public double Number2 { get => number2; set => number2 = value; }
#endregion

​ (3)定义枚举,来存储运算符

 #region Ysf枚举,用来存储:运算符public enum Ysf{ jia,jian,cheng,chu,yu}#endregion

​ (4)在类中定义一个Ysf类型的属性,来让外界改变属性值,改变只能改变为 jia,、jian、cheng、chu、yu五种

 /// <summary>/// 声明一个枚举属性/// </summary>public Ysf Ysf { get; set; }

​ (5)声明方法并将五种运算过程封装与其中

     public double Jia(){return Number1 + Number2;//返回结果,谁调用就返回给谁}public double Jian(){return Number1 - Number2;}public double Cheng(){return Number1 * Number2;}public double Chu(){return Number1 / Number2;}public double Yu(){return Number1 % Number2;}

​ (6)判断枚举属性的值,是否是与对应的枚举值相等,如果相等就返回对应的运算方法(实则返回的是一个运算后的数字)

public double Jg(){switch (Ysf){case Ysf.jia:return Jia();case Ysf.jian:return Jian();case Ysf.cheng:return Cheng();case Ysf.chu:return Chu();case Ysf.yu:return Yu(); ;}return 0;}

三、外部调用

1、在运算符和等号链接之前将用户输入的两次数字存储到Number1和Number2属性中

2、在+、-、×、÷、%运算符按钮链接运算符后改变枚举属性Ysf的值为对应的值(比如+对应jia)

3、在按钮事件中,就可以直接调用运算结果Jg方法,因为客户在输入运算符的时候就已经改变了枚举属性的值

调试结果如下:

正确:

异常:

四、另外一种计算器

设计外观如下:

​ 还有一种计算器,就是没有运算符、以及数字按钮,就是通过手动的输入运算结果的那种,而这种计算器的运算符通常是下拉菜单,这里也是和上边一样,通过选择对应的下拉菜单文本来改变Ysf枚举属性的值,最后也是一样,调用方法即可。

代码如下:

  private void button1_Click(object sender, EventArgs e)//等号按钮事件{#region 将文本框中的数字存储到属性中count.Number1 = textBox1.Text;count.Number2 = textBox2.Text;//因为这种计算器不是在文本框中输入运算符的,而是两个文本框只是输入数字的,所以这就特别简单,在按下等号按钮的时候就可以直接将两个数字存储到属性中#endregion#region 通过下拉菜单的文本来改变索引属性的值//这里是通过下拉文本框的索引(索引其实就对应文本值)来改变Ysf枚举属性的值,其实和上一种计算器的原理是一样的switch (comboBox1.SelectedIndex){case 0:count.Ysf= Ysf.jia;break;case 1:count.Ysf= Ysf.jian; break;case 2:count.Ysf= Ysf.cheng; break;case 3:count.Ysf= Ysf.chu; break;case 4:count.Ysf= Ysf.yu; break;}#endregionlabel1.Text = count.Jg().ToString();}}

总结:

​ 其实两种计算器的重点都是:声明枚举,并定义枚举属性,最后通过外部运算符(+、-、×、÷、%)的选择来改变枚举属性的值,然后类里边是判断枚举属性的值来调用不同运算的方法,最终外部来调用这个最后结果的方法就可以实现二目运算计算机的主要功能了。


以上均为自己在学习中总结的一个案例思想,希望能够帮助到您,如果本篇文章有什么不足之处,或者对大家造成了误导,还希望您能够指点出来,纠正我的错误,谢谢!

c#:使用面向对象的编程思想和窗体实现计算器(二目运算)相关推荐

  1. 200819C阶段一C++面向对象的编程思想

    目录 一.学习的知识点 作业 面向对象的编程思想 类与对象 类 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 四.作业的思路.不会的地方 五.其他需要反馈的问题 六.心得体会 一.学习的知识 ...

  2. 面向过程和面向对象的编程思想 复习原型 构造函数和实例对象和原型对象之间的关系

    体会面向过程和面向对象的编程思想 <!DOCTYPE html> <html lang="en"> <head><meta charset ...

  3. python完全支持面向对象编程思想_面向对象的编程思想和Python的继承和多态,特殊方法,引用计数...

    面向对象的编程思想和Python的类,访问和属性,继承 在上一文中我们了解到了,私有的属性的访问方式:实例名._类名__私有属性名. 一.私有的属性如何对外提供公有的取值和赋值方法呢?提供公有的方法作 ...

  4. python完全支持面向对象编程思想_面向对象的编程思想和Python的类,访问和属性,继承...

    本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承. 复制代码 一.访问权限: Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问 ...

  5. python 类和对象_面向对象的编程思想和Python的类,访问和属性,继承

    面向对象的编程思想和Python的类,类的方法和属性,实例方法这一文从面向对象的角度,介绍类的定义,类的属性和自定义方法. 本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和 ...

  6. 在ASP.NET中面向对象的编程思想

    首先,我们还是来谈一下面向对象的编程思想吧.我想现在的主流编程思想无非两种:结构与面向对象.以前,在ASP中我们完全采用的是结构化思想.现在,asp.net可以完全支持面向对象的编程思想,这不得不说是 ...

  7. 浅谈面向对象的编程思想:如何优雅地把大象装进冰箱?

      许多人刚学编程时,想必都听到过这样的话:"*语言是面向对象的,而***语言是面向过程的".那时的新人还懵懵懂懂,就被大牛或者书上的大牛骗去学了一种听起来很厉害的语言,然而学了半 ...

  8. 面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程

    系列文章目录 面向对象的编程思想写单片机程序--(1)学习笔记 之 程序设计 面向对象的编程思想写单片机程序--(2)学习笔记 之 怎么抽象出结构体 面向对象的编程思想写单片机程序--(3)学习笔记 ...

  9. 包的概念以及面向对象的编程思想

    上一篇:无头双向链表的实现 一. 包 1. 基本概念 包 :本质上就是用文件夹来管理java文件的.是组织类的一种方式. 包是有规范的:包的命名一般全都是小写:并且一般是倒着写的. www.baidu ...

  10. Java中面向对象的编程思想

    目录 面向对象的基本概念 面向对象的编程思想 Java类 Java对象 对象与类的关系 变量的分类 方法的分类 方法的重载 对象与引用 参数传递 this关键字 static关键字 代码块 小总结 包 ...

最新文章

  1. VBS遍历Excel工作表的方法
  2. python 把列表变为字符串_python 把列表转化为字符串
  3. 介绍一个 Windows 10 清理右键菜单和新建菜单的小工具 ContextMenuManager
  4. java安卓的xml布局,android – 将xml布局更改为java代码
  5. python单链表实现荷兰国旗问题_快速排序深入之荷兰国旗问题
  6. 数据类型即其相互转换
  7. Java switch-case语句用法
  8. WindowsXP相关设置对应的注册表位置
  9. 【scratch案例教学】Scratch弹力球小游戏 scratch编程案例教学 少儿编程教案
  10. 易车网报价和4s店相比哪个低?
  11. java计算机毕业设计物流站环境监测系统源码+系统+数据库+lw文档+mybatis+运行部署
  12. 使用Total Commander提高工作效率
  13. 抖音最火word clock屏保设置
  14. 如何保存伴奏在计算机,怎么把原唱变成伴奏 有什么方法可以把歌曲去掉原唱保留伴奏...
  15. java value是什么意思_请问java中的和=是什么意思
  16. 迷你服务器开机无显示,迷你版云服务器未启动
  17. 质量内建是规模化敏捷(规模化研发交付)的核心
  18. I love you not because of who you are
  19. 免费的ppt模板网站
  20. 会计分录(含义,书写格式,编制方法)

热门文章

  1. 【随笔】Linux刷脏页
  2. python prettytable输出对齐_漂亮的输出-----prettytable和colorama的使用
  3. 华为云服务的使用方法详解--以照片备份与恢复为例
  4. oracle+归档时间设置,oracle 归档设置
  5. Jetson TK1
  6. ios越狱python插件_人生苦短,我用Python – 越狱后如何在IOS设备上玩Python编程,2018-07-11 – 算法网...
  7. php7.0 phalcon_phalcon php7
  8. Android Q 上的Biometric生物识别
  9. XShell 下载 安装
  10. 【解决方案】macOS 打开微信视频电话其他应用音量变小问题