학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

클래스를 이용한 성적관리 테이블 만들기

학습목표

구조체를 이용하여 프로그램을 했을 항상 테이블에 10명의 데이터가 출력되었다. 학생수가 가변 메모리를 관리하기가 불편 하였다. 이는 데이터를 클래스를 정의하여 사용하면 효율적으로 프로그램 있다.

다이어로그 박스에서 학생과 성적을 입력하고, 테이블을 만들어 출력한다. 학생의 데이터는 클래스를 정의 해서 데이터를 관리한다.

아래는 학생의 번호, 국어, 영어 점수를 입력하고 입력 버튼을 누르면 테이블에 학생의 데이터가 출력되고 학생의 번호를 입력하고 찾기를 누르면 학생의 데이터가 출력된다.

학습주제

1.       다이어로그 박스의 입출력

2.       학생 성적의 Data 클래스 정의

3.       테이블 만들기, 테이블 초기화, 테이블에 데이터 쓰기

4.       데이터의 찿기

예습내용

다이어로그 박스의 입출력과 구조체에서 학습한 내용을 결합하고 비쥬얼 프로그램의 테이블을 이용하여 성적 프로그램을 만들고 데이터를 찾는 기능을 만들어 본다.

실습방법

   

 

1. 새로운 프로젝트를 만들고 이름은 “Table” 입력한다.

 

 

“OK” 누르고 아래에서 “Dialog based” 선택한다. 나머지는 기본값으로 선택하거나 “Finish” 누르면 프로젝트가 생성된다.

리소스뷰 다이어로그 박스가 생성된 것을 볼수 있다.

 

“Edit Control” 선택하여 6개의 입력창을 만든다.

 

대화상자 편집기에서 “Static Text” 선택하여 만든 후에 아래와 같이속성창의 “Caption” 항목에 해당 이름을 쓴다.

아래 그림에서 Edit Control 선택하여 마우스 오른쪽 키를 눌러 “Class Wizard” 선택한다.

범주(T)” “Value”, “변수 형식(V)” “int”, “변수이름(N)” “m_no” 한다.

나머지 5개도 아래와 같이 변수를 추가한다.

 

 

번호

국어

영어

 

 

ID

IDC_EDIT1

IDC_EDIT2

IDC_EDIT3

 

 

변수이름

m_no

m_kor

m_eng

 

 

ID

IDC_EDIT4

IDC_EDIT5

IDC_EDIT6

 

 

변수이름

m_no1

m_kor1

m_eng1

 

아래 대화상자 편집기에서 “Button”을 선택하여 2개의 버튼을 만든다.

생성된 버튼의 마우스 오른쪽 버튼을 눌러 “속성”창에서 “Caption”을 “입력”과 “찾기”로 수정한다.

“입력”가 “찾기” 버튼을 마우스 왼쪽 키로 더블 크릭하면 “OnBnClickedButton1(), OnBnClickedButton2()”의 실행 함수가 만들어 진다.

 

 

아래 그림과 같이 새로운 클래스를 만든다.

아래 그림과 같이 데이터 저장을 위한 “CData” 클래스를 만든다. 그리고 Base class “CObeject”로 해야하나 여기에는 선택항이 없으므로 임의로 아무것이나 선택을 한 후에 나중에 수정을 하도록 한다.

클래스가 생성된 후에 “Data.h”를 열어서 “class CData : public CDataPathProperty”에서 “class CData : public CObject”로 수정한다.

를 선택하여 int 형태로 no, kor, eng, sum을 선언하고 float ave를 선언한다.

CData 클래스에 함수를 추가해야 하는데 이는 직접 손으로 추가 하는 것으로 한다.

 

 

 

 

#if !defined(AFX_DATA_H__752B62B0_58FE_44DA_9A0B_8098639D3772__INCLUDED_)

#define AFX_DATA_H__752B62B0_58FE_44DA_9A0B_8098639D3772__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// Data.h : header file

//

 

/////////////////////////////////////////////////////////////////////////////

// CData command target

 

class CData : public CObject //(1) Base Class "CDataPathProperty"를 바꾼다.

{

// Attributes

public:

 

// Operations

public:

        CData();                                                

        CData(CData& data);             //(1) 선언 추가

        CData& operator=(CData& data);   //(2) 선언 추가

        virtual ~CData();

 

// Overrides

public:

        //CData(CData& data);

        float ave;

        int sum;

        int eng;

        int kor;

        int no;

        // ClassWizard generated virtual function overrides

        //{{AFX_VIRTUAL(CData)

        //}}AFX_VIRTUAL

 

        // Generated message map functions

        //{{AFX_MSG(CData)

                // NOTE - the ClassWizard will add and remove member functions here.

        //}}AFX_MSG

 

// Implementation

protected:

};

 

/////////////////////////////////////////////////////////////////////////////

 

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

 

#endif // !defined(AFX_DATA_H__752B62B0_58FE_44DA_9A0B_8098639D3772__INCLUDED_)

 

 

 

 

 

 

