MFC/윈도우 프로그래밍

MFC 윈도우 프로그래밍 2장 연습문제(8~16)

꾸준함. 2018. 3. 12. 22:33

윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 2장 연습문제입니다.

저번에 이어서 풀었습니다.


[2-8]

// 연습문제 2-8.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

Console 예제를 다음과 같이 수정하시오.

먼저 직사각형 왼쪽 상단과 오른쪽 하단 좌표가 {80, 45, 190, 135} CRect 객체를 생성하고,

::_tscanf() 함수로 특정 좌표 (x, y) "%d, %d" 형태로 입력받아 CPoint 객체로 저장한다.

그리고 입력된 자표가 해당 직사각형 내에 있으면 내부를, 그렇지 않으면 외부 출력

*/

 

#include "stdafx.h"

#include "연습문제 2-8.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(""));

                       CRect rect(80, 45, 190, 135);

                       CPoint coord;

                       _tscanf_s(_T("%d %d"), &coord.x, &coord.y);

                       if (rect.PtInRect(coord))

                              _tprintf(_T("내부\n"));

                       else

                              _tprintf(_T("외부\n"));

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-9]

// 연습문제 2-9.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

CTime 클래스를 이용해 현재 시각을 받아 '2013-11-22 13:23:40'과 같이

날짜와 시, , 초를 출력하도록 Console 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-9.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(""));

                       CTime tm;

                       tm = CTime::GetCurrentTime();

                       CString str = tm.Format(_T("%Y"));

                       _tprintf(_T("%s"), str);

                       str.Format(_T("-%d-%d %d:%d:%d"), tm.GetMonth(), tm.GetDay(), tm.GetHour(), tm.GetMinute(), tm.GetSecond());

                       _tprintf(_T("%s\n"), str);

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-10]

// 연습문제 2-10.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

//

 

#include "stdafx.h"

#include "연습문제 2-10.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(""));

                       CTime tm = CTime::GetCurrentTime();

                       CString str = tm.FormatGmt(_T("%A, %B %d, %Y"));

                       _tprintf(_T("%s\n"), str);

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-11]

// 연습문제 2-11.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

CTime CTimeSpan 클래스를 이용해 오늘부터 1000일째 되는 기념일을 계산하여

날짜를 출력하도록 Console 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-11.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(""));

                       CTime tm;

                       tm = CTime::GetCurrentTime();

                       CString str = tm.Format(_T("%A, %B %d, %Y"));

                       _tprintf(_T("현재 날짜: %s\n"), str);

                       tm += CTimeSpan(1000, 0, 0, 0); //, 시간, ,

                       str = tm.Format(_T("%A, %B %d, %Y"));

                       _tprintf(_T("1000일 후 날짜: %s\n"), str);

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-12]

// 연습문제 2-12.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

CUintArray 클래스를 이용해 1부터 100까지 입력하고, 입력된 값을 순서대로

출력한 뒤 ': 5050, 평균50' 형태로 합계와 평균을 출력하도록 ArrayTest1 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-12.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(""));

                       CUIntArray array;

                       array.SetSize(100);

                       UINT sum = 0;

                       for (int i = 0; i < 100; i++)

                       {

                              array[i] = i + 1;

                              sum += array[i];

                       }

                       for(int i=0; i<100; i++)

                              _tprintf(_T("%d "), array[i]);

                       _tprintf(_T("\n"));

                       _tprintf(_T(": %d, 평균: %d\n"), sum, sum / 100);

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-13]

// 연습문제 2-13.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

Point3D 구조체에 'COLORREF color' 멤버를 추가한 Point3DColor 구조체를 정의하고,

임의의 색상값으로 초기화하고 해당 색상값을 함께 출력하도록 ArrayTest2 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-13.h"

#include <afxtempl.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// 유일한 응용 프로그램 개체입니다.

 

CWinApp theApp;

 

using namespace std;

 

struct Point3D

{

        int x, y, z;

        COLORREF color;

        Point3D() {} //템플릿 클래스에 사용할 때는 반드시 기본생성자 필요

        Point3D(int x0, int y0, int z0, COLORREF c) :x(x0), y(y0), z(z0), color(c)

        {

        }

};

 

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: 응용 프로그램의 동작은 여기에서 코딩합니다.

                       CArray<Point3D, Point3D&> array;

                       array.SetSize(5);

                       for (int i = 0; i < 5; i++)

                       {

                              Point3D pt(i, i * 10, i * 100, RGB(i * i, i * 10, i * 20));

                              array[i] = pt;

                       }

                       for (int i = 0; i < 5; i++)

                       {

                              Point3D pt = array[i];

                              _tprintf(_T("%d, %d, %d, color: %x\n"), pt.x, pt.y, pt.z, pt.color);

                       }

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-14]

