이전에 만든 계산기를 이어서 만들어봅시다.
이전 계산기의 문제점은 다음과 같습니다.
(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 |