1.2版本主要添加了分数、取负、开方三个功能,由于这三中运算输入单目运算,所以,新声明了一个新类

  class OPeratorV1_2

至此基本完成了一个标准计算器,至于拥有更多功能的科学计算器,日后再做开发,暂定版本2.0

代码如下:

自己写的操作类,负责各种运算,由于是利用了工厂模式,以后新增功能会很方便,特别是今天添加上面的三个功能时,深深体会到了模式的好处。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 计算器
{
//简述:用工厂模式取代了简单工厂模式,对比与简单工厂模式,工厂模式,将简单工厂类中的逻辑判断利用接口分离了开来。
interface Result
{
OperatorV1_1 getOperatorV1_1();
}
class plusOperatorV1_1Factory:Result
{
public OperatorV1_1 getOperatorV1_1()
{
return new plusOperatorV1_1();
}
}
class jianOperatorV1_1Factory:Result
{
public OperatorV1_1 getOperatorV1_1()
{
return new jianOperatorV1_1();
}
}
class chenOperatorV1_1Factory:Result
{
public OperatorV1_1 getOperatorV1_1()
{
return new chenOperatorV1_1();
}
}
class chuOperatorV1_1Factory:Result
{
public OperatorV1_1 getOperatorV1_1()
{
return new chenOperatorV1_1();
}
}
class OperatorV1_1
{
public virtual string GetResult(double num1, double num2)
{
return "error";
}
}
//负责开方、分数、取负
class OPeratorV1_2
{
public virtual string GetResult(double num)
{
return "error";
}
}
//开方
class kaiFangOperatorV1_2:OPeratorV1_2
{
public override string GetResult(double num)
{
num = Math.Sqrt(num);
return num.ToString();
}
}
//分数
class fenShuOperatorV1_2 : OPeratorV1_2
{
public override string GetResult(double num)
{
num = / num;
return num.ToString();
}
}
//取负
class quFuOperatorV1_2:OPeratorV1_2
{
public override string GetResult(double num)
{
num = -num;
return num.ToString();
}
}
class plusOperatorV1_1 : OperatorV1_1
{
public override string GetResult(double num1, double num2)
{
return (num1 + num2).ToString();
}
}
class jianOperatorV1_1 : OperatorV1_1
{
public override string GetResult(double num1, double num2)
{
return (num1 - num2).ToString();
}
}
class chenOperatorV1_1 : OperatorV1_1
{
public override string GetResult(double num1, double num2)
{
return (num1 * num2).ToString();
}
}
class chuOperatorV1_1 : OperatorV1_1
{
public override string GetResult(double num1, double num2)
{
if (num2 == )
{
return "除数不能为0";
}
else
{
return (num1 / num2).ToString();
}
}
}
}

后台控件代码:

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 class Check
//{
// 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;
// }
// }
// public void CheckYunSuan(string myOperator)
// {
// StringBuilder str = new StringBuilder();
// if (this.textBox1.Text != "")
// {
// str.Append(this.textBox1.Text);
// str.Append(myOperator);
// this.textBox1.Text = str.ToString();
// }
// else
// {
// this.textBox1.Text = myOperator;
// }
// }
//}
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 != "" && this.textBox1.Text != "非数字" && 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();
string sText = this.textBox1.Text;
if (this.textBox1.Text != "")
{
string s = this.textBox1.Text;
if (textBox1.Text.Contains("+") || s[] != '-' && textBox1.Text.Contains("-") || textBox1.Text.Contains("*") || textBox1.Text.Contains("/"))
{
ShowResult();
}
else if (myOperator == "Q" || myOperator == "F" || myOperator == "K")
{
ShowResult(myOperator);
}
str.Append(this.textBox1.Text);
//后面的两个判断主要是因为如果出现错误的话,就要避免此种情况下在错误信息上添加运算符的情况。
if (myOperator != "Q" && myOperator != "F" && myOperator != "K"&&!this.textBox1.Text.Contains("参数错误")&&!this.textBox1.Text.Contains("非数字"))
{
str.Append(myOperator);
}
if(sText==str.ToString())//判定是否执行过相关运算
{
this.textBox1.Text = "参数错误";
}
else
{
this.textBox1.Text = str.ToString();
} }
else
{
this.textBox1.Text = myOperator;
}
} public Form1()
{
InitializeComponent();
}
//简述:判断是否是计算完毕后的再次点击。 2016-5-13 张杨
//修改:废除。 2016-5-13 张杨
//private void textboxIsNull()
//{
// if (this.textBox1.Text.Contains("结果为"))
// {
// this.textBox1.Text = "";
// }
//}
#region 数字类
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("");
}
#endregion
#region 加减乘除运算
//简述:下面的为加减乘除功能。
//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("/");
}
#endregion
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 Operator = "")
{
string strText = this.textBox1.Text;
char myOperator = 'A';
if (Operator != "")
{
myOperator = Operator[];
}
int flag = ;
string result = "";
OperatorV1_1 newResult = new OperatorV1_1();
//取负、分数、开方的运算对象
OPeratorV1_2 newResult2 = new OPeratorV1_2();
if (strText[] == '-')//针对为多位负数开方的情况。
{
num1.Append('-');
}
foreach (char key in strText)
{
if (strText[] == key && key == '-')
{
continue;
}
if (isOperator(key))
{
flag = ;
myOperator = key;
continue;
}
else
{ switch (flag)
{
case : num1.Append(key); break;
case : num2.Append(key); break;
}
}
}
switch (myOperator)
{
case '+': newResult = new plusOperatorV1_1(); break;
case '-': newResult = new jianOperatorV1_1(); break;
case '*': newResult = new chenOperatorV1_1(); break;
case '/': newResult = new chuOperatorV1_1(); break;
case 'Q': newResult2 = new quFuOperatorV1_2(); break;
case 'K': newResult2 = new kaiFangOperatorV1_2(); break;
case 'F': newResult2 = new fenShuOperatorV1_2(); break;
}
if (myOperator == 'Q' || myOperator == 'K' || myOperator == 'F')
{
if (num1.ToString() != null)
{
result = newResult2.GetResult(double.Parse(num1.ToString()));
}
else
{
result = "参数错误";
}
}
else
{
string s1 = num1.ToString();
string s2 = num2.ToString();
if (s1.Length>&& s2.Length>)
{
if (!isOperator(s1[]) && !isOperator(s2[]))
result = newResult.GetResult(double.Parse(num1.ToString()), double.Parse(num2.ToString()));
}
else
{
result = "参数错误";
} }
//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();
}
#region 取负,分数,开方
//开方
private void button16_Click(object sender, EventArgs e)
{
string s = this.textBox1.Text;
if (textBox1.Text.Contains("+") || s[] != '-' && textBox1.Text.Contains("-") || textBox1.Text.Contains("*") || textBox1.Text.Contains("/"))
{
ShowResult();
}
CheckYunSuan("K");
}
//分数
private void button17_Click(object sender, EventArgs e)
{
string s = this.textBox1.Text;
if (textBox1.Text.Contains("+") || s[] != '-' && textBox1.Text.Contains("-") || textBox1.Text.Contains("*") || textBox1.Text.Contains("/"))
{
ShowResult();
}
CheckYunSuan("F");
}
//取负
private void button18_Click(object sender, EventArgs e)
{
string s = this.textBox1.Text;
if (textBox1.Text.Contains("+") || s[] != '-' && textBox1.Text.Contains("-") || textBox1.Text.Contains("*") || textBox1.Text.Contains("/"))
{
ShowResult();
}
CheckYunSuan("Q");
}
#endregion
}
}

