11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용 함수의 인자로 구조체 사용하기 열거형
구조체 정의 구조체 정의
구조체 변수의 선언 02 구조체 변수의 선언 students 구조체 정의 struct students { char name[20]; char address[30]; char tel[15]; int grade int age } ; students 구조체 선언 int main( ) { struct students st1; ......... return 0; }
구조체 포인터 선언 및 초기 03 구조체 포인터 선언 및 초기 struct ThreeDime { double x; double y; double z; }; typedef struct ThreeDime ThreeDime; ThreeDime A1= { 3, 1, 8}; ThreeDime* pA1 = &A1; // 포인터 선언 및 초기화
【예제 11-1】Ex1.c 02 구조체 초기화 예제 01 #include <stdio.h> 02 struct list { 03 char name; 04 char sex; 05 int age; 06 } ; 07 int main(void) 08 { 09 struct list st1, st2; 10 st1.name = 'T'; 11 st1.sex = 'M'; 12 st1.age = 25; 13 14 st2.name = 'S'; 15 st2.sex = 'F'; 16 st2.age = 28; 17 printf("이름 성별 나이\n"); 18 printf("-----------------------\n"); 19 printf(" %c %c %d\n", st1.name, st1.sex, st1.age); 20 printf(" %c %c %d\n", st2.name, st2.sex, st2.age); 21 return 0; 22 }
【예제 11-2】Ex2.c 02 구조체 초기화 예제 01 #include <stdio.h> 02 struct list { 03 char name; 04 char sex; 05 int age; 06 } ; 07 int main(void) 08 { 09 struct list st1 = {‘T', 'M', 25}; 10 11 printf("구조체 list의 크기는 %d이다\n", sizeof(struct list)); 12 printf("구조체 객체 st1의 크기는 %d이다\n", sizeof(st1)); 13 return 0; 14 } 표준입력 스트림
【예제 11-3】Ex3.c 02 구조체에서 할당연산자 사용 예제 01 #include <stdio.h> 02 struct list { 03 char name; 04 char sex; 05 int age; 06 } ; 07 int main(void) 08 { 09 struct list st1 = {‘T', 'M', 25}; 10 struct list st2, st3 = {'P', 'F', 30}; 11 st2 = st1; 12 st3.name = st1.name; 13 st3.sex = st1.sex; 14 printf(" 이름 성별 나이\n"); 15 printf("-----------------------\n"); 16 printf(" st1 %c %c %d\n", st1.name, st1.sex, st1.age); 17 printf(" st2 %c %c %d\n", st2.name, st2.sex, st2.age); 18 printf(" st3 %c %c %d\n", st3.name, st3.sex, st3.age); 19 return 0; 20 }
【예제 11-4】Ex4.c 02 구조체 예제 01 #include <stdio.h> 02 struct students { 03 char name[20]; 04 char address[30]; 05 int age; 06 }; 07 typedef struct students student; 08 int main(void) 09 { 10 student st1 = {"Moon", "Seoul", 25}; 11 struct students st2 = {"John", "London", 30}; 12 printf("학생 1은 성이 %s 이고 %s 에 살며 %d 살이다.\n", 13 st1.name, st1.address, st1.age); 14 printf("학생 2는 성이 %s 이고 %s 에 살며 %d 살이다.\n", 15 st2.name, st2.address, st2.age); 16 return 0; 17 }
【예제 11-5】Ex5.c 02 구조체 예제 01 #include <stdio.h> 02 #include <math.h> 03 struct ThreeDime { 04 double x; 05 double y; 06 double z; 07 }; 08 typedef struct ThreeDime ThreeDime; 09 int main(void) 10 { 11 double D1, D2; 12 ThreeDime A1, A2; 13 printf("3차원의 점 A1의 x, y, z 점을 입력하시오.\n"); 14 scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); 15 printf("\n3차원의 점 A2의 x, y, z 점을 입력하시오.\n"); 16 scanf("%lf %lf %lf", &A2.x, &A2.y, &A2.z); 17 D1 = sqrt(A1.x * A1.x + A1.y * A1.y + A1.z * A1.z); 18 D2 = sqrt((A1.x-A2.x)*(A1.x-A2.x) + 19 (A1.y-A2.y)*(A1.y-A2.y) + (A1.z-A2.z)*(A1.z-A2.z)); 20 printf("\nA1점과 원점과의 거리는 %.2lf 이다.\n\n", D1); 21 printf("A1점과 A2점과의 거리는 %.2lf 이다.\n", D2); 22 return 0; 23 }
구조체 포인터를 통한 구조체 멤버 접근 04 구조체 포인터를 통한 구조체 멤버 접근 구조체 포인터 -> 멤버명 ex ) pA1->x pA1->y pA1->z
【예제 11-6】Ex6.c 02 포인터를 사용하는 구조체 01 #include <stdio.h> 02 struct ThreeDime { 03 double x; 04 double y; 05 double z; 06 }; 07 typedef struct ThreeDime ThreeDime; 08 int main(void) 09 { 10 ThreeDime A1 = {3, 1, 8}; 11 ThreeDime* pA1 = &A1; 12 printf("3차원의 점 A1의 x : %.2lf, y : %.2lf, z : %.2lf 이다.\n\n", 13 pA1->x, pA1->y, pA1->z); 14 return 0; 15 } 표준입력 스트림
【예제 11-7】Ex7.c 02 포인터를 사용하는 구조체 29 int main(void) 30 { 31 double D1, D2; 32 ThreeDime A1, A2, A3; 33 printf("3차원의 점 A1의 x, y, z 점을 입력하 시오.\n"); 34 scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); 35 printf("\n3차원의 점 A2의 x, y, z 점을 입력 하시오.\n"); 36 scanf("%lf %lf %lf", &A2.x, &A2.y, &A2.z); 37 // D1 : A1점과 원점과의 거리 38 D1 = Distance(A1); 39 // D2 : A1점과 A2점과의 거리 40 D2 = Distance(A1, A2); 41 // A1점을 원점에 대칭 시킨 점 42 A3 = SymOri(A1); 43 printf("\nA1점과 원점과의 거리는 %.2lf 이다.\n\n", D1); 44 printf("A1점과 A2점과의 거리는 %.2lf 이다. \n", D2); 45 printf("A1점을 원점에 대칭 시킨 점의 x : %.2lf, y : %.2lf, z : %.2lf 이다.\n\n", A3.x, A3.y, A3.z); 46 return 0; 47 } 01 #include <stdio.h> 02 #include <math.h> 03 struct ThreeDime { 04 double x; 05 double y; 06 double z; 07 }; 08 typedef struct ThreeDime ThreeDime; 09 double Distance1(ThreeDime a) 10 { 11 double d; 12 d = sqrt(a.x * a.x + a.y * a.y + a.z * a.z); 13 return d; 14 } 15 double Distance2(ThreeDime a, ThreeDime b) 16 { 17 double d; 18 d = sqrt((a.x-b.x)*(a.x-b.x) +(a.y-b.y)*(a.y-b.y) 19 + (a.z-b.z)*(a.z-b.z)); 20 return d; 21 } 22 ThreeDime SymOri(ThreeDime a) 23 { 24 a.x = -a.x; 25 a.y = -a.y; 26 a.z = -a.z; 27 return a; 28 }
【예제 11-8】Ex8.c 02 포인터를 사용하는 구조체 01 #include <stdio.h> 02 #include <math.h> 03 struct ThreeDime { 04 double x; 05 double y; 06 double z; 07 }; 08 typedef struct ThreeDime ThreeDime; 09 double Distance1(ThreeDime* a) 10 { 11 double d; 12 d = sqrt(a->x * a->x + a->y * 13 a->y + a->z * a->z); 14 return d; 15 } 16 ThreeDime SymOri(ThreeDime* a) 17 { 18 a->x = -a->x; 19 a->y = -a->y; 20 a->z = -a->z; 21 return *a; 22 } 23 int main(void) 24 { 25 double D1; 26 ThreeDime A1, A2, A3; 27 28 printf("3차원의 점 A1의 x, y, z 점을 입력하시오.\n"); 29 scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); 30 // D1 : A1점과 원점과의 거리 31 D1 = Distance(&A1); 32 // A1점을 원점에 대칭 시킨 점 33 A3 = SymOri(&A1); 34 35 printf("\nA1점과 원점과의 거리는 %.2lf 이다.\n\n", D1); 36 printf("A1점을 원점에 대칭 시킨 점의 x : %.2lf, y : % .2lf, z : %.2lf 이다.\n\n", A3.x, A3.y, A3.z); 37 38 return 0; 39 }
열거형 (enum) 05 열거형 (enum) 열거형 정의 : enum 열거형 태그 { 열거형 상수 리스트 }; 사용 예 : enum color {yellow, red, blue, green, magenta}; 변수 선언 enum color col = red;
【예제 11-9】Ex9.c 02 열거형의 예제 01 #include <stdio.h> 02 int main(void) 03 { 04 enum { yellow, red, blue, green } color; 05 printf("원하는 색깔을 입력하세요.\n"); 06 printf("0번 : 노란색 1번 : 빨간색 \n"); 07 printf("2번 : 파란색 3번 : 초록색 \n"); 08 scanf("%d", &color); 09 10 if(color == yellow) printf("노란색입니다\n"); 11 else if(color == red) printf("빨간색입니다\n"); 12 else if(color == blue) printf("파란색입니다\n"); 13 else if(color == green) printf("초록색입니다\n"); 14 15 return 0; 16} 표준입력 스트림