计算器软件的代码实现 (策略模式)

一 封装时策略模式的书写

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace shuxuefudao
{
    class qita
    {

        public void qingkong()
        {
            File.WriteAllText("writer.txt", string.Empty);
            File.WriteAllText("writer1.txt", string.Empty);
            File.WriteAllText("writer2.txt", string.Empty);
        }
    }
    public interface Calculator //声明一个计算的接口
    {
        double Cal(double a,double  b);
    }
   public class Add : Calculator   //接口实现加法运算
   {
     public double Cal(double a, double b)
     {
         double result = 0;
         result = a + b;
         return result;
     }
   }
   public class Sub : Calculator //接口实现减法运算
 {
     public double Cal(double a, double b)
     {
         double result = 0;
         result = a - b;
         return result;
     }
 }
   public class Mul : Calculator  //接口实现乘法运算
 {
     public double Cal(double a, double b)
     {
         double result = 0;
         result = a * b;
        return result;
    }
 }
   public class Div : Calculator  //接口实现除法运算
 {
    public  double Cal(double a, double b)
    {
        double result = 0;
        result = a / b;
        return result;
     }
 }
 public class  Environment        //定义那个需要动态改变算法的对象
 {
     private Calculator calculate;
     public Environment(Calculator calculate)
     {
        this.calculate = calculate;
     }
     public double Cal(double a, double b, String m) //返回运算结果
     {
         return this.calculate.Cal(a, b);
    }
 }
 }
 

