본문으로 바로가기

[C언어] 구조체

category C 2014. 6. 4. 11:25

학교 시스템을 만들어 보자

데이터들을 크게 본다면 학과, 학생, 교수, 도서, 교과목 등이 있을 수 있으며

 

학과와 관련해서

학과번호, 이름, 학과장,  전화번호, 주소, ...

 

학생과 관련해서

학번, 이름, 학과, 전화번호, 주소, ...

 

교수와 관련해서

교수번호, 이름, 학과, 전화번호, 주소, ...

 

도서와 관련해서

책번호, 이름, 저자, 출판사, 대여정보, ....

 

void main()
{
 // 학과
    int   iDepartmentNumber;
    char szDepartmentName[10];
    char szDepartmentChief[10];
    char szDepartmentTelephone[20];
    char szDepartmentAddress[50];
 //...

 // 학생
    int   iStudentNumber;
    char szStudentName[10];
    int   iStudentDepartmentNumber;
    char szStudentTelephone[20];
    char szStudentAddress[50];

 //...

 // 교수
    int   iProfessorNumber;
    char szProfessorName[10];
    int   iProfessorDepartmentNumber;
    char szProfessorTelephone[20];
    char szProfessorAddress[50];
 //...

 // 도서
    int   iBookNumber;
    char szBookName[40];
    char szBookAuthor[20];
    char szBookPress[20];
 //...
}

 

위의 내용은 단 하나만을 처리하기 위한 데이터들이다.

 

#define MAX_DEPARTMENT 10
#define MAX_STUDENT 1000
#define MAX_PROFESSOR 50
#define MAX_BOOK 10000

void main()
{
 // 학과
    int   iDepartmentNumber[MAX_DEPARTMENT];
    char szDepartmentName[MAX_DEPARTMENT][10];
    char szDepartmentChief[MAX_DEPARTMENT][10];
    char szDepartmentTelephone[MAX_DEPARTMENT][20];
    char szDepartmentAddress[MAX_DEPARTMENT][50];
 //...

 // 학생
    int   iStudentNumber[MAX_STUDENT];
    char szStudentName[MAX_STUDENT][10];
    int   iStudentDepartmentNumber[MAX_STUDENT];
    char szStudentTelephone[MAX_STUDENT][20];
    char szStudentAddress[MAX_STUDENT][50];
 //...

 // 교수
    int   iProfessorNumber[MAX_PROFESSOR];
    char szProfessorName[MAX_PROFESSOR][10];
    int   iProfessorDepartmentNumber[MAX_PROFESSOR];
    char szProfessorTelephone[MAX_PROFESSOR][20];
    char szProfessorAddress[MAX_PROFESSOR][50];
 //...

 // 도서
    int   iBookNumber[MAX_BOOK];
    char szBookName[MAX_BOOK][40];
    char szBookAuthor[MAX_BOOK][20];
    char szBookPress[MAX_BOOK][20];
 //...
}

 

문제점

1. 이름 짓기가 너무 힘들다. 

2. 데이터들을 찾기가 힘들다.

 

이러한 문제점을 해결하기 위해서 관련 데이터를 묶을 수 없을까? 배열은 동일한 자료형의 연속된 집합이였다. 그러나 묶어야 할 데이터는 동일한 자료형이 아니다. 좀 더 쉽게 연관된 데이터를 정리할 순 없을까? 여기에 대한 해결책은 "구조체"에 있다.

 

구조체란?

다른 자료형의 변수들의 집합이다.

 

학생성적을 구조체로 만들어 보자

이름, 국어점수, 영어점수, 수학점수, 평균, 총점, ...

 

char szName[10];

int iKor, iEng, iMat, iTot;

float fAve;

 

내용을 구조체로 만든다면

struct STUDENT

{

    char szName[10];

    int iKor, iEng, iMat, iTot;

    float fAve;

};

와 같이 만들 수 있다.

typedef struct _tagSTUDENT

{

    char szName[10];

    int iKor, iEng, iMat, iTot;

    float fAve;

} STUDENT, *LPSTUDENT;

 

<참조> Windows API

typedef unsigned long       DWORD;
typedef int                        BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float                     FLOAT;
typedef void                    *LPVOID;

<참조>

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

<참조>

typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;

<참조>

typedef struct D3DXMATRIX : public D3DMATRIX {
public:
...
} D3DXMATRIX, *LPD3DXMATRIX;

 

구조체는 아주 간단하게 생각하면 사용자가 만든 자료형이라고 볼 수 있다.

struct STUDENT

{

    char szName[10];

    int iKor, iEng, iMat, iTot;

    float fAve;

}; // 유의점 마지막에 세미콜론(;)으로 끝난다.

STUDENT 라는 자료형이 만들어졌다.

자료형 변수; // int a; 라고 사용하듯이

STUDENT a; // STUDENT a 라고 쓰면 STUDENT 라는 자료형의 변수 a 가 생성되는 것이다.

각각의 멤버에 접근하기 위해서는 .(점)을 통해 접근하며 만약 포인터형이라면 ->을 통해 접근한다.

scanf("%d", a.szName);

scanf("%d", &a.iKor);

STUDENT *pa = &a;

scanf("%d", &pa->iEng);

 

Ex1)

#include <stdio.h>

struct STUDENT

{

    char szName[10];

    int iKor, iEng, iMat, iTot;

    float fAve;

};

void main()

{
    STUDENT neo;

    scanf("%s%d%d%d", neo.szName, &neo.iKor, &neo.iEng, &neo.iMat);

    neo.iTot = neo.iKor + neo.iEng + neo.iMat;

    noe.fAve = neo.iTot / 3.0f;

}

<실습1>

복수개로 만들기

    STUDENT neo[5];

구조체 변수를 배열로 만들 수 있다.

<실습2>

포함관계로 만들기

struct STUDENT

{

    char szName[10];

    int iKor, iEng, iMat, iTot;

    float fAve;

};

struct CLASSROOM

{

    STUDENT student[30]; 

};

struct GRADE

{

    CLASSROOM classroom[10];

};

struct SCHOOL

{

    GRADE grade[3];

};