c#实现计算器

原文件和代码需要的话私聊留邮箱我看见会发给你!,做到力所能及 这里是旧版计算器
优化 改过bug的 请移步至
新版计算器

c#计算器

最初visual studio 2019
这是我的样式
–接下来是代码

变量 声明开始

 //--------------------------------------------------------------------------------
        //变量声明and变量的作用开始

		 //记录程序第一次1启动
        Boolean system_one = false;


        //判断用过小数点后,是否有输入数字如果没有输入数字就不能使用四则运算符
        Boolean dian_number;
        //ji 计算 用过多少次等于号
        int ji = 0;
        //sum 用来记录每一次的新值
        double sum = 0;

        //value 是最后的结果
        double value;


        //fh 是用来记录我们正在使用的符号
        String fh;

        //eco 用来记录 用户摁过多少次等于号, eco = 0 就是还没用过, 如果用过的话  就++
        int eco = 0;

        //temp 用来记录  一直被处理的数字
        double temp = 0.0;

        //record 用来判断使用四则运算符后,是否输入数字,输入了就是true没有就是false
        Boolean record = true;

        //number 是用来判断数字键是否使用过,number = 0 就是没用过 等于 number =1 就是使用过;
        byte number = 0;

        //符号的次数  0就按原来的样式不等0就是其他样式
        byte numberOfSymbols = 0;

        //用来装记忆的盒子
        double memory = 0.0;
        //等号执行多次的 num1 
        double num1 = 0.0;

        //记录符号中的变化之前的值
        double temp_symbols;
        //变量声明和变量使用的介绍结束
        //-------------------------------------------------------------------------------------

退格键的方法


        //退格键方法
        private void Backpace_Click(object sender, EventArgs e)
        {   //当删完了之后,就给它补个零
            if (enter.Text == "")
            {
                enter.Text = "0";
            }
            else //否则就继续删
            {
                string old = enter.Text;
                char o = old[0];
                if (old.Length == 2 && o=='-')
                {
                    enter.Text = old.Remove(0);
                    enter.Text = "0";
                }
                else {
                    enter.Text = old.Remove(old.Length - 1);
                }
            }
        }
        //-----------------------------------

数字键的方法


        //数字键入
        private void Number_Click(object sender, EventArgs e)
        {
            dian_number = true;
            if (ji == 1) {
                Empty_Click(C, null);
                ji = 0;
            }
            if (number == 0 )
            {
                
                enter.Clear();
            }
            record = true;
            int leng = enter.TextLength;
            Button num = (Button)sender;

            if (leng < 16)
            {
                if (enter.Text == "0")
                {
                    enter.Text = num.Text;
                }
                else
                {
                    enter.Text += num.Text;
                }
            }
            else
            {
                enter.Text = enter.Text;
            }

            number = 1;//用过就记录一下
        }
        //----------------------------------------------

##符号键


        //符号键入方法
        private void Symbol_Click(object sender, EventArgs e)
        {

          
            if (dian_number == true)
            {
                //刷新用户摁过的等号次数
                eco = 0;
                ji = 0;
                Button f = (Button)sender;

                fh = f.Text;
                /*
                 * 如果enter.Text  是空值的话  人enter.Text 等于 原来的值
                 */
                if (enter.Text == "")
                {
                    enter.Text = sum.ToString();
                }
                //第一次使用从这里
                if (numberOfSymbols == 0)
                {
                    CalculationSteps.Text = "";
                    //record 记录数字键是否有用过   有用过就是true  没用过就是false
                    if (record == true)
                    {
                        sum = double.Parse(enter.Text);
                        //判断CalculationSteps 的内容是不是0 如果是就直接覆盖  如果不是就加等
                        if (CalculationSteps.Text == "0" && ji != 0)
                        {
                            
                            CalculationSteps.Text = enter.Text + fh;
                        }
                        else
                        {
                            CalculationSteps.Text += enter.Text + fh;
                        }


                        value = sum;

                        //用完符号键 就需要在等待数字键的输入所以此时数字键是没用过的所以是false
                        record = false;
                    }
                    else
                    {
                        enter.Text = "0";
                    }

                    //用一次
                    numberOfSymbols = 1;

                }
                else
                {

                    if (record == true)
                    {
                        temp = double.Parse(enter.Text);
                        temp_symbols = value;
                        switch (fh)
                        {
                            case "+":
                                value += temp;

                                break;
                            case "-":
                                value -= temp;

                                break;
                            case "x":
                                value *= temp;

                                break;
                            case "÷":

                                if (enter.Text == "0")
                                {
                                    enter.Text = "除数不能为零";
                                }
                                else
                                {
                                    value /= temp;
                                }

                                break;

                        }
                        enter.Text = value.ToString();
                        /*CalculationSteps.Text = enter.Text + f.Text;*/
                        //该之后
                        CalculationSteps.Text = temp_symbols.ToString() + f.Text + temp.ToString() + "=";


                    }
                    else
                    {
                        CalculationSteps.Text = enter.Text + f.Text;
                        record = false;
                    }
                }


                number = 0;//符号键入后需要继续输入数字所以就把数字的使用记录清空后,在等待数字键入,以防出现两次符号
            }
            else {
                     //如果输入小数点后不输入数字,就不做任何操作 
            }

        }
        //-------------------------------------------------------

