自学内容网 自学内容网

C# 分部类实现计算器功能

本文主要介绍使用分部类实现计算器功能。

功能需求

计算器的功能包括加减乘除、平方等运算。

实现方案

1、利用pictureBox控件,将按键作为背景照片,显示所有按键,然后获取当前按钮的标识,通过控件Tag值,触发记录不同的值
2、符号记录方法和数字一致
3、根据运算符号,调用不同的运算方法

知识点

1、(PictureBox)sender
是一种类型转换。目的是将 sender 参数转换为 PictureBox 类型,以便访问该控件的特定属性和方法。
sender 参数的含义在 C# 的事件处理方法中(如按钮点击、图片框加载等事件),第一个参数通常是 object sender,它表示触发当前事件的对象。例如,当你点击一个 PictureBox 控件时,sender 就指向这个被点击的 PictureBox 实例。
为什么需要 (PictureBox)sender?sender 的类型是 object(所有类型的基类),因此它本身只能访问 object 类的成员(如 ToString())。若要使用触发事件的 PictureBox 控件特有的属性(如 Image、Size、Location 等)或方法,必须先将 sender 转换为 PictureBox 类型。

这种转换不仅限于 PictureBox,对其他控件(如 Button、TextBox 等)也适用。例如 (Button)sender 可转换为按钮控件。

// 为多个 PictureBox 绑定同一个 Click 事件
pictureBox1.Click += PictureBox_Click;
pictureBox2.Click += PictureBox_Click;
pictureBox3.Click += PictureBox_Click;

// 事件处理方法
private void PictureBox_Click(object sender, EventArgs e)
{
    // 将 sender 转换为 PictureBox 类型
    PictureBox clickedPictureBox = (PictureBox)sender;

    // 访问 PictureBox 特有属性
    clickedPictureBox.Image = Properties.Resources.SelectedImage; // 更改图片
    clickedPictureBox.BorderStyle = BorderStyle.Fixed3D; // 更改边框样式
    MessageBox.Show($"你点击了:{clickedPictureBox.Name}"); // 显示控件名称
}

2、partial
在C#中,可以使用 partial 关键字拆分多个.cs文件中的类、结构、方法或接口的实现。编译程序时,编译器将合并来自多个.cs文件的所有实现。

