[MFC] 계산기

당근한박스·2023년 8월 17일
0

C++

목록 보기
1/23

1. 리소스 뷰 편집

  • 속성에서 ID 및 캡션 수정
  • 생성한 버튼 더블 클릭 시 .cpp 파일에 해당하는 함수가 생성된다.

2. 변수 선언

  • .h 헤더 파일에 사용할 변수 선언
CString m_but; //숫자(문자)
CString m_result; //에디트 컨트롤
bool m_equalClk; //클릭 확인
int m_type; //연산자 타입

3. 변수 추가

4. 매크로 상수 선언

  • #define : 매크로를 정의할 때 앞에 붙이는 키워드로 가독성을 높여주고 변수보다 처리 속도가 빠르다.
    - plus(+), minus(-), multi(*), divide(/) 각각 선언

5. 타이틀 설정

  • OnInitDialog( ) 함수에 작성
  • SetWindowText()로 타이틀 변경

6. 버튼 함수 (1~9, . )

  • m_equalClk = false : 변수의 값을 에디트 컨트롤에 출력
  • UpdateDate(false) : 변수의 값을 에디트 컨트롤에 출력
    - 컨트롤에 있는 값을 변수에 넣어 갱신하려면 true 선언
void CMfcProject1Dlg::OnBnClickedButton0()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	if (m_equalClk) {
		m_result.Empty();
		m_equalClk = false; // 변수를 컨트롤에 출력
	}
	m_result += _T("0");
	UpdateData(false); //화면에 출력

}

7. 버튼 함수 ( +, -, *, / )

  • 각 함수에 맞춰 m_type을 지정해줌
void CMfcProject1Dlg::OnBnClickedButtonplus()
{
	m_type = plus;
	m_but = m_result;
	m_result.Empty();
}

void CMfcProject1Dlg::OnBnClickedButtonminus()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	m_type = minus;
	m_but = m_result;
	m_result.Empty();
}
.
.
.

8. 지우기 버튼 ( C )

void CMfcProject1Dlg::OnBnClickedclear()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	m_result.Empty();
	UpdateData(false);
}

9. 연산

  • _tstof : Microsoft Visual Studio에서 사용되는 함수로 유니코드 문자열을 부동 소수점 숫자로 변환한다.
  • C++에서는 (if 문의 조건 또는 논리 연산자의 일부로 사용되는) bool 문맥에서 산술 값 사용 시 값 0은 false로 처리되며, 0이 아닌 값은 true로 처리됨
    따라서 전체 표현식은 위의 조건 중 하나라도 만족하면 true로 평가되며, 두 조건 모두 만족하지 않으면 (즉, static_cast(result)가 0이고 result가 1000000.0보다 작으면) false로 평가된다
void CMfcProject1Dlg::OnBnClickedButtonequal() // 연산
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	double op1, op2, result;
	op1 = _tstof(m_but); //문자를 숫자로 변환
	op2 = _tstof(m_result);

	switch (m_type) {
	case plus : 
		result = op1 + op2;
		break;
	case minus :
		result = op1 - op2;
		break;
	case multi : 
		result = op1 * op2;
		break;
	case divide :
		result = op1 / op2;
		break;
	default:
		result = 0.0; // 기본값 설정
		break;
	}

	// result 값이 6자리 이상 소수인 경우 소수점 이하 6자리까지 출력, 그렇지 않은 경우 필요한 만큼만 출력
	// static_cast로 result값을 정수형으로 변환
	// result가 0 이 아닌 값 || result가 1000000.0보다 크거나 같음
	if (result == static_cast<int>(result) || result >= 1000000.0) {
		m_result.Format(_T("%d"), static_cast<int>(result)); // 소수점 이하 부분을 제외하고 정수만 출력
	}
	else {
		CString resultStr;
		resultStr.Format(_T("%.6f"), result); // 소수점 이하 6자리까지 출력
		int length = resultStr.GetLength();
		while (resultStr[length - 1] == '0') { //소수점 이하의 0을 제거 
			length--;
		}
		if (resultStr[length - 1] == '.') { //마지막 소수점 문자 제거 
			length--;
		}
		m_result = resultStr.Left(length); // 최종으로 수정된 길이로 문자열 잘라서 m_result에 저장
	}

	//m_result.Format(_T("%.6f"), result);
	UpdateData(false);
	m_equalClk = true;

}

결과

0개의 댓글