Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영.

Similar presentations


Presentation on theme: "제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영."— Presentation transcript:

1 제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영

2 순서 제 8장 구조체 구조체의 개요 구조체의 형식 구조체의 연산 구조체의 중첩 공용체 구조체의 응용 요약

3 구조체의 개요 구조체의 정의 구조체 사용의 장점 구조체 사용의 단점 단일 명칭으로 하나 이상의 변수를 함께 묶은 형태의 변수
제 8장 구조체 구조체의 정의 단일 명칭으로 하나 이상의 변수를 함께 묶은 형태의 변수 구조체 사용의 장점 연관된 데이터에 의한 반복성 회피 매개변수로 사용 가능 함수에서 여러개의 데이터를 한 번에 주고 받을 수 있음 구조체 사용의 단점 메모리 낭비

4 구조체의 형식 연관된 데이터의 형태의 예 데이터베이스 프로그램에 유용한 형태의 변수 신체조건 인적사항 레코드 키 성명 가수명
제 8장 구조체 연관된 데이터의 형태의 예 데이터베이스 프로그램에 유용한 형태의 변수 신체조건 인적사항 레코드 성명 가수명 몸무게 주소 레코드사명 가슴둘레 전화번호 소속회사 앉은키 생일 코드번호

5 구조체의 형식 struct 구조체-택 { . . . . . . };
제 8장 구조체 struct 구조체-택 { }; struct jum{ int x_axis; int y_axis; }; struct 구조체-택 { } 선언자-리스트; }point1, *point2;

6 구조체의 형식 struct { . . . . . . . } 선언자-리스트; struct 구조체-택 선언자-리스트;
제 8장 구조체 struct { } 선언자-리스트; struct{ int x_axis; int y_axis; }point1, *point2; struct 구조체-택 선언자-리스트; struct jum point1, *point2;

7 구조체의 연산 구조체 멤버의 연산자 Case I 구조체명.구성원명 struct number{ doouble real;
제 8장 구조체 구조체 멤버의 연산자 Case I 구조체명.구성원명 struct number{ doouble real; double imaginary; }; struct number x1; x1.real = 2.0; x1.imaginary = 3.0;

8 구조체의 연산 [예제 8-1] #include <stdio.h> main(){ struct people{
제 8장 구조체 [예제 8-1] #include <stdio.h> main(){ struct people{ char name; int height; int weight; } data_1,data_2; data_1.name='a'; data_1.height=170; data_1.weight=70; data_2.name='b'; data_2.height=165; data_2.weight=55; printf("data_1.name=%c data_1.height=%d data_1.weight=%d\n", data_1.name,data_1.height,data_1.weight) ; 계속

9 구조체의 연산 제 8장 구조체 [예제 8-1] 계속 printf("data_2.name=%c data_2.height=%d data_1.weight=%d\n", data_2.name,data_2.height,data_2.weight) ; } [실행결과] data_1.name=a data_1.height=170 data_1.weight=70 data_2.name=b data_2.height=165 data_2.weight=55

10 구조체의 연산 [예제 8-2] #include <stdio.h> struct profile {
제 8장 구조체 [예제 8-2] #include <stdio.h> struct profile { char name[20]; char address[20]; char telephone[20]; char birthday[20]; } data={"HAN","SEOUL"," ","75/03/10" }; main(){ printf("name address telephone birthday\n"); printf("%s %s %s %s\n", data.name,data.address,data.telephone,data.birthday); } [실행결과] name address telephone birthday HAN SEOUL /03/10

11 구조체의 연산 [예제 8-3] #include <stdio.h> struct profile {
제 8장 구조체 [예제 8-3] #include <stdio.h> struct profile { char name[20]; char address[20]; char telephone[20]; char birthday[20]; } ; main(){ struct profile data={"HAN","SEOUL"," ","75/03/10" }; printf("name address telephone birthday\n"); printf(" %s %s %s %s\n", data.name,data.address,data.telephone,data.birthday); } [실행결과] name address telephone birthday HAN SEOUL /03/10

12 구조체의 연산 [예제 8-4] #include <stdio.h> #include <string.h>
제 8장 구조체 [예제 8-4] #include <stdio.h> #include <string.h> struct profile { char name[20]; char address[20]; char telephone[20]; char birthday[20]; } ; 계속

