如何让我的代码评估整个算术表达式?

How to make my code evaluate the whole arithmetic expression?

我正在尝试制作一个字符串计算器,它可以很好地处理两个数字,但在评估多个操作时我总是遇到问题: 7*2+4=

你也能帮我算一下乘法和除法的代码吗?我不明白为什么它打印 0 即使只有两个数字 (7*5)

using System;
using System.Text.RegularExpressions;

namespace Sariling_Calcu
{
    class Program
    {
        private static string exp;
        private static int[] i = new int[1000];
        private static char[] oper = new char[10];
        private static int cntr2;
        private static int result;
        private static int pluscount;
        private static int subcount;
        private static int mulcount;
        private static int divcount;

        static void getNum()
        {
            string[] strNum = (Regex.Split(exp, @"\D+"));

            for (int cntr = 0; cntr < exp.Length; cntr++)
            {
                foreach (string item in strNum)
                {
                    if (!string.IsNullOrEmpty(item))
                    {
                        i[cntr] = int.Parse(item);
                        cntr += 1;
                    }
                }
            }
        }

        static void counter()
        {
            for (int cntr = 0; cntr < exp.Length; cntr++)
            {
                if (exp[cntr] == '+')
                {
                    pluscount++;
                }
                else if (exp[cntr] == '-')
                {
                    subcount++;
                }
                else if (exp[cntr] == '*')
                {
                    mulcount++;
                }
                else if (exp[cntr] == '/')
                {
                    divcount--;
                }
            }
        }
        static void oprtr()
        {
            for (int cntr = 0; cntr < exp.Length; cntr++)
            {
                if (exp[cntr] != '1'
                    && exp[cntr] != '2'
                    && exp[cntr] != '3'
                    && exp[cntr] != '4'
                    && exp[cntr] != '5'
                    && exp[cntr] != '6'
                    && exp[cntr] != '7'
                    && exp[cntr] != '8'
                    && exp[cntr] != '9')
                {
                    if (exp[cntr] == '+')
                    {
                        result += i[cntr2];
                        cntr2 += 1;
                        pluscount--;

                        if (pluscount == 0 && subcount == 0 && mulcount==0 && divcount==0)
                        {
                            cntr2 += 3;
                            result += i[cntr2];
                        }

                    }
                    else if (exp[cntr] == '-')
                    {
                        result -= i[cntr2];
                        cntr2 += 1;
                        subcount--;
                        result = -result;
                        if (pluscount == 0 && subcount == 0 && mulcount == 0 && divcount == 0)
                        {
                            cntr2 += 3;
                            result -= i[cntr2];

                        }
                    }
                    else if (exp[cntr] == '*')
                    {
                        if (result == 0)
                        {
                            result += 1;
                        }
                        result *= i[cntr2];
                        cntr2 += 1;
                        mulcount--;
                        if (pluscount == 0 && subcount == 0 && mulcount == 0 && divcount == 0)
                        {
                            cntr2 += 3;
                            result *= i[cntr2];
                        }
                    }
                    else if (exp[cntr] == '/')
                    {
                        if (result == 0)
                        {
                            result += 1;
                        }
                        result /= i[cntr2];
                        cntr2 += 1;
                        divcount--;
                        if (pluscount == 0 && subcount == 0 && mulcount == 0 && divcount == 0)
                        {
                            cntr2 += 3;
                            result /= i[cntr2];
                        }
                    }
                }
            }

        }
        static void Main(string[] args)
        {
            Console.Write("Expression: ");
            exp = Console.ReadLine();

            counter();
            getNum();
            oprtr();
            Console.Write("Answer: \n" + result);
            Console.ReadLine();
        }
    }
}

您可以使用 LINQ 将您的代码减少到几行,但它看起来像是一项学校作业,您必须在其中使用数组和循环。

我已尝试稍微改进您的代码并做了一些修复,更改 getNum()counter()oprtr() 方法如下,让我知道它是否有效,然后我会在代码中添加一些注释来解释我所做的更改。

static void getNum()
        {
            string[] strNum = (Regex.Split(exp, @"\D+"));

            for (int cntr = 0; cntr < strNum.Length; cntr++)
            {
                if (!string.IsNullOrEmpty(strNum[cntr]))
                {
                    i[cntr] = int.Parse(strNum[cntr]);
                }
            }
        }

        static void counter()
        {
            cntr2 = 0;
            for (int cntr = 0; cntr < exp.Length; cntr++)
            {
                if (exp[cntr] == '+')
                {
                    oper[cntr2] = '+';
                    cntr2++;
                }
                else if (exp[cntr] == '-')
                {
                    oper[cntr2] = '-';
                    cntr2++;
                }
                else if (exp[cntr] == '*')
                {
                    oper[cntr2] = '*';
                    cntr2++;
                }
                else if (exp[cntr] == '/')
                {
                    oper[cntr2] = '/';
                    cntr2++;
                }
            }
        }

        static void oprtr()
        {
            result = i[0];

            cntr2 = 1;
            for (int cntr = 0; cntr < oper.Length; cntr++)
            {
                if (oper[cntr] == '+')
                {
                    result += i[cntr2];
                }
                else if (oper[cntr] == '-')
                {
                    result -= i[cntr2];
                }
                else if (oper[cntr] == '*')
                {
                    result *= i[cntr2];
                }
                else if (oper[cntr] == '/')
                {
                    if (i[cntr2] == 0)
                    {
                        throw new DivideByZeroException();
                    }
                    result /= i[cntr2];
                }

                cntr2 += 1;
            }
        }