自己动手写计算器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有问题的朋友可以去看看 ...
随机推荐
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- Oracle数据库该如何着手优化一个SQL
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...
- 在centos7上安装ClamAV杀毒,并杀毒(centos随机英文10字母)成功
前言 上传文件的时候发现总是失败,查看top发现有个进程一直cpu占用80%以上,而且名称还是随机数.kill之后,一会儿又重新生成了.突然发现居然没有在服务端杀毒的经历.在此处补齐. 安装clama ...
- asp.net mvc 验证码
效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...
- interpreter(解释器模式)
一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...
- React Native 之 Text的使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- SQL Server常见问题介绍及快速解决建议
前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...
- 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释
目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...
- .NET中使用Redis (二)
很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和 ...