390 likes | 671 Views
Chapter11. 구조체와 열거형. 구조체 정의와 변수 선언 구조체 접근과 사용 구조체 재정의 구조체 사용 열거형. 구조체와 열거형을 이용하여 사용자 정의 자료형을 만드는 방법을 알아본다 . 구조체를 재정의하여 효율적으로 프로그래밍하는 방법을 알아본다 . 함수의 인자로 구조체와 구조체 포인터를 이용하는 방법을 알아본다. 1.1 구조체 정의. 구조체 : 서로 다른 자료형을 하나의 자료로 구조화한 자료형 구조체의 정의 : 구조체 키워드 struct 를 사용해서 정의
E N D
구조체 정의와 변수 선언 구조체 접근과 사용 구조체 재정의 구조체 사용 열거형
구조체와 열거형을 이용하여 사용자 정의 자료형을 만드는 방법을 알아본다. 구조체를 재정의하여 효율적으로 프로그래밍하는 방법을 알아본다. 함수의 인자로 구조체와 구조체 포인터를 이용하는 방법을 알아본다.
1.1 구조체 정의 • 구조체 : 서로 다른 자료형을 하나의 자료로 구조화한 자료형 • 구조체의 정의 : 구조체 키워드 struct를 사용해서 정의 • 구조체명: 식별자 작성 규칙에 맞추어 작성 • [그림 11-1]에서는 book • 멤버(Member): struct 안의 각 구성 요소 • 중괄호({ })안에 정의 • 마지막 중괄호({ }) 뒤에 꼭 세미콜론(;)을 기록해야함
1.2 구조체 변수의 선언 • 구조체 변수를 선언하는 방법 • students 구조체 정의 – students 구조체 선언 • 구조체 변수의 메모리 구조 st1의 메모리 크기: 총 합인 73
1.2 구조체 변수의 선언 • 예제 11-1) 구조체의 메모리 크기를 확인하는 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 #include <stdio.h> struct list { char name; char sex; int age; }; int main(void) { struct list st1 = {'T', 'M', 25}; printf("구조체 list의 크기는 %d이다.\n", sizeof(struct list)); printf("구조체 객체 st1의 크기는 %d이다.\n", sizeof(st1)); return 0; }
1.2 구조체 변수의 선언 • 구조체를 정의하면서 변수를 선언하는 방법 • students 구조체 정의와 선언 (1) – students 구조체 정의와 선언 (2) • 정의와 동시에 선언 ∙ 구조체명을 기록하지 않음
2. 구조체접근과 사용 • 구조체선언과 초기화하는 방법 • students 구조체 선언과 초기화 (1) • students 구조체 선언과 초기화 (2)
2. 구조체 접근과 사용 • 도트(.) 연산자 • 구조체 멤버변수에 접근할 때 사용 • 구조체 안의 멤버 변수들을 일반변수처럼 사용할 수 있게 해줌 • 구조체 멤버 연산자라고도 함 • 도트 연산자 형식과 예
2. 구조체 접근과 사용 • 예제 11-2) 도트 연산자를 이용한 구조체 접근 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> struct list { char name; char sex; int age; }; int main(void) { struct list st1, st2; st1.name = 'T'; st1.sex = 'M'; st1.age = 25; st2.name = 'S'; st2.sex = 'F'; st2.age = 28; printf("이름 성별 나이\n"); printf("-----------------------\n"); printf(" %c %c %d\n", st1.name, st1.sex, st1.age); printf(" %c %c %d\n", st2.name, st2.sex, st2.age); return 0; }
2. 구조체 접근과 사용 • 할당 연산자를 이용한 값 저장 • 구조체로 선언한 객체를 할당 연산자를 이용해 값을 저장하는 방법과 의미
2. 구조체 접근과 사용 • 예제 11-3) 구조체에서 할당 연산자를 사용하는 예 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> struct list { char name; char sex; int age; } ; int main(void) { struct list st1 = {'T', 'M', 25}; struct list st2, st3 = {'P', 'F', 30}; st2 = st1; st3.name = st1.name; st3.sex = st1.sex; printf(" 이름 성별 나이\n"); printf("-----------------------\n"); printf("st1 %c %c %d\n", st1.name, st1.sex, st1.age); printf("st2 %c %c %d\n", st2.name, st2.sex, st2.age); printf("st3 %c %c %d\n", st3.name, st3.sex, st3.age); return 0; }
2. 구조체 접근과 사용 • 혼자해보기11-1) 다음 프로그램에서 틀린 부분을 수정하시오. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 #include <stdio.h> struct list { char name; char sex; int age; }; int main(void) { list st1 = {'T', 'M', 25}; printf("st1 객체는 이름이 %c, 성별이 %c, 나이가 %d이다. \n", name, sex, age); return 0; }
3. 구조체 재정의 • typedef: 자료형을 재정의하는 키워드 • typedef를 이용해서 구조체의 자료형을 재정의하는 방법 • 구조체 정의 • 자료형 재정의 • 구조체 객체 선언
3. 구조체 재정의 • 예제 11-4) 구조체 재정의를 이용한 구조체 사용 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> structstudents { char name[20]; char address[30]; int age; }; typedefstruct students student; int main(void) { student st1 = {"Moon", "Seoul", 25}; structstudents st2 = {"John", "London", 30}; printf("학생 1은 성이 %s이고 %s에 살며 %d살이다.\n", st1.name, st1.address, st1.age); printf("학생 2는 성이 %s이고 %s에 살며 %d살이다.\n", st2.name, st2.address, st2.age); return 0; }
3. 구조체 재정의 • typedef를 이용한 구조체 자료형을재정의하는 다른 방법 • 자료형 재정의 • 구조체 객체 선언 반드시 이 형식으로 선언!
3. 구조체 재정의 • 혼자해보기11-2) 다음 프로그램에서 틀린 부분을 수정하시오. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 #include <stdio.h> struct list { char name; char sex; int age; }; typedefstruct list list; typedefstruct { char name[20]; char address[30]; int age; } student; 계속
3. 구조체 재정의 • 혼자해보기11-2) 다음 프로그램에서 틀린 부분을 수정하시오. 17 18 19 20 21 22 23 24 25 26 27 28 int main(void) { list lst1 = {'T', 'M', 25}; struct student st2 = {"Moon", "Seoul", 30}; printf("st1 객체는 이름이 %c, 성별이 %c, 나이가 %d이다.\n", lst1.name, lst1.sex, lst1.age); printf("st1 객체는 이름이 %s, 주소가 %s이며, 나이가 %d이다.\n", st1.name, st1.address, st1.age); return 0; }
3. 구조체 재정의 • 구조체를 이용한 3차원 좌표 표시 • 3차원상에서 한 점과 원점의 거리와 두 점간의 거리 구하기 • A1(x1, y1, z1) 점과 원점의 거리 • A1(x1, y1, z1) 점과 A2(x2, y2, z2) 점의 거리 sqrt( ) : 제곱근 구하는 함수. <math.h>파일에 정의됨
3. 구조체 재정의 • 예제 11-5) 구조체를 이용한 3차원 계산 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <stdio.h> #include <math.h> structThreeDime { double x; double y; double z; }; typedefstructThreeDimeThreeDime; int main(void) { double D1, D2; ThreeDime A1, A2; printf("3차원의 점 A1의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); printf("\n3차원의 점 A2의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A2.x, &A2.y, &A2.z);
3. 구조체 재정의 • 예제 11-5) 구조체를 이용한 3차원 계산 예제 24 25 26 27 28 29 30 31 32 33 34 35 // D1 : A1점과 원점과의 거리 D1 = sqrt(A1.x * A1.x + A1.y * A1.y + A1.z * A1.z); // D2 : A1점과 A2점과의 거리 D2 = sqrt((A1.x - A2.x) * (A1.x - A2.x) + (A1.y - A2.y) * (A1.y - A2.y) + (A1.z - A2.z) * (A1.z - A2.z)); printf("\nA1점과 원점의 거리는 %.2lf이다.\n\n", D1); printf("A1점과 A2점의 거리는 %.2lf이다.\n", D2); return 0; }
4.1 포인터를 이용한 구조체 사용 • 도트(.) 연산자: 일반변수 형태로 정의한 구조체의 멤버변수에 접근 • 화살표(->)구조체: 포인터 변수 형태로 정의한 구조체의 멤버변수에 접근 • 구조체 포인터를 사용하는 방법 • 구조체 포인터 선언과 초기화 • 구조체 포인터를 이용한 구조체 멤버 접근 형식과 사용 예
4.1 포인터를 이용한 구조체 사용 • 예제 11-6) 구조체 포인터를 이용한 구조체 멤버 접근 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 #include <stdio.h> structThreeDime { double x; double y; double z; }; typedefstructThreeDimeThreeDime; int main(void) { ThreeDime A1 = {3, 1, 8}; ThreeDime* pA1 = &A1; printf("3차원 점 A1의 x : %.2lf, y : %.2lf, z : %.2lf 이다.\n", pA1->x, pA1->y, pA1->z); return 0; }
4.2 함수의 인자로 구조체 사용 • 구조체를 인자로 받는 함수 • 3차원상의 한 점과 원점의 거리를 구하는 함수 • 3차원상의 두 점간 거리를 구하는 함수
4.2 함수의 인자로 구조체 사용 • 3차원상의 한 점을 원점에 대칭시킨 점을 구하는 함수
4.2 함수의 인자로 구조체 사용 • 예제 11-7) 구조체를 인자로 받는 함수 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <math.h> structThreeDime { double x; double y; double z; }; typedefstructThreeDimeThreeDime; double Distance1(ThreeDime a) { double d; d = sqrt(a.x * a.x + a.y * a.y + a.z * a.z); return d; }
4.2 함수의 인자로 구조체 사용 • 예제 11-7) 구조체를 인자로 받는 함수 예제 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 double Distance2(ThreeDime a, ThreeDime b) { double d; d = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z)); return d; } ThreeDimeSymOri(ThreeDime a) { a.x = -a.x; a.y = -a.y; a.z = -a.z; return a; }
4.2 함수의 인자로 구조체 사용 • 예제 11-7) 구조체를 인자로 받는 함수 예제 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 int main(void) { double D1, D2; ThreeDime A1, A2, A3; printf("3차원의 점 A1의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); printf("\n3차원의 점 A2의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A2.x, &A2.y, &A2.z); // D1 : A1점과 원점의 거리 D1 = Distance1(A1); // D2 : A1점과 A2점의 거리 D2 = Distance2(A1, A2); // A1점을 원점에 대칭시킨 점 A3 = SymOri(A1);
4.2 함수의 인자로 구조체 사용 • 예제 11-7) 구조체를 인자로 받는 함수 예제 54 55 56 57 58 59 60 printf("\nA1점과 원점의 거리는 %.2lf이다.\n", D1); printf("A1점과 A2점의 거리는 %.2lf이다.\n", D2); printf("A1점을 원점에 대칭시킨 점의 x : %.2lf, y : %.2lf, z : %.2lf이다.\n", A3.x, A3.y, A3.z); return 0; }
4.2 함수의 인자로 구조체 사용 • 구조체 포인터를 인자로 받는 함수 • 3차원상의 한 점과 원점의 거리를 구하는 함수 • 3차원상의 두 점간 거리를 구하는 함수
4.2 함수의 인자로 구조체 사용 • 3차원상의 한 점을 원점에 대칭시킨 점을 구하는 함수
4.2 함수의 인자로 구조체 사용 • 예제 11-8) 구조체 포인터를 인자로 받는 함수 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> #include <math.h> structThreeDime { double x; double y; double z; }; typedefstructThreeDimeThreeDime; double Distance1(ThreeDime* a) { double d; d = sqrt(a->x * a->x + a->y * a->y + a->z * a->z); return d; } double Distance2(structThreeDime* a, structThreeDime* b) { double d; d = sqrt((a->x - b->x) * (a->x - b->x) + (a->y - b->y) * (a->y - b->y) + (a->z - b->z) * (a->z - b->z)); return d; }
4.2 함수의 인자로 구조체 사용 • 예제 11-8) 구조체 포인터를 인자로 받는 함수 예제 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 ThreeDimeSymOri(ThreeDime* a) { a->x = -a->x; a->y = -a->y; a->z = -a->z; return *a; } int main(void) { double D1, D2; ThreeDime A1, A2, A3; printf("3차원의 점 A1의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A1.x, &A1.y, &A1.z); printf("\n3차원의 점 A2의 x, y, z 좌표를 입력하시오.\n"); scanf("%lf %lf %lf", &A2.x, &A2.y, &A2.z); // D1 : A1점과 원점의 거리 D1 = Distance1(&A1); // D2 : A1점과 A2점의 거리 D2 = Distance2(&A1, &A2);
4.2 함수의 인자로 구조체 사용 • 예제 11-8) 구조체 포인터를 인자로 받는 함수 예제 52 53 54 55 56 57 58 59 60 61 // A1점을 원점에 대칭시킨 점 A3 = SymOri(&A1); printf("\nA1점과 원점의 거리는 %.2lf이다.\n", D1); printf("A1점과 A2점의 거리는 %.2lf이다.\n", D2); printf("A1점을 원점에 대칭시킨 점의 x : %.2lf, y : %.2lf, z : %.2lf이다.\n", A3.x, A3.y, A3.z); return 0; }
5. 열거형 • 열거형(enum): 순서가 있고 새로운 값(상수)을 가질 수 있는 사용자 정의 자료형 • 열거형 정의와 사용 예 • 열거형 선언 예 0 1 2 3 4 • 상수 리스트에 특정한 상수값을 붙이고 싶은 경우 값을 할당하면 됨 열거형 상수 리스트에 포함된 변수에는 0번부터 1씩 증가하면서 상수값이 차례대로 붙음
5. 열거형 • 정수형 변수인 color값에 따라서 색을 표시하는 경우
5. 열거형 • 정수형 변수인 color값에 따라서 색을 표시하는 경우 : 열거형으로 선언
5. 열거형 • 예제 11-9) 열거형을 이용한 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 #include <stdio.h> int main(void) { enum{yellow, red, blue, green} color; printf("원하는 색을 입력하세요.\n"); printf("0번 : 노란색, 1번 : 빨간색\n"); printf("2번 : 파란색, 3번 : 초록색\n"); scanf("%d", &color); if(color = = yellow) printf("노란색입니다\n"); else if(color = = red) printf("빨간색입니다\n"); else if(color = = blue) printf("파란색입니다\n"); else if(color = = green) printf("초록색입니다\n"); return 0; }