[MFC] 계산기 (2)

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

C++

목록 보기
2/23

[1] 기록

1. 기록창 추가

- 리소스 뷰에 Edit Control 추가

2. 변수 추가

.h (헤더파일)

public:
	CMfcProject1Dlg(CWnd* pParent = nullptr);	// 표준 생성자입니다.

	CString m_but; //숫자(문자)
	CString m_result; //에디트 컨트롤
	CString m_recode; //계산 기록
	bool m_equalClk; //클릭 확인
	int m_type; //연산자 타입

3.



[2] 특수문자( ., +, -, *, / ) 연속 입력 제어

  • if (m_equalClk || recodeStr[reclength - 1] == '+') 따옴표 안 기호만 바꿔서 사용
void CMfcProject1Dlg::OnBnClickedButtonplus()
{
	CString recodeStr;
	recodeStr.Format(m_result);
	int reclength = recodeStr.GetLength();

	if (m_result.IsEmpty() || (!m_result.IsEmpty() && (recodeStr[reclength - 1] == '.' || recodeStr[reclength - 1] == '+' ||
		recodeStr[reclength - 1] == '-' || recodeStr[reclength - 1] == '*' || recodeStr[reclength - 1] == '/')))
	{
		return; // 소수점 추가 입력 막기
	}

	if (m_equalClk || recodeStr[reclength - 1] == '+') {
		//m_result.Empty();
		m_equalClk = false; // 변수를 컨트롤에 출력
	}
	/*if (m_equalClk) {
		m_result.Empty();
		m_equalClk = false;
	}*/

	//m_result += _T("+");
	
	m_type = plus; //1
	m_but = m_result;
	m_result.Empty();
	UpdateData(false);
}


[3] = (equal) 입력 제어

오류 수정 전

처음 실행할 땐 입력이 제어되는데 계산을 한번 한 뒤는 제어가 풀림

  • 디버깅으로 확인
    이전에 입력했던 값이 초기화되어 있지 않고 남아있음

1. 연산 함수 수정

  • m_but(입력1)과 m_result(입력2)가 비어있지 않을 때 각각의 문자열을 숫자로 변환한다.
void CMfcProject1Dlg::OnBnClickedButtonequal() // 연산
{
	double op1, op2, result;
	if (!m_num.IsEmpty() && !m_result.IsEmpty()) 
	{
		op1 = _tstof(m_num); // 문자열을 숫자로 변환
		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_equalClk = true;
	}
	else 
	{
		return;
	}
	UpdateData(false);
	//m_equalClk = false;

}

2. Clear 함수 수정

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

수정 후

- 계산 한 뒤에도 = 막힘

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기