事件函数的两个参数的定义:private void button21_Click(object sender, EventArgs e)
{
button a=(button)sender;
}
sender:事件主体(事件的触发对象)
EvenArgs:事件数据(参数)
例如:可以通过a访问button21的其他属性;
开发计算器过程:
先分析最简单的现实情况:两个数
目标清晰;
成果展示:
SNAGHTMLcf1651
思路:
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;
}
}