繁体   English   中英

用C#用数组制作一个简单的计算器

[英]Making a simple calculator with arrays in C#

我正在尝试用 C# 中的数组制作一个简单的计算器。 首先,我尝试仅使用两个整数和一个运算符来制作它,并且效果很好。 现在我正在尝试这样做,以便用户可以根据自己的喜好进行表达。 例如 7 * 7 + 1 / 50 而不是简单的 9 + 8,它只包含一个运算符和两个整数。 问题是,每当我输入一个带有多个数字和运算符的长表达式时,它只用第一个运算符计算前 2 个数字。 这个问题有什么好的解决方法? 提前致谢。

static void Main()
    {
        while (true)
        {
            Console.WriteLine("Write an expression with two numbers and an operator with space in-between, for example, 4 + 2");
            string expression;
            string[] array;
            string[] array1;
            expression = Console.ReadLine();
            array = expression.Split();
            array1 = Calculation(array);
            Console.WriteLine("Press ENTER to write a new expression.");
            Console.ReadLine();
            Console.Clear();
        }

    }
    static string[] Calculation(string[] arr)
    {
        double numLeft= 0.0;
        double numRight = 0.0;
        string sign = "";
        double result = 0.0;
        int index = 1;

        while (true)
        {
            numLeft = Convert.ToDouble(arr[0]);
            sign = Convert.ToString(arr[index]);
            numRight = Convert.ToDouble(arr[index + 1]);
            index = index + 2;
            if (sign == "+")
            {
                Console.Clear();
                Console.WriteLine();
                result= result + numLeft;
            }
            else if (sign == "-")
            {
                Console.Clear();
                result = result + numLeft;
                numLeft = 0 - numRight;
            }
            else if (sign == "*")
            {
                Console.Clear();
                numLeft = numLeft * numRight;
            }
            else if (sign == "/")
            {
                Console.Clear();
                numLeft = numLeft / numRight;
            }
            else
            {
                break;
            }
            result = result + numLeft;
            Console.WriteLine("Answer: {0}", result);
            return arr;
        }
        return arr;
    }

因为您在“while true”的末尾返回数组,所以只计算前 2 个。

此外,这将是不正确的。 例如:2 + 3 * 4 = 14,而不是 20,就像您的计算器会计算的那样。

这个怎么样?

将您的操作字符串拆分为多个部分并用它们填充一个列表;

7 * 7 + 1 / 50 => [7][*][7][+][1][/][50]

然后遍历列表并解决 * 和 / 操作。 当您遇到其中一个操作符时,移除操作符元素,前一个和后一个,并用结果替换它们。 请记住,列表长度会发生变化。

第一次迭代 => [49][+][1][/][50] 第二次迭代 => [49][+][0.02]

然后对 + 和 - 运算符执行相同的第一次迭代 => [49.02]

当列表中只剩下一个元素时,这就是您的结果。

对于简单的计算,.net 中有一个方法:

public static int Compute(string operation)
{
    return new DataTable().Compute("7 * 7 + 1 / 50", null);
}

来源: C# 数学计算器

如果您真的想实现这一点,我会建议使用递归二叉树算法。

伪代码: 1. 在有数学运算符号的地方拆分传入的字符串并变成二叉树 2. 遍历这棵树并解析具有更高优先级的运算(* 在 + 之前) 3. 递归应该返回两个子叶的值,依此类推,直到主程序只产生一个值

using System;

namespace _2nd_A_recap
{
    class Program
    {
        static void Main(string[] args)
        {
            int result;
            int a = 20, b = 10;
            result = (a + b );
            Console.WriteLine("Addition Opertaor:" + result);
            result = (a - b);
            Console.WriteLine("Subtraction Operator:" + result);
            result = (a * b);
            Console.WriteLine("Multiplication Operator:" + result);
            result = (a / b);
            Console.WriteLine("Division Operator:" + result);
            result = (a % b);
            Console.WriteLine("Modulus Operator:" + result);
            Console.WriteLine("Press enter to end Calculator...");
            Console.ReadKey();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM