制作计算器

Making the Calculator

我知道有很多方法可以解决这个问题,我知道使用 if 语句的“愚蠢”方法,但是我一直在尝试使用更少的代码,但更多地使用它。

     if(ope == "+")
        {
            result = userInput + userInput2;
            Console.WriteLine(result);
        }

并为所有操作员复制过去的垃圾内容。

我列出了所有运算符,我想我可以检查列表,如果输入不等于列表中的任何内容,请重复,直到选择运算符。 (这可能会导致一个错误()如果用户写了一个以上的正确答案会发生什么,它会从列表或第一个中获取更多。一个例子:如果用户输入 +- /(甚至还没有走到这一步会怎样), 两者都在列表中。

下面是我编写的用于获取双倍代码的示例: 一个例子是“while (!double.TryParse(Console.ReadLine(), out userInput));”从代码片段中,代码不会采用任何字符串值,并一遍又一遍地重复代码,直到 userInput 是一个数字。

我不知道如何使用 do while 循环来循环代码以检查 userInput 是否与列表具有相同的值包含:数学运算符 +、-、*、/;^、% 和 if用户输入不正确,重复代码直到正确。

我的问题是,我如何遍历列表,检查输入是否正确,挑选出正确的输入并求解 userInput X userInput2 上的方程。用户是否应该选择 2 个运算符,例如 / 和 - Repeat 循环。仅选择 1 个操作员。

    private static void Main(string[] args)
      {
        List<string> OperatorToUse = new List<string>();
        OperatorToUse.Add("+");
        OperatorToUse.Add("-");
        OperatorToUse.Add("/");
        OperatorToUse.Add("*");
        OperatorToUse.Add("%");
        OperatorToUse.Add("^");
       
        double userInput;
        double userInput2;
        var result;
        var ope;
             
        do
        {
            Console.WriteLine("Enter Your first number: ");
        } while (!double.TryParse(Console.ReadLine(), out userInput));
           #If the answer is X, and user Input is also X. stop the Loop
               #Not working
       do
       {
            Console.WriteLine("Enter your Operator: ");
        } while (!OperatorToUse.Contains(Console.ReadLine(), out OperatorToUse));
                #Not working
        do
        {
            Console.WriteLine("Enter your Operator: ");
        } while (Console.Readline(ope) == "+" || ope == "-" || ope == "/");    
         
        do
        {
            Console.WriteLine("Enter Your Second number: ");
        } while (!double.TryParse(Console.ReadLine(), out userInput2));

        Console.WriteLine($"{result}");
     }

您的 while 循环应如下所示:

do
{
    Console.WriteLine("Enter your Operator: ");
    ope = Console.ReadLine()?.Trim();
} while (!OperatorToUse.ContainsKey(ope));

在下面的示例中,我使用的不是 List,而是 Dictionary,但思路是一样的。

为了避免每个运算符的 if 语句,您应该使用字典并将每个运算符添加为键,将相应的数学函数添加为值。您可以像示例中那样使用委托来执行此操作。然后你只需通过使用所选运算符从字典中检索它来调用相应的函数,如下所示:

OperatorToUse[ope](userInput, userInput2)

internal class Program
{
    delegate double MathOperation(double a, double b);
    static void Main(string[] args)
    {
        Dictionary<string, MathOperation> OperatorToUse = new Dictionary<string, MathOperation>();
        OperatorToUse.Add("+", (a, b) => a + b);
        OperatorToUse.Add("-", (a, b) => a - b);
        OperatorToUse.Add("/", (a, b) => a / b);
        OperatorToUse.Add("*", (a, b) => a * b);
        OperatorToUse.Add("%", (a, b) => a % b);
        OperatorToUse.Add("^", Math.Pow);

        double userInput;
        double userInput2;
        string ope = String.Empty;
        do
        {
            Console.WriteLine("Enter Your first number: ");
        } while (!double.TryParse(Console.ReadLine(), out userInput));
                    
        do
        {
            Console.WriteLine("Enter your Operator: ");
            ope = Console.ReadLine()?.Trim();
        } while (!OperatorToUse.ContainsKey(ope));

        do
        {
            Console.WriteLine("Enter Your Second number: ");
        } while (!double.TryParse(Console.ReadLine(), out userInput2));

        Console.WriteLine($"{OperatorToUse[ope](userInput, userInput2)}");
    }
}