C++/C++(계산기)

[MFC] 계산기 만들기 (사칙연산, 0으로나눌경우 ERROR표시)

byeol2ing 2017. 10. 10. 18:53
반응형


OTL.zip


1. 가장 먼저 아래와 같이 Dialog를 도구상자를 이용해 꾸며줍니다.(edit control, button)

(0~9까지 순서대로 버튼을 생성해주어 ID값이 IDC_BUTTON1~IDC_BUTTON10이 되도록 만들어주었음)



2. 버튼을 클릭했을때 EDIT창에 표시가 되도록 버튼을 더블클릭하여 함수생성을 해주었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
void COTLDlg::OnBnClickedButton1()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"0");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton2()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"1");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton3()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"2");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton4()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"3");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton5()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"4");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton6()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"5");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton7()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"6");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton8()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"7");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton9()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"8");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedButton10()
{
    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    SetDlgItemText(IDC_EDIT1,str+L"9");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
cs
-Cstring str : str변수를 만들어주었습니다.

-GetDlgItemText(ID,변수) : EDIT(ID)창에 있는 문자열을 STR변수에 저장

-SetDlgItemText: EDIT(ID)에 (STR + 글자 "0~9")을 표시해줌 

고로 계속 숫자를 클릭하면 뒤에 숫자(문자열로)가 붙음


3. 이후 사측연산버튼의 함수를 생성후, 숫자를 변수에 받아놓고, edit화면을 비우는 과정을 코딩함.



1
2
3
4
5
6
7
8
9
10
void COTLDlg::OnBnClickedPlus() //더하기
{
    start=0;
    first = GetDlgItemInt(IDC_EDIT1);
    SetDlgItemText(IDC_EDIT1,L" ");
 
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    
}
 
cs

더하기 버튼을 클릭하게 되면

start = 0; 의 경우 switch문을 주어 plus라는 함수라는 것을 알려주기위하여 변수로 주었다. start또한 Dlg.h에 변수선언 해야함.

first = GetDlgItemInt(IDC_EDIT1); = first변수(Dlg.h에 변수선언)에 현재 edit박스에 있는 숫자를 받아온다.(첫번째 숫자 = first변수에 입력)

GetDlgItemInt : 숫자로 값을 입력받는다.

SetDlgItemText(IDC_EDIT1,L" "); =  EDIT창을 " " 비어있는 창으로 표시해준다. 


*변수선언시

아래와 같이 설정해준다.






이후 + - * /등 같은 방법으로 해준다.(first 변수와 start변수는 한번씩만 선언해주면 된다)

+의 경우 start 0

-의 경우 start 1

*의 경우 start 2

/의 경우 start 3

으로 flag변수 줌.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void COTLDlg::OnBnClickedminus() //빼기
{
    start=1;
    first = GetDlgItemInt(IDC_EDIT1);
    SetDlgItemText(IDC_EDIT1,L" ");
 
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
void COTLDlg::OnBnClickedx() //곱하기
{
    start=2;
    first = GetDlgItemInt(IDC_EDIT1);
    SetDlgItemText(IDC_EDIT1,L" ");
 
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
 
 
void COTLDlg::OnBnClickedButton11()  //나누기
{
    start=3;
    first = GetDlgItemInt(IDC_EDIT1);
    SetDlgItemText(IDC_EDIT1,L" ");
}
 

 
cs




4. = 버튼에 switch 문을 주어 사측연산 별로 계산하며, 다음에 입력한 값(문자열로 받은 값) 을 숫자로 바꾸어 준뒤, 앞에서 받은 first값과 계산하고 표시해준다.

double num1 = _wtof(str); 의 경우 str변수에 있는 글자를 num1이라는 숫자변수로 변경 해준다.(왜? 계산해주려고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void COTLDlg::OnBnClickedOk() //는 계산결과
{
    switch(start)
    {
        case 0//더하기
        {
            CString str;
            GetDlgItemText(IDC_EDIT1,str);
            double num1 = _wtof(str);
            SetDlgItemInt(IDC_EDIT1,num1+first);
            break;
        }
        case 1//빼기
        {
            CString str;
            GetDlgItemText(IDC_EDIT1,str);
            double num1 = _wtof(str);
            SetDlgItemInt(IDC_EDIT1,first-num1);
            break;
        }
        case 2//곱하기
        {
            CString str;
            GetDlgItemText(IDC_EDIT1,str);
            double num1 = _wtof(str);
            SetDlgItemInt(IDC_EDIT1,first*num1);
            break;
        }
        case 3//나누기
        {
            CString str;
            GetDlgItemText(IDC_EDIT1,str);
            double num1 = _wtof(str);
            if(num1 !=0)
            SetDlgItemInt(IDC_EDIT1,first/num1);
            else
            SetDlgItemText(IDC_EDIT1,L"ERROR");
            break;
        }
    
    }
 
    
}
 
cs


5.클리어 버튼의 경우 아래와 같다.

비어있는 text표시해줌.

1
2
3
4
5
void COTLDlg::OnBnClickedButton12() //클리어
{
    SetDlgItemText(IDC_EDIT1,L" ");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
 
cs





OTL.zip
8.55MB
반응형