撤消计算并将其从运行总计中减去

时间:2019-06-11 13:22:57

标签: c#

这是一个简单的计算器。它执行计算。但是,每次计算时,我都会保存该总计并将其添加到运行总计中。但是,当我键入undo时,运行总计消失,并且不会从运行总计中减去之前的计算。有人可以帮帮我吗?假定是纪念品格式。因此,当我撤消操作时,将从先前的计算中删除堆栈或总计。我为此感到挣扎。

 class Calculator
 {
    public Stack<double> result= new Stack<double>();
    double total = 0;

    public void Add(double a, double b)
    {
        total += a + b;
        Console.WriteLine("Sum:{0}", total);
        result.Push(total);

    }
    public void Sub(double a, double b)
    {
        total += a - b;
        Console.WriteLine("Difference:{0}", total);
        result.Push(total);

    }
    public void Mul(double a, double b)
    {
        total += a * b;
        Console.WriteLine("Product:{0} ", total);
        result.Push(total);

    }
    public void Div(double a, double b)
    {
        if (b!=0)
        {
            total += a / b;
            Console.WriteLine("Quotient:{0}", total);
            result.Push(total);

        }
        else
        {
            Console.WriteLine("Error: Cannot divide by 0");
        }
    }

    double GetTotal()
    {
        return total;


    }
    void Undo()
    {
        if (result.Count==0)
        {
            Console.WriteLine("UNDO IS NOT AVAILABLE");
        }
        Console.WriteLine("Running total:{0}", total);

    }
    void clear()
    {
        while (result.Count !=0)
            result.Pop();
        total = 0;
        Console.WriteLine("Running total:{0}", total);
    }
    static int Main()
    {
        Calculator cal=new Calculator();
        string line="";
        while (true)
        {
            Console.WriteLine("Enter (Clear, Undo, Exit, Expression):");

            if (line.ToLower() == "exit")
                break;
            else if (line.ToLower() == "undo")
                cal.Undo();
            else if (line.ToLower() == "clear")
                cal.clear();
            else
            {
                double a, b;

                Console.WriteLine("Write the first number");
                double.TryParse(Console.ReadLine(), out a);

                Console.WriteLine("Write the second number");
                double.TryParse(Console.ReadLine(), out b);

                Console.WriteLine("Write the operand (+, -, /, *)");
                char.TryParse(Console.ReadLine(), out char c);


                if (c == '+')
                    cal.Add(a, b);
                if (c == '-')
                    cal.Sub(a, b);
                if (c == '*')
                    cal.Mul(a, b);
                if (c == '/')
                    cal.Div(a, b);
            }
        }
        return 0;
    }

1 个答案:

答案 0 :(得分:1)

您需要在此处修复一些问题。

首先,您永远不会为<element>分配任何内容,因此您的代码将立即落入“表达式”的line块中。因此,不仅else不起作用,而且我也看不到Undo()Clear()方法如何起作用。通过分配给Exit(),类似的事情会有所帮助:

line

请注意,这会将无效输入视为“表达式”,并沿while (true) { Console.WriteLine("Enter (Clear, Undo, Exit, Expression):"); line = Console.ReadLine(); if (line.ToLower() == "exit") break; //Rest of the code left out for simplicity... } 路径提供了错误信息,因此您可能需要考虑显式检查else并给出错误消息。

还可以考虑更改为line.ToLower() == "expression"语句。 IMO绝对不需要它,但是维护和阅读起来更容易一些。您还应该执行不区分大小写的switch with this overload,而不是将输入转换为小写。

对于您的Equals()方法的实际实现,由于您的最后一个动作只是Undo()的下一项,因此仅Stack的最前项和Pop()Peek()中为您之前的总计:

Stack

这应该可以帮助您实现大部分目标。它们可能是您还需要修复的其他内容。我确实测试了撤消和清除功能,它们似乎按预期工作,但是没有测试其他任何东西(除了基本的+和-表达式)。