代码

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 BranchMeans
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string Value_1 = "";//记录计算之前的数
        public string Value_2 = "";//记录计算之后的数
        public string Kind = "";//记录算法
        string tem_Value = "";//记录当前输入的键值
        bool isnum = false;//判断输入的是计算的那个值
        bool isdian = false;//是否有小数点
        Account Acc = new Account();//实例化计算类

        //根据键值触发相应的功能
        private void pictureBox21_Click(object sender, EventArgs e)
        {
            tem_Value = ((PictureBox)sender).Tag.ToString();//获取当前按钮的标识
            switch (tem_Value)
            {
                //输入数字键
                case "0": num(tem_Value); break;
                case "1": num(tem_Value); break;
                case "2": num(tem_Value); break;
                case "3": num(tem_Value); break;
                case "4": num(tem_Value); break;
                case "5": num(tem_Value); break;
                case "6": num(tem_Value); break;
                case "7": num(tem_Value); break;
                case "8": num(tem_Value); break;
                case "9": num(tem_Value); break;
                //输入计算键
                case "+":
                case "-":
                case "*":
                case "/": Kind = tem_Value; isnum = true; textBox1.Text = "0"; break;
                case "%":
                case "1/X":
                case "+-":
                case "Sqrt": fu(tem_Value); break;
                case ".": dian(); break;
                //计算结果
                case "=": js(tem_Value); break;
                //清除键
                case "C":
                    {
                        Value_1 = "";
                        Value_2 = "";
                        Kind = "";
                        textBox1.Text = "0";
                        break;
                    }
                case "CE": textBox1.Text = "0"; Value_1 = ""; break;
                case "Back": backspace(); break;
            }
        }

        /// <summary>
        /// 记录当前输入的数字键的值
        /// </summary>
        /// <param name="n">键值</param>
        public void num(string n)
        {
            if (isdian)
            {
                if (textBox1.Text == "0")
                    textBox1.Text = "0.";
                else
                    textBox1.Text += ".";
                isdian = false;
            }
            if (textBox1.Text == "0")
                textBox1.Text = "";
            if (isnum)//如果是计算之前的值
            {
                textBox1.Text += n;//累加输入值
                Value_2 = textBox1.Text;//显示在文本框中
            }
            else//计算之后的值
            {
                textBox1.Text += n;//累加输入值
                Value_1 = textBox1.Text;//显示在文本框中
            }
        }
        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="n"></param>
        public void js(string n)
        {
            double tem_v = 0;//记录计算后的结果
            if (Value_1.Length <= 0 || Value_2.Length <= 0)//判断是否有计算的两个值
                return;
            if (Kind.Length > 0)//如果可以计算
            {
                switch (Kind)
                {
                    case "+": tem_v = Acc.Addition(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
                    case "-": tem_v = Acc.Subtration(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
                    case "*": tem_v = Acc.Multiplication(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
                    case "/": tem_v = Acc.Division(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
                }
            }
            if (tem_v == Math.Ceiling(tem_v))//如果计算结果为整数
            {
                textBox1.Text = Convert.ToInt64(tem_v).ToString();//对结果进行取整
            }
            else
            {
                textBox1.Text = tem_v.ToString();//以双精度进行显示
            }
            Value_1 = textBox1.Text;//显示计算结果
            Value_2 = "";

        }

        /// <summary>
        /// 辅助计算
        /// </summary>
        /// <param name="n"></param>
        public void fu(string n)
        {
            double tem_v = 0;//记录计算结果
            switch (n)
            {
                case "%": tem_v = Acc.Par(Convert.ToDouble(textBox1.Text)); break;
                case "1/X": tem_v = Acc.Molecule(Convert.ToDouble(textBox1.Text)); break;
                case "+-": tem_v = Acc.Opposition(Convert.ToDouble(textBox1.Text)); break;
                case "Sqrt": tem_v = Acc.Evolution(Convert.ToDouble(textBox1.Text)); break;
            }
            if (tem_v == Math.Ceiling(tem_v))//如果计算结果为整数
            {
                textBox1.Text = Convert.ToInt64(tem_v).ToString();//对结果进行取整
            }
            else
            {
                textBox1.Text = tem_v.ToString();//以双精度进行显示
            }
            Value_1 = textBox1.Text;//显示计算结果
            Value_2 = "";
        }

        /// <summary>
        /// 删除输入的值
        /// </summary>
        public void backspace()
        {
            var bstr = textBox1.Text;//记录当前文本框中的值
            if (bstr != "0")//如果值不为零
            {
                string isabs = (Math.Abs(Convert.ToDouble(bstr)).ToString());//获取该值的绝对值
                if ((bstr.Length == 1) || (isabs.Length == 1))//如果当前文本框中只有一个数值
                {
                    textBox1.Text = "0";//将文本框清零
                }
                else { textBox1.Text = bstr.Substring(0, bstr.Length - 1); }//删除指定的值
                Value_1 = textBox1.Text;//显示删除后的结果
            }
        }

        public void dian()
        {
            if (textBox1.Text.IndexOf(".") == -1)
                isdian = true;
            else
                isdian = false;
        }

        private void pictureBox24_Click(object sender, EventArgs e)
        {
            Close();
        }

    }
}


Access类

    public partial class Account
    {
        #region 执行两个数的加法运算
        /// <summary>
        /// 执行两个数的加法运算
        /// </summary>
        /// <param name="Former">加数</param>
        /// <param name="After">被加数</param>
        /// <returns>返回相加后的结果</returns>
        public double Addition(double Former, double After)
        {
            return Former + After;
        }
        #endregion

        #region 执行两个数的减法运算
        /// <summary>
        /// 执行两个数的减法运算
        /// </summary>
        /// <param name="Former">减数</param>
        /// <param name="After">被减数</param>
        /// <returns>返回相减后的结果</returns>
        public double Subtration(double Former, double After)
        {
            return Former - After;
        }
        #endregion

        #region 执行两个数的乘法运算
        /// <summary>
        /// 执行两个数的乘法运算
        /// </summary>
        /// <param name="Former">乘数</param>
        /// <param name="After">被乘数</param>
        /// <returns>返回相乘后的结果</returns>
        public double Multiplication(double Former, double After)
        {
            return Former * After;
        }
        #endregion

        #region 执行两个数的除法运算
        /// <summary>
        /// 执行两个数的除法运算
        /// </summary>
        /// <param name="Former">除数</param>
        /// <param name="After">被除数</param>
        /// <returns>返回相除后的结果</returns>
        public double Division(double Former, double After)
        {
            if (After == 0)
            {
                MessageBox.Show("被除数不能为0。");
                return 0;
            }
            return Former / After;
        }
        #endregion
    }

    public partial class Account
    {
        /// <summary>
        /// 计算一个数的倒数
        /// </summary>
        /// <param name="num">数据</param>
        /// <returns>返回倒数值</returns>
        public double Molecule(double num)
        {
            return 1 / num;
        }

        /// <summary>
        /// 计算一个数的开方
        /// </summary>
        /// <param name="num">数据</param>
        /// <returns>返回开方后的值</returns>
        public double Evolution(double num)
        {
            return Math.Sqrt(num);
        }

        /// <summary>
        /// 求一个数的相反数
        /// </summary>
        /// <param name="num">数据</param>
        /// <returns>相反数</returns>
        public double Opposition(double num)
        {
            return -num;
        }

        /// <summary>
        /// 算一个数的百分比
        /// </summary>
        /// <param name="num">数据</param>
        /// <returns>返回百分比</returns>
        public double Par(double num)
        {
            return num / 100 * num;
        }
    }

总结


原文地址:https://blog.csdn.net/yue008/article/details/154486669

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!