이번 시간에는 구조체에 대해 알아보자.
struct xyz{
int x; // int형 멤버
long y; // long형 멤버
double z; // double형 맴버
}
struct xyz a; // struct xyz형 a의 정의
struct xyz *p = &a;
<구조체의 객체 안 멤버 접근 방법>
1. a.x
2. a.y
3. a.z
<p가 포인터 일 때, p가 가리키는 객체의 멤버에 접근하는 형식 '->' 사용>
1. p->x
<struct xyz에 대해서 typedef 이름인 동의어 XYZ를 정의할 수 있다.>
1. typedef struct xyz XYZ;
2. XYZ a; // XYZ형 (struct xyz형)의 a
3. XYZ *p = &a; // a를 가리키는 XYZ *형 (struct xyz*형)의 포인터 p
다음은 구조체를 활용한 예제를 보자.
#include <stdio.h>
#define VMAX 21
typedef struct
{
char name[20];
int height;
double vision;
}pisik;
void dist_vision(const pisik dat[], int n, int dist[])
{
int i;
for (i = 0; i < VMAX; i++)
dist[i] = 0;
for (i = 0; i < n; i++)
if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
dist[(int)(dat[i].vision * 10)]++;
}
double ave_height(const pisik dat[], int n) // x와 nx
{
int i = 0;
double sum = 0;
for (i = 0; i < n; i++)
sum += dat[i].height;
return sum / n;
}
int main(void)
{
int i;
pisik x[] = {
{"오지환", 175, 0.3},
{"이다솜", 163, 0.7},
{"이구영", 180, 2.0},
{"홍연의", 185, 1.5},
{"이준우", 130, 0.4},
{"유동훈", 145, 1.2},
{"오지원", 191, 0.8}
};
int nx = sizeof(x) / sizeof(x[0]);
//배열 x의 요소개수를 구한다.
int vdist[VMAX];
puts("ㅁㅁㅁ 신체검사표 ㅁㅁㅁ");
puts("===========================");
for (i = 0; i < nx; i++)
{
printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision);
}
printf("\n 평균 키 : %5.1f cm\n", ave_height(x, nx));
dist_vision(x, nx, vdist);
printf("\n 시력 분포 \n");
for (i = 0; i < VMAX; i++)
{
printf("%3.1f ~ : %2d명\n", i / 10.0, vdist[i]);
}
return 0;
}
<결과>
<main에서 호출>
printf("\n 평균 키 : %5.1f cm\n", ave_height(x, nx));
// 키의 평균값을 구한다.
double ave_height(const pisik dat[], int n) // x와 nx
{
int i = 0;
double sum = 0;
for (i = 0; i < n; i++)
sum += dat[i].height;
return sum / n;
}
<main에서 호출>
dist_vision(x, nx, vdist);
// vdist[21]; 분포를 저장하는 공간
//시력 분포를 구한다.
void dist_vision(const pisik dat[], int n, int dist[])
{
int i;
for (i = 0; i < VMAX; i++)
dist[i] = 0;
for (i = 0; i < n; i++)
if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
dist[(int)(dat[i].vision * 10)]++;
}