// 연습문제 2-14.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

CStriingList 클래스 대신 CList<> 템플릿 클래스를 사용하도록 ListTest1 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-14.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 *szFruits[] =

                       {

                              _T("사과"), _T("딸기"), _T("포도"), _T("오렌지"), _T("자두")

                       };

                       CList<CString, LPCTSTR> list;

                       for (int i = 0; i < 5; i++)

                              list.AddTail(szFruits[i]);

                       POSITION pos = list.GetHeadPosition();

                       while (pos != NULL)

                       {

                              CString str = list.GetNext(pos);

                              _tprintf(_T("%s "), str);

                       }

                       _tprintf(_T("\n"));

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-15]

// 연습문제 2-15.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

ListTest1 예제를 다음과 같이 수정하시오.

먼저 CList<> 템플릿 클래스를 사용하여 1부터 100까지 값을 보관한다.

그런 뒤 ::_tscanf() 함수로 1~100 사이 값을 입력받아 목록에서 검색하여 삭제하고, 남은 목록을 출력한다

*/

 

#include "stdafx.h"

#include "연습문제 2-15.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(""));

                       CList<UINT> list;

                       for (int i = 0; i < 100; i++)

                              list.AddTail(i + 1);

                       POSITION pos = list.GetHeadPosition();

                       _tprintf(_T("기존: "));

                       while (pos != NULL)

                       {

                              UINT temp = list.GetNext(pos);

                              _tprintf(_T("%d "), temp);

                       }

                       _tprintf(_T("\n"));

                       UINT num;

                       _tprintf(_T("삭제할 번호: "));

                       _tscanf_s(_T("%d"), &num);

                       pos = list.Find(num);

                       list.RemoveAt(pos);

                       pos = list.GetHeadPosition();

                       _tprintf(_T("변경 후: "));

                       while (pos != NULL)

                       {

                              UINT temp = list.GetNext(pos);

                              _tprintf(_T("%d "), temp);

                       }

                       _tprintf(_T("\n"));

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


[2-16]

// 연습문제 2-16.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.

/*

다음 표의 데이터를 보관하고, 이름을 입력하면 키를 출력하고

키를 입력하면 관련된 이름을 모두 출력하도록 MapTest2 예제를 수정하시오

*/

 

#include "stdafx.h"

#include "연습문제 2-16.h"

#include <afxtempl.h>

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// 유일한 응용 프로그램 개체입니다.

 

CWinApp theApp;

 

using namespace std;

//CString 타입에 해당하는 해시 함수가 없으므로 정의

template <> UINT AFXAPI HashKey(CString &str)

{

        LPCTSTR key = (LPCTSTR)str;

        return HashKey(key); //LPCTSTR 타입의 해시함수를 재호출

}

 

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(""));

                       //(CString->UINT) 객체를 생성하고 초기화

                       CMap<CString, CString&, UINT, UINT&> map;

                       map[CString(_T("홍길동"))] = 172;

                       map[CString(_T("박철수"))] = 164;

                       map[CString(_T("오영희"))] = 166;

                       map[CString(_T("구오성"))] = 182;

                       map[CString(_T("김순희"))] = 159;

                       map[CString(_T("최성주"))] = 177;

                       map[CString(_T("신여정"))] = 172;

                      

                       TCHAR buffer[1024];

                       UINT input, nCount;

                       _tscanf_s(_T("%s"), buffer, _countof(buffer));

                       CString name(buffer);

                       input = _ttoi((LPCTSTR)name); //CString->UINT

 

                       if(map.Lookup(name, nCount))

                       {

                              _tprintf(_T("%dcm\n"), nCount);

                       }

                       else

                       {

                              POSITION pos = map.GetStartPosition();

                              BOOL cnt = false; //이름을 찾았는지 여부

                              while (pos != NULL)

                              {

                                      map.GetNextAssoc(pos, name, nCount); //링크드 리스트처럼 하나하나 찾으며

                                      if (input == nCount)

                                      {

                                              _tprintf(_T("%s "), name);

                                              cnt = TRUE;

                                      }

                              }

                              if (!cnt)

                                      _tprintf(_T("표에 존재하지 않는 이름입니다\n"));

                              _tprintf(_T("\n"));

                       }

        }

    }

    else

    {

        // TODO: 오류 코드를 필요에 따라 수정합니다.

        wprintf(L"심각한 오류: GetModuleHandle 실패\n");

        nRetCode = 1;

    }

 

    return nRetCode;

}

 


개발환경:Visual Studio 2017


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


반응형