13 구조체의 연산 [예제 8-4] 계속 main(){ struct profile data;
제 8장 구조체 [예제 8-4] 계속 main(){ struct profile data; strcpy(data.name,"HAN"); strcpy(data.address,"SEOUL"); strcpy(data.telephone," "); strcpy(data.birthday,"75/03/10"); printf("name address telephone birthday\n"); printf("%s %s %s %s\n", data.name,data.address,data.telephone,data.birthday); }

14 구조체의 연산 구조체 멤버의 연산자 Case II 구조체명->구성원명 struct number{ doouble real;
제 8장 구조체 구조체 멤버의 연산자 Case II 구조체명->구성원명 struct number{ doouble real; double imaginary; }; struct number *x2; (*x2).real ⇒ x2->real (*x2).imaginary ⇒ x2->imaginary

15 구조체의 연산 [예제 8-5] #include<stdio.h>
제 8장 구조체 [예제 8-5] #include<stdio.h> #include<string.h> [실행결과] main(){ Product name is pencil struct product { Color is white ,and cost is $3 char name[20]; char color[20]; int cost; } a,*pnt ; pnt=&a; strcpy(pnt->name,"pencil"); strcpy(pnt->color,"white"); pnt->cost = 3; printf("Product name is %s\n",pnt->name); printf("Color is %s ,and cost is $%d\n", pnt->color,pnt->cost); }

16 구조체의 연산 [예제 8-6] #include<stdio.h> struct hello{ char *pnt1;
제 8장 구조체 [예제 8-6] #include<stdio.h> struct hello{ char *pnt1; char *pnt2; char *pnt3; } greeting ; main(){ int x; printf("Input'1'if morning,'2'if afternoon,'3'if evening \n"); scanf("%d",&x); greeting.pnt1 = "Good morning"; greeting.pnt2 = "Good afternoon"; greeting.pnt3 = "Good evening"; 계속

17 구조체의 연산 [예제 8-6] 계속 if(x==1) printf("%s",greeting.pnt1); else if(x==2)
제 8장 구조체 [예제 8-6] 계속 if(x==1) printf("%s",greeting.pnt1); else if(x==2) printf("%s",greeting.pnt2); else if(x==3) printf("%s",greeting.pnt3); else printf("error"); } [실행결과] Input'1'if morning,'2'if afternoon,'3'if evening 1 Good morning

18 구조체의 연산 [예제 8-7] #include <stdio.h> main() { struct number{
제 8장 구조체 [예제 8-7] #include <stdio.h> main() { struct number{ int x; int y; }; struct number a[5], *pnt; pnt = a; int i; for(i=0 ;i<5 ;i++) printf("pnt+%d 's address is %p and it points to %p\n", i,&pnt+i,pnt+i); } 계속

19 구조체의 연산 제 8장 구조체 [예제 8-7] 계속 [실행결과] pnt+0 's address is 1669:0FFC and it points to 1669:0FE8 pnt+1 's address is 1669:1000 and it points to 1669:0FEC pnt+2 's address is 1669:1004 and it points to 1669:0FF0 pnt+3 's address is 1669:1008 and it points to 1669:0FF4 pnt+4 's address is 1669:100C and it points to 1669:0FF8

20 구조체의 중첩 중첩된 구조체란 : 중첩된 구조체는 구조체내에 구성원으로서 구조체를 가진다. struct jum{
제 8장 구조체 중첩된 구조체란 : 중첩된 구조체는 구조체내에 구성원으로서 구조체를 가진다. struct jum{ int x_axis; int y_axis; }; /* 중첩된 구조체 형태 */ struct rectangle{ struct jum point1; struct jum point2;

21 구조체의 중첩 [예제 8-8] #include<stdio.h> struct dot { int x; int y; };
제 8장 구조체 [예제 8-8] #include<stdio.h> struct dot { int x; int y; }; struct square { struct dot topleft; struct dot bottomrgt; } rectangle; long area; main(){ printf("Input the x coordinate of top left: "); scanf("%d",&rectangle.topleft.x); printf("Input the y coordinate of top left: "); 계속

22 구조체의 중첩 [예제 8-8] 계속 scanf("%d",&rectangle.topleft.y);
제 8장 구조체 [예제 8-8] 계속 scanf("%d",&rectangle.topleft.y); printf("Input the x coordinate of bottom right: "); scanf("%d",&rectangle.bottomrgt.x); printf("Input the y coordinate of bottom right: "); scanf("%d",&rectangle.bottomrgt.y); area=(rectangle.bottomrgt.x - rectangle.topleft.x) * (rectangle.topleft.y - rectangle.bottomrgt.y); printf("The area of the rectangular form is %ld\n",area); } [실행결과] Input the x coordinate of top left: 2 Input the y coordinate of top left: 6 Input the y coordinate of bottom right: 8 Input the y coordinate of bottom right: 3 The area of the rectangular form is 18

23 구조체의 중첩 [예제 8-9] #include<stdio.h> main(){ struct dot{ int x;
제 8장 구조체 [예제 8-9] #include<stdio.h> main(){ struct dot{ int x; int y; struct dot *pnt; } dot1 ; dot1.pnt = & dot1 ; printf("address of dot1 is %p\n",&dot1); printf("dot1.pnt points to itself (%p)\n",dot1.pnt); printf("address of dot1.pnt is %p\n",&dot1.pnt); } [실행결과] address of dot1 is 166D:0FF8 dot1.pnt points to itself (166D:0FF8) address of dot1.pnt is 166D:0FFC

24 공용체 공용체의 정의 동일한 기억장소를 서로 다른 데이터형이 공동으로 사용하는 유도형 데이터이다.
제 8장 구조체 공용체의 정의 동일한 기억장소를 서로 다른 데이터형이 공동으로 사용하는 유도형 데이터이다. struct s_tag{ union u_tag{ int x; int x; int y; int y; char *p; char *p; s_val; u_val; }; }; 구조체와 공용체는 기억장소 할당에 차이가 있다

25 구조체와 공용체의 차이 공용체와 구조체가 기억장소에 저장되는 형태 구조체 모든 멤버에 기억장소가 각각 할당 공용체
제 8장 구조체 공용체와 구조체가 기억장소에 저장되는 형태 구조체 모든 멤버에 기억장소가 각각 할당 공용체 가장 크기가 큰 멤버변수의 기억장소만큼 할당 같은 기억장소에 반복해서 멤버 설정 멤버의 선두번지가 일치하고 있음에 유의할것 u_val.p u_val.x s_val.x s_val.y s_val.p u_val.y 기억장소를 공유한다 . 멤버가 서로 다른 기억장소를 차지한다 . 공용체의 경우 구조체의 경우

26 구조체와 공용체의 차이 [예제 8-10] /* 구조체와 공용체의 비교 */ #include <stdio.h>
제 8장 구조체 [예제 8-10] /* 구조체와 공용체의 비교 */ #include <stdio.h> union number{ int x; int y; } ex1; struct num{ } ex2; main(){ ex1.x = 1234; ex1.y = 4321; 계속

27 구조체와 공용체의 차이 제 8장 구조체 [예제 8-10] 계속 printf("union member variable = %d\n", ex1.x); ex2.x = 1234; ex2.y = 4321; printf("struct member variable = %d\n",ex2.x); } [실행결과] union member variable = 4321 struct member variable = 1234

28 구조체의 응용 매개변수를 구조체로 취하는 함수의 형태 struct person{ char name[20]; char sex;
제 8장 구조체 매개변수를 구조체로 취하는 함수의 형태 struct person{ char name[20]; char sex; int age; }; /* 구조체 p를 매개변수로 받는 함수이다 */ /* 구조체 p의 각 멤버들의 값을 보여주는 함수 */ void display1(struct person p) { printf("%s : %c : %d \n", p.name, p.sex, p.age); }

29 구조체 응용 [예제 8-11] #include <stdio.h> struct person{
제 8장 구조체 [예제 8-11] #include <stdio.h> struct person{ char name[20]; char sex; int age; }; void display(struct person p) /* person구조체형 변수 p선언 */ { printf("%s : %c : %d \n", p.name, p.sex, p.age); } 계속

30 구조체 응용 [예제 8-11] 계속 main() { struct person people={ "Chan Ho Park",
제 8장 구조체 [예제 8-11] 계속 main() { struct person people={ "Chan Ho Park", 'm', 26 }; printf("\n name sex age \n"); display(people); } [실행결과] name sex age Chan Ho Park : m : 26

31 구조체 응용 [예제 8-12] #include <stdio.h> [실행결과]
제 8장 구조체 [예제 8-12] #include <stdio.h> [실행결과] struct person{ name sex age char name[20]; Chan Ho Park : m : 26 char sex; int age; }; void display(struct person *p){ printf("%s : %c : %d \n", p->name, p->sex, p->age); } main(){ struct person people={ "Chan Ho Park", 'm', 26 }; printf("\n name sex age \n"); display(&people); }

32 구조체 응용 [예제 8-13] #include<stdio.h> struct marks { int math;
제 8장 구조체 [예제 8-13] #include<stdio.h> struct marks { int math; int phys; int biol; } temp = {0,0,0}; marks funct(int math, int phys,int biol); void main(void){ struct marks point ; int a,b,c,i,t; printf("Input total number of tests : "); scanf("%d",&t); for(i=0;i<t;i++) { printf("Input marks in math, %d th test : ",i+1); scanf("%d",&a); 계속

33 구조체 응용 제 8장 구조체 [예제 8-13] 계속 printf("Input marks in physics, %d th test : ",i+1); scanf("%d",&b); printf("Input marks in biology, %d th test : ",i+1); scanf("%d",&c); point=funct(a,b,c); /* 함수 호출 */ } printf("*****************************************\n"); printf("average marks in math : %d\n",point.math/t); printf("average marks in physics : %d\n",point.phys/t); printf("average marks in biology : %d\n",point.biol/t); marks funct(int math, int phys,int biol) { temp.math = math + temp.math; temp.phys = phys + temp.phys; temp.biol = biol + temp.biol; return temp; } 계속

34 구조체 응용 [예제 8-13] 계속 [실행결과] Input total number of tests : 2
제 8장 구조체 [예제 8-13] 계속 [실행결과] Input total number of tests : 2 Input marks in math, 1 th test : 60 Input marks in physics, 1 th test : 70 Input marks in biology, 1 th test : 90 Input marks in math, 2 th test : 50 Input marks in physics, 2 th test : 80 Input marks in biology, 2 th test : 100 ***************************************** average marks in math : 55 average marks in physics : 75 average marks in biology : 95

35 구조체의 응용 자기참조 구조체 종류 자기참조 구조체란 여러 종류의 데이터 구조를 연계시킨 연계 구조체이다
제 8장 구조체 자기참조 구조체 자기참조 구조체란 여러 종류의 데이터 구조를 연계시킨 연계 구조체이다 종류 선형 연결 리스트( linear linked list ) 단일 연결 리스트 이중 연결 리스트 이진 트리 구조( binary tree structure )

36 구조체의 응용 선형 연결 리스트( linear linked list ) : 단일연결, 다중연결 head head p p p p
제 8장 구조체 선형 연결 리스트( linear linked list ) : 단일연결, 다중연결 struct linked_list{ char *p; struct linked_list *next; }; head p p p p struct linked_list{ char ch; struct linked_list *forward; struct linked_list *backward; }; head

37 구조체의 응용 이진 트리 구조( binary tree structure ) struct binary{ char *p;
제 8장 구조체 이진 트리 구조( binary tree structure ) struct binary{ char *p; struct binary *left; struct binary *right; }; p left child right child p p p p p p

38 구조체 예제 예제 구조체 리스트의 추가 struct node{ char *name; char sex; int age;
제 8장 구조체 예제 구조체 struct node{ char *name; char sex; int age; struct node *next; }; struct node *head; 리스트의 추가 struct node *p; for(p=head; p->next !=NULL; ){ p=p->next; p->next=&d; d.next = NULL; }

39 구조체 예제 리스트에 삽입 p->next = q->next; q->next = p; ( 삽입 전 ) q
제 8장 구조체 리스트에 삽입 p->next = q->next; q->next = p; ( 삽입 ) q q->next ( 삽입 ) q q->next->next p

40 · p p->next->next 제거전 제거후 p p->next · 구조체 예제 리스트 제거
제 8장 구조체 리스트 제거 p->next = p->next->next; p p->next->next 제거전 제거후 p p->next

41 비트필드 int형 데이터를 비트단위로 조작하는 구조체 비트필드 구조체의 선언문 형식 예제 struct 구조체-택{
제 8장 구조체 int형 데이터를 비트단위로 조작하는 구조체 비트필드 구조체의 선언문 형식 struct 구조체-택{ 형지정자 필드명: 비트수; }; 예제 struct int_num{ unsigned field1: 2; unsigned fiedl2: 4; unsigned field3: 8; }num;

42 비트필드 특 징 형지정자 → int 와 unsigned 둘 중에 하나만 사용 비트필드 전체는 0∼16사이의 숫자이다
제 8장 구조체 특 징 형지정자 → int 와 unsigned 둘 중에 하나만 사용 비트필드 전체는 0∼16사이의 숫자이다 "필드명"은 생략가능 필드는 하위비트에서 상위비트로 배치 비트필드도 구조체와 같이 참조연산자 .(dot)사용 첫번째 비트필드만 초기화 가능 구조체나 공용체의 구성원으로만 선언 가능

43 한글코드의 비트필드 할당 han.code 한글코드 MSB LSB 15 14 13 12 11 10 9 8 7 6 5 4 3 2
제 8장 구조체 han.code 한글코드 MSB LSB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 han.final 한글종성(5비트) han.medial 한글중성(5비트) han.initial 한글초성(5비트) han.flag 한글/영문 on : 한글, off : 영문


Download ppt "제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영."

Similar presentations


Ads by Google