2015-01-04 3 views
1

저는 C#을 사용하여 Visual Studio 2013에서 계산기를 디자인하는 초보 프로그래머입니다. 내가 수정할 수없는 약간의 문제가 발생했습니다. 제곱근 버튼을 클릭하면 텍스트 상자에 제곱근을 표시하고 레이블에서 어떤 일이 일어나는지 보여줍니다.If if Calculator in

예를 들어 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

그냥 호기심이 9 + sqrt (sqrt (16)) – AgustinCoder

+0

될 Windows 계산기에서 출력을 복제하려는 아니요 조금 더 간단하게 유지하고 그냥 9 + sqrt (4) 표시되도록 가장 최근의 계산. – Josh

답변

0

지역 변수 square_root_pressed는 항상 false로 설정됩니다. 성명서는

expression.Text = exp + " sqrt(" + Convert.ToString(res) + ")"; 

에 결코 도달하지 않습니다.

이벤트 처리기 외부에서 누른 키 상태를 저장하려고합니다.

0

이벤트가 호출 될 때을 호출하면 "제곱근"에 대한 다른 이벤트 처리기를 추가하고 숫자를 두 배로 늘릴 수 있습니다. sqrt_Click 이벤트 "res"를 클릭하면 올바른 sqrt 번호가 계산됩니다.

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; 
+1

고마워, 문제가 해결되었습니다. – Josh

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 
+ 
SQRT 
    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); 

// Add the function term as new element to the term 
term.AddRange((o as Function).Term);