윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 2장 심화문제입니다.
[2-1]
// 심화문제 2-1.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
/*
'3+4'와 같이 사칙연산(+, -, *, /)을 입력받아,
CString 클래스를 사용해 문자열을 분석한 후 연산 결과를 출력하도록
Console 에제를 수정하시오
*/
#include "stdafx.h"
#include "심화문제 2-1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: MFC를 초기화하지 못했습니다.\n");
nRetCode = 1;
}
else
{
// TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
_tsetlocale(LC_ALL, _T(""));
TCHAR buffer[1024];
_tscanf_s(_T("%s"), buffer, _countof(buffer));
CString str = buffer;
UINT idx = str.FindOneOf(_T("+-*/"));
UINT operand1, operand2, result; //연산자 기준 왼쪽 오른쪽 피연산자, 결과
switch (str[idx])
{
case '+':
operand1 = _ttoi((LPCTSTR)str.Left(idx));
operand2 = _ttoi((LPCTSTR)str.Mid(idx + 1));
result = operand1 + operand2;
break;
case '-':
operand1 = _ttoi((LPCTSTR)str.Left(idx));
operand2 = _ttoi((LPCTSTR)str.Mid(idx + 1));
result = operand1 - operand2;
break;
case '*':
operand1 = _ttoi((LPCTSTR)str.Left(idx));
operand2 = _ttoi((LPCTSTR)str.Mid(idx + 1));
result = operand1 * operand2;
break;
case '/':
operand1 = _ttoi((LPCTSTR)str.Left(idx));
operand2 = _ttoi((LPCTSTR)str.Mid(idx + 1));
result = operand1 / operand2;
break;
default:
_tprintf(_T("계산식이 아닙니다\n"));
return 0;
}
_tprintf(_T("결과: %d\n"), result);
}
}
else
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: GetModuleHandle 실패\n");
nRetCode = 1;
}
return nRetCode;
}
[2-2]
// 심화문제 2-2.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
/*
다음 행렬을 보관했다가 ㅎ화면에 출력하도록 Console 예제를 수정하시오.
단, 행과 옆의 추가/삭제/삽입 등이 자유롭도록 CArray 클래스를 이용한다
*/
#include "stdafx.h"
#include "심화문제 2-2.h"
#include <afxtempl.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: MFC를 초기화하지 못했습니다.\n");
nRetCode = 1;
}
else
{
// TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
_tsetlocale(LC_ALL, _T(""));
CPtrArray ptrArr;
CArray<int, int&> arr, arr2, arr3;
arr.SetSize(3), arr2.SetSize(3), arr3.SetSize(3);
_tprintf(_T("과연 이렇게 푸는 것이 맞는 방법일까?\n"));
for (int i = 0; i < 3; i++)
_tscanf_s(_T("%d"), &arr[i]);
ptrArr.Add(&arr);
for (int i = 0; i < 3; i++)
_tscanf_s(_T("%d"), &arr2[i]);
ptrArr.Add(&arr2);
for (int i = 0; i < 3; i++)
_tscanf_s(_T("%d"), &arr3[i]);
ptrArr.Add(&arr3);
_tprintf(_T("행렬 출력\n"));
for (int i = 0; i < ptrArr.GetSize(); i++)
{
CArray<int, int&> *temp = (CArray<int, int&> *)ptrArr.GetAt(i);
for (int j = 0; j < temp->GetSize(); j++)
_tprintf(_T("%d "), temp->GetAt(j));
_tprintf(_T("\n"));
}
}
}
else
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: GetModuleHandle 실패\n");
nRetCode = 1;
}
return nRetCode;
}
[2-3]
// 심화문제 2-3.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
/*
Console 예제를 다음과 같이 수정하시오.
먼저 다음 표의 데이터를 보관한다.
그리고 이름을 입력받으면 그 이름에 해당하는 키와 몸무게를 출력한다
*/
#include "stdafx.h"
#include "심화문제 2-3.h"
#include <afxtempl.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
typedef struct Body
{
UINT height, weight;
Body() {};
Body(UINT _h, UINT _w)
{
height = _h;
weight = _w;
};
}Body, *ptrBody;
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: MFC를 초기화하지 못했습니다.\n");
nRetCode = 1;
}
else
{
// TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
_tsetlocale(LC_ALL, _T(""));
CMapStringToPtr map;
map[_T("홍길동")] = new Body(172, 72);
map[_T("박철수")] = new Body(164, 67);
map[_T("오영희")] = new Body(166, 51);
map[_T("구오성")] = new Body(182, 80);
map[_T("김순희")] = new Body(159, 48);
map[_T("최성주")] = new Body(177, 69);
map[_T("신여정")] = new Body(172, 51);
//특정 키값을 가진 데이터를 검색
TCHAR buffer[1024];
_tscanf_s(_T("%s"), buffer, _countof(buffer));
CString str = buffer;
void *data;
if (map.Lookup(str, data))
{
ptrBody temp = (ptrBody)data;
_tprintf(_T("%s의 키: %d, 몸무게: %d\n"), str, temp->height, temp->weight);
}
}
}
else
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: GetModuleHandle 실패\n");
nRetCode = 1;
}
return nRetCode;
}
[2-4]
// 심화문제 2-4.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
/*
Console 예제를 다음과 같이 수정하시오.
먼저 다음 표의 데이터를 보관한다.
그리고 ::_tscanf() 함수로 다음과 같이 영문을 입력하면 기호로, 기호를 입력하면 영문을 출력한다.
단, 대소문자는 구분하지 않고 기호는 겹치지 않는다
*/
#include "stdafx.h"
#include "심화문제 2-4.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 유일한 응용 프로그램 개체입니다.
CWinApp theApp;
using namespace std;
template <> UINT AFXAPI HashKey(CString &str)
{
LPCTSTR key = (LPCTSTR)str;
return HashKey(key);
}
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: MFC를 초기화하지 못했습니다.\n");
nRetCode = 1;
}
else
{
// TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
_tsetlocale(LC_ALL, _T(""));
CMapStringToString map, map2;
map[_T(" ")] = _T("111");
map2[map[_T(" ")]] = _T(" ");
map[_T("A")] = _T("1010");
map2[map[_T("A")]] = _T("A");
map[_T("B")] = _T("0010011");
map2[map[_T("B")]] = _T("B");
map[_T("C")] = _T("01001");
map2[map[_T("C")]] = _T("C");
map[_T("D")] = _T("01110");
map2[map[_T("D")]] = _T("D");
map[_T("E")] = _T("110");
map2[map[_T("E")]] = _T("E");
map[_T("F")] = _T("0111100");
map2[map[_T("F")]] = _T("F");
map[_T("G")] = _T("0111110");
map2[map[_T("G")]] = _T("G");
map[_T("H")] = _T("0010010");
map2[map[_T("H")]] = _T("H");
map[_T("I")] = _T("1000");
map2[map[_T("I")]] = _T("I");
map[_T("J")] = _T("011111110");
map2[map[_T("J")]] = _T("J");
map[_T("K")] = _T("011111111001");
map2[map[_T("K")]] = _T("K");
map[_T("L")] = _T("0001");
map2[map[_T("L")]] = _T("L");
map[_T("M")] = _T("00101");
map2[map[_T("M")]] = _T("M");
map[_T("N")] = _T("1001");
map2[map[_T("N")]] = _T("N");
map[_T("O")] = _T("0000");
map2[map[_T("O")]] = _T("O");
map[_T("P")] = _T("01000");
map2[map[_T("P")]] = _T("P");
map[_T("Q")] = _T("0111101");
map2[map[_T("Q")]] = _T("Q");
map[_T("R")] = _T("0101");
map2[map[_T("R")]] = _T("R");
map[_T("S")] = _T("1011");
map2[map[_T("S")]] = _T("S");
map[_T("T")] = _T("0110");
map2[map[_T("T")]] = _T("T");
map[_T("U")] = _T("0011");
map2[map[_T("U")]] = _T("U");
map[_T("V")] = _T("001000");
map2[map[_T("V")]] = _T("V");
map[_T("W")] = _T("011111111000");
map2[map[_T("W")]] = _T("W");
map[_T("X")] = _T("01111110");
map2[map[_T("X")]] = _T("X");
map[_T("Y")] = _T("0111111111");
map2[map[_T("Y")]] = _T("Y");
map[_T("Z")] = _T("01111111101");
map2[map[_T("Z")]] = _T("Z");
POSITION pos = map.GetStartPosition(), pos2 = map.GetStartPosition();
TCHAR buffer[1024];
_tscanf_s(_T("%s"), buffer, _countof(buffer));
CString alphabet = buffer;
UINT len = alphabet.GetLength(); //입력받은 CString의 길이
UINT cnt = 0; //인덱스
CString temp = alphabet;
alphabet = temp.Mid(cnt, 1); //인덱스 하나씩 변환해야하므로
CString strValue;
if(alphabet >= _T("A") && alphabet <= _T("Z"))
{
while (cnt < len)
{
while (pos != NULL)
{
if (map.Lookup(alphabet, strValue))
{
_tprintf(_T("%s"), strValue);
break;
}
map.GetNextAssoc(pos, alphabet, strValue);
}
cnt++;
alphabet = temp.Mid(cnt, 1);
}
_tprintf(_T("\n"));
}
else
{
UINT lastIdx = 0, cnt = 3; //최소 3자리
CString temp2 = buffer;
while (lastIdx + cnt - 1 < len)
{
while (pos2 != NULL)
{
CString digit = temp2.Mid(lastIdx, cnt); //마지막 인덱스를 기준으로 cnt만큼 문자열을 자른다
if (map2.Lookup(digit, strValue))
{
_tprintf(_T("%s"), strValue);
lastIdx += cnt;
cnt = 3;
break;
}
else
cnt++;
map.GetNextAssoc(pos, digit, strValue);
}
}
_tprintf(_T("\n"));
}
}
}
else
{
// TODO: 오류 코드를 필요에 따라 수정합니다.
wprintf(L"심각한 오류: GetModuleHandle 실패\n");
nRetCode = 1;
}
return nRetCode;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 3장 연습문제(9~16) (0) | 2018.03.18 |
---|---|
MFC 윈도우 프로그래밍 3장 연습문제(1~8) (0) | 2018.03.18 |
MFC 윈도우 프로그래밍 2장 연습문제(8~16) (0) | 2018.03.12 |
MFC 윈도우 프로그래밍 2장 연습문제(1~7) (0) | 2018.03.12 |
MFC 윈도우 프로그래밍 1장 심화문제 (0) | 2018.03.09 |