구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef 8장 구조체 구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
구조체 구조체(structure) (예) 여러 사람의 학번, 이름, 학과를 저장하는 변수 선언 여러 개의 임의의 자료형의 값들의 모임을 나타내는 자료형 (예) 여러 사람의 학번, 이름, 학과를 저장하는 변수 선언 구조체를 사용하지 않은 경우 int id1, id2, id3; … 학번 char name1[10], name2[10], name3[10]; … 이름 int dept1, dept2, dept3; … 학과코드 구조체를 사용한 경우 struct student { … 구조체 정의 int id; … 학번 char name[10]; … 이름 int dept; … 학과코드 }; struct student p1, p2, p3; … 구조체 변수 선언 C 언어 프로그래밍
구조체 정의 구조체의 사용 구조체 정의 구조체를 사용하기 위해서는 먼저 구조체의 자료 구조를 정의한다. 그 다음에 정의된 구조체의 자료형을 갖는 변수를 선언한다. 구조체 정의 struct student { int id; … 학번 char name[10]; … 이름 int dept; … 학과코드 } ; student 구조체이름, 태그 이름 id, name, dept 구조체 원소, 필드(field), 멤버(member) 빠뜨리지 않도록 주의 C 언어 프로그래밍
구조체 변수 선언 구조체 정의 후 변수 선언 구조체 정의와 함께 변수 선언 struct student person; struct student p1, p2; 구조체 정의와 함께 변수 선언 struct student { int id; char name[10]; int dept; } p1, p2; 이 구조체에 대한 변수 선언이 더 이상 없을 경우에는 태그이름 생략 가능. (권장하지 않음) C 언어 프로그래밍
구조체 정의와 변수 선언과의 관계 C 언어 프로그래밍
구조체 멤버 접근 구조체 멤버 접근: 구조체변수.멤버이름 (멤버연산자 .) (예) 구조체 멤버 접근: 구조체변수.멤버이름 (멤버연산자 .) person.id person.name person.dept p1.id p1.name p1.dept (예) person.id = 20030134; … 학번 초기화 gets(person.name); … 문자열 입력 scanf("%d", &person.dept); … 학과코드 입력 C 언어 프로그래밍
예제 (예 8.1) 두 점 사이의 거리 계산 2차원 좌표를 구조체를 사용하여 나타냄 C 언어 프로그래밍
struct point는 (예8.1)에서 정의된 구조체 중첩된 구조체 중첩된 구조체 구조체의 멤버로서 다른 구조체를 사용할 수 있음 struct triangle { struct triangle { struct point a; 또는 struct point a, b, c; struct point b; }; struct point c; }; 멤버의 접근 struct triangle p; p.a.x = 0; p.a.y = 10; … 구조체 멤버 접근 방법을 … 반복하여 적용 struct point는 (예8.1)에서 정의된 구조체 C 언어 프로그래밍
구조체의 초기화 구조체의 초기화 배열과 같이 { }를 사용하여 선언과 함께 초기화 가능 struct test { int a; 배열과 같이 { }를 사용하여 선언과 함께 초기화 가능 struct test { int a; double f[2]; 5개의 초기값이 필요 struct point p; }; struct test s1 = {1, 2.1, 4.5 , 5, 7 }; struct test s2 = {1, 2.1, 4.5 , 5 }; … s2.p.y = 0 struct test t1 = { 1, {2.1, 4.5}, {5, 7} }; struct test t2 = { 1, {2.1}, {5, 7} }; … t2.f[1] = 0.0 초기값이 멤버 수 보다 적으면 나머지는 0으로 간주됨 a f p C 언어 프로그래밍
예제: 복소수 곱셈 (예 8.2) 두 개의 복소수를 곱하는 프로그램 (a+bi) (c+di) = (ac-bd) + (ad+bc)i } 곱할 복소수 초기화 C 언어 프로그래밍
구조체의 치환과 비교 구조체의 치환은 허용됨 구조체의 비교는 허용되지 않음 구조체의 모든 멤버들이 복사됨 개별적으로 멤버 비교해야 함 struct point p1 = {4.0, 10.0}; struct point p2; p2 = p1; /* 구조체 치환 */ printf("p2: x = %f, y = %f\n", p2.x, p2.y); if (p1.x == p2.x && p1.y == p2.y) /* 구조체 비교: 멤버 별로 */ printf("두 점 p1과 p2는 같다.\n"); C 언어 프로그래밍
구조체와 함수 구조체는 함수의 인수 및 반환 값으로 사용 가능함. (예 8.5) 두 점의 중점의 좌표를 계산하는 함수 인수 및 반환값은 복사되어 전달됨 구조체의 크기가 큰 경우에는 비효율적 (예 8.5) 두 점의 중점의 좌표를 계산하는 함수 인수와 반환값으로 구조체 자료형 사용 호출 함수 피호출 인수값 반환값 C 언어 프로그래밍
예제 (계속) C 언어 프로그래밍
구조체 배열 구조체의 배열 (예) 10명의 학생의 자료를 입력 받아서 역순으로 출력 여러 개의 같은 구조체 자료형의 모임을 나타내는 자료형 (예) 10명의 학생의 자료를 입력 받아서 역순으로 출력 C 언어 프로그래밍
sizeof 연산자 sizeof 연산자 자료형이나 변수에 할당되는 메모리의 크기를 바이트 단위로 알려줌 sizeof(int) … 자료형 int의 크기 sizeof(struct student) … 자료형 struct student의 크기 sizeof(s) … 변수 s의 크기 int a[ ][5] = { … }; sizeof(a) / sizeof(a[0]) … 2차원 배열의 행의 개수 sizeof(a) / (5*sizeof(int)) … 2차원 배열의 행의 개수 struct student s[ ] = { … }; sizeof(s) / sizeof(struct student) … 구조체 배열 s의 원소 개수 sizeof(s) / sizeof(s[0]) ... 구조체 배열 s의 원소 개수 C 언어 프로그래밍
예제: 초기화된 구조체 배열의 검색 (예 8.7) 학번을 1000으로 나누면 입학년도 C 언어 프로그래밍
열거형 enum 열거형(enum) 예: 학과코드 정수형 상수 식별자들로 구성되는 자료형 학과 구분용으로 사용됨 기억하기가 어려우므로 기호상수를 정의하여 사용 #define KOREAN 100 /* 국어국문학과 */ #define ENGLISH 101 /* 영어영문학과 */ #define LAW 200 /* 법학과 */ #define ECONOMY 201 /* 경제학과 */ … struct student s; s.dept = LAW; 열거형을 사용하면 학과코드 이름을 더욱 간편하게 정의할 수 있음 C 언어 프로그래밍
열거형 정의 열거형 정의 열거형 변수 선언 enum deptcode {Korean, English, Law, Economy}; … 상수 식별자에는 0부터 순서대로 정수 값이 부여됨 (0,1,2,3) enum deptcode {Korean=100, English, Law=200, Economy}; … Korean=100, English=101, Law=200, Economy=201 열거형 변수 선언 enum deptcode dept; … 정의된 열거형 변수 선언 enum deptcode {Korean, English, … } dept; … 정의와 함께 선언 struct student { int id; char name[10]; enum deptcode dept; … 구조체 멤버로 정의 }; dept = Korean; … 열거형 상수 식별자를 값으로 사용 C 언어 프로그래밍
예제: 열거형을 사용한 프로그램 (예 8.9) C 언어 프로그래밍
자료형 정의 typedef 자료형 정의 자료형에 새로운 이름을 부여할 수 있음 typedef type newname typedef long int DWORD; typedef short WORD; typedef char BYTE; typedef struct student Student; typedef enum deptcode Deptcode; DWORD a; … long int a; BYTE c; … char c; Student s; … struct student s; Deptcode d; … enum deptcode d; C 언어 프로그래밍
자료형 정의(2) 배열에 대한 자료형 정의 구조체나 열거형을 정의할 때 형 정의를 함께 하면 태그이름 불필요 typedef int vector[10]; …vector는 1차원 정수 배열 typedef int matrix[5][5]; … matrix는 2차원 정수 배열 vector a; … int a[10]; matrix p; … int p[5][5]; 구조체나 열거형을 정의할 때 형 정의를 함께 하면 태그이름 불필요 typedef struct { double x, y; } Point; typedef enum { False=0, True=1 } Bool; Point p, q; … 구조체 Bool cond; … 열거형 C 언어 프로그래밍
예제: 형 정의를 사용한 프로그램 (예 8.10) 배열 구조체 C 언어 프로그래밍
실습 문제 음식 이름, 가격, 판매 수량이 다음과 같다. 짜장면 4000 87 짜장면 4000 87 짬뽕 5000 54 (자료를 더 많이 추가하시오.) 우동 4500 10 … 이 자료를 위한 구조체를 정의하고 구조체 배열을 선언하시오. 음식이름과 가격은 배열 선언과 함께 초기화하고 판매수량은 입력 받아서 저장하시오. 음식의 총 판매 가격을 계산하는 프로그램을 작성하시오. 음식을 가격 순서대로 정렬하여 출력하는 프로그램을 작성하시오. (교재의 구조체 자료 정렬 부분을 참고하시오.) C 언어 프로그래밍