📄 form1.cs
字号:
//
// numBox
//
this.numBox.Location = new System.Drawing.Point(21, 16);
this.numBox.Name = "numBox";
this.numBox.Size = new System.Drawing.Size(275, 21);
this.numBox.TabIndex = 8;
this.numBox.Text = "";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(320, 237);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.numBox,
this.panel2,
this.panel1});
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false;
this.Name = "Form1";
this.Text = "MyCalcApp";
this.Load += new System.EventHandler(this.Form1_Load);
this.panel1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//枚举类型,各种操作符
enum calcOperators:int
{
add,sub,mul,div,log,exp,sqr,result
};
//枚举类型,2个运算阶段,第一个阶段中读取第一个操作数和第一个运算符,第二个阶段中读取第二个操作数和第二个运算符
enum calcPeriod:int
{
pfirstnum,psecondnum
};
//两个操作数
private double firstNumber,secondNumber;
//前一个操作符和当前操作符
private calcOperators oldOp,newOp;
//当前运算阶段
private calcPeriod myPeriod;
//第二阶段是否可以重复进行
private bool dosecondAgain = false;
//调用MyNumberBox的reSet方法,设置文本“0.”。同时计算阶段设为1
private void Form1_Load(object sender, System.EventArgs e)
{
numBox.reSet ();
myPeriod = calcPeriod.pfirstnum ;
}
//调用MyNumberBox的reSet方法,重置文本“0.”。同时计算阶段设为1
private void btnC_Click(object sender, System.EventArgs e)
{
numBox.reSet ();
myPeriod = calcPeriod.pfirstnum ;
}
//调用MyNumberBox的MyInputKey方法,向文本框中输入字符
private void btn0_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '0');
}
private void btn1_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '1');
}
private void btn2_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '2');
}
private void btn3_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '3');
}
private void btn4_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '4');
}
private void btn5_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '5');
}
private void btn6_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '6');
}
private void btn7_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '7');
}
private void btn8_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '8');
}
private void btn9_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '9');
}
private void btndot_Click(object sender, System.EventArgs e)
{
numBox.MyInputKey (this, '.');
}
//设置当前运算符,调用MyCalc方法计算
private void btnAdd_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.add ;
MyCalc();
}
private void btnSub_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.sub ;
MyCalc();
}
private void btnMul_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.mul ;
MyCalc();
}
private void btnDiv_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.div ;
MyCalc();
}
private void btnLog_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.log ;
MyCalc();
}
private void btnExp_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.exp ;
MyCalc();
}
private void btnSqr_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.sqr;
MyCalc();
}
private void btnResult_Click(object sender, System.EventArgs e)
{
newOp = calcOperators.result ;
MyCalc();
}
//根据当前计算阶段和操作数,进行计算
private void MyCalc()
{
switch (myPeriod)
{
//计算的第一阶段,读第一个操作数
case calcPeriod.pfirstnum :
firstNumber = numBox.InputNumber ;
switch (newOp)
{ //如果是+-*÷,进入第二阶段
case calcOperators.add :
case calcOperators.sub :
case calcOperators.mul :
case calcOperators.div :
myPeriod = calcPeriod.psecondnum ;
oldOp = newOp;
break;
//如果是=,什么也不做
case calcOperators.result :
break;
//如果是log,exp,sqrt,对第一个操作数运算
case calcOperators.log :
case calcOperators.exp :
case calcOperators.sqr :
MyDoOne(ref firstNumber);
break;
}
break;
case calcPeriod.psecondnum :
switch (newOp)
{ //如果是+-*÷
case calcOperators.add :
case calcOperators.sub :
case calcOperators.mul :
case calcOperators.div :
//如果已经有新输入操作数,或者需要再次计算
if ((!numBox.reInput )||(dosecondAgain))
{
dosecondAgain = false;
secondNumber = numBox.InputNumber;
//读取第二个操作数,计算
MyDoTwo(ref firstNumber,secondNumber);
}
else
{ //没有输入第二个操作数,记录当前运算符
oldOp = newOp;
}
break;
//如果是=
case calcOperators.result :
if ((!numBox.reInput )||(dosecondAgain))
{
dosecondAgain = false;
secondNumber = numBox.InputNumber;
MyDoTwo(ref firstNumber,secondNumber);
}
//设置计算阶段为第一阶段,等待重新输入第一个数,或者操作符
myPeriod = calcPeriod.pfirstnum ;
break;
//如果是log,exp,sqrt
case calcOperators.log :
case calcOperators.exp :
case calcOperators.sqr :
//如果输入第二个操作数
if (!numBox.reInput)
{
secondNumber = numBox.InputNumber ;
//计算第二个操作数的函数,可以再次计算
MyDoOne(ref secondNumber);
dosecondAgain = true;
}
else
{ //没有输入第二个操作数,计算第一个操作数的函数
MyDoOne(ref firstNumber);
}
break;
}
break;
}
//再次输入需先清除,也表示尚未再次输入
numBox.reInput = true;
}
//进行两元运算符计算,结果存入第一个操作符
private void MyDoTwo(ref double num1,double num2)
{
switch (oldOp)
{
case calcOperators.add :
num1 = num1+num2;
break;
case calcOperators.sub :
num1 = num1-num2;
break;
case calcOperators.mul :
num1 = num1*num2;
break;
case calcOperators.div :
num1 = num1/num2;
break;
}
oldOp = newOp;
//显示结果,并进行判断,决定是否在最后面显示“.”
numBox.Text = String.Format ("{0}{1}",num1.ToString (),
(num1.ToString ().IndexOf ('.')==-1)?".":"");
}
//进行一元运算符计算,即各个函数的计算,结果保存在操作数中
private void MyDoOne(ref double number)
{
try
{
switch (newOp)
{
case calcOperators.log :
number = Math.Log10 (number);
break;
case calcOperators.exp :
number = Math.Exp (number);
break;
case calcOperators.sqr :
number = Math.Sqrt (number);
break;
}
}
catch(Exception ex){
MessageBox.Show (ex.Message);
numBox.reSet ();
numBox.reInput = true;
myPeriod = calcPeriod.pfirstnum ;
}
//显示结果,并进行判断,决定是否在最后面显示“.”
numBox.Text = String.Format ("{0}{1}",number.ToString (),
(number.ToString ().IndexOf ('.')==-1)?".":"");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -