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)!
