计算器实验

来源:互联网 发布:c语言 整数奇偶排序 编辑:程序博客网 时间:2024/05/01 09:34

一.    实验要求

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(newChar[] { '+','-', '*', '/' });

               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事件,只需识别好每个键的值就可以了。

0 0