C#普通计算器与科学计算器

一. 功能

  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 = "";
        }

    }


  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验题目:计算器实验 二、实验目的: 1)熟悉.NET的编程方法,掌握项目的创建与使用及安装; 2)熟悉C#编程语言,字符串使用、自定义类、自定义类库等; 3)熟悉Windows应用程序类编程、事件驱动编程; 三、实验内容: 1)参照Windows提供的计算器工具,设计一个与之类似的程序;另外可参考运行效果下载(计算器Demo程序); 2)基本要求:实现“普通运算”功能,支持连续运算,如连续输入“2+3×5”后点击“等号”按钮进行运算其结果为25. 3)附加要求: A,支持“科学运算”功能,即输入表达式时遵循运算符号的优先原则,连续输入“2+3×5”后点击“等号”按钮进行运算其结果为17; B,支持数字键盘(小键盘)输入功能(焦点不在文本框内时也支持键盘输入); 四、实验方法 经过用户的输入得到数学表达式后,可选择以下方法计算结果: 方法1)不定义计算类方法,在程序中直接计算出结果。 方法2)在项目中设计一个计算类(CalculateClass),其中包含“普通计算”和“科学计算”功能,即输入数学运算表达式字符串,返回计算结果。直接在项目中调用该类,输出计算结果。 方法3)在解决方案中增加一个类库(ClassLibrary)项目(在bin\debug下生成dll文件),其中包含计算类(CalculateClass),该类中包含两个方法(普通计算和科学计算),可以根据表达式计算结果。然后在计算器项目中“引用”该类库中的类,输出计算结果; 点评:方法1代码重用性差;方法2代码重用性好,在项目内可方便使用;方法3代码重用性较好,能在不同的项目内重用。 五、实验说明 1)认真分析总结每个“按钮”点击之后的动作(对应的代码); 2)代码的共享:如数字按钮可以共享一个事件代码; 3)考虑操作性或实用性,如支持退格键、异常输入处理等; 4)为突出实验重点,可以不考虑数制转换、复合运算、括号运算等功能; 5)支持小键盘输入时,留意理解窗口的KeyPreview属性,即是否窗口接收键盘事件。另外实现时会涉及到“焦点隐藏”问题,以及按钮的键盘事件等。 6)“麻雀虽小,五脏俱全”,程序很容易出Bug,请认真调试; 7)要想达到界面有特点,不亚于在功能上下功夫。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值