二 策略模式的引用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace shuxuefudao
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string path = "E:\rtf";
        public static int Count = 0; // 题目出的数量
        public static int zuode = 0; //做的题目数量
        public static int zhengque = 0;
        public static int lefttime;
        public static int time;
        public static int sum;
        int i =0;
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void open_Click(object sender, EventArgs e) //打开文件的方法
        {
            OpenFileDialog TxTOpenDialog = new OpenFileDialog();
            TxTOpenDialog.Filter = "RTF文件(*.RTF)|*.RTF";
            if (TxTOpenDialog.ShowDialog() == DialogResult.OK)
            {
                path = TxTOpenDialog.FileName;
                this.richTextBox1.LoadFile(TxTOpenDialog.FileName, RichTextBoxStreamType.RichText);
                save.Enabled = false;
                open.Enabled = false;
                MessageBox.Show("读取成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

        private void save_Click(object sender, EventArgs e) //保存文件的方法
        {
            SaveFileDialog TxtSaveDialog = new SaveFileDialog();
            TxtSaveDialog.Filter = "RTF文件(*.RTF)|*.RTF";
            if (File.Exists(path))
            {

                this.richTextBox1.LoadFile(path, RichTextBoxStreamType.RichText);
                MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                this.richTextBox1.Clear();
                save.Enabled = false;
            }
            else
            {
                if (TxtSaveDialog.ShowDialog() == DialogResult.OK)
                {

                    this.richTextBox1.SaveFile(TxtSaveDialog.FileName, RichTextBoxStreamType.RichText);
                    MessageBox.Show("保存成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    this.richTextBox1.Clear();
                    save.Enabled = false;
                }
            }
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            save.Enabled = true;
            if (this.richTextBox1.Text == "" || this.richTextBox1.Text == null)
            {
                open.Enabled = true;
            }
        }
        private void open2_Click(object sender, EventArgs e) //打开试题的方法
        {
            OpenFileDialog TxTOpenDialog = new OpenFileDialog();
            TxTOpenDialog.Filter = "RTF文件(*.RTF)|*.RTF";
            if (TxTOpenDialog.ShowDialog() == DialogResult.OK)
            {
                path = TxTOpenDialog.FileName;
                this.richTextBox2.LoadFile(TxTOpenDialog.FileName, RichTextBoxStreamType.RichText);
                save.Enabled = false;
                open.Enabled = false;
                MessageBox.Show("打开成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

        private void daoru_Click(object sender, EventArgs e) //导入试题的方法
        {
            richTextBox2.Text = richTextBox1.Text;
        }

        private void daan1_Click(object sender, EventArgs e)
        {
            if (daan1.Text == "显示答案")
            {
                daan.PasswordChar = Convert.ToChar(0);
                daan1.Text = "隐藏答案";
            }
            else if (daan1.Text == "隐藏答案")
            {
                daan.PasswordChar = ‘.‘;
                daan1.Text = "显示答案";

            }
        }

        private void kaishi_Click(object sender, EventArgs e)
        {
            string[] ll = new string[100];
            ll = File.ReadAllLines("writer.txt");
            textBox1.Text = ll[0];
            string[] lli = new string[100];
            lli = File.ReadAllLines("writer1.txt");
            textBox2.Text = lli[0];
            string[] llp = new string[100];
            llp = File.ReadAllLines("writer2.txt");
            textBox3.Text = llp[0];
            int minute;
            try
            {
                minute = int.Parse(this.shijian.Text);
            }
            catch (System.Exception ex)
            {
                this.shijian1.Text = "输入错误";
                return;
            }
            lefttime = minute;
            this.timer1.Interval = 1000;
            this.timer1.Enabled = true;
            this.timer1.Start();

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            time = Convert.ToInt32(shijian.Text);
            if (lefttime <= 0)
            {
                timer1.Enabled = false;
                MessageBox.Show("答题时间到!");
                textBox4.Enabled = false;
                Form2 frm2 = new Form2();
                frm2.ShowDialog();
            }
            this.shijian1.Text = "剩余时间" + lefttime.ToString() + "秒";
            lefttime--;
        }

        private void jieshu_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e) //请编辑下道题的事件
        {
            Count++;
            ti.Text = Count.ToString();
            StreamWriter writer = File.AppendText("writer.txt");
            writer.WriteLine(left.Text);
            writer.Close();
            StreamWriter writer1 = File.AppendText("writer1.txt");
            writer1.WriteLine(fuhao.Text);
            writer1.Close();
            StreamWriter writer2 = File.AppendText("writer2.txt");
            writer2.WriteLine(right.Text);
            writer2.Close();
            richTextBox1.Text += left.Text + fuhao.Text + right.Text + label2.Text + "" + "\n";
            left.Clear();
            fuhao.Clear();
            right.Clear();
        }
        private void textBox4_KeyDown(object sender, KeyEventArgs e)
        {

            try //异常处理机制,预防数组发生越界
            {
            Environment environment=null;
            double a = Convert.ToDouble(textBox1.Text); //为相关的变量赋值
            double b = Convert.ToDouble(textBox3.Text);
            string m = textBox2.Text;
            int result;
            switch (m)
            {
                case "+":
                    environment = new Environment(new Add()); //策略模式的引用
                    break;
                case "-":
                    environment = new Environment(new Sub());

                    break;
                case "*":
                    environment = new Environment(new Mul());

                    break;
                case "/":
                    environment = new Environment(new Div());

                    break;
                default:
                    break;
            }

            if (e.KeyCode == Keys.Enter)
            {

                if (int.TryParse(textBox4.Text, out result) == false)
                {
                    MessageBox.Show("请输入数字");
                }
                string answer = environment.Cal(a, b, m).ToString();
                daan.Text += answer + "\r\n";
                if (textBox4.Text == answer.ToString())
                {
                    MessageBox.Show("回答正确");
                    zuode++;
                    zhengque++;
                }
                else
                {
                    MessageBox.Show("回答错误");
                    zuode++;
                }
                i++;
                textBox4.Clear();
                string[] ll = new string[100];
                ll = File.ReadAllLines("writer.txt");
                textBox1.Text = ll[i];
                string[] lli = new string[100];
                lli = File.ReadAllLines("writer1.txt");
                textBox2.Text = lli[i];
                string[] llp = new string[100];
                llp = File.ReadAllLines("writer2.txt");
                textBox3.Text = llp[i];
             }
            }
            catch(Exception ex)
            {
                Form2 frm = new Form2();
                frm.ShowDialog();
            }

        }
        private void button2_Click(object sender, EventArgs e) //清空上次编辑试题的方法
        {
            qita aaa = new qita();
            aaa.qingkong();
        }
        private void button3_Click(object sender, EventArgs e) //退出程序的方法
        {
            Application.Exit();
        }
    }
}

三 界面的运行

时间: 2024-10-08 20:27:10

计算器软件的代码实现 (策略模式)的相关文章

计算器软件的代码实现 (windowform窗体+SQL+策略模式)

一 整体概述 这个计算器软件的功能和以前的功能基本上一样,只不过是数据的保存形式发生了变化,,以前用的是txt文件保存,现在更正用SQL数据库,现在更改了以前的文件保存形式,是三层架构中数据层的更换,但是仍然采用了设计模式中的策略模式,对于在wpf中实现的要求,会在今后中进一步实现的! 二 数据库代码的封装  using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy

计算器软件的代码实现 (策略模式+asp.net)

一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> ///Class1 的摘要说明 /// </summary> public interface Calculator //声明一个计算的接口 { double Cal(double a,double b); } public class Add : Calcula

《大话设计模式》ruby版代码:策略模式

需求: 商场收银软件,根据客户购买物品的单价和数量,计算费用,会有促销活动,打八折,满三百减一百之类的. 一,使用工厂模式. # -*- encoding: utf-8 -*- #现金收费抽象类 class CashSuper def accept_cash(money) end end #正常收费子类 class CashNormal < CashSuper def accept_cash(money) money end end #打折收费子类 class CashRebate < Cas

四则运算《《《代码封装 策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace sum 7 { 8 class Class1 9 { 10 public interface Calculator //声明计算接口 11 { 12 double Cal(double x, double y); 13 } 14 private double x; //定义x变量:

简易计算器(代码+封装+策略模式)

具体设计思路:1.先创建一个Windows窗体.2.添加所需控件,修改相应的属性值.3.对控件编写代码,使之实现相应的功能.4.设计出一个四则运算雏形后再根据需求完善代码.5.进行测试分析.6.对程序进行PSP耗时分析. 运行结果: 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sys

asp.net实现运算+代码封装+策略模式

设计界面: 测试界面: 代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> ///Class2 的摘要说明 /// </summary> public interface ITaxStragety { int Calcul(int a, int b); } class Class2 : ITaxStragety { public

设计模式之策略模式(Strategy)详解及代码示例

一.策略模式的定义 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户.策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理. 二.策略模式优缺点 策略模式的主要优点如下. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件转移语句. 符合开闭原则,可以在不修改原代码的情况下,灵活增加新算法. 算法使用和实现隔离分离,提高算法的保密性和

理解javascript中的策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句. 2. 策略模式提供了开放-封闭原则,使代码更容易理解和扩展. 3. 策略模式中的代码可以复用. 一:使用策略模式计算奖金: 下面的demo是我在书上看到的,但是没有关系,我们只是来理解下策略模式的使用而已,我们可以使用策略模式来计算奖金问题: 比如公司的年终奖是根据员工的工资和绩效来考核的,绩效为A的人,年终奖

JavaScript设计模式 策略模式

在现实中,我们到达一个地方,通常可以选择不同的方式,例如自行车,火车,汽车,飞机等. 在程序设计中,通常也会有这样的情况,实现一个功能有多个方案可以选择,比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法. 而这种情况,在设计模式中,称为策略模式. 策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 例子: 很多公司的年终奖是根据员工的工资基数和年底绩效情况来方法的.如S级绩效为4倍工资,A级有3倍工资,B级有两倍工资. 在不使用策略模式的情况下,