自己动手写计算器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("1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            CheckTextbox("2");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            CheckTextbox("3");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            CheckTextbox("4");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            CheckTextbox("5");
        }

        private void button6_Click(object sender, EventArgs e)
        {
            CheckTextbox("6");
        }

        private void button7_Click(object sender, EventArgs e)
        {
            CheckTextbox("7");
        }

        private void button8_Click(object sender, EventArgs e)
        {
            CheckTextbox("8");
        }

        private void button9_Click(object sender, EventArgs e)
        {
            CheckTextbox("9");
        }
        //简述:下面的为加减乘除功能。
        //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 = 0;
            string result = "";
            foreach (char key in strText)
            {

                if (isOperator(key))
                {
                    flag = 1;
                    myOperator = key;
                    continue;
                }
                else
                {
                    switch (flag)
                    {
                        case 0: num1.Append(key); break;
                        case 1: num2.Append(key); break;
                    }
                }
            }

            result = OperatorFactory.GetResult(myOperator, double.Parse(num1.ToString()), double.Parse(num2.ToString()));
            num1 = num1.Remove(0, num1.Length);
            num2 = num2.Remove(0, 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 == 0)
            {
                return "除数不能为0";
            }
            else
            {
                return (num1 / num2).ToString();
            }
        }
    }
}

运行结果:

时间: 2024-10-29 11:57:49

自己动手写计算器v1.0的相关文章

自己动手写计算器v1.2

1.2版本主要添加了分数.取负.开方三个功能,由于这三中运算输入单目运算,所以,新声明了一个新类 class OPeratorV1_2 至此基本完成了一个标准计算器,至于拥有更多功能的科学计算器,日后再做开发,暂定版本2.0 代码如下: 自己写的操作类,负责各种运算,由于是利用了工厂模式,以后新增功能会很方便,特别是今天添加上面的三个功能时,深深体会到了模式的好处. using System; using System.Collections.Generic; using System.Linq

自己动手写计算器v1.1

这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与此同时,我们新建运算符工厂类,继承这些借口, 重写里面的getResult()方法,获取对应的运算对象. 这样做的好处在于,满足了“少修改,多扩充”的原则.缺点是:要将逻辑代码写在客户端,这样很难维护,以后会做改进. 代码如下: using System; using System.Collecti

JAVA学习之简单计算器——V1.0

今天简单的尝试了下java编程,写了一个简短的只包含+,-,*,/,的计算器.今天,对该计算器进行一个简单的总结. 首先计算器分为输入,计算,输出3个环节,首先来介绍下输入环节. 输入: 我们需要从键盘上敲击2个需要计算的数字,以及一个运算的运算符.暂时将计算的数字定为整型int.在这里我用的输入类是Scanner类(据了解这个类比BufferedReader更好).通过Scanner类创建一个对象sc.然后通过调用该对象的方法sc.nextInt()输入整型数据,sc.next()输入字符串数

C#写爬虫,版本V1.0

之前看了Sql Server中的基本数据类型,发现image这个类型还是比较特殊的. 于是乎就做了一个将图片以二进制流形式存储的程序http://www.cnblogs.com/JsonZhangAA/p/5568575.html,现在如果我想批量ed存储网上一个网站的图片,难道我要手写n多地址吗?显然这是不可取的,针对这种情况,就用C#写了一个简单的爬虫,我们所爬的对象是天文网http://www.tianwenwang.cn/ 程序的原理是利用WebRequest和WebResponse来相

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

一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了宝贵的意见.最后决定吸收园友的建议把这个工具重构一下.首先给它换了个名 称,XSmartNote.因为各种自身的原因,并没有完成这个工具的基本功能,只是实现了基本的框架.最近有点时间就搞了一下,权当做打下基础.本来想用B/S结构来重新搞一下,毕竟园子里有很多大牛都是专注于ASP.NET MVC,但仔

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

用js 写计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv = "content-type" content="text/html;charset=utf-8"/> &

heatmap.js v1.0 到 v2.0,详细总结一下:)

前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这里: http://www.oschina.net/p/heatmap-js 目前,对于热力图的开发,百度.高德开发平台上使用的都是这款JS开源库.当然,现在还有我们公司:P 百度示例:http://developer.baidu.com/map/jsdemo.htm#c1_15 高德示例:http

《自己动手写框架8》:高屋建瓴,理念先行

<史记·高祖本纪>:"地势便利,其以下兵于诸侯,譬犹居高屋之上建瓴水也."这里用到了高屋建瓴这个词.意思是把瓶子里的水从高层顶上倾倒.比喻居高临下,不可阻遏的形势.现指对事物把握全面,了解透彻.此典故于汉高祖刘邦欲杀功臣韩信,大夫田肯进言到"陛下牢牢地控制着三秦(关中),陛下利用这雄险的地势,来控制.驾御诸侯,就如从高高的屋脊上把水从瓶子里倒下去."以此来表彰韩信的功劳,于是,刘邦赦免了韩信,只是将他降为淮阴侯. 同样,设计企业框架,也要对事物把握全面,