事件函数的两个参数的定义:private void button21_Click(object sender, EventArgs e)
{
button a=(button)sender;
}
sender:事件主体(事件的触发对象)
EvenArgs:事件数据(参数)
例如:可以通过a访问button21的其他属性;
开发计算器过程:
先分析最简单的现实情况:两个数
目标清晰;
成果展示:
思路:
1:从最简单的两个数运算出发,找出问题中的两个主要对象:两个数字型字符串,五个运算符。
2.找出各个对象需要在问题中体现的特点,
数字型字符串:通过11个按钮赋值;本身及运算结果在文本框的显示设定与实现;
运算符:主要通过成员函数解决运算问题;
不同对象的功能相似的函数可通过触发事件,通过一个函数来实现,比如各个按钮的赋值功能。(本例题未体现)
private string preOperaror;//用来存储前面的运算符 private string firstNum;//用来存储运算结果 private string secondNum;//用来存储当前输入的 private bool a = false;//标记是否重复输入了运算符 private double result; //通过按钮给数字型字符串赋值 private void twobutton_Click(object sender, EventArgs e) { //若前面有过计算结果,清空状态框、表达式框 if (preOperaror == "=") { expressionBox1.Clear(); resultBox2.Clear(); preOperaror = null; } //如果刚刚输入运算符,清空结果框 if (a) { resultBox2.Clear(); a = false; } //存入当前数字串secondNum secondNum += "2"; //显示当前数字串 resultBox2.Text += "2"; } //小数点的输入 private void dotBtn_Click(object sender, EventArgs e) { if (secondNum.Length > 0 && secondNum.ToString().Contains(".") == false) { secondNum += "."; resultBox2.Text += "."; } } //加法运算,其他运算类似写法 private void plusButton_Click(object sender, EventArgs e) { //如果前面没有运算符 if (preOperaror == null && secondNum != null) { firstNum = secondNum; preOperaror = "+"; resultBox2.Clear(); resultBox2.Text = firstNum; //保存表达式 expressionBox1.Text += secondNum+"+"; //清空secondNum,准备接收新值 secondNum = null; a = true;//标记当前状态框最后一个字符是运算符,如果a=true,后面不能继续输入运算符 } //如果前面有一个运算符,使用前面这个运算符运算,运算结果在状态框显示,更新表达式框,保存刚输入的运算符 else { if (a == false||preOperaror=="=")//确保前面运算符后有数字,“=”是特殊情况 { //保存表达式 expressionBox1.Text +=secondNum+"+"; //根据preOperator,执行对应运算 #region if (preOperaror == "+") { //相加 result = double.Parse(firstNum) + double.Parse(secondNum); } if (preOperaror == "-") { //相减 result = double.Parse(firstNum) - double.Parse(secondNum); } if (preOperaror == "*") { //相乘 result = double.Parse(firstNum) * double.Parse(secondNum); } if (preOperaror == "/") { //除法 result = double.Parse(firstNum) / double.Parse(secondNum); } if (preOperaror == "=") { expressionBox1.Text = firstNum + "+"; } #endregion //清空secondNum,准备接收新值 secondNum = null; a = true; //显示计算结果 firstNum = result.ToString(); resultBox2.Clear(); resultBox2.Text = firstNum ; //将当前按钮运算符存入 preOperaror = "+"; } } } //等号运算符 private void resultBtn_Click(object sender, EventArgs e) { #region if (a == false && secondNum != null)//保证前面有数字串、运算符 { //根据preOperator,执行对应运算 (重复代码) #region if (preOperaror == "+") { //相加 result = double.Parse(firstNum) + double.Parse(secondNum); } if (preOperaror == "-") { //相减 result = double.Parse(firstNum) - double.Parse(secondNum); } if (preOperaror == "*") { //相乘 result = double.Parse(firstNum) * double.Parse(secondNum); } if (preOperaror == "/") { //除法 result = double.Parse(firstNum) / double.Parse(secondNum); } #endregion //显示计算结果 firstNum = result.ToString(); resultBox2.Clear(); resultBox2.Text = firstNum; //清空表达式框 expressionBox1.Clear(); //清空secondNum,准备接收新值 secondNum = null; //用“=”运算符标记preOperaror,继续输入数字可以清空前面状态框 preOperaror = "="; a = true; } #endregion } //删除按钮:删除一个当前正在输入的数字字符串的末尾字符 private void revokeButton_Click(object sender, EventArgs e) { if (a == false && secondNum.Length > 0)//确定当前输入数据不为空 { secondNum = secondNum.Substring(0, secondNum.Length - 1);//删除当前数据最后一个字符 resultBox2.Text = resultBox2.Text.Substring(0, resultBox2.Text.Length - 1);//状态框删除最后一个字符 } } //清除状态框中当前字符串的按钮 private void clearReBtn_Click(object sender, EventArgs e) { //清空当前数字串、状态框 if (!a)//避免删除运算结果 { secondNum = null; resultBox2.Text = null; } }