我是一名初学程序员,使用C#在Visual Studio 2013中设计计算器。我遇到了一个我无法解决的小问题。当我点击平方根按钮时,我希望程序在文本框中显示平方根,并显示标签中发生的事情。
例如,如果我想计算9 + sqrt(16),我需要单击9 + 16,然后按平方根按钮。文本框上方的标签应显示" 9 + sqrt(16)"文本框本身应该说" 4"。一切都像它应该的那样。但如果我拿4的平方根,我希望标签说" 9 + sqrt(4)"。我尝试将第一部分(9 +)存储为字符串,但是当按下平方根按钮两次时,它会显示" 9 + sqrt(16)sqrt(4)"。 有没有不同的方法来解决这个问题,或者我做错了什么?
这是我尝试的代码的一部分(结果是文本框,表达式是标签):
private void sqrt_Click(object sender, EventArgs e)
{
bool square_root_pressed = false;
string exp = "";
Button b = (Button)sender;
double res = Convert.ToDouble(result.Text);
if ((equal_pressed) || (operation == ""))
{
if (b.Text == "√")
{
result.Text = Convert.ToString(Math.Sqrt(res));
expression.Text = "sqrt(" + Convert.ToString(res) + ") =";
}
else
{
result.Text = Convert.ToString(Math.Sqrt(res));
if (square_root_pressed)
{
expression.Text = exp + " sqrt(" + Convert.ToString(res) + ")";
}
else
{
exp = expression.Text;
expression.Text = expression.Text + " sqrt(" + Convert.ToString(res) + ")";
square_root_pressed = true;
}
}
答案 0 :(得分:0)
调用事件处理程序时,局部变量square_root_pressed
始终设置为false。声明
expression.Text = exp + " sqrt(" + Convert.ToString(res) + ")";
永远不会到达。
尝试存储在事件处理程序外部按下的键的状态。
答案 1 :(得分:0)
你可以为“square root”添加另一个事件处理程序,并在调用Event时加倍数字, 一旦你点击sqrt_Click事件“res”计算出正确的sqrt数字。
答案 2 :(得分:0)
如果我理解你的问题,当按两次平方根按钮时,标签显示会重复sqrt
。一个可能的解决方案是语句exp = expression.Text
执行时;检查标签中是否已存在文本sqrt
。如果是,则按顺序将其删除以避免重复。
exp = expression.Text;
if (exp.Contains("sqrt"))
{ exp = exp.Remove(exp.IndexOf("sqrt")); }
expression.Text = exp + " sqrt(" + Convert.ToString(res) + ")";
square_root_pressed = true;
答案 3 :(得分:0)
我建议采用一种完全不同的方法:我将整个术语存储为对象列表,并编写一个可视化方法。
我的意思是一个例子如下:
public class Operation
{
public string Operator;
}
public class Function
{
public string Functor;
public List<object> Term;
}
这两个班级将成为我的小帮手。现在,如果用户只按下数字和运算符,您可以填写这样的术语项列表:
public List<object> term = new List<object>();
...
term.Add(3);
term.Add(new Operation() { Operator = "+" });
term.Add(4);
这相当于3+4
。
如果用户按下SQRT按钮,您可以执行以下操作:
// Get the last element in the term and remove it
object o = term[term.Count - 1];
term.RemoveAt(term.Count - 1);
// Wrap the element in a function
Function f = new Function() { Functor = "SQRT" };
f.Term = new List<object>();
f.Term.Add(o);
// Add the function as new element to the term
term.Add(f);
这将从
转换列表3
+
4
到
3
+
SQRT
4
同样,如果用户再次按下SQRT,您可以删除该功能:
// Get the last element in the term and remove it
object o = term[term.Count - 1];
term.RemoveAt(term.Count - 1);
// Add the function term as new element to the term
term.AddRange((o as Function).Term);