⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 基于编译原理的表达式计算器 使用算符优先算法实现了表达式计算器
💻 CS
📖 第 1 页 / 共 4 页
字号:
        }

        private void S10()     //函数S10判断负号输入是否正确
        {
            if (logo[n - 1] != 6 && logo[n - 1] != 9)
            {
                label4.Text = "输入错误,负号输入错误!";
                MessageBox.Show("输入错误,负号输入错误!");
            }

            n = n + 1;
        }


        //运算函数
        private double Count(string op, string numleft, string numright)
        {
            double left, right;
            left = 0;
            right = 0;
            if (numleft == "$")
                left = 0;
            else
                left = Convert.ToDouble(numleft);
            if (numright == "$")
                right = 0;
            else
                right = Convert.ToDouble(numright);
            double result;
            switch (op)
            {
                case "+": result = left + right; return result;
                case "-": result = left - right; return result;
                case "*": result = left * right; return result;
                case "/": if (right == 0.0) { label4.Text = "除法运算中,除数不能为0!"; return 0; }
                    result = left / right; return result;
                case "^": result = Math.Pow(left, right); return result;//乘方
                case "@": result = -right; return result;//取负
                case "%": result = left / 100; return result;
                case "sin":
                    result = Math.Sin(right); return result;
                case "cos":
                    result = Math.Cos(right); return result;
                case "tg":
                    result = Math.Tan(right); return result;
                case "ctg":
                    result = 1.0 / Math.Tan(right); return result;
                case "acos":
                    result = Math.Acos(right); return result;
                case "asin":
                    result = Math.Asin(right); return result;
                case "atg":
                    result = Math.Atan(right); return result;
                case "actg":
                    result = 1.0 / Math.Atan(right); return result;

                case "sqrt":
                    if (left < 0.0) { label4.Text = "开方运算中,开方数必须大于等于0!"; return 0; }//开平方
                    else
                    {
                        result = Math.Sqrt(right); return result;
                    }
                case "cbrt":               //开三次方
                    result = Math.Pow(right, 1.0 / 3.0); return result;

                case "ln":
                    result = Math.Log(2.7182818, right); return result;   //e=2.7182818...
                case "log":
                    result = Math.Log(left, right); return result;		//left为底数 log(100,10)=2
                case "lg":
                    result = Math.Log10(right); return result;
                default:
                    return 0.0;
            }
        }


        //语法分析
        private void YuFa(string input, int n)
        {
            double result;                       //存储运算后的运算结果
            string numleft, numright;           //存储待运算的运算数
            string signleft, signright;         //存储待比较运算优先关系的运算符
            string[] num = new string[100];    //存储未运算的运算数
            string[] sign = new string[100];    //存储未运算的运算符号
            string str, op;
            char prior;  //记录两运算符的位置比较优先关系
            str = null;
            int i, j, k, f, p;
            int mark;     //循环标记
            int remsl, remsr;  //remsl记录signleft在优先关系表中纵向的位置,remsr记录signright在优先关系表中横向的位置
            numleft = null;
            numright = null;
            signleft = null;
            signright = null;
            op = "+-*/()^@%$,#"; //设置优先关系表的横向符号顺序
            remsl = -1;
            remsr = -1;
            prior = '?';
            mark = 0;
            result = 0;
            i = 0;
            k = 0;
            p = 0;
            //优先关系表的优先关系
            //+               -                *             /               (               )                  ^               @             %                函数          ,                #
            string[] precede ={ ">><<<><<<<>>", ">><<<><<<<>>", ">>>><><<<<>>", ">>>><><<<<>>", "<<<<<=<<<<< ", ">>>> >> > >>", ">>>><>><   >", ">>>> >> <<<>", ">>>> >> > >>", ">>>><>><<<>>", "<<<<<><<<<  ", "            " };

            while (mark != 2)
            {
                if (signleft == "#" && k == 0 && i > n)   //判断运算是否完成
                    mark = 2;
                if (mark == 0)
                {
                    if (logo[i] < 3 && logo[i] > 0) //判断是否为运算数
                    {

                        while (logo[i] < 3)
                        {
                            str = str + input[p];
                            p = p + 1;
                            i = i + 1;

                        }
                        if (numleft == null)
                        {
                            if (signleft != null)
                            {
                                if (signleft == "(" || signleft.Length > 1 || signleft == "@")
                                    numleft = "$";
                                else
                                    numleft = str;
                            }
                            else
                                numleft = str;
                        }
                        else if (numleft != null)
                        {
                            if (signright != null)
                            {
                                if (signright == "(" || signright.Length > 1 || signleft == "@")
                                    numright = "$";
                            }
                            else
                                numright = str;

                        }
                        str = null;
                    }
                    else if (logo[i] > 2)       //判断是否未运算符
                    {
                        if (zi[i] > 1)    //判断长度大于1的运算符
                        {
                            for (j = 0; j < zi[i]; j++)

                                str = str + Convert.ToString(input[p + j]);
                            p = p + zi[i];
                            i = i + 1;

                        }
                        else if (zi[i] == 1)  //判断长度为1的运算符
                        {
                            str = Convert.ToString(input[p]); p = p + 1; i++;
                        }
                        if (signleft == null)
                        {
                            signleft = str;
                            if (signleft == "@" || signleft == "(" || signleft.Length > 1) //当为负号,(,以及长度大于1(sin,log,sqat等)的运算符相对应的运算数设为“$”
                                numleft = "$";
                        }
                        else if (signleft != null)
                        {
                            signright = str;
                            if (signright == "(" || signright.Length > 1 || signright == "@")
                                numright = "$";
                        }
                        str = null;

                    }
                }
                else if (mark == 1 && k - 1 > -1) //把存储在sign与num两数组中的运算符与运算数取出比较,即向前读运算式子input
                {
                    signright = signleft;
                    numright = numleft;
                    signleft = sign[k - 1];
                    numleft = Convert.ToString(num[k - 1]);
                    k = k - 1;
                    if (k - 1 < 0)  //当sign与num两数组中的运算符与运算数为空,则向后读运算式子input
                        mark = 0;

                }

                if (signleft != null && signright != null)  //找到两运算符表中的位置
                {
                    for (f = 0; f < 12; f++)
                    {
                        if (signleft == Convert.ToString(op[f]))
                        {
                            remsl = f;
                            break;

                        }
                        else if (f == 11 && signleft != Convert.ToString(op[f]))  //对函数统一起来,用“$”在表中表示
                        {
                            remsl = 9;

                        }
                    }

                    for (f = 0; f < 12; f++)
                    {
                        if (signright == Convert.ToString(op[f]))
                        {
                            remsr = f;
                            break;
                        }
                        else if (f == 11 && signright != Convert.ToString(op[f])) //对函数统一起来,用“$”在表中表示
                        {
                            remsr = 9;

                        }
                    }

                }
                if (remsl != -1 && remsr != -1)
                {
                    prior = precede[remsl][remsr]; //找出两运算符的优先关系
                    switch (prior)
                    {
                        case '>':  //做运算操作
                            {
                                if (signleft == ")")
                                {
                                    // i = i - 1;
                                    mark = 1;
                                }
                                else if (signleft == "," && signright == ")")
                                {
                                    for (j = 0; j < k; j++)
                                    {
                                        if (sign[j] == "log")
                                        {
                                            num[j] = numleft;
                                            break;
                                        }
                                    }
                                    signleft = signright;
                                    numleft = numright;
                                    numright = null;
                                    signright = null;
                                    if (k > 0)
                                    {
                                        mark = 1;
                                    }

                                }
                                else
                                {
                                    result = Count(signleft, numleft, numright);
                                    signleft = signright;
                                    numleft = Convert.ToString(result);

                                    if (signleft != "#")
                                    {
                                        if (k > 0)
                                        {
                                            mark = 1;
                                            numright = null;
                                            signright = null;
                                        }
                                        else
                                        {
                                            numright = null;
                                            signright = null;
                                        }
                                    }
                                    else if (signleft == "#")
                                    {
                                        if (k != 0)
                                        {
                                            mark = 1;
                                            numright = null;
                                            signright = null;
                                        }
                                        else if (k == 0 && i > n)
                                            mark = 2;

                                    }
                                    else if (signleft == "%" || signleft == "@")
                                    {

                                        signright = null;

                                    }

                                }
                                remsl = -1;
                                remsr = -1;
                                break;
                            }
                        case '<':  //若signleft中的运算符优先级小于signright中的运算符,则把signleft存入sign数组中,把相应的运算数即numleft存入num数组中
                            {
                                if (signleft == "(")
                                {
                                    sign[k] = signleft; num[k] = numleft;
                                    signleft = signright;
                                    numleft = numright;
                                    numright = null;
                                    signright = null;
                                    k++;
                                    if (mark == 1)
                                        mark = 0;
                                }

                                else
                                {
                                    sign[k] = signleft; signleft = signright; signright = null;
                                    num[k] = numleft; numleft = numright; numright = null;
                                    k = k + 1;
                                    if (mark == 1)
                                        mark = 0;
                                }
                                remsl = -1;
                                remsr = -1;
                                break;
                            }
                        case '=':  //当两运算符为(,)则执行以下操作,进行消括号
                            {
                                if (k > 0)
                                {

                                    signleft = sign[k - 1];
                                    numleft = Convert.ToString(num[k - 1]);
                                    signright = null;
                                    k = k - 1;
                                    //if (k == 0)
                                    mark = 0;
                                    // else
                                    // mark = 1;
                                }
                                else if (k == 0)
                                {
                                    numleft = numright;
                                    numright = null;
                                    signleft = null;
                                    signright = null;
                                    mark = 0;
                                    //i = i + 1;
                                }
                                remsl = -1;
                                remsr = -1;
                                break;
                            }

                    }

                }

            }

            textBox3.Text = Convert.ToString(result);
            result = 0;
        }



        //进制转换功能
        private void Change()
        {
            int result;
            if (radioButton4.Checked == true && radioButton7.Checked == true)  //二进制转换二进制
                textBox3.Text = textBox1.Text;
            else if (radioButton4.Checked == true && radioButton6.Checked == true) //二进制转换八进制
            {
                result = Convert.ToInt32(input, 2);
                textBox3.Text = Convert.ToString(result, 8);

            }
            else if (radioButton4.Checked == true && radioButton8.Checked == true) //二进制转换十进制
            {
                result = Convert.ToInt32(input, 2);
                textBox3.Text = Convert.ToString(result);
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -