ch08 - 구조체 (structure)...
TRANSCRIPT
8. 구조체 (Structure)
2015-1 프로그래밍언어
2015년 4월 11일
교수 김 영 탁
영남대학교 공과대학 정보통신공학과(Tel : +82-53-810-2497; Fax : +82-53-810-4742http://antl.yu.ac.kr/; E-mail : [email protected])
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 2
Outline
구조체란 무엇인가 ?구조체의 선언, 초기화, 사용구조체의 활용구조체의 배열구조체와 포인터구조체와 함수공용체열거형 typedef Bit-field 구조체
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 3
자료형의 분류
자료형
기본자료형: char, int, float, double 등
파생자료형: 배열 (array), 열거형 (enum), 구조체 (struct), 공용체 (union)
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 4
구조체의 필요성학생에 대한 데이터를 하나로 모으려면?
학번: 20100001(정수)이름: “최자영”(문자열)학점: 4.3(실수)…
int number;
char name[10];
double grade;
와 같이 개별 변수로
나타낼 수 있지만
묶을 수가 있나?
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 5
구조체의 필요성
구조체를 사용하면 변수들을하나로 묶을 수
있습니다.
int number;
char name[10];
double grade;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 6
구조체와 배열
구조체 vs 배열
같은 자료 유형의 집합 다른 자료 유형의 집합
struct student {
int st_id;char name[50];double avg_score;. . . .
}
int data[50];
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 7
구조체 선언
구조체 선언 형식
struct 태그 {자료형 멤버1;자료형 멤버2;...
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 8
구조체 선언
구조체 선언은 변수 선언은 아님
구조체를 정의하는 것은 와플이나 붕어빵을 만드는 틀을 정의하는 것과 같다.
와플이나 붕어빵을 실제로 만만들릭 위해서는 구조체 변수를 선언하여야 한다.
구조체 구조체변수
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 9
구조체 선언의 예
// x값과 y값으로 이루어지는 화면의 좌표struct point {
int x; // x 좌표int y; // y 좌표
};
// 복소수struct complex {
double real; // 실수부double imag; // 허수부
};
// 날짜struct date {
int month;int day;int year;
};
// 사각형struct rect {
int x;int y;int width;int grade;
};
// 직원struct employee {
char name[20]; // 이름int age; // 나이int gender; // 성별int salary; // 월급
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 10
구조체 변수 선언
구조체 정의와 구조체 변수 선언은 다르다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 11
구조체의 초기화
중괄호를 이용하여 초기값을 나열한다.
struct student {int number;char name[10];double grade;
};struct student s1 = { 24, "Kim", 4.3 };
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 12
구조체 멤버 참조
구조체 멤버를 참조하려면 다음과 같이 ‘.’ 연산자를사용한다.
s1.number = 26; // 정수 멤버
strcpy(s1.name, "Kim"); // 문자열 멤버
s1.grade = 4.3; // 실수 멤버
.기호는구조체에서
멤버를 참조할때 사용하는
연산자입니다. .
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 13
예제 #1…struct student {
int number;char name[10];double grade;
};
int main(void){
struct student s;
s.number = 20070001;strcpy(s.name,"홍길동");s.grade = 4.3;
printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf(“학점: %f\n", s.grade);return 0;
}학번: 20070001이름: 홍길동학점: 4.300000
구조체 선언
구조체 변수 선언
구조체 멤버 참조
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 14
예제 #2struct student {
int number;char name[10];double grade;
};
int main(void){
struct student s;
printf("학번을 입력하시오: ");scanf("%d", &s.number);
printf("이름을 입력하시오: ");scanf("%s", s.name);
printf("학점을 입력하시오(실수): ");scanf("%lf", &s.grade);
printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf("학점: %f\n", s.grade);return 0;
}
학번을 입력하시오: 20070001이름을 입력하시오: 홍길동학점을 입력하시오(실수): 4.3학번: 20070001이름: 홍길동학점: 4.300000
구조체 선언
구조체 변수 선언
구조체 멤버의 주소 전달
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 15
예제 #3#include <math.h>struct point {
int x;int y;
};
int main(void){
struct point p1, p2;int xdiff, ydiff;double dist;
printf("점의 좌표를 입력하시오(x y): ");scanf("%d %d", &p1.x, &p1.y);
printf("점의 좌표를 입력하시오(x y): ");scanf("%d %d", &p2.x, &p2.y);
xdiff = p1.x - p2.x;ydiff = p1.y - p2.y;
dist = sqrt(xdiff * xdiff + ydiff * ydiff);
printf("두 점사이의 거리는 %f입니다.\n", dist);return 0;
}
점의 좌표를 입력하시오(x y): 10 10점의 좌표를 입력하시오(x y): 20 20두 점사이의 거리는 14.142136입니다.
p1 (x,y)
p2 (x,y)
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 16
구조체를 멤버로 가지는 구조체
struct date { // 구조체 선언
int year;int month;int day;
};
struct student { // 구조체 선언
int number;char name[10];struct date dob; // date of birth, 구조체 안에 구조체 포함
double grade;};struct student s1; // 구조체 변수 선언
s1.dob.year = 1983; // 멤버 참조
s1.dob.month = 03;s1.dob.day = 29;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 17
예제
#include <stdio.h>
struct point {int x;int y;
};
struct rect {struct point p1;struct point p2;
};
int main(void){
struct rect r;int w, h, area, peri;
p1(x,y)
p2(x,y)
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 18
예제
printf("왼쪽 상단의 좌표를 입력하시오: ");scanf("%d %d", &r.p1.x, &r.p1.y);
printf("오른쪽 상단의 좌표를 입력하시오: ");scanf("%d %d", &r.p2.x, &r.p2.y);
w = r.p2.x - r.p1.x;h = r.p2.x - r.p1.x;
area = w * h;peri = 2 * w + 2 * h;printf("면적은 %d이고 둘레는 %d입니다.\n", area, peri);
return 0;}
p1(x,y)
p2(x,y)
왼쪽 상단의 좌표를 입력하시오: 1 1오른쪽 상단의 좌표를 입력하시오: 6 6면적은 25이고 둘레는 20입니다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 19
구조체 변수의 대입과 비교
같은 구조체 변수까리 대입은 가능하지만 비교는불가능하다.
struct point {int x;int y;
};
int main(void){
struct point p1 = {10, 20};struct point p2 = {30, 40};
p2 = p1; // 대입 가능
if( p1 == p2 ) // 비교 -> 컴파일 오류!!printf("p1와 p2이같습니다.")
if( (p1.x == p2.x) && (p1.y == p2.y) ) // 올바른 비교printf("p1와 p2이같습니다.")
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 20
구조체 배열 (Array of Struct)구조체를 여러 개 모은 것
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 21
구조체 배열 (Array of Struct)
구조체 배열의 선언
struct student {int number;char name[20];double grade;
};
int main(void){
struct student list[100]; // 구조체의 배열 선언
list[2].number = 27;strcpy(list[2].name, "홍길동");list[2].grade = 178.0;
}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 22
구조체 배열의 초기화
구조체 배열의 초기화
struct student list[3] = {{ 1, "Park", 172.8 },{ 2, "Kim", 179.2 },{ 3, "Lee", 180.3 }
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 23
구조체 배열 예제
#define SIZE 3
struct student {int number;char name[20];double grade;
}; int main(void){
struct student list[SIZE];int i;
for(i = 0; i < SIZE; i++){
printf("학번을 입력하시오: ");scanf("%d", &list[i].number);printf("이름을 입력하시오: ");scanf("%s", list[i].name);printf("학점을 입력하시오(실수): ");scanf("%lf", &list[i].grade);
}
for(i = 0; i< SIZE; i++)printf("학번: %d, 이름: %s, 학점: %f\n", list[i].number, list[i].name, list[i].grade);
return 0;}
학번을 입력하시오: 20070001이름을 입력하시오: 홍길동학점을 입력하시오(실수): 4.3학번을 입력하시오: 20070002이름을 입력하시오: 김유신학점을 입력하시오(실수): 3.92학번을 입력하시오: 20070003이름을 입력하시오: 이성계학점을 입력하시오(실수): 2.87학번: 20070001, 이름: 홍길동, 학점: 4.300000학번: 20070002, 이름: 김유신, 학점: 3.920000학번: 20070003, 이름: 이성계, 학점: 2.870000
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 24
구조체 배열의 응용 예 (1)
Can initialize at declarationExample:
struct Planet {char name[10];double relativeMass;double distance;
};
struct Planet earth = {“Earth”, 1.0, 150};
Declaration provides initial data to all three member variables
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 25
Array of Structure
Struct data elements can be organized in array
Example)struct Planet solarSystem[SOLAR_PLANETS] = { {"Mercury", 0.0558, 57.9},
{"Venus", 0.815, 108},{"Earth",1.0, 150},{"Mars", 0.107, 228},{"Jupiter", 318, 778},{"Saturn", 95.1, 1430},{"Uranus", 14.5, 2870},{"Neptune", 17.2, 4500},{"Pluto", 0.11, 5900}
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 26
Handling attributes of each element of struct arrayvoid printPlanets(struct Planet solarPlanets[], int num_planet)1. {2. for (int i = 0; i<num_planet; i++)3. {4. printf("%2d", i);5. printf(" Name: ");6. printf("%-8s", solarPlanets[i].name);7. printf(" Rel Mass: ");8. printf("%7.3f", solarPlanets[i].relativeMass);9. printf(" Dist from Sun: ");10. printf("%6.1f₩n", solarPlanets[i].distance);11. } // end for12.}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 27
Sorting Array of Structure
Sorting elements in array of structure (1)void sortPlanetsByRelMass(struct Planet solarPlanets[], int num_planet)1. {2. struct Planet temp;3. int i, j, m;4. double min_RelMass;5. for (i=0; i<num_planet-1; i++) {6. m = i;7. min_RelMass = solarPlanets[i].relativeMass;8. for (j=i+1; j<num_planet; j++) {9. if (min_RelMass > solarPlanets[j].relativeMass) {10. m = j;11. min_RelMass = solarPlanets[j].relativeMass;12. }13. } // end inner for14. if (m != i) { // if new minimum found, swap15. temp = solarPlanets[i];16. solarPlanets[i] = solarPlanets[m];17. solarPlanets[m] = temp;18. }19. } // end outer for20. }
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 28
Sorting elements in array of structure (2)void sortPlanetsByName(struct Planet solarPlanets[], int num_planet) {1. struct Planet temp;2. int i, j, m;3. char min_Name[10] = {0};4. for (i=0; i<num_planet-1; i++) {5. m = i;6. strcpy(min_Name, solarPlanets[i].name);7. for (j=i+1; j<num_planet; j++) {8. if (strcmp(min_Name, solarPlanets[j].name) > 0) {9. m = j;10. strcpy(min_Name, solarPlanets[j].name);11. }12. } // end inner for13. if (m != i) { // if new minimum found, swap14. temp = solarPlanets[i];15. solarPlanets[i] = solarPlanets[m];16. solarPlanets[m] = temp;17. }18. } // end outer for19.}
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 29
1. int main() {2. struct Planet solarSystem[SOLAR_PLANETS] = 3. {{"Mercury", 0.0558, 57.9}, {"Venus", 0.815, 108}, {"Earth",1.0, 150},4. {"Mars", 0.107, 228}, {"Jupiter", 318, 778}, {"Saturn", 95.1, 1430},5. {"Uranus", 14.5, 2870}, {"Neptune", 17.2, 4500}, {"Pluto", 0.11, 5900} };
6. printf("₩n Initial state₩n");7. printPlanets(solarSystem, SOLAR_PLANETS);
8. sortPlanetsByRelMass(solarSystem, SOLAR_PLANETS);9. printf("₩n After sorting by relative mass:₩n");10. printPlanets(solarSystem, SOLAR_PLANETS);
11. sortPlanetsByDist(solarSystem, SOLAR_PLANETS);12. printf("₩n After sorting by distance from sun:₩n");13. printPlanets(solarSystem, SOLAR_PLANETS);
14. sortPlanetsByName(solarSystem, SOLAR_PLANETS);15. printf("₩n After sorting by name using strcmp and strcpy:₩n");16. printPlanets(solarSystem, SOLAR_PLANETS);17. printf("₩n₩n");18. return 0;19. }
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 30
result of execution
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 31
구조체와 포인터
• 구조체를 가리키는포인터
• 포인터를 멤버로가지는 구조체
순서로 살펴봅시다.
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 32
구조체를 가리키는 포인터
구조체를 가리키는 포인터
struct student *p;
struct student s = { 20070001, "홍길동", 4.3 };
p = &s;
printf("학번=%d 이름=%s 학점=%f \n", s.number, s.name, s.grade);printf("학번=%d 이름=%s 학점=%f \n", (*p).number,(*p).name,(*p).grade);
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 33
-> 연산자
-> 연산자는 구조체 포인터로 구조체 멤버를 참조할 때사용
struct student *p;
struct student s = { 20070001, "홍길동", 180.2 };
p = &s;
printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.grade); printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).grade);
printf("학번=%d 이름=%s 키=%f \n", p->number, p->name, p->grade);
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 34
-> 연산자
arrow operator
p가 가리키는 구조체 변수
p가 가리키는 구조체 변수의 멤버 number
(*p).number
p가 가리키는 구조체 변수의 멤버 number
p->number==
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 35
예제// 포인터를 통한 구조체 참조#include <stdio.h>
struct student {int number;char name[20];double grade;
};
int main(void){
struct student s = { 20070001, "홍길동", 4.3};struct student *p;
p = &s;
printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.grade);printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).grade);printf("학번=%d 이름=%s 키=%f \n", p->number, p->name, p->grade);
return 0;}
학번=20070001 이름=홍길동 학점=4.300000학번=20070001 이름=홍길동 학점=4.300000학번=20070001 이름=홍길동 학점=4.300000
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 36
포인터를 멤버로 가지는 구조체
struct date {int month;int day;int year;
};
struct student {int number;char name[20];double grade;struct date *dob;
};
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 37
포인터를 멤버로 가지는 구조체
int main(void){
struct date d = { 3, 20, 1980 };struct student s = { 20070001, "Kim", 4.3 };
s.dob = &d;
printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf("학점: %f\n", s.grade);printf("생년월일: %d년 %d월 %d일\n", s.dob->year, s.dob->month, s.dob->day);return 0;
}
학번: 20070001이름: Kim
학점: 4.300000생년월일: 1980년 3월 20일
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 38
자기참조 구조체 (Self-referential Structure)
Self-referential structure(자기참조 구조체) a special structure that includes a pointer which points the same
type structure
// definition of data fieldtypedef struct data {
int id;char name[20];char phone[12];
} DATA;
// definition of nodetypedef struct NODE {
DATA data; // data fieldstruct NODE *link; // pointer to next node
} NODE;
Advanced Networking Tech. Lab.Yeungnam University (yuANTL)
Programming LanguageProf. Young-Tak Kim8 - 39
자기참조 구조체의 예 –Binary Search Tree Node
A node in a binary tree is like a node in a linked list, except it has two node pointer fields:typedef struct TreeNode{
struct NodeData *pNodeData; // data fieldTreeNode *left; // link fieldTreeNode *right; // link field
} TreeNode;A constructor can aid in the creation of nodes