MFC/윈도우 프로그래밍

MFC 윈도우 프로그래밍 2장 심화문제

꾸준함. 2018. 3. 13. 23:14

윈도우 프로그래밍 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


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


반응형