Transcript pps

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