自己动手写计算器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有问题的朋友可以去看看 ...
随机推荐
- 奇葩问题-TextView无法获取值
问题场景 前几天写一个界面的时候,遇到一个非常奇葩的问题.app第一次安装的时候,这里针对用户第一次安装的时候,后来是不会出现这个问题了.我明明是对某个界面的一个textview赋值了,而且服务端也返 ...
- iOS架构一个中型普通App的一些经验总结
这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...
- fir.im Weekly - 关于 iOS10 适配、开发、推送的一切
"小程序"来了,微信变成名副其实的 Web OS,新一轮的Web App 与Native App争论四起.程序员对新技术永远保持灵敏的嗅觉和旺盛的好奇心,@李锦发整理了微信小程序资 ...
- background例子
- 中文 iOS/Mac 开发博客列表
中文 iOS/Mac 开发博客列表 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 一只魔法师的工坊 http://blog.ibireme.com ...
- Android 添加ActionBar Buttons
一.在res/menu文件夹下创建Xml文件 跟标签为menu,设置item <?xml version="1.0" encoding="utf-8"?& ...
- Linux设备管理(二)_从cdev_add说起
我在Linux字符设备驱动框架一文中已经简单的介绍了字符设备驱动的基本的编程框架,这里我们来探讨一下Linux内核(以4.8.5内核为例)是怎么管理字符设备的,即当我们获得了设备号,分配了cdev结构 ...
- 【已解决】Https请求——基础连接已经关闭 发送时发生错误
本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...
- ENode框架单台机器在处理Command时的设计思路
设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...
- Hadoop1 Centos伪分布式部署
前言: 毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...