// Data.cpp : implementation file

//

 

#include "stdafx.h"

#include "TableClass.h"

#include "Data.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

/////////////////////////////////////////////////////////////////////////////

// CData

 

CData::CData()

{

}

 

CData::CData(CData &data)

{

        no = data.no;

        kor = data.kor;

        eng = data.eng;

        sum = data.kor + data.eng;

        ave = (float)sum/2.;

}

 

CData& CData::operator =(CData &data)

{

        if (this == &data) return *this;

        no = data.no;

        kor = data.kor;

        eng = data.eng;

        sum = data.kor + data.eng;

        ave = (float)sum/2.;

        return *this;

}

 

CData::~CData()

{

}

 

 

// Do not edit the following lines, which are needed by ClassWizard.

#if 0

BEGIN_MESSAGE_MAP(CData, CDataPathProperty)

        //{{AFX_MSG_MAP(CData)

        //}}AFX_MSG_MAP

END_MESSAGE_MAP()

#endif  // 0

 

/////////////////////////////////////////////////////////////////////////////

// CData member functions

 

 

 

데이터를 추가하려면 아래와 같이 클래스를 추가하면 된다.

 

 

void CTableClassDlg::OnButton1()

{

        CData pData;

 

        UpdateData(TRUE);

        pData.no = m_no;

        pData.kor = m_kor;

        pData.eng = m_eng;

        m_listData.AddTail(pData);

}

 

 

 

 

데이터가 저장된 클래스의 처음부터 검색하여 입력 번호와 일치하면 클래스를 리턴한다.

 

 

CData CTableClassDlg::FindMan(int no)

{

        CData pData;

        POSITION pos,posL;

 

        for(pos=m_listData.GetHeadPosition(); pos != NULL;) {

                pData = m_listData.GetNext(pos);

                if(pData.no == no)

                        return pData;

        }

        pData.no = 0;

        return pData;

}

 

실행하면 아래와 같이 입력하고 찾기를 할 수 있다.

이제 테이블을 만들어 전체 데이터를 출력하는 프로그램을 만들자.

아래와 같이 “List Control”을 선택하여 Properties에서 아래와 같이 선택한다.

테이블을 선택하여 오른쪽 마우스를 클릭하여 ClassWizard를 선택하여 변수 이름을 아래와 같이 “m_ctrlList”로 정의 한다.

 

테이블은 “InitTabel” 함수를 만들어 “번호”, “국어”, “영어”, “합계”, “평균”을 기록하기 위한 컬럼을 초기화 한다. 그리고 “ListWrite” 함수를 만들어 학생들의 성적을 표시한다.

클래뷰에서 함수 추가를 선택하여

 

테이블에 성적을 나열하기 위해 5개의 컬럼을 추가한다. 그리고 이 함수를 다이어로그 박스가 생길 때 실행되는 “OnInitDialog()”에 추가한다.

 

데이터를 테이블에 출력하는 프로그램을 만든다. 그리고 함수가입력버튼을 누르면 실행하게 한다.

 

 

 

 

// TableClassDlg.h : header file

//

 

#if !defined(AFX_TABLECLASSDLG_H__0412ECCC_9AE5_41EC_A207_1C55687CA6EC__INCLUDED_)

#define AFX_TABLECLASSDLG_H__0412ECCC_9AE5_41EC_A207_1C55687CA6EC__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

/////////////////////////////////////////////////////////////////////////////

// CTableClassDlg dialog

#include "Data.h"       // (1) Data를 위한 파일 추가

#include "afxtempl.h"   // (1) Data를 위한 파일 추가

class CTableClassDlg : public CDialog

{

// Construction

public:

        void ListWrite();

        void InitTable();

        CData FindMan(int no);

        CList <CData, CData&> m_listData;        // 데이터 저장을 위한 선언

        CTableClassDlg(CWnd* pParent = NULL);    // standard constructor

 

// Dialog Data

        //{{AFX_DATA(CTableClassDlg)

        enum { IDD = IDD_TABLECLASS_DIALOG };

        CListCtrl       m_ctrlList;

        int             m_no;

        int             m_kor;

        int             m_eng;

        int             m_no1;

        int             m_kor1;

        int             m_eng1;

        //}}AFX_DATA

 

        // ClassWizard generated virtual function overrides

        //{{AFX_VIRTUAL(CTableClassDlg)

        protected:

        virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

        //}}AFX_VIRTUAL

 

// Implementation

protected:

        HICON m_hIcon;

 

        // Generated message map functions

        //{{AFX_MSG(CTableClassDlg)

        virtual BOOL OnInitDialog();

        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

        afx_msg void OnPaint();

        afx_msg HCURSOR OnQueryDragIcon();

        afx_msg void OnButton1();

        afx_msg void OnButton2();

        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()

};

 

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

 

#endif // !defined(AFX_TABLECLASSDLG_H__0412ECCC_9AE5_41EC_A207_1C55687CA6EC__INCLUDED_)

 

 

 

 

 

 

 

