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.";elsetextBox1.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;elseisdian = 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;}}
