C#使用堆栈创建一个简单的计算器

C#使用堆栈创建一个简单的计算器,c#,C#,我试图创建一个简单的计算器,使用堆栈的撤销功能。如果有人能告诉我我的代码哪里出错了,那就太棒了。看起来我的一些变量可能没有正确陈述。我从未使用堆栈进行编码。我读过关于它的文章,但我需要代码方面的帮助才能找到正确的方向 class Calculator { public Stack<double> result; double total; public void add(double a, double b) { total =

我试图创建一个简单的计算器,使用堆栈的撤销功能。如果有人能告诉我我的代码哪里出错了,那就太棒了。看起来我的一些变量可能没有正确陈述。我从未使用堆栈进行编码。我读过关于它的文章,但我需要代码方面的帮助才能找到正确的方向

 class Calculator
   {
    public Stack<double> result;
    double total;
    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.DefaultIfEmpty())
        {
            Console.WriteLine("UNDO IS NOT AVAILABLE");
        }
        result.Pop();
        total = result.Pop();
        Console.WriteLine("Running total:{0}", total);
    }
    void clear()
    {
        while (result.DefaultIfEmpty())
            result.Pop();
        total = 0;
        Console.WriteLine("Running total:{0}", total);
    }
    int main()
    {
        Calculator cal;
        string line;
        while (true)
        {
            Console.WriteLine("Enter (Clear, Undo, Exit, Expression):");

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

                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);
            }
        }
    }
}
类计算器
{
公共堆栈结果;
双倍总数;
公共无效添加(双a、双b)
{
总计=a+b;
WriteLine(“总和:{0}”,总计);
结果:推送(总);
}
公共作废分包(双a、双b)
{
总数=a-b;
WriteLine(“差异:{0}”,总计);
结果:推送(总);
}
公共无效mul(双a、双b)
{
总计=a*b;
WriteLine(“产品:{0}”,总计);
结果:推送(总);
}
公共无效分区(双a、双b)
{
如果(b!=0)
{
总计=a/b;
WriteLine(“商:{0}”,总计);
结果:推送(总);
}
其他的
{
Console.WriteLine(“错误:不能除以0”);
}
}
双getTotal()
{
返回总数;
}
void undo()
{
if(result.DefaultIfEmpty())
{
Console.WriteLine(“撤消不可用”);
}
result.Pop();
total=result.Pop();
WriteLine(“运行总计:{0}”,总计);
}
无效清除()
{
while(result.DefaultIfEmpty())
result.Pop();
总数=0;
WriteLine(“运行总计:{0}”,总计);
}
int main()
{
计算器;
弦线;
while(true)
{
WriteLine(“输入(清除、撤消、退出、表达式):”;
如果(行==“退出”)
打破
否则如果(行==“撤消”)
cal.undo();
否则如果(行==“清除”)
cal.clear();
其他的
{
双a,b;
字符c;
如果(c=='+')
加上(a,b);
如果(c=='-')
cal.sub(a,b);
如果(c=='*')
cal.mul(a,b);
如果(c=='/'))
加州分区(a、b);
}
}
}
}

此代码有几个问题

  • 最重要的是,您没有初始化任何变量(result、cal、line、a、b、c)。c#需要知道它们的值,以便能够对它们进行处理。解决这个问题似乎可以让你的计算器工作

  • 第二件事,您应该将用户输入的行(我添加的内容)转换为较低的字符,这样无论您的写操作是如何清除、撤消还是退出的

  • 关于初始化变量所需的表达式(我也添加了一些内容)

  • main必须是静态的,在编写c#console应用程序时要考虑到这一点
  • 我会让你的代码固定工作,尝试玩它,并理解我做了什么,如果你有任何问题,请随时留下一个命令

    class Calculator
    {
        public Stack<double> result = new Stack<double>();
        double total;
        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");
            }
            result.Pop();
            total = result.Pop();
            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):");
                line = Console.ReadLine();
                if (line.ToLower() == "exit")
                    break;
                else if (line.ToLower() == "undo")
                    cal.undo();
                else if (line.ToLower() == "clear")
                    cal.clear();
                else
                {
                    double a, b;
                    char c;
    
                    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 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;
        }
    }
    
    类计算器
    {
    公共堆栈结果=新堆栈();
    双倍总数;
    公共无效添加(双a、双b)
    {
    总计=a+b;
    WriteLine(“总和:{0}”,总计);
    结果:推送(总);
    }
    公共作废分包(双a、双b)
    {
    总数=a-b;
    WriteLine(“差异:{0}”,总计);
    结果:推送(总);
    }
    公共空心骡(双a,双b)
    {
    总计=a*b;
    WriteLine(“产品:{0}”,总计);
    结果:推送(总);
    }
    公共无效分区(双a、双b)
    {
    如果(b!=0)
    {
    总计=a/b;
    WriteLine(“商:{0}”,总计);
    结果:推送(总);
    }
    其他的
    {
    Console.WriteLine(“错误:不能除以0”);
    }
    }
    双getTotal()
    {
    返回总数;
    }
    void undo()
    {
    如果(result.Count==0)
    {
    Console.WriteLine(“撤消不可用”);
    }
    result.Pop();
    total=result.Pop();
    WriteLine(“运行总计:{0}”,总计);
    }
    无效清除()
    {
    while(result.Count!=0)
    result.Pop();
    总数=0;
    WriteLine(“运行总计:{0}”,总计);
    }
    静态int Main()
    {
    Calculator cal=新计算器();
    字符串行=”;
    while(true)
    {
    WriteLine(“输入(清除、撤消、退出、表达式):”;
    line=Console.ReadLine();
    if(line.ToLower()=“退出”)
    打破
    else if(line.ToLower()=“撤消”)
    cal.undo();
    else if(line.ToLower()=“清除”)
    cal.clear();
    其他的
    {
    双a,b;
    字符c;
    Console.WriteLine(“写第一个数字”);
    double.TryParse(Console.ReadLine(),out a);
    Console.WriteLine(“写第二个数字”);
    double.TryParse(Console.ReadLine(),out b);
    WriteLine(“写入操作数(+、-、/、*)”;
    TryParse(Console.ReadLine(),out c);
    如果(c=='+')
    加上(a,b);
    如果(c=='-')
    cal.sub(a,b);
    如果(c=='*')
    cal.mul(a,b);
    如果(c=='/'))
    加州分区(a、b);
    }
    }
    返回0;
    }
    }
    
    您对此进行了调试吗?请参阅:“Main必须是静态的,并且必须返回一个值”这是错误的,您可以使用void Main。如果我想添加发起者、纪念品和管理员设计。代码会有很大不同吗