이전에 만든 계산기를 이어서 만들어봅시다.

 이전 계산기의 문제점은 다음과 같습니다. 


(1) = 버튼을 누르면 바로 이전 연산이 되지 않는다

(2) 초기화 버튼이 없다

(3) 정수 연산만 가능하다


 우선 (1)번의 경우는 3+2=5인 상태에서 '='을 누르면 +2가 되어서 7값이 나와야하는데 10값이 나오는 에러입니다. 연산을 한번 수행한 뒤 아무값도 입력하지 않고 =버튼을 누르면 이전의 연산이 그대로 수행되어야합니다. 


 이를 해결하기 위해 우선 헤더파일에 변수를 추가해줍니다.

private :

char m_op_flag = 0;//0:덧셈,1:뺄셈,2:곱셈,3:나눗셈

char m_step_flag = 0;//연산자가 눌러졌는지 기억, 1 되있으면 기존 숫자를 지울려고

char count = 0;

int num = 0;//이전 연산값 저장


 =버튼쪽 함수를 수정해줍니다.

void CTestCarlDlg::OnBnClickedEqBtn()

{

int second_value = GetDlgItemInt(IDC_EDIT1);


switch (m_op_flag){

case 0:

if (count != 0 && m_first_value == second_value){

m_first_value += num;

}

else{

num = second_value;

m_first_value += second_value;

}

count++;

break;

......

 우선 처음 연산은 그대로 진행하고 두번째 연산부터 적용되도록 count변수를 활용합니다. 처음 생각으로는 first값에 first와 second값이 합해진 값이 들어가니 second값은 second값(3)이 남아있을 거라고 생각했는데 2+3=5 그리고 =을 연산하니 10이 나오는 것을 보고 연산이 된 후에는 first와 second와 같은 값(5)을 갖게 되는 것을 알게되었습니다. 따라서 첫번째 연산은 그대로 수행하면서 num변수에 두번째 연산될 수가 저장되고 두번째부터 first와 second의 값이 같다면, 즉 그냥 =버튼을 눌렀다면 저장되었던 num을 꺼내어 연산하도록 코드를 짜봤습니다. 밑의 case 1,2,3 다 같게 수정하시면 됩니다.


 (2)초기화 버튼은 간단합니다. 우선 리소스를 추가해줍니다.



 더블 클릭 후 함수를 만들어 수정해줍니다.

void CTestCarlDlg::OnBnClickedInitBtn()

{

m_step_flag = 1;//기존 숫자를 지워야하기 때문에 1설정

count = 0;//입력 횟수 초기화

num = 0;//이전 연산값 저장 초기화

SetDlgItemInt(IDC_EDIT1, 0);//0을 출력

}

 버튼을 누를 때 0으로 갱신됩니다.


 (3)번 실수 연산의 경우 Edit창은 실수를 받을 수 없기 때문에 수정해주어야 합니다.

 우선 버림연산을 하지 않도록 first_value와 second_value와 num을 double선언 해줍니다.

private :

char m_op_flag = 0;//0:덧셈,1:뺄셈,2:곱셈,3:나눗셈

char m_step_flag = 0;//연산자가 눌러졌는지 기억, 1로 되있으면 기존 숫자를 지울려고

char count = 0;

double num = 0;//이전 연산값 저장


double m_first_value = 0;

----------------------------------------------------------

void CTestCarlDlg::OnBnClickedEqBtn()

{

CString str;

GetDlgItemText(IDC_EDIT1, str);//EDIT1창에 있는 문자열을 str에 저장

double second_value = _wtof(str);//문자를 실수로 변환

..


나머지 코드를 수정해줍니다.

...

switch (m_op_flag){

case 0:

if (count != 0 && m_first_value == second_value){

str.Format(L"%f",m_first_value += num);

}

else{

num = second_value;

str.Format(L"%f",m_first_value += second_value);

}

count++;

break;

case 1:

if (count != 0 && m_first_value == second_value){

str.Format(L"%f",m_first_value -= num);

}

else{

num = second_value;

str.Format(L"%f",m_first_value -= second_value);

}

count++;

break;

case 2:

if (count != 0 && m_first_value == second_value){

str.Format(L"%f",m_first_value *= num);

}

else{

num = second_value;

str.Format(L"%f",m_first_value *= second_value);

}

count++;

break;

case 3:

if (second_value != 0) {

if (count != 0 && m_first_value == second_value){

str.Format(L"%f",m_first_value /= num);

}

else{

num = second_value;

str.Format(L"%f",m_first_value /= second_value);

}

}

else m_first_value = 0;

count++;

break;

}

str.TrimRight(L"0"); //0이 사라질 때까지 오른쪽 방향으로 가면서 지운다

SetDlgItemText(IDC_EDIT1, str);

m_step_flag = 1;

} 

EDIT창에 있는 값을(문자열)을 문자열로 받음-> 각 변수에 값을 실수로 변환해 넣는다-> 실수 연산-> 연산한 결과값을 다시 문자열로 바꿔서 EDIT창에 출력



5/2== 을 누른 결과 값

'Programming > Win32 API & MFC' 카테고리의 다른 글

MFC 10 : 대화상자 컨트롤 2  (0) 2015.08.19
MFC 08 : 계산기 만들기 1  (0) 2015.08.15
MFC 07 : 대화상자 컨트롤  (0) 2015.08.15
MFC 06 : 짝맞추기 게임 2  (2) 2015.08.13
MFC 05 : 짝맞추기 게임 1  (1) 2015.08.12

+ Recent posts