BOOL CTableClassDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

 

        // Add "About..." menu item to system menu.

 

        // IDM_ABOUTBOX must be in the system command range.

        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

        ASSERT(IDM_ABOUTBOX < 0xF000);

 

        CMenu* pSysMenu = GetSystemMenu(FALSE);

        if (pSysMenu != NULL)

        {

                CString strAboutMenu;

                strAboutMenu.LoadString(IDS_ABOUTBOX);

                if (!strAboutMenu.IsEmpty())

                {

                        pSysMenu->AppendMenu(MF_SEPARATOR);

                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                }

        }

 

        // Set the icon for this dialog.  The framework does this automatically

        //  when the application's main window is not a dialog

        SetIcon(m_hIcon, TRUE);                  // Set big icon

        SetIcon(m_hIcon, FALSE);         // Set small icon

       

        // TODO: Add extra initialization here

        InitTable();

        return TRUE;  // return TRUE  unless you set the focus to a control

}

void CTableClassDlg::OnButton1()

{

        CData pData;

 

        UpdateData(TRUE);

        pData.no = m_no;

        pData.kor = m_kor;

        pData.eng = m_eng;

        m_listData.AddTail(pData);

        ListWrite();

}

 

void CTableClassDlg::OnButton2()

{

        CData pData,pData1;

 

        UpdateData(TRUE);

        pData = FindMan((int)m_no1);

        m_kor1 = pData.kor;

        m_eng1 = pData.eng;

        UpdateData(FALSE);

}

 

CData CTableClassDlg::FindMan(int no)

{

        CData pData;

        POSITION pos,posL;

 

        for(pos=m_listData.GetHeadPosition(); pos != NULL;) {

                pData = m_listData.GetNext(pos);

                if(pData.no == no)

                        return pData;

        }

        pData.no = 0;

        return pData;

}

 

void CTableClassDlg::InitTable()

{

        // 컬럼에 대한 정보를 저장하는 구조체

        LV_COLUMN lvcolumn;

 

        // 설정할 항목들을 명시함

        lvcolumn.mask = LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;

 

        // 컬럼 헤더를 중앙에 출력하도록 함

        lvcolumn.fmt = LVCFMT_CENTER;

 

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

        {

                lvcolumn.iSubItem = i;

                switch(i)

                {

                case 0: // 첫번째 컬럼 정보 설정

                        lvcolumn.cx = 50;

                        lvcolumn.pszText = "번호";

                        break;

                case 1: // 두번째 컬럼 정보 설정

                        lvcolumn.cx = 50;

                        lvcolumn.pszText = "국어";

                        break;

                case 2: // 세번째 컬럼 정보 설정

                        lvcolumn.cx = 50;

                        lvcolumn.pszText = "영어";

                        break;

                case 3: // 네번째 컬럼 정보 설정

                        lvcolumn.cx = 50;

                        lvcolumn.pszText = "합계";

                        break;

                case 4: // 다섯번째 컬럼 정보 설정

                        lvcolumn.cx = 50;

                        lvcolumn.pszText = "평균";

                        break;

                }

                m_ctrlList.InsertColumn(i, &lvcolumn);   // 컬럼 추가

        }

}

 

void CTableClassDlg::ListWrite()

{

        m_ctrlList.DeleteAllItems( );    // 리스트에 있는 것을 모두 지운다.

        // 기존 파일을 열었을 때 테이블 작성

 

        LV_ITEM lvitem;

        lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;

        lvitem.iSubItem = 0;

        lvitem.iImage = 2;

        lvitem.stateMask = LVIS_STATEIMAGEMASK;

        lvitem.state = INDEXTOSTATEIMAGEMASK(1);

        lvitem.pszText = "";

 

        CData pData;

        POSITION pos,posL;

        CString strIms;

       

        for(pos=m_listData.GetHeadPosition(); pos != NULL;) {

                pData = m_listData.GetNext(pos);

 

                lvitem.iItem = m_ctrlList.GetItemCount();

                m_ctrlList.InsertItem(&lvitem);

 

                strIms.Empty();

                strIms.Format("%d",pData.no);

                m_ctrlList.SetItemText(lvitem.iItem, 0, strIms);

 

                strIms.Empty();

                strIms.Format("%d",pData.kor);

                m_ctrlList.SetItemText(lvitem.iItem, 1, strIms);

 

                strIms.Empty();

                strIms.Format("%d",pData.eng);

                m_ctrlList.SetItemText(lvitem.iItem, 2, strIms);

 

                strIms.Empty();

                strIms.Format("%d",pData.sum);

                m_ctrlList.SetItemText(lvitem.iItem, 3, strIms);

 

                strIms.Empty();

                strIms.Format("%f",pData.ave);

                m_ctrlList.SetItemText(lvitem.iItem, 4, strIms);

        }

}

 

 

이제 프로그램을 실행하면 학습목표와 같은 다이어로그 창이 나타난다.

 

 

   

 

중요함수

처음