관리 메뉴

ComputerVision Jack

[MFC - Chater2 연습 문제] 본문

Image Processing/MFC Programming

[MFC - Chater2 연습 문제]

JackYoon 2020. 8. 6. 02:11
반응형

1. 문자열 리소스(IDS_APP_TITLE)가 포함한 문자열을 'Console'에서 'World'로 수정하여 콘솔에 출력하시오.

문제 1번
IDS_APP_TITLE

Resource에 접근하여 IDS_APP_TITLE 캡션을 World로 수정하면 된다.

 

2. 문자열 리소스(IDS_APP_TITLE)가 포함한 문자열을 '콘솔'로 수정하여 한글이 정상적으로 출력되도록 수정하시오.

한글 콘솔 출력

우선 마찬가지로 Resource에 접근하여 IDS_APP_TITLE 캡션의 값을 콘솔로 변경한다.

_tsetlocale("LC_ALL", _T(""));

위 코드를 삽입하면 유니코드가 적용되어 한글이 콘솔 창에 실행된다.

 

3. "메세지 입니다." 문자열을 리소스 IDS_MESSAGE로 추가하고, CString 클래스를 이용하여 콘솔에 출력하시오.

문자열 리소스 출력
리소스 추가

IDS_MESSAGE를 추가하고 LoadString을 통하여 읽어오면 된다.

 

4. "이름 : %s, 나이 : %d" 문자열을 문자열 리소스 IDS_FORMAT으로 추가하고 CString 클래스를 이용하여 자신의 이름과 나이를 문자열로 변환한 후 메시지 상자로 출력하도록 수정하시오.

이름 나이 출력
리소스 추가

CString str;

CString buff;

Cstring name("본인 이름"); 을 선언한다.

buff.LoadString(IDS_FORMAT); 을 사용하여 리소스를 읽어오고

str.Format(buff, name, 27);을 사용하여 string 포멧을 설정하고 출력한다.

메세지 상자로 출력인데..까먹었네요..

 

5. TCHAR[1024] 버퍼에 _tscanf_s()함수로 영어 문자열을 입력 받아 CString 객체로 만든후 소문자로 변경하여 메시지 상자에 출력하시오.

소문자로 변경하여 출력

TCHAR szBuf[1024];

_tscanf_s(_T("%s"), szBuf, (UINT)_countof(szBuf)); 를 사용하여 우선 영문자를 읽어옵니다.

 

CString str = (LPCTSTR) szBuf; 로 형 변환을 적용합니다.

MessageBox(NULL, str.MakeLower(), _T(""), MB_OK); 를 통하여 화면에 출력합니다.

 

6.TCHAR[1024] 버퍼와 _tscanf_S() 함수로 한글 문자열을 입력 받아 "하세요" 문자를 "하시오" 문자로 대체하여 메시지 상자로 출력하시오.

하시오 변경 출력

마찬가지로 CString str = (LPCTSTR) szBuf; 로 형변환을 적용합니다.

str.Replace(_T("하세요"), _T("하시오")); replace함수를 통해 문자열 변경 한 후, 

MessageBox(NULL, str, _T(""), MB_OK)를 통하여 화면에 출력합니다.

 

7.'1248+370' 같이 덧셈 수식을 문자열로 입력 받아 CString 객체를 만들고 문자열을 분석한 후, 연산 결과를 메시지 상자로 출력하여라.

CString first = _tstoi(str.Left(str.Find(_T("+"))));

