这是一个简单的计算器。它执行计算。但是,每次计算时,我都会保存该总计并将其添加到运行总计中。但是,当我键入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;
}
答案 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
这应该可以帮助您实现大部分目标。它们可能是您还需要修复的其他内容。我确实测试了撤消和清除功能,它们似乎按预期工作,但是没有测试其他任何东西(除了基本的+和-表达式)。