编程环境是vs2005。
代码注释我都写得很详细,几乎可以作为教程来看,希望给像我这样的新人有更多的帮助。
//一楼为图片,源程序
//二楼为源代码
[此贴子已经被作者于2007-4-7 11:22:32编辑过]
[此贴子已经被作者于2007-4-7 11:22:32编辑过]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace jisuanqi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*下面定义在计算过程中将用到的变量,如用户输入的操作数、小数点输入标志等*/
String Op1, Op2;
//预先输入操作数
Boolean DecimaFlag;
//小数点存在吗?
int NumOps;
//操作数个数
String LastInput;
//指示上一次按键事件的类型
int OpFlag;
//指示未完成的操作
String TempReadout;
//下面在窗体装载的时候初始化设计的参变量,例如将操作数的个数清空等。
private void Form1_Load(object sender, EventArgs e)
{
DecimaFlag = false;
//将小数点标志设置为假
NumOps = 0;
//将输入操作数个数设置为0
LastInput = "NONE";
//将最后一次输入标记设置为None
OpFlag = 0;
//将未完成的操作设置为空
Txtread.Text = "0.";
//格式化文本框的输出
}
/*定义一个函数来读取操作数,该函数有一个整型参数,该参数是用来确定用户单击的按钮所对应的数字的,
* 将这个数字字符增加到文本框显示的文本末尾,就实现了数字的输入操作,然后将该结果保存到操作数中,
* 为以后的运算做准备*/
//数字键0-9的click事件过程
//向显示中的数追加新数
public void calculate(int MyNumber)
{
int Index = MyNumber;
//取得单击的按钮对应的数字
if (LastInput != "NUMS")
{
Txtread.Text = "0.";
//格式化输入
DecimaFlag = false;
//设置小数点标志
}
if (DecimaFlag)
{
//表明已经单击过小数点按钮
Txtread.Text = Txtread.Text + MyNumber;
//则直接在文本框文本后面增加字符
}
else
{
//如果小数点标记为假
if (Txtread.Text == "0.")
{
//如果文本框中没有文本
Txtread.Text = MyNumber + ".";
//则将文本框中的字符设置为数字和点
}
else
{
//如果文本框中已经存在了字符
Txtread.Text = Txtread.Text.Substring(0, Txtread.Text.Length - 1) + MyNumber + ".";
//则将文本插入到整数部分的结尾处
}
}
if (LastInput == "NEG")
{
//如果上一次输入为负数
Txtread.Text = "-" + Txtread.Text;
}
LastInput = "NUMS";
//设置本次输入标记为正数
}
//给小数点增加操作代码,设置小数点标志
//小数点按钮的click事件过程
//如果上一次按键为运算符,初始化txtread为“0.”
//否则在显示时追加一个小数点
private void button10_Click(object sender, EventArgs e)
{
if (LastInput == "NEG")
{
//如果输入的负数
Txtread.Text = "-0.";
//按照负数格式输出
}
else if (LastInput != "NUMS")
{
//如果上一次输出的是正数
Txtread.Text = "0.";
//则按照整数格式输出
}
DecimaFlag=true;
//设置小数点标记为真
LastInput="NUMS";
//设置输入标志为正数
}
//在单击各个按钮时调用上面设计的输入函数来设置输入的操作数,在调用输入函数时,加入相应的参数,
//因为这个参数是与要输入的数字相一致的,所以只要根据按钮上的Text属性中的数字来填写参数即可。
private void Number1_Click(object sender, EventArgs e)
{
calculate(1);
}
private void Number2_Click(object sender, EventArgs e)
{
calculate(2);
}
private void Number3_Click(object sender, EventArgs e)
{
calculate(3);
}
private void Number4_Click(object sender, EventArgs e)
{
calculate(4);
}
private void Number5_Click(object sender, EventArgs e)
{
calculate(5);
}
private void Number6_Click(object sender, EventArgs e)
{
calculate(6);
}
private void Number7_Click(object sender, EventArgs e)
{
calculate(7);
}
private void Number8_Click(object sender, EventArgs e)
{
calculate(8);
}
private void Number9_Click(object sender, EventArgs e)
{
calculate(9);
}
private void Number0_Click(object sender, EventArgs e)
{
calculate(0);
}
//定义一个计算函数来实现各种计算操作,该计算函数有一个参数,这个参数用来标志是哪一种计算
//并且根据操作数的个数和菜做符号的种类,分别进行操作,最后将操作结果返回文本框,显示给用户
//运算符(+、-、*、/、=)的click事件过程
//如果接下来的按键是数字键,增加NumOps
//如果有一个操作数,则设置Op1;
//如果有两个操作数,则将Op1设置为Op1与当前输入字符串的运算结果,并显示结果
public void OperatorCal(int MyOperator)
{
//取得操作代号
int Index = MyOperator;
//取得文本框文本
TempReadout = Txtread.Text;
//设置文本框最后一次输入类型
if (LastInput == "NUMS")
{
NumOps = NumOps + 1;
//将操作数加一
}
String Myop;
Myop = NumOps.ToString();
switch (NumOps)
{
case 0:
if (MyOperator == 3 && LastInput != "NEG")
{
Txtread.Text = "-" + Txtread.Text;
LastInput = "NEG";
}
//如果有一个操作数
break;
case 1:
Op1 = Txtread.Text;
if(MyOperator == 3 && LastInput != "NUMS"&&OpFlag!=4)
{
Txtread.Text = "-";
LastInput = "NEG";
}
//如果有两个操作数
break;
case 2:
//取得第二个操作数
Op2 = TempReadout;
//根据操作标记进行不同的操作
switch (OpFlag)
{
//如果是加法操作
case 1:
Op1 = (Double.Parse(Op1) + Double.Parse(Op2)).ToString();
//将两个操作数相加然后复制给操作数1
//如果是减法
break;
case 3:
Op1 = (Double.Parse(Op1) - Double.Parse(Op2)).ToString();
//将两个操作数相减然后复制给操作数1
//如果是乘法
break;
case 2:
Op1 = (Double.Parse(Op1) * Double.Parse(Op2)).ToString();
//将两个操作数相乘然后复制给操作数1
//如果是除法
break;
case 0:
//首先判断出书是否为0
if (Double.Parse(Op2) == 0)
{
//如果为0则显示除数不能为0的提示框
MessageBox.Show("除数不能为0", "计算器");
}
else
{
Op1 = (Double.Parse(Op1) / Double.Parse(Op2)).ToString();
//将两个操作数相除然后复制给操作数1
}
break;
//如果是等号操作
case 4:
//取得当前值
Op1 = Op2;
break;
}
Txtread.Text = Op1;
//则显示计算结果
NumOps = 1;
//将操作数个数设置为一个
break;
}
if (LastInput != "NEG")
{
//如果最后一次输入是负数
LastInput = "OPS";
//设置输入类型
OpFlag = MyOperator;
//设置输入操作类型
}
}
//在各个操作按钮中调用上面函数,实现各种操作
private void Btnjian_Click(object sender, EventArgs e)
{
OperatorCal(3);//减法
}
private void Btnchu_Click(object sender, EventArgs e)
{
OperatorCal(0);//除法
}
private void Btncheng_Click(object sender, EventArgs e)
{
OperatorCal(2);//乘法
}
private void Btnjia_Click(object sender, EventArgs e)
{
OperatorCal(1);//加法
}
private void Btndy_Click(object sender, EventArgs e)
{
OperatorCal(4);//等号
}
//给百分号按钮增加操作代码,如果调用了百分号操作,只要将操作数缩小100即可
private void Btnbf_Click(object sender, EventArgs e)
{
//百分比键的click事件过程如下
//计算并显示第一个操作数的百分数
Txtread.Text = (Double.Parse(Txtread.Text) / 100).ToString();
LastInput = "Ops";
NumOps = NumOps + 1;
DecimaFlag = true;
}
//给c按钮增加实现代码,该按钮是用来清空左右操作的
//该操作的主要任务是初始化运算中用到的各个参数
//c按钮的click事件过程
//重新设置显示并初始化变量
private void Btnc_Click(object sender, EventArgs e)
{
Txtread.Text = "0.";
//格式化输出
Op1 = "";
//将操作数一清零
Op2 = "";
//将操作数二清零
Form1_Load(this, new System.EventArgs());
//调用窗体载入时的操作
}
//给ce按钮增加操作代码,该按钮左右用来清空错误输入用的
//与c的不同之处在于本按钮的操作是要保留原来的计算结果,只是清空本次输入而已
//ce按钮的click事件
private void Btnce_Click(object sender, EventArgs e)
{
//格式化文本框的输出
Txtread.Text = "0.";
//设置小数标记为假
DecimaFlag=false;
//指示上一次输入的类型
LastInput="CE";
}
}
}