参考《C#从入门到项目实践》边学习,边练习实现。
Windows计算器的制作
此次练习的计算器应用软件在Visual Studio 2019编程环境中开发,是一个简单的窗体应用程序,实现简单的计算器功能。
1、系统功能描述
Windows计算器是利用C#程序设计编写一个简易计算器程序,可以进行简单的加、减、乘、除运算,还可以实现对三角函数、对数、指数等高级运算的功能。
整个系统的功能结构图如下:
用户可以在窗体程序中,添加计算器窗体,建立Windows应用程序的框架。因此,通过添加两个窗体控件Form1和Form2分别用来添加两个窗体控件Form1和Form2,分别用来表示科学计算器和普通计算器。然后添加Button控件建立程序的主要界面。最后在每个按钮的代码段中,分别添加事件触发的处理代码。控件textBox1,显示输入的信息和处理后的结果。
2、系统功能分析及实现
在C#中,基于Windows应用程序设计方法是事件驱动的。事件驱动不是由程序的顺序来控制,而是由事件的发生来控制的。事件驱动程序设计是围绕消息的产生与处理而展开的,消息就是关于发生的事件的信息。Windows程序员的工作就是对所开发的应用程序所要发出或者接收的消息进行排序和管理。
2.1、功能分析
控件表示用户和程序之间的图形化连接。控件可以提供或处理数据、接受用户输入、对事件作出响应或执行连接用户和应用程序的其他功能。窗体中的控件有很多,工具箱中的Windows窗体里包含所有的Windows标准控件。通过在属性窗口改变控件的属性可以改变控件的外观和特性。本项目需要用到以下控件。
(1)按钮(Button)控件:在Form1窗体中,添加30个Button控件,其中有10个数字按钮,16个运算按钮,1个用于计算的等号按钮,2个用于清空的按钮。在Form2窗体中,添加17个Button控件,其中10个数字按钮,4个运算按钮,1个用于计算的等号按钮,1个用于清空的按钮。
(2)文本框(TextBox)控件:Form1和Form2中分别添加一个TextBox控件,用于显示计算结果。
(3)菜单栏(MenuStrip)控件:在Form1和Form2中分别添加MenuStrip控件,并修改该控件中的ToolStripMenultem菜单项的Text属性为“机型转换”。该控件可以实现两个窗体之间的相互转换。
两个窗体如图所示:
2.2、功能实现
在窗体设计器中看到的是窗体及其中的控件,而要为控件添加事件处理程序就必须先切换到代码编辑器状态。下面分析计算器中各个控件到底该添加什么样的代码。
1、数字0-9的功能设计
对于计算器来说,当单击某个数字按钮后,结果显示区内应显示该按钮上的数字。因此,可以双击按钮1,切换到代码编辑器,此时光标就会停留在该按钮所对应的代码处,输入下列代码:
private void btNumber1_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "1";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
注意:在代码中数字键0-9只需要将上述代码中的1改为相应的数字。
2、小数点功能的设计
private void BtComma_Click(object sender, EventArgs e)
{
if (textBox1.Text.IndexOf(".") < 0)
textBox1.Text += ((Button)sender).Text;
else
{ }
}
3、加减乘除的设计:加设计
private void BtAdd_Click(object sender, EventArgs e)
{
Op = "+";
Op2 = Op1;
textBox1.Text = "";
}
4、三角函数的设计:sin设计
private void Btsin_Click(object sender, EventArgs e)
{
Convert.ToDouble(Op1);
textBox1.Text = System.Convert.ToString(Op1 * Math.PI / 180);
}
5、整体程序代码
(1)主窗体Form1.cs文件中的代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace A001_calculator
{
public partial class Form1 : Form
{
private string Op;
private double Op1;
private double Op2;
private double result;
public Form1()
{
InitializeComponent();
}
//数字键1
private void btNumber1_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "1";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键2
private void btNumber2_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "2";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键3
private void btNumber3_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "3";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键4
private void btNumber4_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "4";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键5
private void btNumber5_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "5";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键6
private void btNumber6_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "6";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键7
private void btNumber7_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "7";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键8
private void btNumber8_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "8";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键9
private void btNumber9_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "9";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键0
private void btNumber0_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "0";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//加功能
private void BtAdd_Click(object sender, EventArgs e)
{
Op = "+";
Op2 = Op1;
textBox1.Text = "";
}
//减功能
private void BtSubtract_Click(object sender, EventArgs e)
{
Op = "-";
Op2 = Op1;
textBox1.Text = "";
}
//乘功能
private void BtMult_Click(object sender, EventArgs e)
{
Op = "*";
Op2 = Op1;
textBox1.Text = "";
}
//除功能
private void BtDivision_Click(object sender, EventArgs e)
{
Op = "/";
Op2 = Op1;
textBox1.Text = "";
}
//%功能
private void BtRemedial_Click(object sender, EventArgs e)
{
Op = "%";
Op2 = Op1;
textBox1.Text = "";
}
//Del功能
private void BtDel_Click(object sender, EventArgs e)
{
if(textBox1.Text.Length>=1)
{
textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);
}
if(textBox1.Text.Length==0)
{
textBox1.Text = "";
}
}
//小数点功能
private void BtComma_Click(object sender, EventArgs e)
{
if (textBox1.Text.IndexOf(".") < 0)
textBox1.Text += ((Button)sender).Text;
else
{ }
}
//等于功能
private void BtDebgyu_Click(object sender, EventArgs e)
{
switch (Op)
{
case "+":
result = Op2 + Op1;
break;
case "-":
result = Op2 - Op1;
break;
case "/":
if(Op2==0)
{
Console.WriteLine("错误,被除数不能为0!");
}
else
{
result = Op2 / Op1;
}
break;
case "%":
result = Op2 % Op1;
break;
case "^":
int m;double n;
m = 1;n = Op2;
while (m+1<=Op1)
{
n = n * Op2;
m++;
}
result = n;
break;
}
textBox1.Text = System.Convert.ToString(result);
}
//sin功能
private void Btsin_Click(object sender, EventArgs e)
{
Convert.ToDouble(Op1);
textBox1.Text = System.Convert.ToString(Math.Sin(Op1 * Math.PI / 180));
}
//cos功能
private void Btcos_Click(object sender, EventArgs e)
{
Convert.ToDouble(Op1);
textBox1.Text = System.Convert.ToString(Math.Cos(Op1 * Math.PI / 180));
}
//tan功能
private void Bttan_Click(object sender, EventArgs e)
{
Convert.ToDouble(Op1);
textBox1.Text = System.Convert.ToString(Math.Tan(Op1 * Math.PI / 180));
}
//阶乘功能
private void BtFactorial_Click(object sender, EventArgs e)
{
int i, j;
i = 1;j = 1;
while (i<=Op1)
{
j *= i;
i++;
}
textBox1.Text = System.Convert.ToString(j);
}
//平方功能
private void BtSquare_Click(object sender, EventArgs e)
{
textBox1.Text = System.Convert.ToString(Op1 * Op1);
}
//立方功能
private void BtCube_Click(object sender, EventArgs e)
{
textBox1.Text = System.Convert.ToString(Op1 * Op1 * Op1);
}
//π功能
private void BtPI_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + Math.PI;
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//清屏功能
private void BtClear_Click(object sender, EventArgs e)
{
textBox1.Text = "";
Op = "";
Op1 = 0;
Op2 = 0;
result = 0;
}
//幂运算功能
private void BtPower_Click(object sender, EventArgs e)
{
Op = "^";
Op2 = Op1;
textBox1.Text = "";
}
//10^x功能
private void BtIndex_Click(object sender, EventArgs e)
{
int a = 1;
int b = 1;
while(a<=Op1)
{
b *= 10;
a++;
}
textBox1.Text = System.Convert.ToString(b);
}
//Log功能
private void Btlog_Click(object sender, EventArgs e)
{
textBox1.Text = System.Convert.ToString(Math.Log10(Op1));
}
//ln功能
private void BtLn_Click(object sender, EventArgs e)
{
textBox1.Text = System.Convert.ToString(Math.Log(Op1));
}
private void 机型转换ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 stu = new Form2();
this.Hide();
stu.ShowDialog();
this.Close();
}
}
}
(2)主窗体Form2.cs文件中的代码。
using System;
using System.Windows.Forms;
namespace A001_calculator
{
public partial class Form2 : Form
{
private string Op;
private double Op1;
private double Op2;
private double result;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
//数字键1
private void btNumber1_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "1";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键2
private void btNumber2_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "2";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键3
private void btNumber3_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "3";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键4
private void btNumber4_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "4";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键5
private void btNumber5_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "5";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键6
private void btNumber6_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "6";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键7
private void btNumber7_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "7";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键8
private void btNumber8_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "8";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键9
private void btNumber9_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "9";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
//数字键0
private void btNumber0_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text + "0";
Op1 = System.Convert.ToDouble(textBox1.Text);
}
private void BtComma_Click(object sender, EventArgs e)
{
if (textBox1.Text.IndexOf(".") < 0)
textBox1.Text += ((Button)sender).Text;
else
{ }
}
private void BtDebgyu_Click(object sender, EventArgs e)
{
switch (Op)
{
case "+":
result = Op2 + Op1;
break;
case "-":
result = Op2 - Op1;
break;
case "/":
if (Op2 == 0)
{
Console.WriteLine("错误,被除数不能为0!");
}
else
{
result = Op2 / Op1;
}
break;
case "%":
result = Op2 % Op1;
break;
case "^":
int m; double n;
m = 1; n = Op2;
while (m + 1 <= Op1)
{
n = n * Op2;
m++;
}
result = n;
break;
}
textBox1.Text = System.Convert.ToString(result);
}
private void BtAdd_Click(object sender, EventArgs e)
{
Op = "+";
Op2 = Op1;
textBox1.Text = "";
}
private void BtSubtract_Click(object sender, EventArgs e)
{
Op = "-";
Op2 = Op1;
textBox1.Text = "";
}
private void BtMult_Click(object sender, EventArgs e)
{
Op = "*";
Op2 = Op1;
textBox1.Text = "";
}
private void BtDivision_Click(object sender, EventArgs e)
{
Op = "/";
Op2 = Op1;
textBox1.Text = "";
}
private void BtClear_Click(object sender, EventArgs e)
{
textBox1.Text = "";
Op = "";
Op1 = 0;
Op2 = 0;
result = 0;
}
private void 机型转换ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 stu = new Form1();
this.Hide();
stu.ShowDialog();
this.Close();
}
}
}
3、运行程序
运行程序,在科学计算器界面。首先输入6,然后单击计算阶乘的按钮,便会得到6!为720。
在科学计算器界面左上角单击“机型转换”后转换成普通计算器界面,这个机型转换键可以实现科学计算器与普通计算器之间的转换。
4、源码下载
有感兴趣的同学可以点击下载源码