C#使用分部類設(shè)計(jì)實(shí)現(xiàn)一個(gè)計(jì)算器
在開發(fā)一些大型項(xiàng)目或者特殊部署時(shí),可能需要把一個(gè)類、結(jié)構(gòu)或接口放在幾個(gè)文件中來分別進(jìn)行處理。等到編譯時(shí),再自動(dòng)把它們整合起來,這時(shí)就用到了分部類。
分部類相當(dāng)于將一個(gè)會(huì)計(jì)部門(類、結(jié)構(gòu)或接口)分成兩個(gè)部門,這兩個(gè)部門可以單獨(dú)對(duì)公司各部門的賬目進(jìn)行審核,而在繁忙時(shí)期,兩個(gè)部門也可以相互調(diào)動(dòng)人員(這里的人員相當(dāng)于類中的方法、屬性、變量等),或是合成一個(gè)整體進(jìn)行工作
一、涉及到的知識(shí)點(diǎn)
1.分部類
分部類是C#4.5中的一個(gè)新特性,它的出現(xiàn)使得程序的結(jié)構(gòu)更加合理,代碼組織更加緊密。開發(fā)人員可以將類、結(jié)構(gòu)或接口的定義拆分到兩個(gè)或多個(gè)源文件中,每個(gè)源文件包含類定義的一部分,編譯應(yīng)用程序時(shí),VS會(huì)把所有部分組合起來,這樣的類被稱為分部類。
定義分部類時(shí)需要使用partial關(guān)鍵字,分部類的每個(gè)部分都必須包含一個(gè)partial關(guān)鍵字,并且其聲明必須與其他部分位于同一命名空間。使用分部類時(shí),要成為同一類型的各個(gè)部分的所有分部類型定義都必須在同一程序集和同一模塊(.exe或.dll文件)中進(jìn)行定義,分部類定義不能跨越多個(gè)模塊。使用分部類時(shí),各個(gè)部分必須具有相同的可訪問性,如public、private等。
2.分部類主要應(yīng)用在以下兩個(gè)方面
當(dāng)項(xiàng)目比較龐大時(shí),使用分部類可以拆分一個(gè)類至幾個(gè)文件中,這樣可以使不同的開發(fā)人員同時(shí)進(jìn)行工作,提高了工作效率。
使用自動(dòng)生成的文件源時(shí),無須重新創(chuàng)建源文件即可將代碼添加到類中。VS在創(chuàng)建Windows窗體和Web服務(wù)包裝代碼等時(shí)都使用此方法。
3.合理使用分部類分割類
C#編碼規(guī)范中規(guī)定,一個(gè)類中的代碼最好不要超過500行,但是,如果實(shí)際開發(fā)中,確實(shí)需要在一個(gè)類中包含超過500行以上的代碼時(shí),該怎么辦呢?這時(shí)可以使用分部類將該類分成幾部分,其中每個(gè)部分包含一部分實(shí)現(xiàn)代碼。
例如,本例中,把一個(gè)public class Account類,用partial關(guān)鍵字,分割成兩個(gè)public partial class Account類。
//分部類
//分割類的用法
namespace _124
{
public partial class Account
{
#region 執(zhí)行兩個(gè)數(shù)的加法運(yùn)算
/// <summary>
/// 執(zhí)行兩個(gè)數(shù)的加法運(yùn)算
/// </summary>
/// <param name="Former">加數(shù)</param>
/// <param name="After">被加數(shù)</param>
/// <returns>返回相加后的結(jié)果</returns>
public static double Addition(double Former, double After)
{
return Former + After;
}
#endregion
#region 執(zhí)行兩個(gè)數(shù)的減法運(yùn)算
/// <summary>
/// 執(zhí)行兩個(gè)數(shù)的減法運(yùn)算
/// </summary>
/// <param name="Former">減數(shù)</param>
/// <param name="After">被減數(shù)</param>
/// <returns>返回相減后的結(jié)果</returns>
public static double Subtration(double Former, double After)
{
return Former - After;
}
#endregion
#region 執(zhí)行兩個(gè)數(shù)的乘法運(yùn)算
/// <summary>
/// 執(zhí)行兩個(gè)數(shù)的乘法運(yùn)算
/// </summary>
/// <param name="Former">乘數(shù)</param>
/// <param name="After">被乘數(shù)</param>
/// <returns>返回相乘后的結(jié)果</returns>
public static double Multiplication(double Former, double After)
{
return Former * After;
}
#endregion
#region 執(zhí)行兩個(gè)數(shù)的除法運(yùn)算
/// <summary>
/// 執(zhí)行兩個(gè)數(shù)的除法運(yùn)算
/// </summary>
/// <param name="Former">除數(shù)</param>
/// <param name="After">被除數(shù)</param>
/// <returns>返回相除后的結(jié)果</returns>
public static double Division(double Former, double After)
{
if (After == 0)
{
MessageBox.Show("被除數(shù)不能為0。");
return 0;
}
return Former / After;
}
#endregion
}
public partial class Account
{
/// <summary>
/// 計(jì)算一個(gè)數(shù)的倒數(shù)
/// </summary>
/// <param name="num">數(shù)據(jù)</param>
/// <returns>返回倒數(shù)值</returns>
public static double Reciprocal(double num)
{
if (num == 0)
{
MessageBox.Show("分母不能為0。");
return 0;
}
return 1 / num;
}
/// <summary>
/// 計(jì)算一個(gè)數(shù)的開方
/// </summary>
/// <param name="num">數(shù)據(jù)</param>
/// <returns>返回開方后的值</returns>
public static double SquareRoot(double num)
{
if (num <= 0)
{
MessageBox.Show("負(fù)數(shù)不能開方。");
return 0;
}
return Math.Sqrt(num);
}
/// <summary>
/// 求一個(gè)數(shù)的相反數(shù)
/// </summary>
/// <param name="num">數(shù)據(jù)</param>
/// <returns>相反數(shù)</returns>
public static double Opposition(double num)
{
return -num;
}
/// <summary>
/// 一個(gè)數(shù)的百分比
/// </summary>
/// <param name="num">數(shù)據(jù)</param>
/// <returns>返回百分比</returns>
public static double Percentage(double num)
{
return num / 100;
}
}
}4.事件處理程序
在C#編程中,事件處理程序是一個(gè)方法,它用于響應(yīng)特定事件的發(fā)生。例如,當(dāng)一個(gè)按鈕被單擊時(shí),可以使用事件處理程序來響應(yīng)這個(gè)事件并執(zhí)行相應(yīng)的代碼。例如:
this.pictureBox22.Click += new System.EventHandler(this.pictureBox21_Click);
在這個(gè)例子中,pictureBox22控件的Click事件被添加了一個(gè)事件處理程序,即pictureBox21_Click方法。當(dāng)pictureBox22控件被單擊時(shí),pictureBox21_Click方法將被執(zhí)行。這樣就可以在pictureBox22控件被單擊時(shí),響應(yīng)這個(gè)事件并執(zhí)行相應(yīng)的代碼。
這樣的設(shè)計(jì),可以集中處理功能類似的事件,極大地減少代碼量,并且代碼更易讀、更易維護(hù)。
5.Math.Ceiling方法
Math.Ceiling是 C# 中的一個(gè)方法,用于將一個(gè)浮點(diǎn)數(shù)向上取整到最接近的整數(shù)。如果浮點(diǎn)數(shù)已經(jīng)是整數(shù),則該方法不會(huì)對(duì)其做任何修改。
例如,Math.Ceiling(3.14)的結(jié)果是4,因?yàn)?3.14 最接近的整數(shù)是4。Math.Ceiling(5.0)的結(jié)果是5,因?yàn)?5.0 已經(jīng)是一個(gè)整數(shù)。
需要注意的是,如果浮點(diǎn)數(shù)是負(fù)數(shù),則Math.Ceiling方法會(huì)將其向上取整到最接近的負(fù)整數(shù)。例如,Math.Ceiling(-3.14)的結(jié)果是-3,因?yàn)?3.14最接近的負(fù)整數(shù)是-3。
6.Text.Contains()
Text.Contains()是 C# 中的一個(gè)方法,用于檢查一個(gè)字符串是否包含另一個(gè)字符串。它返回一個(gè)布爾值,表示指定的子字符串是否存在于字符串中。
string str = "Hello World";
bool result = str.Contains("World"); //result 變量的值為 true
Text.Contains()方法接受一個(gè)字符串參數(shù),用于指定要查找的子字符串。它還接受一個(gè)可選的StringComparison枚舉值參數(shù),用于指定字符串比較的類型。如果不指定這個(gè)參數(shù),則默認(rèn)使用StringComparison.CurrentCulture,它使用當(dāng)前文化來比較字符串。
if (!textBox1!.Text.Contains('.', StringComparison.CurrentCulture))
//等價(jià)語(yǔ)句
if (!textBox1!.Text.Contains('.'))
7.pictureBox.Tag屬性
設(shè)置pictureBox的Tag屬性的字符串內(nèi)容=該按鍵的功能,比如,設(shè)置按鍵CE的Tag屬性為"CE"。其它按鍵屬性的設(shè)置以此類推。
//
// pictureBox22
//
pictureBox22 = new PictureBox
{
BackgroundImage = Properties.Resources.ce,
Location = new Point(91, 72),
Name = "pictureBox22",
Size = new Size(66, 24),
TabIndex = 21,
TabStop = false,
Tag = "CE"
};
//pictureBox22.Click += PictureBox22_Click;
pictureBox22.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox22).BeginInit();設(shè)置pictureBox的Tag屬性的用途是當(dāng)觸發(fā)按鈕事件時(shí),把該按鈕的Tag屬性作為Switch表達(dá)式的參數(shù)列表,從而響應(yīng)按鈕事件。例如:
private void PictureBox21_Click(object? sender, EventArgs e)
{
ButtonTag = (sender as PictureBox)!.Tag!.ToString()!;//獲取當(dāng)前按鈕的標(biāo)識(shí)
switch (ButtonTag)
{
//點(diǎn)擊到數(shù)字鍵
case "0": ReadNumber(ButtonTag); break;
case "1": ReadNumber(ButtonTag); break;
case "2": ReadNumber(ButtonTag); break;
case "3": ReadNumber(ButtonTag); break;
case "4": ReadNumber(ButtonTag); break;
case "5": ReadNumber(ButtonTag); break;
case "6": ReadNumber(ButtonTag); break;
case "7": ReadNumber(ButtonTag); break;
case "8": ReadNumber(ButtonTag); break;
case "9": ReadNumber(ButtonTag); break;
//點(diǎn)擊到運(yùn)算符
case "+": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "-": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "*": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "/": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "%": AuxiliaryCalculation(ButtonTag); break;
case "1/X": AuxiliaryCalculation(ButtonTag); break;
case "+-": AuxiliaryCalculation(ButtonTag); break;
case "Sqrt": AuxiliaryCalculation(ButtonTag); break;
case ".": DecimalPoint(); break;
case "=": Calculation(ButtonTag); isnum = false; break; //計(jì)算結(jié)果
//C 則是 "Clear" 的簡(jiǎn)稱,它用于清除計(jì)算器中的所有數(shù)據(jù),包括存儲(chǔ)器和寄存器的內(nèi)容。
case "C":
{
Value_1 = "";
Value_2 = "";
OperatorType = "";
textBox1!.Text = "0";
break;
}
//CE 是 "Clear Entry" 的縮寫,它的主要作用是清除當(dāng)前正在輸入的數(shù)字或者運(yùn)算符。
case "CE": textBox1!.Text = "0"; Value_1 = ""; break;
default: Backspace(); break; /*"Back":*/
}
}二、實(shí)例
本實(shí)例將使用分部類制作一個(gè)計(jì)算器,其中主要是用分部類來分別記錄計(jì)算器的計(jì)算方法,如將實(shí)現(xiàn)加、減、乘和除的方法放在一個(gè)分部類中,而將實(shí)現(xiàn)正負(fù)、開方、百分比和倒數(shù)的方法放在另一個(gè)分部類中。
1.源碼
// 使用分部類實(shí)現(xiàn)多種計(jì)算方法
namespace _124
{
public partial class Form1 : Form
{
private Panel? panel1;
private PictureBox? pictureBox5;
private PictureBox? pictureBox4;
private PictureBox? pictureBox3;
private PictureBox? pictureBox2;
private PictureBox? pictureBox1;
private PictureBox? pictureBox10;
private PictureBox? pictureBox9;
private PictureBox? pictureBox8;
private PictureBox? pictureBox7;
private PictureBox? pictureBox6;
private PictureBox? pictureBox20;
private PictureBox? pictureBox19;
private PictureBox? pictureBox18;
private PictureBox? pictureBox17;
private PictureBox? pictureBox16;
private PictureBox? pictureBox15;
private PictureBox? pictureBox14;
private PictureBox? pictureBox13;
private PictureBox? pictureBox12;
private PictureBox? pictureBox11;
private PictureBox? pictureBox23;
private PictureBox? pictureBox22;
private PictureBox? pictureBox21;
private PictureBox? pictureBox24;
private TextBox? textBox1;
public string Value_1 = ""; //操作數(shù)1
public string Value_2 = ""; //操作數(shù)2
public string OperatorType = ""; //運(yùn)算符種類
string ButtonTag = ""; //記錄當(dāng)前輸入的鍵值
bool isnum = false; //判斷輸入的是計(jì)算的那個(gè)值,他就是一個(gè)開關(guān),按下運(yùn)算符號(hào)時(shí)翻轉(zhuǎn),按下等號(hào)后,要復(fù)原
bool IsNotDecimalPoint = false; //是否包含小數(shù)點(diǎn)
public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// pictureBox24
//
pictureBox24 = new PictureBox
{
BackgroundImage = Properties.Resources.Close,
Location = new Point(226, 0),
Name = "pictureBox24",
Size = new Size(11, 11),
TabIndex = 23,
TabStop = false
};
pictureBox24.Click += PictureBox24_Click;
((System.ComponentModel.ISupportInitialize)pictureBox24).BeginInit();
//
// pictureBox23
//
pictureBox23 = new PictureBox
{
BackgroundImage = Properties.Resources.c,
Location = new Point(161, 72),
Name = "pictureBox23",
Size = new Size(66, 24),
TabIndex = 22,
TabStop = false,
Tag = "C"
};
pictureBox23.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox23).BeginInit();
//
// pictureBox22
//
pictureBox22 = new PictureBox
{
BackgroundImage = Properties.Resources.ce,
Location = new Point(91, 72),
Name = "pictureBox22",
Size = new Size(66, 24),
TabIndex = 21,
TabStop = false,
Tag = "CE"
};
//pictureBox22.Click += PictureBox22_Click;
pictureBox22.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox22).BeginInit();
//
// pictureBox21
//
pictureBox21 = new PictureBox
{
BackgroundImage = Properties.Resources.back,
Location = new Point(12, 72),
Name = "pictureBox21",
Size = new Size(75, 24),
TabIndex = 20,
TabStop = false,
Tag = "Back"
};
pictureBox21.Click += PictureBox21_Click;
((System.ComponentModel.ISupportInitialize)pictureBox21).BeginInit();
//
// pictureBox20
//
pictureBox20 = new PictureBox
{
BackgroundImage = Properties.Resources.Amound,
Location = new Point(188, 192),
Name = "pictureBox20",
Size = new Size(40, 24),
TabIndex = 19,
TabStop = false,
Tag = "="
};
pictureBox20.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox20).BeginInit();
//
// pictureBox19
//
pictureBox19 = new PictureBox
{
BackgroundImage = Properties.Resources.Add,
Location = new Point(144, 192),
Name = "pictureBox19",
Size = new Size(40, 24),
TabIndex = 18,
TabStop = false,
Tag = "+"
};
pictureBox19.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox19).BeginInit();
//
// pictureBox18
//
pictureBox18 = new PictureBox
{
BackgroundImage = Properties.Resources.Dot,
Location = new Point(100, 192),
Name = "pictureBox18",
Size = new Size(40, 24),
TabIndex = 17,
TabStop = false,
Tag = "."
};
pictureBox18.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox18).BeginInit();
//
// pictureBox17
//
pictureBox17 = new PictureBox
{
BackgroundImage = Properties.Resources.Bear,
Location = new Point(56, 192),
Name = "pictureBox17",
Size = new Size(40, 24),
TabIndex = 16,
TabStop = false,
Tag = "+-"
};
pictureBox17.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox17).BeginInit();
//
// pictureBox16
//
pictureBox16 = new PictureBox
{
BackgroundImage = Properties.Resources._0,
Location = new Point(12, 192),
Name = "pictureBox16",
Size = new Size(40, 24),
TabIndex = 15,
TabStop = false,
Tag = "0"
};
pictureBox16.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox16).BeginInit();
//
// pictureBox15
//
pictureBox15 = new PictureBox
{
BackgroundImage = Properties.Resources.Deno,
Location = new Point(188, 162),
Name = "pictureBox15",
Size = new Size(40, 24),
TabIndex = 14,
TabStop = false,
Tag = "1/X"
};
pictureBox15.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox15).BeginInit();
//
// pictureBox14
//
pictureBox14 = new PictureBox
{
BackgroundImage = Properties.Resources.Decr,
Location = new Point(144, 162),
Name = "pictureBox14",
Size = new Size(40, 24),
TabIndex = 13,
TabStop = false,
Tag = "-"
};
pictureBox14.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox14).BeginInit();
//
// pictureBox13
//
pictureBox13 = new PictureBox
{
BackgroundImage = Properties.Resources._3,
Location = new Point(100, 162),
Name = "pictureBox13",
Size = new Size(40, 24),
TabIndex = 12,
TabStop = false,
Tag = "3"
};
pictureBox13.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox13).BeginInit();
//
// pictureBox12
//
pictureBox12 = new PictureBox
{
BackgroundImage = Properties.Resources._2,
Location = new Point(56, 162),
Name = "pictureBox12",
Size = new Size(40, 24),
TabIndex = 11,
TabStop = false,
Tag = "2"
};
pictureBox12.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox12).BeginInit();
//
// pictureBox11
//
pictureBox11 = new PictureBox
{
BackgroundImage = Properties.Resources._1,
Location = new Point(12, 162),
Name = "pictureBox11",
Size = new Size(40, 24),
TabIndex = 10,
TabStop = false,
Tag = "1"
};
pictureBox11.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox11).BeginInit();
//
// pictureBox10
//
pictureBox10 = new PictureBox
{
BackgroundImage = Properties.Resources.Hund,
Location = new Point(188, 132),
Name = "pictureBox10",
Size = new Size(40, 24),
TabIndex = 9,
TabStop = false,
Tag = "%"
};
pictureBox10.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox10).BeginInit();
//
// pictureBox9
//
pictureBox9 = new PictureBox
{
BackgroundImage = Properties.Resources.Ride,
Location = new Point(144, 132),
Name = "pictureBox9",
Size = new Size(40, 24),
TabIndex = 8,
TabStop = false,
Tag = "*"
};
pictureBox9.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox9).BeginInit();
//
// pictureBox8
//
pictureBox8 = new PictureBox
{
BackgroundImage = Properties.Resources._6,
Location = new Point(100, 132),
Name = "pictureBox8",
Size = new Size(40, 24),
TabIndex = 7,
TabStop = false,
Tag = "6"
};
pictureBox8.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox8).BeginInit();
//
// pictureBox7
//
pictureBox7 = new PictureBox
{
BackgroundImage = Properties.Resources._5,
Location = new Point(56, 132),
Name = "pictureBox7",
Size = new Size(40, 24),
TabIndex = 6,
TabStop = false,
Tag = "5"
};
pictureBox7.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox7).BeginInit();
//
// pictureBox6
//
pictureBox6 = new PictureBox
{
BackgroundImage = Properties.Resources._4,
Location = new Point(12, 132),
Name = "pictureBox6",
Size = new Size(40, 24),
TabIndex = 5,
TabStop = false,
Tag = "4"
};
pictureBox6.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox6).BeginInit();
//
// pictureBox5
//
pictureBox5 = new PictureBox
{
BackgroundImage = Properties.Resources.sqrt,
Location = new Point(188, 102),
Name = "pictureBox5",
Size = new Size(40, 24),
TabIndex = 4,
TabStop = false,
Tag = "Sqrt"
};
pictureBox5.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox5).BeginInit();
//
// pictureBox4
//
pictureBox4 = new PictureBox
{
BackgroundImage = Properties.Resources.Remove,
Location = new Point(144, 102),
Name = "pictureBox4",
Size = new Size(40, 24),
TabIndex = 3,
TabStop = false,
Tag = "/"
};
pictureBox4.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox4).BeginInit();
//
// pictureBox3
//
pictureBox3 = new PictureBox
{
BackgroundImage = Properties.Resources._9,
Location = new Point(100, 102),
Name = "pictureBox3",
Size = new Size(40, 24),
TabIndex = 2,
TabStop = false,
Tag = "9"
};
pictureBox3.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox3).BeginInit();
//
// pictureBox2
//
pictureBox2 = new PictureBox
{
BackgroundImage = Properties.Resources._8,
Location = new Point(56, 102),
Name = "pictureBox2",
Size = new Size(40, 24),
TabIndex = 1,
TabStop = false,
Tag = "8"
};
pictureBox2.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox2).BeginInit();
//
// pictureBox1
//
pictureBox1 = new PictureBox
{
BackgroundImage = Properties.Resources._7,
Location = new Point(12, 102),
Name = "pictureBox1",
Size = new Size(40, 24),
TabIndex = 0,
TabStop = false,
Tag = "7"
};
pictureBox1.Click += new EventHandler(PictureBox21_Click);
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(12, 33),
Name = "textBox1",
Size = new Size(215, 23),
TabIndex = 24
};
//
// panel1
//
panel1 = new Panel
{
BackgroundImage = Properties.Resources.bg,
Dock = DockStyle.Fill,
Location = new Point(0, 0),
Name = "panel1",
Size = new Size(240, 230),
TabIndex = 0
};
panel1.Controls.Add(textBox1);
panel1.Controls.Add(pictureBox24);
panel1.Controls.Add(pictureBox23);
panel1.Controls.Add(pictureBox22);
panel1.Controls.Add(pictureBox21);
panel1.Controls.Add(pictureBox20);
panel1.Controls.Add(pictureBox19);
panel1.Controls.Add(pictureBox18);
panel1.Controls.Add(pictureBox17);
panel1.Controls.Add(pictureBox16);
panel1.Controls.Add(pictureBox15);
panel1.Controls.Add(pictureBox14);
panel1.Controls.Add(pictureBox13);
panel1.Controls.Add(pictureBox12);
panel1.Controls.Add(pictureBox11);
panel1.Controls.Add(pictureBox10);
panel1.Controls.Add(pictureBox9);
panel1.Controls.Add(pictureBox8);
panel1.Controls.Add(pictureBox7);
panel1.Controls.Add(pictureBox6);
panel1.Controls.Add(pictureBox5);
panel1.Controls.Add(pictureBox4);
panel1.Controls.Add(pictureBox3);
panel1.Controls.Add(pictureBox2);
panel1.Controls.Add(pictureBox1);
panel1.SuspendLayout();
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(240, 230);
Controls.Add(panel1);
FormBorderStyle = FormBorderStyle.None;//隱藏窗體的邊框
Name = "Form1";
Text = "Form1";
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox24).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox23).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox22).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox21).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox20).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox19).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox18).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox17).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox16).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox15).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox14).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox13).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox12).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox11).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox10).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox9).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox8).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox7).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox6).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox5).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox4).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox3).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox2).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
}
/// <summary>
/// Backspace
/// 根據(jù)鍵值觸發(fā)相應(yīng)的功能
/// </summary>
private void PictureBox21_Click(object? sender, EventArgs e)
{
ButtonTag = (sender as PictureBox)!.Tag!.ToString()!;//獲取當(dāng)前按鈕的標(biāo)識(shí)
switch (ButtonTag)
{
//點(diǎn)擊到數(shù)字鍵
case "0": ReadNumber(ButtonTag); break;
case "1": ReadNumber(ButtonTag); break;
case "2": ReadNumber(ButtonTag); break;
case "3": ReadNumber(ButtonTag); break;
case "4": ReadNumber(ButtonTag); break;
case "5": ReadNumber(ButtonTag); break;
case "6": ReadNumber(ButtonTag); break;
case "7": ReadNumber(ButtonTag); break;
case "8": ReadNumber(ButtonTag); break;
case "9": ReadNumber(ButtonTag); break;
//點(diǎn)擊到運(yùn)算符
case "+": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "-": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "*": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "/": OperatorType = ButtonTag; isnum = true; textBox1!.Text = "0"; break;
case "%": AuxiliaryCalculation(ButtonTag); break;
case "1/X": AuxiliaryCalculation(ButtonTag); break;
case "+-": AuxiliaryCalculation(ButtonTag); break;
case "Sqrt": AuxiliaryCalculation(ButtonTag); break;
case ".": DecimalPoint(); break;
case "=": Calculation(ButtonTag); isnum = false; break; //計(jì)算結(jié)果
//C 則是 "Clear" 的簡(jiǎn)稱,它用于清除計(jì)算器中的所有數(shù)據(jù),包括存儲(chǔ)器和寄存器的內(nèi)容。
case "C":
{
Value_1 = "";
Value_2 = "";
OperatorType = "";
textBox1!.Text = "0";
break;
}
//CE 是 "Clear Entry" 的縮寫,它的主要作用是清除當(dāng)前正在輸入的數(shù)字或者運(yùn)算符。
case "CE": textBox1!.Text = "0"; Value_1 = ""; break;
default: Backspace(); break; /*"Back":*/
}
}
/// <summary>
/// X,關(guān)閉窗體
/// </summary>
private void PictureBox24_Click(object? sender, EventArgs e)
{
Close();
}
/// <summary>
/// 記錄當(dāng)前輸入的數(shù)字鍵的值
/// </summary>
/// <param name="num">鍵值</param>
public void ReadNumber(string num)
{
if (IsNotDecimalPoint)
{
if (textBox1!.Text == "0")
textBox1.Text = "0.";
else
textBox1.Text += ".";
IsNotDecimalPoint = false;
}
if (textBox1!.Text == "0")
textBox1.Text = "";
if (isnum) //如果是計(jì)算之前的值
{
textBox1.Text += num; //累加輸入值
Value_2 = textBox1.Text; //顯示在文本框中
}
else //計(jì)算之后的值
{
textBox1.Text += num; //累加輸入值
Value_1 = textBox1.Text; //等待連續(xù)計(jì)算
}
}
/// <summary>
/// +-*/%計(jì)算
/// </summary>
/// <param name="n"></param>
public void Calculation(string n)
{
ArgumentNullException.ThrowIfNull(n);
double tem_v = 0; //記錄計(jì)算后的結(jié)果
if (Value_1.Length <= 0 || Value_2.Length <= 0)//判斷是否有計(jì)算的兩個(gè)值
return;
if (OperatorType.Length > 0) //如果可以計(jì)算
{
switch (OperatorType)
{
case "+": tem_v = Account.Addition(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
case "-": tem_v = Account.Subtration(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
case "*": tem_v = Account.Multiplication(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
case "/": tem_v = Account.Division(Convert.ToDouble(Value_1), Convert.ToDouble(Value_2)); break;
}
}
if (tem_v == Math.Ceiling(tem_v)) //如果計(jì)算結(jié)果為整數(shù)對(duì)結(jié)果進(jìn)行取整
{
textBox1!.Text = Convert.ToInt64(tem_v).ToString();
}
else
{
textBox1!.Text = tem_v.ToString(); //以雙精度進(jìn)行顯示
}
Value_1 = textBox1.Text; //等待連續(xù)計(jì)算
Value_2 = "";
}
/// <summary>
/// 輔助計(jì)算
/// </summary>
/// <param name="str"></param>
public void AuxiliaryCalculation(string str)
{
double tem_v = 0; //記錄計(jì)算結(jié)果
switch (str)
{
case "%": tem_v = Account.Percentage(Convert.ToDouble(textBox1!.Text)); break;
case "1/X": tem_v = Account.Reciprocal(Convert.ToDouble(textBox1!.Text)); break;
case "+-": tem_v = Account.Opposition(Convert.ToDouble(textBox1!.Text)); break;
case "Sqrt": tem_v = Account.SquareRoot(Convert.ToDouble(textBox1!.Text)); break;
}
if (tem_v == Math.Ceiling(tem_v)) //如果計(jì)算結(jié)果為整數(shù)對(duì)結(jié)果進(jìn)行取整
{
textBox1!.Text = Convert.ToInt64(tem_v).ToString();
}
else
{
textBox1!.Text = tem_v.ToString(); //以雙精度進(jìn)行顯示
}
Value_1 = textBox1.Text; //等待連續(xù)計(jì)算
Value_2 = "";
}
/// <summary>
/// 刪除輸入的值
/// </summary>
public void Backspace()
{
var BackspaceStr = textBox1!.Text; //記錄當(dāng)前文本框中的值
if (BackspaceStr != "0") //如果值不為零
{
string ToAbs = Math.Abs(Convert.ToDouble(BackspaceStr)).ToString();//獲取該值的絕對(duì)值
if ((BackspaceStr.Length == 1) || (ToAbs.Length == 1))//如果當(dāng)前文本框中只有一個(gè)數(shù)值
{
textBox1.Text = "0"; //將文本框清零
}
else { textBox1.Text = BackspaceStr[..^1]; }//刪除指定的值
Value_1 = textBox1.Text; //顯示刪除后的結(jié)果
}
}
/// <summary>
/// 非小數(shù)點(diǎn)則為真
/// </summary>
public void DecimalPoint()
{
if (!textBox1!.Text.Contains('.'))
IsNotDecimalPoint = true;
else
IsNotDecimalPoint = false;
}
}
}2.生成效果

到此這篇關(guān)于C#使用分部類設(shè)計(jì)實(shí)現(xiàn)一個(gè)計(jì)算器的文章就介紹到這了,更多相關(guān)C#分部類實(shí)現(xiàn)計(jì)算器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(一)
其實(shí)說白了,反射就是能知道我們未知類型的類型信息這么一個(gè)東西.沒什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運(yùn)行時(shí)得到類型信息2013-07-07
利用Aspose.Cells和Excel模板導(dǎo)出統(tǒng)計(jì)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了利用Aspose.Cells和Excel模板導(dǎo)出復(fù)雜的統(tǒng)計(jì)數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
C#使用sqlSugar操作mysql數(shù)據(jù)庫(kù)的完整教程
這篇文章主要為大家詳細(xì)介紹了使用C#?sqlSugar進(jìn)行MySQL數(shù)據(jù)庫(kù)操作的基本配置流程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-04-04
C#調(diào)用??倒I(yè)相機(jī)SDK采集圖像并在Halcon窗口中顯示方式
這篇文章主要介紹了C#調(diào)用海康工業(yè)相機(jī)SDK采集圖像并在Halcon窗口中顯示方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C#如何讀取Txt大數(shù)據(jù)并更新到數(shù)據(jù)庫(kù)詳解
這篇文章主要給大家介紹了關(guān)于C#如何讀取Txt大數(shù)據(jù)并更新到數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

