自己动手写计算器v1.0
今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们。发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进。
包括功能的增加和算法的改进。初学者难免犯错,希望大家不吝指教。
计算器V1.0:主要实现了计算器最常见的加减乘除功能,同时还有一个特殊功能,例如:我们执行完1+2后,如果点击等号,会执行加法运算输出结果。但我们如果点击的是运算符(如-),那么不仅会执行加法运算,还会将-号放置到执行结果后,表示这次执行的将会是减法运算。
代码:Operator类负责使用简单工厂模式来生成加减乘除运算。
Form窗体后台代码:
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 计算器
{
public partial class Form1 : Form
{
//简述:变量集中声明处
StringBuilder num1 = new StringBuilder();
StringBuilder num2 = new StringBuilder();
public void CheckTextbox(string num)
{
StringBuilder str = new StringBuilder();
if (this.textBox1.Text != "")
{
str.Append(this.textBox1.Text);
str.Append(num);
this.textBox1.Text = str.ToString();
}
else
{
this.textBox1.Text = num;
}
}
//简述:输入运算符。 2016-5-13 张杨
public void CheckYunSuan(string myOperator)
{
StringBuilder str = new StringBuilder();
if (this.textBox1.Text != "")
{
if (textBox1.Text.Contains("+") || textBox1.Text.Contains("-") || textBox1.Text.Contains("*") || textBox1.Text.Contains("/"))
{
ShowResult();
}
str.Append(this.textBox1.Text);
str.Append(myOperator);
this.textBox1.Text = str.ToString();
}
else
{
this.textBox1.Text = myOperator;
}
} public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button2_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button3_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button4_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button5_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button6_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button7_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button8_Click(object sender, EventArgs e)
{
CheckTextbox("");
} private void button9_Click(object sender, EventArgs e)
{
CheckTextbox("");
}
//简述:下面的为加减乘除功能。
//2016-5-13 张杨 private void button10_Click(object sender, EventArgs e)
{
CheckYunSuan("+");
} private void button11_Click(object sender, EventArgs e)
{
CheckYunSuan("-");
} private void button12_Click(object sender, EventArgs e)
{
CheckYunSuan("*");
} private void button13_Click(object sender, EventArgs e)
{
CheckYunSuan("/");
} private void button14_Click(object sender, EventArgs e)
{
this.textBox1.Text = String.Empty;
}
//简述:判断字符是否为运算符。 2016-5-13 张杨
public bool isOperator(char key)
{
if (key == '+' || key == '-' || key == '*' || key == '/')
{
return true;
}
else
{
return false;
}
}
//简述:计算结果。 2016-5-13 张杨
private void ShowResult()
{
string strText = this.textBox1.Text;
char myOperator = 'A';
int flag = ;
string result = "";
foreach (char key in strText)
{ if (isOperator(key))
{
flag = ;
myOperator = key;
continue;
}
else
{
switch (flag)
{
case : num1.Append(key); break;
case : num2.Append(key); break;
}
}
} result = OperatorFactory.GetResult(myOperator, double.Parse(num1.ToString()), double.Parse(num2.ToString()));
num1 = num1.Remove(, num1.Length);
num2 = num2.Remove(, num2.Length);
this.textBox1.Text = result;
}
private void button15_Click(object sender, EventArgs e)
{
ShowResult();
}
}
}
重点来了,Operator类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 计算器
{
//简述:加减乘除处理类,采用了简单工厂模式。 2016-5-13 张杨
class Operator
{
public virtual string GetResult(double num1, double num2)
{
return "error";
}
}
public class OperatorFactory
{
static Operator myOperator=new Operator();
public static string GetResult(char key,double num1,double num2)
{
switch (key)
{
case '+': myOperator = new plusOperator(); break;
case '-': myOperator = new jianOperator(); break;
case '*': myOperator = new chenOperator(); break;
case '/': myOperator = new chuOperator(); break;
}
return myOperator.GetResult(num1,num2);
}
}
class plusOperator : Operator
{
public override string GetResult(double num1, double num2)
{
return (num1 + num2).ToString();
}
}
class jianOperator : Operator
{
public override string GetResult(double num1, double num2)
{
return (num1 - num2).ToString();
}
}
class chenOperator : Operator
{
public override string GetResult(double num1, double num2)
{
return (num1 * num2).ToString();
}
}
class chuOperator : Operator
{
public override string GetResult(double num1, double num2)
{
if (num2 == )
{
return "除数不能为0";
}
else
{
return (num1 / num2).ToString();
}
}
}
}
运行结果:
自己动手写计算器v1.0的更多相关文章
- 自己动手写计算器v1.1
这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...
- 自己动手写计算器v1.2
1.2版本主要添加了分数.取负.开方三个功能,由于这三中运算输入单目运算,所以,新声明了一个新类 class OPeratorV1_2 至此基本完成了一个标准计算器,至于拥有更多功能的科学计算器,日后 ...
- 03-c#入门(简易存款利息计算器v1.0)
本想把练习题做了的结果放上来,不过发现附录是有答案的,就算了吧,自己做了没问题就行了哈.之前提到过,要是有朋友有想法,需要做小工具我可以帮忙实现,不过貌似大家都很忙.SO,自己学完第4章后,决定做一个 ...
- 圆柱模板价格计算器V1.0版本
因很多客户需求,就做了一个初始版本的产品圆柱模板面积和价格的计算器,界面非常简单,做工粗糙,但是功能是可以运行.后期会在界面和功能上进行升级,打算出一个微信小程序版本.这个程序仅供参考. 演示地址:h ...
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
- 【原创】自己动手写工具----XSmartNote [Beta 2.0]
一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...
- 【原创】自己动手写工具----签到器[Beta 2.0]
一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...
- C#写爬虫,版本V1.0
之前看了Sql Server中的基本数据类型,发现image这个类型还是比较特殊的. 于是乎就做了一个将图片以二进制流形式存储的程序http://www.cnblogs.com/JsonZhangAA ...
- Canvas绘制不规则图形,实现可拖动,编辑--V1.0第一篇
目前的工作在做在线的标注工具,接触canvas一年了,各种绘制,基本上图像的交互canvas都可以完成,也写了几篇关于canvas的文章,遇到的问题也写博客上了,对于canvas有问题的朋友可以去看看 ...
随机推荐
- 讓TQ2440也用上設備樹(1)
作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...
- .Net Core上也可以使用的二维码组件
我Fork了QRCoder,并且兼容了.Net Core,图形库用的是ZKWeb.System.Drawing Github: https://github.com/zkweb-framework/Q ...
- 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇
最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...
- Android的Kotlin秘方(II):RecyclerView 和 DiffUtil
作者:Antonio Leiva 时间:Sep 12, 2016 原文链接:http://antonioleiva.com/recyclerview-diffutil-kotlin/ 如你所知,在[支 ...
- 为什么 Android Studio 工程文件夹占用空间这么大?我们来给它减减肥
偶然中发现Android Studio的工程文件夹比ADT Bundle的大很多.用Android Studio新建一个空工程,工程文件夹大小为30M,运行一次后大小为40M.同样用ADT Bundl ...
- MyBatis3:SQL映射
前言 前面学习了config.xml,下面就要进入MyBatis的核心SQL映射了,第一篇文章的时候,student.xml里面是这么写的: <?xml version="1.0&qu ...
- Hadoop学习笔记—22.Hadoop2.x环境搭建与配置
自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...
- 前端工程师手中的Sublime Text
原文地址:http://css-tricks.com/sublime-text-front-end-developers/ 我的Blog:http://cabbit.me/sublime-text-f ...
- 利用AOP写2PC框架(一)
并不是很想写这个系列,因为这个2pc单独写一个小架构有点鸡肋.不过也不知道写什么了,先写了再说吧. 整个流程如下图: 关于AOP系列的文章很多,我这里也再重复造一下轮子. 首先,我们定义了一个IAop ...
- mysql sleep进程过多,应用级配置
<property name="hibernateProperties"> <props> <prop key="hibernate.dia ...