학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

테이블 만들기

학습목표

다이어로그 박스를 이용하여 학생과 성적을 입력하고, 테이블을 만들어 출력한다.

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

학습주제

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

2.       학생 성적의 구조체 선언과 메모리 할당

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()”의 실행 함수가 만들어 진다.

이제 필요한 구조체와 변수를 선언하여 데이터를 저장하고 읽어야 합니다.

“보기1”의 “TableDlg.h”에 (1)항목의 구조체를 직접 입력하고, 구조체의 초기 번지를 입력하기 위한 포인터를 (2) 항목을 아래와 같이 “Add Member Variable”을 선택하여 입력합니다.

 

 

데이터를 입력하거나 찾기 할 때 선택된 학생의 메모리 번지에 위치하여 데이터를 입력하거나 참조를 하여야한다. 그러므로 데이터의 번지수를 찾기위한 “Man* FindMan(int no)” 함수를 만든다. 이 함수는 학생의 번호를 입력 변수로 받아 데이터의 저장 번지를 포인터로 반환 한다. 클래스에서 “함수 추가”를 선택한다.

 

 

 

보기1  TableDlg.h

 

 

// TableDlg.h : header file

#if !defined(AFX_TABLEDLG_H__0A887F7C_4701_4AB5_8095_E38B3089862F__INCLUDED_)

#define AFX_TABLEDLG_H__0A887F7C_4701_4AB5_8095_E38B3089862F__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

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

// CTableDlg dialog

typedef struct list Man;

struct list{    // (1)구조체의 선언

        int no;

        int kor;

        int eng;

        int sum;

        float ave;

};

 

class CTableDlg : public CDialog

{

// Construction

public:

        Man *init;      // (2) 구조체의 초기 번지를 입력하기 위해 선언

        Man* FindMan(int no);   // (3) 학생의 번호를 받아 저장 번지의 포인터를 반환한다.

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

 

// Dialog Data

        //{{AFX_DATA(CTableDlg)

        enum { IDD = IDD_TABLE_DIALOG };

        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(CTableDlg)

        protected:

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

        //}}AFX_VIRTUAL

 

// Implementation

protected:

        HICON m_hIcon;

 

        // Generated message map functions

        //{{AFX_MSG(CTableDlg)

        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_TABLEDLG_H__0A887F7C_4701_4AB5_8095_E38B3089862F__INCLUDED_)

 

 

 

보기 2   TableDlg.cpp

 

 

// TableDlg.cpp : implementation file

BOOL CTableDlg::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

        init = (Man *)malloc(sizeof(Man)*10);    //(4) 10 명의데이타메모리할당

        Man *a;

        a=init;

        for(int i=1;i<=10;i++) {         //(5) 학생의번호를초기화한다.

                a->no = i;

                a->kor=0; a->eng=0; a->sum=0; a->ave=0;

                a++;

        }

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

}

void CTableDlg::OnButton1()              // "입력" 버튼실행함수

{

        // (6) 입력된번호의학생을찾아국어, 영어점수를입력한다.

        Man *a;

       

        UpdateData(TRUE);

        a=FindMan(m_no);

        a->kor = m_kor;

        a->eng = m_eng;

}

 

void CTableDlg::OnButton2()              // "찾기" 버튼실행함수

{

        // (7) 입력된번호의학생을찾아국어, 영어점수를화면에출력한다.

        Man *a;

       

        UpdateData(TRUE);

        a=FindMan(m_no1);

        m_kor1=a->kor;

        m_eng1=a->eng;

        a->sum = a->kor + a->eng;

        a->ave = (float)a->sum/2.;

        UpdateData(FALSE);

}

 

Man* CTableDlg::FindMan(int no)

{

// (8) 매개변수no 와 학생의 번호가 일치하면 해당 학생의 포인터를 반환하고 해당 학생이 없으면 NULL을 반환한다.

        Man *a;

        a=init;

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

                if(a->no == no)

                        return a;

                a++;

        }

        return NULL;

}

 

 

 

 

이제 프로그램을 실행하면 아래와 같이 화면이 나오고 번호와 성적을 입력한 후에 입력 버튼을 누르면 입력되고 찾기의 번호에 학생의 번호를 입력 후에 “찾기” 버튼을 누르면 해당 학생의 성적이 출력 된다.

이제 테이블을 만들고 여기서 학생들의 성적을 출력한다. 아래에서 “List Control”을 선택한다.

아래와 같이 테이블을 만들고 속성 창에서 “View”를 “Report”로 수정하고 “Single selection, Edit labels”를 선택한다.

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

 

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

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

 

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

 

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

 

BOOL CTableDlg::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

              init = (Man *)malloc(sizeof(Man)*10);    //(4) 10 명의데이타메모리할당

              Man *a;

              a=init;

              for(int i=1;i<=10;i++) {           //(5) 학생의번호를초기화한다.

                             a->no = i;

                             a->kor=0; a->eng=0; a->sum=0; a->ave=0;

                             a++;

              }

              InitTable();              //(10) 테이블에 컬럼을 추가하여 초기화 한다.

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

}

 

void CTableDlg::OnButton1()                 // "입력" 버튼실행함수

{

              // (6) 입력된번호의학생을찾아국어, 영어점수를입력한다.

              Man *a;

             

            UpdateData(TRUE);

              a=FindMan(m_no);

              a->kor = m_kor;

              a->eng = m_eng;

              a->sum = a->kor + a->eng;

              a->ave = (float)a->sum/2.;

              ListWrite();

}

 

void CTableDlg::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 CTableDlg::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 = "";

 

              int i;

              CString strIms;

              Man *a;

              a=init;

 

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

                             lvitem.iItem = m_ctrlList.GetItemCount();

                             m_ctrlList.InsertItem(&lvitem);

 

                             strIms.Empty();

                             strIms.Format("%d",a->no);

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

 

                             strIms.Empty();

                             strIms.Format("%d",a->kor);

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

 

                             strIms.Empty();

                             strIms.Format("%d",a->eng);

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

 

                             strIms.Empty();

                             strIms.Format("%d",a->sum);

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

 

                             strIms.Empty();

                             strIms.Format("%f",a->ave);

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

                             a++;

              }

}

 

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

 

 

 

 

   

 

중요함수

처음