%求百分的符号键

  //百分比

        private void Bai_Click(object sender, EventArgs e)
        {   
            int B = 100;

            enter.Text = (double.Parse(enter.Text) / B).ToString();
        }
        //--------------------------------------------

等于号键功能实现


            //等于号
            /*
             * 处理点了等号之后的操作
             * 比如如果我们没有输入值,然后点了等号  之后的处理
             */
            private void Equal_Click(object sender, EventArgs e)
        {

       

            //读取等于号
            Button nu = (Button)sender;

            
            if (number == 0)
            {
                enter.Text = value.ToString();
            }

            //如果enter.Text  是空值的话  人enter.Text 等于 "0"
            if (enter.Text == "")
            {
                enter.Text = "0";
            }
            else//不是的话就,正常执行操作
            {
									//第一次进入系统和没用过符号
                if (numberOfSymbols == 0 & system_one == false )
                {
                  
                    value =  Convert.ToDouble(enter.Text);
                    CalculationSteps.Text = enter.Text;
                    
                }
                else
                {
                    //第一次点等号执行这个操作
                    if (eco == 0)
                    {



                        Boolean WhetherTheNumbers = double.TryParse(enter.Text, out double Now);

                      
                        if (WhetherTheNumbers == true )
                        {
                            if (fh == null)
                            {
                                CalculationSteps.Text = enter.Text;
                                numberOfSymbols = 0;
                                enter.Text = value.ToString();
                                ji = 1;
                                return;
                            }
                            CalculationSteps.Text = value.ToString() + fh.ToString() + enter.Text + nu.Text;

                            switch (fh)
                            {
                                case "+":
                                    value += Now;

                                    break;
                                case "-":
                                    value -= Now;
                                    break;
                                case "x":
                                    value *= Now;

                                    break;
                                case "÷":

                                    if (enter.Text == "0")
                                    {
                                        enter.Text = "除数不能为零";
                                        return;
                                    }
                                    else
                                    {
                                        value /= Now;
                                    }
                                    break;

                            }
                            eco++;
                            temp = Now;
                        }
                        else
                        {
                            enter.Clear();
                            CalculationSteps.Text = "0";
                            temp = 0;
                            return;
                        }
                    }//点击1~n次的等号后的操作
                    else
                    {

                        switch (fh)
                        {
                            case "+":
                                value += temp;
                                num1 = value - temp;
                                break;
                            case "-":
                                value -= temp;
                                num1 = value + temp;
                                break;
                            case "x":
                                value *= temp;
                                num1 = value / temp;
                                break;
                            case "÷":

                                if (enter.Text == "0")
                                {
                                    enter.Text = "除数不能为零";
                                }
                                else
                                {
                                    value /= temp;
                                }
                                num1 = value * temp;
                                break;

                        }

                        CalculationSteps.Text = num1.ToString() + fh.ToString() + temp + nu.Text;
                    }

                }
                
                enter.Text = value.ToString();
                ji=1;
            }

            system_one = true;
            numberOfSymbols = 0;
            
        }

enter 显示界面的一些方法

   //动态显示
        /*
         该方法的作用是控制enter.Text  
        也就是用户能够输入几个数
        超过十个数之后就缩小字体大小
         
         */
        private void Enter_TextChanged(object sender, EventArgs e)
        {
            TextBox temp = (TextBox)sender;
            int leng = temp.TextLength;
            if (leng == 10)
            {
                //设置enter 超过10位时 字体变小
                enter.Font = new Font("Microsoft YaHei UI", 22);
            }
        }

清空 C or CE 操作

        //清空操作
        private void Empty_Click(object sender, EventArgs e)
        {
            Button en = (Button)sender;

            switch (en.Text)
            {   //让一切回到最初的样式
                case "C":
                    ji = 0;
                    sum = 0;
                    eco = 0;
                    temp = 0.0;
                    number = 0;
                    value = 0.0;
                    record = true;
                    enter.Text = "0";
                    dian_number = true;
                    CalculationSteps.Text = "";
                    break;
                // 只清空enter.Text的记录
                case "CE":
                    enter.Text = "0";
                    break;

            }

        }

小数点的使用规范

   //小数点
        private void Dian_Click(object sender, EventArgs e)
        {
            //判断该字符串中是否有 "." 如果没有就可以使用 "."  如果有就不能使用
            if (enter.Text.Contains(".") == false)
            {
                enter.Text += ".";

            }
            dian_number = false;

        }