CString second = _tstoi(str.Mid(str.Find(_T("+))));

str.Left() + str.Find() 함수를 통해 + 앞에 있는 글자를 first 객체에 넣고 _tstoi() 함수를 통해 숫자로 바꾼다.

str.Mid() + str.Find() 함수를 통해 + 뒤에 있는 글자를 second 객체에 넣고 숫자로 바꿉니다.

 

int sum = first + second; 를 진행 한 후,

CString result;

result.Format(_T("%d"), sum); 을 통해 숫자를 다시 문자열로 변환한다.

MessageBox(NULL, result, _T(""), MB_OK);

문자열로 보통 변환할 땐, Format()을 사용하여 새롭게 문자열을 정의하면 편하다.

 

8. x좌표가 120, y좌표가60에 가로가 150이고 세로가 210인 CRecct 객체를 생성하고, 이 영역의 중심 좌표를 출력하여라.

중심 좌표

CRect rect{120, 60, 270, 270}; CRect rect 객체를 생성자를 통해 초기화 합니다

CPoint pt;

pt = rect.CenterPoint (); 함수를 통해서 사각형의 중심을 반환 받습니다.

(제가 사각형을 다르게 초기화 했습니다.)

9.직사각형 왼쪽 상단과 오른쪽 하단 좌표가 {120, 60, 270, 270} 인 CRect 객체를 생성하고 이 영역의 크기(폭 너비)를 출력하시오

너비 높이 출력

CRect rect{120, 60, 270, 270};

_tprintf(_T("사각형 너비 : %d 사각형 높이 : %d \n"), rect.width(), rect.height());

width() 와 height() 함수를 통해서 너비와 높이를 반환 받는다.

 

10. 직사각형 왼쪽 상단과 오른쪽 하단 좌표가 {120, 50, 280, 110}인 CRect 객체를 생성하고 가로 47, 세로 143만큼 이동시킨다. 사각형의 왼쪽 상단과 오른쪽 하단 좌표를 출력하시오.

사각형 좌표

CRect rect{120, 50, 280, 110};

rect.OffsetRect(47, 130);

_tprintf(_T("사각형 left : %d, 사각형 top : %d, 사각형 right : %d, 사각형 bottom : %d"), rect.left, rect.top, rect.right, rect.bottom);

OffsetRect() 함수를 이용하여 x값 y을 더해 이동시킨다.

 

11. 먼저 직사각형 왼쪽 상단과 오른쪽 하단 좌표가 {115, 245, 232, 397}인 CRect 객체를 생성하고, _tscanf_s()함수로 %d %d 형태로 특정 좌표 값을 입력 받아 CPoint 객체로 저장한다. 그리고 입력된 좌표가 해당 직사각형 내에 있으면 내부를 그렇지 않으면 외부를 출력한다.

사각형 내부외부

이것도 원이라고 잘못 표기 되었네요.

CPoint pt;

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

if (rect.PtInRect(pt))

    _tprintf(_T("사각형 내부 \n"));

else

    _tprintf(_T("사각형 외부 \n"));

PtInRect() 함수를 사용하여 사각형 내부에 점이 있는지 판별 할 수 있다.

 

12. 먼저 직사각형 왼쪽 상단과 오른쪽 하단 좌표를 _tscanf_s()함수로 %d %d %d %d 형태로 입력 방아 CRect 객체를 생성한다. 그리고 입력한 좌표가 정상적인 직사각형이면 정상을 출력하고 그렇지 않으면 정상으로 수정한 뒤 그 직사각형 왼쪽 상단과 오른쪽 하단 좌표를 출력한다.

사각형 검사

if (rect.IsRectEmpty())

    _tprintf(_T("정상 \n"));

else{

    rect.NormalizeRect();

    _tprintf(_T("수정된 사각형 ------"));

}

IsRectEmpty()로 정상적인 사각형을 검출한다. 만약 정상적인 사각형이 아니라면 NormalizeRect() 함수를 통해서 정상적인 사각형으로 조절한다.

 

13. CTime 클래스를 이용해 현재 시각을 받아 "2020-01-27 18:26:10'd와 같이 날짜와 시, 분 초를 출력하시오.

시간 출력 양식

Cstring str;

CTime tm;

tm = GetCurrentTime();

str.Format(_T("%04d-%02d-%02d %02d:%02d:%02d \n"), tm.GetYear(), tm.GetMonth(), tm.GetDay(), tm.GetHour(), tm.GetMinute(), tm.GetSecond());

GetCurrentTime() 함수로 현재시간을 얻어와 형식을 맞춰 출력하면 된다.

 

14. CTime 클래스를 이용해 현재 시각을 받아 협정 세계시 (UTC)로 변환하여 'Wednesday, January 29, 2020'과 같이 요일과 날짜를 출력하시오.

시간 출력 양식

CString str;

CTime tm;

tm = GetCurrentTime();

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

_tprintf(str);

양식을 맞추기 위해 string Format() 함수가 아닌 CTime의 FormatGmt() 함수를 사용하여 출력 양식을 맞춘다.

 

15. CTime과 CTimeSpan 클래스를 이용해 오늘부터 1000일째 되는 기념일을 계산하여 '2020년 10월 25일'과 같이 날짜를 출력하시오.

 

1000일뒤 출력

CTime tm;

CTime result;

tm = GetCurrentTime();

 

CTimeSpan cs(1000, 0, 0, 0);

result = tm + cs;

printf("%04년 %02d월 %02d일 \n", result.GetYear(), result.GetMonth(), result.GetDay());

CTimeSpan 클래스를 이용하여 CTime과 연산자 오버로딩을 사용하여 마무리한다.

(일단 왜 내껀..1994년이 뜨는건지.. 못찾았다)

 

17. Point3D 구조체에 'COLORREF color' 멤버를 추가한 Point3DColor 구조체를 정의하고, 임의의 색상 값으로 초기화하고 해당 색상 값을 함께 출력하시오.

Point3DColor 출력

struct Point3DColor{

    int x, y, z;

    COLORREF color;

 

    Point3DColor() {}

    Point3DColor(int x0, int y0, int z0, COLORREF color) { x= x0; y= y0; z = z0; color = 0;}

};

구조체에 COLORREF color를 추가한후,

CArray<Point3DColor, Point3DColor&> array;

array.SetSize(5);

... ... 출력시

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

    Point3DColor pt = array[i];

    _tprintf(_T("%d %d %d"), pt.x, pt.y, pt.z);

    _tprintf(_T("R: %d, G : %d, B : %d \n"), GetRValue(pt.color), GetGValue(pt.color), GetBValue(pt.color));

} 식으로 출력했다. (솔직히 아직 COLORREF에 대해 잘 공부해보진 않았다.

 

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

비 템플릿 제작

TCHAR* Fruit[] = { _T("사과"), _T("딸기"), _T("포도"), _T("오렌지"), _T("자두")};

 

CList<CString, LPCTSTR> list;

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

     list.AddTail(CString((LPCTSTR)Fruit[i]));

}

POSITION pos = list.GetHeadPosition();

while(pos != NULL){

    CString str = list.GetNext(pos);

    _tprintf(str);

    _tprintf(_T("\n");

}

 

19. 먼저 CList<> 템플릿 클래스를 사용하여 1부터 10까지 값을 보관한다. 그런 뒤 _tscanf_s() 함수로 %d 형태로 1~10 사이의 값을 입력 받아 목록에서 검색하여 삭제한다. 삭제 후 남은 목록에 숫자가 남지 않을 때까지 반복한다.

입력받아 리스트 삭제하기

CList <UINT, UINT&> cl;

for(int i = 0; i < 10; i++){

    cl.AddTail(UINT(i));

}

 

POSITION pos;

 

while(!cl.IsEmpty()){

    UINT nItem = 0;

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

 

    pos = cl.Find(nItem);

    cl.RemoveAt(pos);

    pos = cl.GetHeadPosition();

 

    while(pos != NULL) {

        CString str;

        str.Format(_T("%d "), cl.GetNext(pos));

        _tprintf(str);

    }

    _tprintf(_T("\n"));

}

 

20. 다음 표를 구성하는 데이터를 보관하고 이름을 입력하면 키를 출력하고 키를 입력하면 관련된 이름을 모두 출력하시오.

자료

우선

template<> UINT AFXAPI HashKey(CString& str) {

    LPCTSTR key = (LPCTSTR) str;

    return HashKey(key);

전역으로 템프릿을 제작한다.

 

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

map[CString(_T("전승환"))] = 172; ...식으로 map을 세팅한다.

 

TCHAR szName[100];

UINT height;

_tscanf_s(_T("%s"), szName, (UINT)_countof(szName));

 

if (map.Lookup(CString(szName), height))

    _tprintf(_T("%s 의 키는 %d cm 입니다.\n"), szName, height);

 

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

POSITION pos = map.GetStartPosition();

 

_tprintf(_T("%d의 키를 가진 학생들 \n"), height);

while (pos != NULL){

    CString strKey;

    UINT strValue;

    map.GetNextAssoc(pos, strKey, strValue);

    if(height == strValue)

        _tprintf(_T("%s "), (LPCTSTR) strKey);

}

반응형

'Image Processing > MFC Programming' 카테고리의 다른 글

[MFC - Chapter3 연습 문제]  (0) 2020.08.17
[MFC - MFC 프로그램 구조]  (0) 2020.08.17
[MFC - MFC 기초 클래스]  (0) 2020.08.05
[MFC - Chater1 연습 문제]  (0) 2020.08.03
[MFC - 윈도우 프로그래밍 기초]  (0) 2020.08.03
Comments