一. 实验要求
1)参照Windows提供的计算器工具,设计一个与之类似的程序;另外可参考运行效果下载;
2)基本要求:实现“普通运算”功能,支持连续运算,如连续输入“2+3×5”后点击“等号”按钮进行运算其结果为25.
3)附加要求:
A,支持“科学运算”功能,即输入表达式时遵循运算符号的优先原则,连续输入“2+3×5”后点击“等号”按钮进行运算其结果为17;
B,支持数字键盘(小键盘)输入功能(焦点不在文本框内时也支持键盘输入);
二. 设计思路
1)先设计界面,然后定义每一个按钮对应的事件,相同的事件可重用,重用的方法是在Clik中添加重用的事件;
2)焦点不在文本框内时支持键盘输入:先在界面的属性框内将KeyPreview属性设置成True,然后除了该文本框外的其他控件的TabStop属性设置成False,将文本框的TableIndex设置成0。
核心代码
namespace Calculate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private voidqingchu()
{
textBox1.Text = null;
textBox2.Text = null;
}
private double s_d(string b)
{
string a = b;
int i =a.IndexOf('.');
int k = 0;
double l = 0;
double result = 0;
if (i < 0)
for (; k < a.Length; k++) { result=result * 10 + a[k] - '0'; }
else
{
for(k = 0; k < i; k++) { result = result * 10 + a[k] - '0';}
for (k = k + 1, l = 1; k < a.Length;k++, l = l * 10) { result = result * 10 + a[k] - '0';}
result = result / l;
}
return result;
}
private double deal(double num1, doublenum2,char a)
{
double result=0;
switch (a)
{
case '+':result=num1 + num2; break;
case '-':result = num1 - num2; break;
case'*': result = num1 * num2; break;
case '/':result = num1 / num2; break;
default: break;
}
return result;
}
private voidbutton10_Click(object sender, EventArgs e)//0 1 2 3 45 6 7 8 9
{
Button a=(Button)sender;
//textBox2.Text += " f ";
textBox1.Text += ((Button)sender).Tag.ToString();
//textBox1.Focus();
}
private void button22_Click(object sender, EventArgse)//←?
{
string a = textBox1.Text;
if (a.Length > 0) textBox1.Text =a.Remove(a.Length - 1);
//textBox1.Focus();
}
private voidbutton23_Click(object sender, EventArgs e)//C
{
qingchu();
textBox1.Focus();
}
private voidbutton14_Click(object sender, EventArgs e)//+ - * /
{
//textBox2.Text += " a ";
string a = textBox1.Text;
int b =a.Length;
if (b > 0 && a[b - 1] <= '9' && a[b - 1] >= '0') textBox1.Text += ((Button)sender).Tag.ToString();
//textBox1.Focus();
}
private voidForm1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
switch (e.KeyChar)
{
case (char)(Keys.Enter): button13_Click(button13, null); break;
case '=':button13_Click(button13,null); break;
case (char)Keys.Back: button22_Click(button22, null); break;
case '+':button14_Click(button15, null); break;
case '-':button14_Click(button14, null); break;
case '/': button14_Click(button18, null); break;
case '*':button14_Click(button19, null); break;
case '.':button12_Click(button12, null); break;
case '0': button10_Click(button10, null); break;
case '1':{ button10_Click(button1, null); } break;
case '2': button10_Click(button2, null); break;
case '3':button10_Click(button3, null); break;
case '4':button10_Click(button4, null); break;
case '5':button10_Click(button5, null); break;
case '6': button10_Click(button6, null); break;
case '7':button10_Click(button7, null); break;
case '8':button10_Click(button8, null); break;
case '9':button10_Click(button9, null); break;
default:break;
}
}
private voidbutton13_Click(object sender, EventArgs e)//=
{
string a = textBox1.Text;
//
if (a[a.Length - 1] >= '0' && a[a.Length - 1] <= '9')
{
textBox2.Text = a;
//textBox1.Text = null;
string fuhao = "";
double[] num = newdouble[100];
string[] split = a.Split(new Char[] { '+', '-', '*', '/' });
for (inti = 0; i < a.Length; i++)
{
if(a[i] == '-' || a[i] == '/' || a[i] == '*'|| a[i] == '+') fuhao += a[i];
}
for (inti = 0; i < split.Length; i++)
{
num[i] = s_d(split[i]);
}
if (radioButton1.Checked)//普通运算
{
intp = 0;
doubleresult = num[0];
for(int i = 1; i < split.Length; i++)
{
if (fuhao[i] == '/' &&num[i] == 0) { p = 1; break; }
else result = deal(result, num[i], fuhao[i]);
}
if(p == 1) textBox1.Text = "除数不能为0!";
elsetextBox1.Text = result.ToString();
}
else//科?学¡ì运?算?
{
char[]b = { '*', '/'};
doubleresult = 0;
intp=0;
intindex = fuhao.IndexOfAny(b);
for(;index>=0;index= fuhao.IndexOfAny(b))//找到/*号先计算
{
if (num[index] == 0 && fuhao[index] == '/') { p = 1; break;}
else
{
result =deal(num[index - 1], num[index], fuhao[index]);
num[index-1]=result;
for (int i = index; i< fuhao.Length - 1; i++) num[i] = num[i + 1];//数字往前挪
string f=" ";
for (int i = 1; i< index; i++) f += fuhao[i];
for (int i = index; i< fuhao.Length - 1; i++) f += fuhao[i + 1];
fuhao = f;
}
}
if(fuhao.Length > 1&&p==0)
{
//textBox2.Text = result.ToString();
p = 0;
result = num[0];
for(int i = 1; i < fuhao.Length; i++)
{
result = deal(result,num[i], fuhao[i]);
}
}
if(p == 1) textBox1.Text = "除数不能为0!";
else textBox1.Text = result.ToString();
}
}
//textBox1.Focus();
}
private voidpanel1_Paint(object sender, PaintEventArgs e)
{
}
private void radioButton1_CheckedChanged(object sender, EventArgse)
{
textBox1.Focus();
textBox1.Text = null;
textBox2.Text = null;
}
private voidbutton12_Click(object sender, EventArgs e)//.
{
//textBox2.Text+= " a ";
string a = textBox1.Text;
int b = a.Length;
int i = a.IndexOf('.');
if (i < 0 && b > 0&& a[b - 1] <= '9' && a[b- 1] >= '0') textBox1.Text += ".";
textBox1.Focus();
}
}
}
三. 程序运行效果图
A.普通运算
1+2*3=9
B.科学运算
1+2*3=7
4实验总结
在写这个实验时,我第一个解决的问题是如何解决焦点不在文本框内时支持键盘输入,主要是处理好其他控件的焦点问题。第二个解决的问题是组合键的输入,首先我用的是keyup事件,但是发现自己解决不了问题,接下来用的是keypress事件,只需识别好每个键的值就可以了。