##记忆键使用


        //记忆存
        private void MS_Click(object sender, EventArgs e)
        {
            MR_label.Enabled = true;
            MC_Label.Enabled = true;
            Mv_label.Enabled = true;
            memory = double.Parse(enter.Text);

        }
        //记忆清楚
        private void MC_Click(object sender, EventArgs e)
        {
            
            memory = 0.00;
            MC_Label.Enabled = false;
            Mv_label.Enabled = false;
            MR_label.Enabled = false;
        }
        //记忆读取
        private void MR_Click(object sender, EventArgs e)
        {
            enter.Text = memory.ToString();
        }
        //记忆加
        private void MJ_Click(object sender, EventArgs e)
        {
            memory += double.Parse(enter.Text);
        }
        //记忆存
        private void Ms_Click(object sender, EventArgs e)
        {
            memory -= double.Parse(enter.Text);
        }
        //查看当前的记忆数字
        private void Mv_Click(object sender, EventArgs e)
        {
            MessageBox.Show("当前记忆数字是"+memory.ToString(),"当前记忆数字");
        }

负数的实现

  //正负号添加
        private void JiaOrJian_Click(object sender, EventArgs e)
        {
            
                string tempStr = enter.Text;
                char t = tempStr[0];
                if (enter.Text == "0")
                {
                    enter.Text = enter.Text;
                }
                else
                {
                    if (t == '-')
                    {
                        enter.Text = tempStr.Remove(0, 1);

                    }
                    else
                    {

                        enter.Text = tempStr.Insert(0, "-");

                    }

                }
            }

对应使用功能

介绍> 如果云知道是一个lable 就是我的想写的一个标签吧,好看而已

实现功能:模拟微软计算器界面,实现四则混合运算1.键盘输入(KeyUp事件)2.无焦点(按钮失去焦点)3.实现优先级运算。比如直接输入1-2*3=-5,而不是微软计算器的-34.使用操作工厂,使用接口5.实现菜单里的复制粘贴功能6.可视化文本框7.实现中间操作结果显示8.正则表达式验证输入是否为数字9.小数点个数校验10.使用发消息_Flag实现操作符状态的判定及转换部分注释预览:失去焦点: private void text_display_GotFocus(object sender, EventArgs e) { /* * 文本框的“获取焦点”事件发生时执行的方法。每次获得焦点时,就会执行此方法,使之马上失去焦点。 * * 当某控件的Enable属性变为False的时候,它的焦点将转移到TabIndex属性值比它大1的控件上。 * 这时,如果有多个控件的TabIndex属性值同时比它大1,鼠标点击按钮或敲击键盘时候会发出“咚”的一声。 * 故在本程序中,将label_m控件的TabIndex设为1,其它的全部设为0,因此所有的控件在不可用时焦点都会转移到label_m上, * 因为label_m没有Click和KeyUp事件,所以不会出错。 * 这样就实现了全局无焦点的功能。 * */ text_display.Enabled = false; //先使文本框不可用,这时焦点转移到TabIndex比文本框大的下一个控件上 text_display.Enabled = true; //再使文本框可用,这时焦点不会返回。 }KeyUp事件: else if (e.KeyCode == Keys.NumPad1 || e.KeyCode == Keys.D1) { /* 当窗体的某个控件触发了其本身的KeyUp事件之后, * 将会调用keyUp()方法,并判断是哪个按键 * 如果是大键盘或者是小键盘的1时,便调用num_Click()方法。 * 参数是no_1和e。 * 在这里的no_1指的是按钮no_1,e是KeyUp事件 * no_1是按钮,参数格式正确;而e是KeyUp事件,也是事件的一种。KeyEventHandler当然也是EventHandler的一部分。 * 所以调用了之num_Click()后一切按照no_1按钮事件的操作执行 * 所以no_1按钮的这一句 * this.no_1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.num_Click); * 可以不写 */ num_Click(no_1, e); }小数点点击的校验: private void dot_Click(object sender, EventArgs e) { if (!dotFlag) //没点击的情况下 { if (operFlag) //如果点击了运算符,就将文本换为"0.",并将小数点设为已点击 { text_display.Text = "0."; dotFlag = true; } else if (text_display.Text.Equals("0.")) //如果没有点击运算符,切当前文本是"0.",便保持现状但将小数点设为已点击 { dotFlag = true; } else if (text_display.Text.Equals("0") || text_display.Text.Equals("")) { text_display.Text = "0."; dotFlag = true; } else //其他情况直接添加并将小数点设为已点击 { text_display.Text = text_display.Text + "."; dotFlag = true; } } else //如果已点击则什么也不做 { } enterFlag = false; label_m.Focus(); //键盘按键之后焦点由下面的各个_GotFocus()方法控制;鼠标点击之后的焦点有这条语句控制,同样使焦点转移到label_m上。 }
评论 78
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ConanRitchie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值