학교 시스템을 만들어 보자
데이터들을 크게 본다면 학과, 학생, 교수, 도서, 교과목 등이 있을 수 있으며
학과와 관련해서
학과번호, 이름, 학과장, 전화번호, 주소, ...
학생과 관련해서
학번, 이름, 학과, 전화번호, 주소, ...
교수와 관련해서
교수번호, 이름, 학과, 전화번호, 주소, ...
도서와 관련해서
책번호, 이름, 저자, 출판사, 대여정보, ....
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];
};