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. 打包上传成功, itunes connect 不出现上传的版本

    由于有一次感觉build setting 里 code signing identity设置证书有点乱,有些已经用不到了,就想把那些删除 于是我找到了所有证书的那个文件夹(进入所有证书的那个文件夹), ...

  2. Java基础之常用类

    1.Collections类: (1)此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. (2)静态方法摘要: static <T> boolea ...

  3. 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult

    回到目录 对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个I ...

  4. 前端那点事儿——Tocify自动生成文档目录

    今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目录的焦点. 效果 框架 原来使用的是一个开源的jquery-ui控件——tocify.js,它可以遍历页面 ...

  5. 1121冬至!!!巩固HTML基础第一堂

    今天只是把以前的知识巩固了一下.温故而知新,说的一点没错: 又新明白了一种居中对齐方法: 水平居中:align left(左侧对齐),center(居中对齐) 垂直居中:ralign top(上对齐) ...

  6. Atitit. Atiposter 发帖机 新特性 poster new feature v11  .docx

    Atitit. Atiposter 发帖机 新特性 poster new feature v11  .docx 1.1.  版本历史1 2. 1. 未来版本规划2 2.1. V12版本规划2 2.2. ...

  7. Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞

    JS注入漏洞存在的Android版本:Android < 4.2 综述:Android的SDK中提供了一个WebView组件,用于在应用中嵌入一个浏览器来进行网页浏览.WebView组件中的ad ...

  8. How Google TestsSoftware - Part One

    This is the firstin a series of posts on this topic.The one question I get morethan any other is &qu ...

  9. C# 进制转换 (没有数值的长度限制)

    曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换 ...

  10. JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

    第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...