控件设计形式:

自己动手写计算器v1.2的更多相关文章

  1. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  2. 自己动手写计算器v1.1

    这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...

  3. 动手写一个简单版的谷歌TPU-矩阵乘法和卷积

    谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU.计划实现到行为 ...

  4. 动手写一个简单版的谷歌TPU-指令集

    系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...

  5. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  6. 【原创】自己动手写工具----XSmartNote [Beta 3.0]

    一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...

  7. 【原创】自己动手写工具----XSmartNote [Beta 2.0]

    一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...

  8. 【原创】自己动手写工具----签到器[Beta 2.0]

    一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...

  9. 自己动手写ORM的感受

    之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...

随机推荐

  1. [ACM_贪心] Radar Installation

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/A 题目大意:X轴为海岸线可放雷达监测目标点,告诉n个目标点和雷 ...

  2. 微软承诺将在今年的 Visual C++ 更新中加入 Clang 编译器

    微软最近发布将在2015年11月 Visual C++ 更新中加入 Clang 编译器 ,Clang 开源编译器以相比GCC更快的编译速度和更优的错误提示著称. Clang关于C,C++,及Objec ...

  3. node.js1

    node的helloworld是非常的简单. 下载node绿色安装包即可.转至node.exe所在目录——写一个hw.js,然后cmd下执行node hw.js——返回相应结果.. http://ww ...

  4. Dubbo的使用及原理浅析.

    前面几个博文中关于SSM 框架已经搭建完成, 这里来讲下项目中使用到的Dubbo以及自己了解到的关于Dubbo的一些知识. Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天 ...

  5. 据说,每一个 iOSer 都想要一张 Swift 大会门票

    据说,每一个 iOSer 都想要一张中国首届 Swift 开发者大会的门票: 那么,福利来了-- fir.im 作为中国首届 Swift 大会的唯一钻石赞助商,有最后 2 张价值 600 多的门票(已 ...

  6. 动手搭个wordpress

    看到很多人都是自己搭建博客服务器,然后一切都在自己的掌控之下,这样就不存在什么迁移,数据安全之类的问题,当然需要自己搞个空间了,不过现在都便宜的不行,$15/year,也是醉了.我不怎么写博客,但是个 ...

  7. 插入排序java代码

    /** * 插入排序 * * 原理:从数组中取出一个值插入到一个左边已经排好序的数组片段中 * * @param a * @return */ public long[] InsertSort(lon ...

  8. 【Discuz】-QQ互联登陆提示错误信息:Unknown column 'conuintoken' in 'field list'

    提示信息 discuz! Database Error(1054) Unknown column 'conuintoken' in 'field list'REPLACE INTO common_co ...

  9. 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)

    /* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...

  10. Ubuntu下安装配置JDK1.7

    1.下载JDK 对于下载方法,可以使用命令,也可以手动下载.本人采用手动下载jdk的方式. 下载jdk-7u7-linux-i586.tar.gz到Ubuntu桌面. 2. 将下载的文件移动到这个文件 ...