如果在计算器中声明

时间:2015-01-04 06:09:39

标签: c#

我是一名初学程序员,使用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;
    }
}

4 个答案:

答案 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);