6. 簡易計算器

using System.Diagnostics.CodeAnalysis;

namespace Q6
{
    public partial class Form1 : Form
    {

        List<string> ops = new List<string>();

        void add(char k)
        {
            if (Char.IsDigit(k))
            {
                if (ops.Count == 0 || !Char.IsDigit(ops.Last()[0]))
                {
                    ops.Add("");
                }
                ops[ops.Count - 1] += k;
                label1.Text = ops.Last();
            }
            else
            {
                if (!Char.IsDigit(ops.Last()[0])) ops.RemoveAt(ops.Count - 1);
                ops.Add(k.ToString());
            }
        }

        public Form1()
        {
            InitializeComponent();
            var size = 60;

            for (int i = 0; i < 9; i++)
            {
                int x = i % 3;
                int y = i / 3;

                Button btn = new Button();
                btn.Left = 10 + size * x;
                btn.Top = 50 + size * (2 - y);
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "" + (i + 1);
                var ic = i + 1;
                btn.Click += (s, c) =>
                {
                    add(ic.ToString()[0]);
                };
                Controls.Add(btn);
            }

            {
                Button btn = new Button();
                btn.Left = 10 + size * 0;
                btn.Top = 50 + size * 3;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "" + "+/-";
                btn.Click += (s, c) =>
                {
                    var last = ops.Last();
                    ops[ops.Count - 1] =
last.StartsWith("-") ? last[1..] :
                    ("-" + last);
                    label1.Text = ops.Last();
                };
                Controls.Add(btn);

                btn = new Button();
                btn.Left = 10 + size * 1;
                btn.Top = 50 + size * 3;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "" + (0);
                btn.Click += (s, c) =>
                {
                    add('0');
                };
                Controls.Add(btn);

                btn = new Button();
                btn.Left = 10 + size * 2;
                btn.Top = 50 + size * 3;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "" + ".";
                btn.Click += (c, s) =>
                {
                    add('.');
                };
                Controls.Add(btn);
            }


            {
                Button btn = new Button();
                btn.Left = 10 + size * 4;
                btn.Top = 50 + size * 0;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "Log";
                btn.Click += (s, c) =>
                {
                    label1.Text = Math.Log10(int.Parse(label1.Text)).ToString();
                };
                Controls.Add(btn);

                btn = new Button();
                btn.Left = 10 + size * 5;
                btn.Top = 50 + size * 0;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "AC";
                btn.Click += (s, c) =>
                {
                    ops.Clear();
                    label1.Text = "";
                };
                Controls.Add(btn);
            }

            {
                Button btn = new Button();
                btn.Left = 10 + size * 4;
                btn.Top = 50 + size * 1;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "+";
                btn.Click += (s, c) =>
                {
                    add('+');
                };
                Controls.Add(btn);

                btn = new Button();
                btn.Left = 10 + size * 5;
                btn.Top = 50 + size * 1;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "×";
                btn.Click += (s, c) =>
                {
                    add('x');
                };
                Controls.Add(btn);
            }

            {
                Button btn = new Button();
                btn.Left = 10 + size * 4;
                btn.Top = 50 + size * 2;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "-";
                btn.Click += (s, c) =>
                {
                    add('-');
                };
                Controls.Add(btn);

                btn = new Button();
                btn.Left = 10 + size * 5;
                btn.Top = 50 + size * 2;
                btn.Width = size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "/";
                btn.Click += (s, c) =>
                {
                    add('/');
                };
                Controls.Add(btn);
            }

            {
                Button btn = new Button();
                btn.Left = 10 + size * 4;
                btn.Top = 50 + size * 3;
                btn.Width = 2 * size;
                btn.Height = size;
                btn.BackColor = Color.White;
                btn.Text = "=";
                btn.Click += (s, c) =>
                {
                    var a = double.Parse(ops.First());
                    var b = double.Parse(ops[2]);
                    switch (ops[1])
                    {
                        case "+":
                            label1.Text = (a + b).ToString();
                            break;
                        case "-":
                            label1.Text = (a - b).ToString();
                            break;
                        case "x":
                            label1.Text = (a * b).ToString();
                            break;
                        case "/":
                            label1.Text = (a / b).ToString();
                            break;
                    }
                    ops.Clear();
                    ops.Add(label1.Text);
                };
                Controls.Add(btn);
            }
        }
    }
}

Last updated