zoukankan      html  css  js  c++  java
  • 练习——制作计算器

    自制一个计算器,实现计算器的基本功能,按顺序依次计算,可进行拓展练习添加其他内容,尽可能完善

    思路:1、界面布局 2、数字键功能 3、运算符功能 4、清屏键、退格键、小数点等功能 5、查缺补漏

    代码文件:

    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;
    
    namespace 计算器
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private bool isysf = false;//公共变量 判断上一步按的是否是运算符
            private decimal ys = 0;//记录上一步的运算结果
            private bool error = false;//记录运算指令是否有错(除数为0)
            //数字键点击事件
            private void button1_Click(object sender, EventArgs e)
            {
                if (error)//如果上一步运算指令有错 则先清空
                {
                    button17_Click(button17,null);
                }
                Button btn = sender as Button;
                if (isysf)//如果上一步点击的是运算符 则清空label2
                {
                    label2.Text = btn.Text;
                    isysf = false;
                }
                else//上一步点击的不是运算符
                {
                    if (label2.Text == "0")//如果label2中是0 则直接改值
                    {
                        label2.Text = btn.Text;
                    }
                    else//label2中不是0 向后拼接
                    {
                        if(label2.Text.Length<16)
                        label2.Text += btn.Text;
                    }
                }
            }
            //小数点按钮点击事件
            private void button12_Click(object sender, EventArgs e)
            {
                if (!error)
                {
                    if (isysf)//如果上一步点击的是运算符 则label2清零后加小数点
                    {
                        label2.Text = "0.";
                        isysf = false;
                    }
                    else
                    {
                        if (!label2.Text.Contains("."))
                        {
                            label2.Text += ".";
                        }
                    }
                }
            }
            //C按钮点击事件 所有清零并初始化标记变量
            private void button17_Click(object sender, EventArgs e)
            {
                label1.Text = "";
                label2.Text = "0";
                isysf = false;
                error = false;
                ys = 0;
            }
            //正负号点击事件
            private void button10_Click(object sender, EventArgs e)
            {
                if (!error)
                {
                    if (label2.Text != "0")
                    {
                        if (!label2.Text.Contains("-"))
                        {
                            label2.Text = "-" + label2.Text;
                        }
                        else
                        {
                            label2.Text = label2.Text.Substring(1);
                        }
                    }
                }
            }
            //退格键点击事件
            private void button18_Click(object sender, EventArgs e)
            {
                if (!error)
                {
                    if (!isysf)
                    {
                        if (label2.Text.Length > 1)
                            label2.Text = label2.Text.Substring(0, label2.Text.Length - 1);
                        else
                            label2.Text = "0";
                    }
                }
                else
                { 
                    button17_Click(button17,null);
                }
            }
            //加减乘除膜运算符
            private void button14_Click(object sender, EventArgs e)
            {
                if (!error)//上一步运算指令无错误才执行
                {
                    Button btn = sender as Button;
                    if (isysf&&label1.Text!="")//如果上一步点击的是运算符 只修改label1中的最后一个字符
                    {
                        label1.Text = label1.Text.Substring(0, label1.Text.Length - 1) + btn.Text;
                        isysf = true;
                    }
                    else//上一步点击的不是运算符
                    {
                        if (label1.Text == "")//如果是本次运算第一次点击运算符,给中间变量ys赋值并且将内容拼接到label1中
                        {
                            ys = Convert.ToDecimal(label2.Text);
                            label1.Text = " " + label2.Text + " " + btn.Text;
                            isysf = true;
                        }
                        else//如果不是第一次点击运算符(label1中有内容)则对上一步的运算结果进行继续计算并修改两个 label中的text
                        {
                            if (label1.Text.Substring(label1.Text.Length - 1) == "+")
                            {
                                ys += Convert.ToDecimal(label2.Text);
                                label1.Text = label1.Text + " " + label2.Text + " " + btn.Text;
                                label2.Text = ys.ToString();
                                isysf = true;
                            }
                            else if (label1.Text.Substring(label1.Text.Length - 1) == "-")
                            {
                                ys -= Convert.ToDecimal(label2.Text);
                                label1.Text = label1.Text + " " + label2.Text + " " + btn.Text;
                                label2.Text = ys.ToString();
                                isysf = true;
                            }
                            else if (label1.Text.Substring(label1.Text.Length - 1) == "*")
                            {
                                ys *= Convert.ToDecimal(label2.Text);
                                label1.Text = label1.Text + " " + label2.Text + " " + btn.Text;
                                label2.Text = ys.ToString();
                                isysf = true;
                            }
                            else if (label1.Text.Substring(label1.Text.Length - 1) == "/")
                            {
                                if (!label2.Text.Contains("1") && !label2.Text.Contains("2") && !label2.Text.Contains("3") && !label2.Text.Contains("4") && !label2.Text.Contains("5") && !label2.Text.Contains("6") && !label2.Text.Contains("7") && !label2.Text.Contains("8") && !label2.Text.Contains("9"))
                                {
                                    label2.Text = "除数不能为零";
                                    error = true;
                                }
                                else
                                {
                                    ys /= Convert.ToDecimal(label2.Text);
                                    label1.Text = label1.Text + " " + label2.Text + " " + btn.Text;
                                    label2.Text = ys.ToString();
                                    isysf = true;
                                }
                            }
                            else if (label1.Text.Substring(label1.Text.Length - 1) == "%")
                            {
                                if (!label2.Text.Contains("1") && !label2.Text.Contains("2") && !label2.Text.Contains("3") && !label2.Text.Contains("4") && !label2.Text.Contains("5") && !label2.Text.Contains("6") && !label2.Text.Contains("7") && !label2.Text.Contains("8") && !label2.Text.Contains("9"))
                                {
                                    label2.Text = "除数不能为零";
                                    error = true;
                                }
                                else
                                {
                                    ys %= Convert.ToDecimal(label2.Text);
                                    label1.Text = label1.Text + " " + label2.Text + " " + btn.Text;
                                    label2.Text = ys.ToString();
                                    isysf = true;
                                }
                            }
                        }
                    }
                }
            }
            //label2的text改动事件,当字符串过长时调整字体大小
            private void label2_TextChanged(object sender, EventArgs e)
            {
                if(label2.Text.Length<=9)
                    label2.Font = new Font(label2.Font.FontFamily.Name, 20, FontStyle.Bold);
                else if (label2.Text.Length > 9&&label2.Text.Length<=11)
                    label2.Font = new Font(label2.Font.FontFamily.Name, 18, FontStyle.Bold);
                else if (label2.Text.Length > 11 && label2.Text.Length <= 13)
                    label2.Font = new Font(label2.Font.FontFamily.Name, 16, FontStyle.Bold);
                else if (label2.Text.Length > 13 && label2.Text.Length <= 15)
                    label2.Font = new Font(label2.Font.FontFamily.Name, 14, FontStyle.Bold);
                else if (label2.Text.Length > 15)
                {
                    label2.Font = new Font(label2.Font.FontFamily.Name, 13, FontStyle.Bold);
                    label2.Text = label2.Text.Substring(0,16);
                }
            }
            //label1的text改动事件,当字符串过长事 只显示后面的26个字符
            private void label1_TextChanged(object sender, EventArgs e)
            {
                if (label1.Text.Length > 26)
                    label1.Text = label1.Text.Substring(label1.Text.Length-26);
            }
            //等号按钮点击事件
            private void button20_Click(object sender, EventArgs e)
            {
                if (!error)
                {
                    if (label1.Text != "")
                    {
                        if (label1.Text.Substring(label1.Text.Length - 1) == "+")
                        {
                            ys += Convert.ToDecimal(label2.Text);
                            label1.Text = "";
                            label2.Text = ys.ToString();
                        }
                        else if (label1.Text.Substring(label1.Text.Length - 1) == "-")
                        {
                            ys -= Convert.ToDecimal(label2.Text);
                            label1.Text = "";
                            label2.Text = ys.ToString();
                        }
                        else if (label1.Text.Substring(label1.Text.Length - 1) == "*")
                        {
                            ys *= Convert.ToDecimal(label2.Text);
                            label1.Text = "";
                            label2.Text = ys.ToString();
                        }
                        else if (label1.Text.Substring(label1.Text.Length - 1) == "/")
                        {
                            if (!label2.Text.Contains("1")&&!label2.Text.Contains("2")&&!label2.Text.Contains("3")&&!label2.Text.Contains("4")&&!label2.Text.Contains("5")&&!label2.Text.Contains("6")&&!label2.Text.Contains("7")&&!label2.Text.Contains("8")&&!label2.Text.Contains("9"))
                            {
                                label2.Text = "除数不能为零";
                                error = true;
                            }
                            else
                            {
                                ys /= Convert.ToDecimal(label2.Text);
                                label1.Text = "";
                                label2.Text = ys.ToString();
                            }
                        }
                        else
                        {
                            if (!label2.Text.Contains("1") && !label2.Text.Contains("2") && !label2.Text.Contains("3") && !label2.Text.Contains("4") && !label2.Text.Contains("5") && !label2.Text.Contains("6") && !label2.Text.Contains("7") && !label2.Text.Contains("8") && !label2.Text.Contains("9"))
                            {
                                label2.Text = "除数不能为零";
                                error = true;
                            }
                            else
                            {
                                ys %= Convert.ToDecimal(label2.Text);
                                label1.Text = "";
                                label2.Text = ys.ToString();
                            }
                        }
                        isysf = true;
                    }
                }
            }
            //按键事件(键盘操作)
            private void button1_KeyDown(object sender, KeyEventArgs e)
            {
                string key = e.KeyData.ToString();
                if (key == "D1" || key == "NumPad1")
                    button1_Click(button1,null);
                else if (key == "D2" || key == "NumPad2")
                    button1_Click(button2, null);
                else if (key == "D3" || key == "NumPad3")
                    button1_Click(button3, null);
                else if (key == "D4" || key == "NumPad4")
                    button1_Click(button4, null);
                else if (key == "D5" || key == "NumPad5")
                    button1_Click(button5, null);
                else if (key == "D6" || key == "NumPad6")
                    button1_Click(button6, null);
                else if (key == "D7" || key == "NumPad7")
                    button1_Click(button7, null);
                else if (key == "D8" || key == "NumPad8")
                    button1_Click(button8, null);
                else if (key == "D9" || key == "NumPad9")
                    button1_Click(button9, null);
                else if (key == "D0" || key == "NumPad0")
                    button1_Click(button11, null);
                else if (key == "Add")
                    button14_Click(button14, null);
                else if (key == "Subtract" || key == "OemMinus")
                    button14_Click(button13, null);
                else if (key == "Multiply")
                    button14_Click(button15, null);
                else if (key == "Divide")
                    button14_Click(button16, null);
                else if (key == "Oemplus")
                    button20_Click(button20, null);
            }
            //托盘菜单关闭按钮点击事件
            private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            //托盘菜单隐藏窗体点击事件
            private void 隐藏ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (this.WindowState == FormWindowState.Normal)
                {
                    this.WindowState = FormWindowState.Minimized;
                    this.ShowInTaskbar = false;
                    隐藏ToolStripMenuItem.Text = "恢复显示";
                    string picPath = Application.StartupPath + "\btn_restore_highlight.png";
                    隐藏ToolStripMenuItem.Image = Image.FromFile(picPath);
                }
                else
                {
                    this.WindowState = FormWindowState.Normal;
                    this.ShowInTaskbar = true;
                    隐藏ToolStripMenuItem.Text = "隐藏到托盘";
                    string picPath = Application.StartupPath + "\btn_mini_highlight.png";
                    隐藏ToolStripMenuItem.Image = Image.FromFile(picPath);
                }
            }
        }
    }
    计算器CS文件代码

    设计界面:

    效果: 

  • 相关阅读:
    Codeforces Round #384 (Div. 2) 解题报告
    Codeforces Round #383 (Div. 2) 解题报告
    (DFS、bitset)AOJ-0525 Osenbei
    (DFS、全排列)POJ-3187 Backward Digit Sums
    自考新教材-p169
    自考新教材-p167
    自考新教材-p166
    自考新教材-p165
    自考新教材-p161
    自考新教材-p159
  • 原文地址:https://www.cnblogs.com/wt627939556/p/6141750.html
Copyright © 2011-2022 走看看