一. 功能
1)基本功能:实现“普通运算”功能,支持连续运算,如连续输入“2+3×5”后点击“等号”按钮进行运算其结果为25.
2)附加功能:
A,支持“科学运算”功能,即输入表达式时遵循运算符号的优先原则,连续输入“2+3×5”后点击“等号”按钮进行运算其结果为17;
B,支持数字键盘(小键盘)输入功能(焦点不在文本框内时也支持键盘输入);
二. 设计思路
在项目中设计一个计算类,其中包含“普通计算”和“科学计算”功能,即输入数学运算表达式字符串,返回计算结果。直接在项目中调用该类,输出计算结果。
public partial class Form1 : Form
{
string str = string.Empty;
string sumStr;
char[] _operator = { '+', '-', '*', '/', '%' };
string[] strArray;
char[] opArray;
Regex r = new Regex(@"[0-9]");
public Form1()
{
InitializeComponent();
}
private void Press_Button_Click(object sender, EventArgs e)
{
if (textBox2.Text.Contains('='))
{
textBox2.Text = "";
if (r.IsMatch((string)((Button)sender).Tag))//判D断?是?否?接ó着?计?算?
{
str = "";
}
}
if (!str.Contains('.'))
{
str += (string)((Button)sender).Tag;
textBox1.Text = str;
}
else
{
if ((string)((Button)sender).Tag != ".")
{
str += (string)((Button)sender).Tag;
textBox1.Text = str;
}
}
}
private void Clear_Button_Click(object sender, EventArgs e)
{
textBox1.Text = textBox2.Text = "";
str = "";
textBox1.Text = 0.ToString();
}
private void Delete_Button_Click(object sender, EventArgs e)
{
if (str.Length > 0)
{
str = str.Substring(0, str.Length - 1);
if (str.Length == 0)
{
textBox1.Text = "0";
}
else
textBox1.Text = str;
}
}
private static string MyOperate(string strA, string strB, char _operator)
{
double numA = Convert.ToDouble(strA);
double a, b, numB;
double result = 0;
if (strB.Contains('^'))
{
a = Convert.ToDouble(strB.Split('^')[0]);
b = Convert.ToDouble(strB.Split('^')[1]);
numB = Math.Pow(a, b);
}
else if (strB.Contains('Ó'))
{
numB = Math.Sqrt(Convert.ToDouble(strB.Substring(1)));
}
else
{
numB = Convert.ToDouble(strB);
}
switch (_operator)
{
case '+': result = numA + numB; break;
case '-': result = numA - numB; break;
case '*': result = numA * numB; break;
case '/':
{
if (numB == 0)
{
return "除y数簓不?能ü为a零?!?";
}
result = numA / numB;
break;
}
case '%':
{
if (numA.ToString().Contains('.') == true || numB.ToString().Contains('.'))
{
return "不?能ü对?浮?点?数簓求ó余?!?";
}
result = numA % numB;
break;
}
}
return result.ToString();
}
private void Equal_Button_Click(object sender, EventArgs e)
{
if (radioButton1.Checked)
{
sumStr = MyNormalCalculating(str);
}
else
{
sumStr = MyScienceCalculating(str);
}
if (strArray.Length == 1)
{
textBox1.Text = sumStr;
}
else
{
str += '=';
textBox2.Text = str;
textBox1.Text = sumStr;
}
str = sumStr;
}
private string MyScienceCalculating(string s)
{
strArray = str.Split(_operator);
opArray = new char[strArray.Length - 1];
int index = -1;
int numLength = 0;
int opLength = 0;
for (int i = 0; i < strArray.Length - 1; i++)
{
index += (strArray[i].Length + 1);
opArray[i] = str[index];
}
opLength = opArray.Length;
numLength = strArray.Length;
for (int i = 0; i < opLength; i++)
{
if (opArray[i] == '*' || opArray[i] == '/')
{
strArray[i] = MyOperate(strArray[i], strArray[i + 1], opArray[i]);
for (int k = i + 1; k < numLength - 1; k++)
{
strArray[k] = strArray[k + 1];
}
numLength--;
for (int k = i; k < opLength - 1; k++)
{
opArray[k] = opArray[k + 1];
}
opLength--;
}
}
for (int i = 0; i < opLength; i++)
{
strArray[i + 1] = MyOperate(strArray[i], strArray[i + 1], opArray[i]);
}
return strArray[numLength - 1];
}
private string MyNormalCalculating(string s)
{
strArray = str.Split(_operator);
string sum = "0";
char op;
int index = -1;
for (int i = 0; i < strArray.Length; i++)
{
if (i == 0)
{
sum = MyOperate(sum, strArray[i], '+');
}
else
{
index += (strArray[i - 1].Length + 1);
op = s[index];
sum = MyOperate(sum, strArray[i], op);
}
}
return sum;
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case '0': Press_Button_Click(button16, null); break;
case '1': Press_Button_Click(button5, null); break;
case '2': Press_Button_Click(button6, null); break;
case '3': Press_Button_Click(button7, null); break;
case '4': Press_Button_Click(button9, null); break;
case '5': Press_Button_Click(button10, null); break;
case '6': Press_Button_Click(button11, null); break;
case '7': Press_Button_Click(button13, null); break;
case '8': Press_Button_Click(button14, null); break;
case '9': Press_Button_Click(button15, null); break;
case '.': Press_Button_Click(button12, null); break;
case '+': Press_Button_Click(button17, null); break;
case '-': Press_Button_Click(button8, null); break;
case '*': Press_Button_Click(button4, null); break;
case '/': Press_Button_Click(button3, null); break;
case '^': Press_Button_Click(button23, null); break;
case 'Ó': Press_Button_Click(button22, null); break;
case (char)Keys.Enter:
case '=': Equal_Button_Click(Equal_Button, null); break;
case (char)Keys.Back: Delete_Button_Click(Delete_Button, null); break;
}
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
str = string.Empty;
textBox1.Text = "0";
textBox2.Text = "";
}
}