当前位置: 首页 > news >正文

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;}}

总结

http://www.dtcms.com/a/578150.html

相关文章:

  • 怎样建设个人网站广告赚钱彩票投资理财平台网站建设
  • 代码编辑器
  • C# 中,0.1 在什么情况下不等于 0.1 ?
  • 哪块行业需要网站建设揭阳企业建站系统
  • 目前主流网站开发所用软件建筑工程公司起名
  • 【stm32协议外设篇】- NEO-6M GPS 模块
  • 内网网站开发费用泰安网签查询2023
  • 微算法科技(NASDAQ MLGO)采用动态层次管理和位置聚类技术,修改pBFT算法以提高私有区块链网络运行效率
  • 潍坊网络建站模板wordpress 指定页面nofollow
  • 从Hive on YARN到Hive on Spark
  • 创作写作-李劭卓
  • 论文分享 |Spark-TTS:用解耦语音令牌实现高效可控的语音合成
  • Spark 文本分类实战经验总结
  • 英伟达体系内关于 DGX Spark 的讨论观点整理
  • 模版型网站a站为什么会凉
  • 强软弱虚四种引用
  • [Esterel大师课] Gérard Berry:使用Esterel v7进行同步多时钟电路设计(2013)
  • 有什么学做木工的网站吗WordPress添加下载弹窗
  • 目标检测模型SSD详解与实现
  • 网站弹窗广告代码企业官方网站的作用
  • 网站建设排行山西省确诊病例最新情况
  • 线程池浅谈
  • KubeSphere在线安装单节点K8S集群
  • 北京安慧桥网站建设口碑好的家装前十强
  • 著名建筑网站正规的教育机构有哪些
  • Linux - Vault
  • VSCode+Cline部署本地爬虫fetch-mcp实战
  • 使用python-pandas-openpyxl编写运营查询小工具
  • Label Studio 安装与简单使用指南
  • 宁波正规网站seo公司php网站开发机试题目