计算公式

本文关键字:计算 | 更新日期: 2023-09-27 17:51:05

我试图实现一个程序,从用户(在1行)中获取方程并输出结果。到目前为止,我用indexof找到了+号,然后我试着找到+号左右的数字的值-

            string input = "5+4+6";
            while (input.Contains('+'))
            {
                Console.WriteLine(input.IndexOf("+"));
                string position1 = input.Substring(0, input.IndexOf("+"));
                int number1 = Convert.ToInt32(position1);
                String position2 = input.Substring(2, input.IndexOf("+"));
                int number2 = Convert.ToInt32(position2);
                int sum = (number1 + number2);

我的代码的问题是,我陈述的数字到左边,并将其转换为int,而在现实生活中的数字在方程将是未知的,可以是2+4,或3+5+6+4,为了简单,现在我试图做+和-,然后/和*。

谁能建议改进代码或任何帮助?我知道还有其他方法可以计算公式,比如ncalc,但我想坚持使用这种方法。

谢谢

计算公式

根据您给出的,如果这是期望的string输入,您可以这样做:

string input = "5+4+6";
int result = 0;
while (input.Contains('+'))
{
    var numbers = input.Split('+');
    foreach(var num in numbers)
    {
        result += Convert.ToInt32(num);
    }
}

类似的操作应该可以工作,您可以用+替换任何操作符。

如果您需要担心的唯一操作符是+,则只需使用string.Split()创建字符串数组,然后将它们转换为整数并将它们相加。您甚至可以使用Linq进一步简化其中的一些。

string[] numbers = input.Split('+');
int sum = input.Select(n => int.Parse(n)).Sum();

你甚至可以把它们放到一个语句中

int sum = input.Split('+').Select(n => int.Parse(n)).Sum();

好吧,为了学习的目的,对于这种特殊情况,您可以使用"手动"解析的方法。

但在现实生活中,如果你想解析公式,我建议你阅读反向波兰符号和分流码算法。这是您解析任何公式而不受任何操作限制的方式(您可以实现"+",然后添加"-","*","/"甚至"sin","cos"操作)。

处理加、减、乘、除以及考虑运算顺序…我会查一下分流场算法。这将接受作为中缀表示法给出的输入表达式,并将其转换为反波兰表示法。你可以看看分流场算法的很多。net实现。

正如大家所说,如果输入只包含一种操作类型,比如加法,那么您可以使用.Split('+'),然后解析出每个整数并将它们相加。

我使用与Excel相同的优先级。+ - * /
.net Fiddle

这只适用于公式中的整数。即使当返回double来存储除法。如果您想在公式中接受双精度,请尝试double.Parse而不是int.Parse

=1+2*3/4-5+6*7/8-9将得到-6.75。
第一个操作是3/4和7/8
然后2 * 0.75和6 * 0.875
然后是1.5 - 5和5.25 - 9
最后1 + (-3.5)+ (-3.75)

=1+2+3+4+5+6+7+8+9 is 45
=1-2-3-4是-8
=1*2*3*4 = 24
=1/2/3/4 = 0.416667

public static void Main()
{
    int n;
    bool isNumeric;
    string input = "1+2*3/4-5+6*7/8-9";
    string[] addSplit = input.Split('+');
    double addTotal = 0;
    foreach (string addCode in addSplit)
    {
        isNumeric = int.TryParse(addCode, out n);
        if (isNumeric)
        {
            addTotal += n;
        }
        else
        {
            string[] addMinus = addCode.Split('-');
            double minusTotal = 0;
            bool firstMinus = true;
            foreach (string minusCode in addMinus)
            {
                isNumeric = int.TryParse(minusCode, out n);
                if (isNumeric)
                {
                    if (firstMinus) { 
                        minusTotal = n;
                        firstMinus = false;
                    }
                    else {
                        minusTotal -= n;
                    }
                }
                else
                {
                    string[] multySplit = minusCode.Split('*');
                    double multyTotal = 1;
                    foreach (string multyCode in multySplit)
                    {
                        isNumeric = int.TryParse(multyCode, out n);
                        if (isNumeric)
                        {
                            multyTotal *= n;
                        }
                        else
                        {
                            string[] divSplit = multyCode.Split('/');                               
                            int.TryParse(divSplit[0], out n);                               
                            double divTotal = n;    
                            for( int i = 1; i < divSplit.Length ; i++ ) {   
                                int.TryParse(divSplit[i], out n);
                                divTotal /= n;
                            }
                            multyTotal *= divTotal;                         
                        }
                    }
                    if (firstMinus) { 
                        minusTotal = multyTotal;
                        firstMinus = false;
                    }
                    else {
                        minusTotal -= multyTotal;
                    }   
                }
            }
            addTotal += minusTotal;
        }
    }
    Console.WriteLine("addTotal: " + addTotal);
}