2. Console 예제를 수정하여, 다음 표의 데이터를 보관한다. 그리고 이름을 입력하면 키와 몸무게를 출력하라.
이름 |
키(cm) |
몸무게(kg) |
홍길동 |
172 |
72 |
박철수 |
164 |
67 |
오영희 |
166 |
51 |
구오성 |
182 |
80 |
김순희 |
159 |
48 |
최성주 |
177 |
69 |
신여정 |
172 |
51 |
보통 맵을 사용하는 것과 동일하지만, 키 외에 저장되는 데이터가 하나 이상이므로 구조체를 사용해야 한다. 따라서 PHYSIQUE 라는 구조체를 사용하여 CMapStringToPtr 객체에 저장한 후, 입력한 이름을 검색하여 해당 키와 몸무게를 출력한다. CMapStringToPtr 객체에 데이터를 저장할 때 new 연산자를 사용하여 메모리를 할당하므로, 프로그램을 종료할 때 반드시 메모리를 모두 해제해 주어야 한다.
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
…
else
{
CMapStringToPtr mapData;
mapData["홍길동"] = new PHYSIQUE(172, 72);
mapData["박철수"] = new PHYSIQUE(164, 67);
mapData["오영희"] = new PHYSIQUE(166, 51);
mapData["구오성"] = new PHYSIQUE(182, 80);
mapData["김순희"] = new PHYSIQUE(159, 48);
mapData["최성주"] = new PHYSIQUE(177, 69);
mapData["신여정"] = new PHYSIQUE(172, 51);
cout << "이름을 입력하면 키와 몸무게를 알 수 있습니다" << endl;
TCHAR szName[100];
CString strName;
void *pData;
cin >> szName;
strName = szName;
if (mapData.Lookup(strName, pData) == TRUE)
{
PPHYSIQUE pphysique = (PPHYSIQUE)pData;
cout << (LPCTSTR)strName << "의 키: " << pphysique->uiHeight;
cout << ", 몸무게: " << pphysique->uiWeight << endl;
}
else
cout << "존재하지 않는 이름입니다" << endl;
POSITION pos = mapData.GetStartPosition();
while (pos)
{
mapData.GetNextAssoc(pos, strName, pData);
delete pData;
}
}
…
}
MFC 템플릿을 사용하기 위해 다음과 같이 afxtempl.h 헤더 파일이 필요하다. PHYSIQUE 는 키와 몸무게를 UINT 멤버로 포함하는 구조체다.
#include "afxtempl.h"
typedef struct tagPHYSIQUE
{
tagPHYSIQUE() {
};
tagPHYSIQUE(UINT uiH, UINT uiW)
: uiHeight(uiH), uiWeight(uiW) {
};
UINT uiHeight;
UINT uiWeight;
} PHYSIQUE, *PPHYSIQUE;