C#窗体实现的仿WIN10标准计算器

上周C#的第一节winform课结束后老师布置了一个计算器的作业。由于之前学过C++所以语法方面都没什么问题,只是以前的代码练习都不怎么多,所以也想趁着这次学习语言的机会多练习。这是我的第一篇博客,若有什么不当之处,请多指教。

我做的这个计算器是模仿的win10,大部分功能都实现了。比如连续按操作符(单目、双目)可以一直计算下去,不是只能简单的1+1之后必须按=出结果。进行完一次运算后(双目的按=算完成,单目按操作符就算完成),可以不需要按C,直接点击任意一个数字按钮或者小数点算重来。

有一些我发现了的功能没实现,比如win10计算器=之后再按=可以继续之前的运算。还有复合运算+=、-=这些。因为我把+、-、*、/和=统一处理了,所以连续按这几个运算符就认为是按错了重新选择。

界面就只改了下背景颜色,不怎么精致。如图。

C#窗体实现的仿WIN10标准计算器_第1张图片

主要思路是按下一个算术运算符之后实际上是先进行上一次的运算,然后将指针指向当前运算符。所以初始运算为+,初始总和为0,这样当初始的时候输入第一个操作数之后再按一个算术运算符实际上是进行了一次“0+第一个操作数”的运算所以屏幕没变。

后台代码如下:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        enum Operator2 { Plus, Subtract, Multiply, Divide }
        //enum Operator1{Radical, Square, Reverse }
        int op2 = 0;//双目运算符指针
        double sum = 0;//总和
        bool pressedBI = false, pressedU = false;//按过双目、单目运算符
        bool again = false;
        public Form1()
        {
            InitializeComponent();
        }
        void CalculateBI(double second)
        {
            switch (op2)
            {
                case 0:
                    sum += second; break;
                case 1:
                    sum -= second; break;
                case 2:
                    sum *= second; break;
                case 3:
                    sum /= second; break;
            }
        }

        private void number_Click(object sender, EventArgs e)//数字点击事件
        {
            if (pressedBI || pressedU)
            {
                if (again) { sum = 0; op2 = 0; again = false; }
                textBox1.Text = "0";
                pressedBI = pressedU = false;
            }
            Button b = (Button)sender;
            if (textBox1.Text != "0")
            {
                if (textBox1.Text.Length < textBox1.MaxLength)
                    textBox1.Text += b.Text;
            }
            else  textBox1.Text = b.Text;
        }

        private void Uoperator_Click(object sender, EventArgs e)//单目运算符点击事件
        {
            pressedU = true;
            double Uresult = 0, num = Convert.ToDouble(textBox1.Text);
            Button b = (Button)sender;
            switch (b.Text)
            {
                case "√":
                    Uresult = Math.Sqrt(num); break;
                case "x²":
                    Uresult = num * num; break;
                case "¹/x":
                    Uresult = 1 / num; break;
            }
            textBox1.Text = Convert.ToString(Uresult);
            if (pressedBI)
            {
                sum = Uresult; again = true;
            }
        }

        private void BIoperator_Click(object sender, EventArgs e)//双目运算符、=点击事件
        {
            if (again) again = false;
            if (!pressedBI)
            {
                CalculateBI(Convert.ToDouble(textBox1.Text));
                textBox1.Text = Convert.ToString(sum);
            }
            Button b = (Button)sender;
            switch (b.Text)
            {
                case "+":
                    op2 = (int)Operator2.Plus; break;
                case "-":
                    op2 = (int)Operator2.Subtract; break;
                case "×":
                    op2 = (int)Operator2.Multiply; break;
                case "÷":
                    op2 = (int)Operator2.Divide; break;
                case "=":
                    again = true; break;
            }
            pressedBI = true;
        }

        private void button11_Click(object sender, EventArgs e)//小数点
        {
            if (pressedBI || pressedU)
            {
                if (again) { sum = 0; op2 = 0; again = false; }
                textBox1.Text = "0.";
                pressedBI = pressedU = false;
            }
            int a = textBox1.Text.IndexOf('.');
            if (a == -1)
            {
                if (textBox1.Text.Length < textBox1.MaxLength)
                    textBox1.Text += '.';
            }
        }

        private void backspace_Click(object sender, EventArgs e)
        {
            if (!pressedBI && !pressedU)
            {
                string s = textBox1.Text;
                if (s.Count() > 1)
                    textBox1.Text = s.Remove(s.Count() - 1, 1);
                else textBox1.Text = "0";
            }
        }

        private void C_Click(object sender, EventArgs e)
        {
            sum = 0;
            op2 = 0;
            textBox1.Text = "0";
        }

        private void CE_Click(object sender, EventArgs e)
        {
            if (again) { sum = 0; op2 = 0; }
            textBox1.Text = "0";
        }
    }
}
C#新手,有什么不对的地方,欢迎指正。

你可能感兴趣的:(C#窗体实现的仿WIN10标准计算器)