Download presentation
Presentation is loading. Please wait.
1
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
2
구조체란? 기본자료형: char, int, float, double 등 자료형 파생자료형: 배열, 열거형, 구조체, 공용체
구조체: 서로 다른 자료형을 하나로 묶는 구조 구조체 vs 배열 Slide 2 (of 25)
3
구조체의 선언 (예)학생에 대한 데이터 구조체 선언 형식 구조체 선언은 변수 선언은 아님 struct 구조체_태그_이름 {
자료형 멤버_이름; ... }; 구조체 선언은 변수 선언은 아님 Slide 3 (of 25)
4
구조체 선언의 예 // x값과 y값으로 이루어지는 화면의 좌표 struct point { int x; // x 좌표
int y; // y 좌표 }; // 사각형 struct rect { int x; int y; int width; int height; }; // 복소수 struct complex { double real; // 실수부 double imag; // 허수부 }; // 직원 struct employee { char name[20]; // 이름 int age; // 나이 int gender; // 성별 int salary; // 월급 }; // 날짜 struct date { int month; int day; int year; }; Slide 4 (of 25)
5
구조체 변수 선언 구조체 정의와 구조체 변수 선언은 다르다. Slide 5 (of 25)
6
구조체의 초기화 중괄호를 이용하여 초기값을 나열한다. struct student { int number;
char name[10]; double height; }; struct student s1 = { 24, "Kim", }; Slide 6 (of 25)
7
.기호는 구조체에서 멤버를 참조할 때 사용하는 연산자입니다.
구조체 멤버 참조 구조체 멤버를 참조하려면 다음과 같이 .연산자를 사용한다. s1.number = 26; // 정수 멤버 strcpy(s1.name, "Kim"); // 문자열 멤버 s1.height = 183.2; // 실수 멤버 .기호는 구조체에서 멤버를 참조할 때 사용하는 연산자입니다. . Slide 7 (of 25)
8
구조체를 멤버로 가지는 구조체 struct date { // 구조체 선언 int year; int month; int day;
}; struct student { // 구조체 선언 int number; char name[10]; struct date dob; // 구조체 안에 구조체 포함 double height; }; struct student s1; // 구조체 변수 선언 s1.dob.year = 1983; // 멤버 참조 s1.dob.month = 03; s1.dob.day = 29; Slide 8 (of 25)
9
예제 #1 구조체 선언 구조체 변수 선언 구조체 멤버 참조 #include <stdio.h>
#include <stdlib.h> struct student { int number; char name[10]; double height; }; int main(void) { struct student s; s.number = ; strcpy(s.name,"홍길동"); s.height = 180.2; printf("학번: %d\n", s.number); printf("이름: %s\n", s.name); printf("신장: %f\n", s.height); return 0; } 구조체 선언 구조체 변수 선언 구조체 멤버 참조 학번: 이름: 홍길동 신장: Slide 9 (of 25)
10
예제 #2 struct student { int number; char name[10]; double height; };
int main(void) { struct student s; printf("학번을 입력하시오: "); scanf("%d", &s.number); printf("이름을 입력하시오: "); scanf("%s", s.name); printf("신장을 입력하시오(실수): "); scanf("%lf", &s.height); printf("학번: %d\n", s.number); printf("이름: %s\n", s.name); printf("신장: %f\n", s.height); return 0; } 학번을 입력하시오: 이름을 입력하시오: 홍길동 신장을 입력하시오(실수): 180.2 학번: 이름: 홍길동 신장: Slide 10 (of 25)
11
구조체 변수의 대입과 비교 같은 구조체 변수까리 대입은 가능하지만 비교는 불가능하다. 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) ) // 올바른 비교 } Slide 11 (of 25)
12
구조체 배열 구조체 배열의 선언 구조체 배열의 초기화 struct student { int number;
char name[20]; double height; }; int main(void) { struct student list[100]; // 구조체의 배열 선언 list[2].number = 27; strcpy(list[2].name, "홍길동"); list[2].height = 178.0; } 구조체 배열의 초기화 struct student list[3] = { { 1, "Park", }, { 2, "Kim", }, { 3, "Lee", } }; Slide 12 (of 25)
13
구조체와 포인터 구조체를 가리키는 포인터 struct student *p;
struct student s = { , "홍길동", }; p = &s; printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.height); printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).height); Slide 13 (of 25)
14
== -> 연산자 -> 연산자는 구조체 포인터로 구조체 멤버를 참조할 때 사용 struct student *p;
struct student s = { , "홍길동", }; p = &s; printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.height); printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).height); printf("학번=%d 이름=%s 키=%f \n", p->number, p->name, p->height); == Slide 14 (of 25)
15
자체 참조 구조체 struct student { int number; char name[10]; double height;
struct student *next; }; int main(void) { struct student s1 = { 30, "Kim", 167.2, NULL }; struct student s2 = { 31, "Park", 179.1, NULL }; struct student *first = NULL; struct student *current = NULL; first = &s1; s1.next = &s2; s2.next = NULL; current = first; while( current != NULL ) printf("학생의 번호=%d 이름=%s, 키=%f\n", current->number, current->name, current->height); current = current->next; } 학생의 번호=30 이름=Kim, 키= 학생의 번호=31 이름=Park, 키= Slide 15 (of 25)
16
구조체와 함수 구조체를 함수의 인수로 전달하는 경우 구조체의 복사본이 함수로 전달되게 된다.
만약 구조체의 크기가 크면 그만큼 시간과 메모리가 소요된다. 구조체의 포인터를 함수의 인수로 전달하는 경우 시간과 공간을 절약할 수 있다. int equal(struct student s1, struct student s2) { if( strcmp(s1.name, s2.name) == 0 ) return 1; else return 0; } int equal(struct student const *p1, struct student const *p2) { if( strcmp(p1->name, p2->name) == 0 ) return 1; else return 0; } Slide 16 (of 25)
17
구조체를 반환하는 경우 복사본이 반환된다. struct student make_student(void) {
struct student s; printf("나이:“); scanf("%d", &s.age); printf("이름:“); scanf("%s", s.name); printf("키:“); scanf("%f", &s.height); return s; } 구조체 s의 복사본이 반환된다. Slide 17 (of 25)
18
공용체 공용체(union) 같은 메모리 영역을 여러 개의 변수가 공유 공용체를 선언하고 사용하는 방법은 구조체와 아주 비슷
union example { char c; // 같은 기억 공간 공유 int i; // 같은 기억 공간 공유 }; Slide 18 (of 25)
19
예제 #include <stdio.h> union example { int i; char c; }; 공용체 선언
int main(void) { union example v; v.c = 'A'; printf("v.c:%c v.i:%i\n", v.c, v.i ); v.i = 10000; printf("v.c:%c v.i:%i\n", v.c, v.i); } 공용체 선언 공용체 변수 선언. char 형으로 참조. int 형으로 참조. v.c:A v.i:65 v.c:ꠕ v.i:10000 Slide 19 (of 25)
20
열거형 열거형(enumeration)이란 변수가 가질 수 있는 값들을 미리 열거해놓은 자료형
(예) 요일을 저장하고 있는 변수는 { 일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일 } 중의 하나의 값만 가질 수 있다. 열거형은 enum이라는 키워드를 사용하여 만들어진다. enum 태그_이름 { 값1, 값2, ... }; enum days1 { MON, TUE, WED, THU, FRI, SAT, SUN }; enum days2 { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum days3 { MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6, SUN=7 }; enum days4 { MON, TUE=2, WED=3, THU, FRI, SAT, SUN }; enum days1 d; d = WED; Slide 20 (of 25)
21
열거형의 예 enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
enum colors { white, red, blue, green, black }; enum boolean { 0, 1 }; enum months { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }; enum major { COMMUNICATION, COMPUTER, ELECTRIC, ELECTRONICS }; enum component { MAIN_BOARD, CPU, GRAPHIC_CARD, DISK, MEMORY }; enum levels { low = 1, medium, high }; enum CarOptions { SunRoof = 0x01, Spoiler = 0x02, FogLights = 0x04, TintedWindows = 0x08, } Slide 21 (of 25)
22
열거형과 다른 방법과의 비교 정수 사용 기호 상수 열거형 switch(code) { case 1:
printf("LCD TV\n"); break; case 2: printf("PDP TV\n"); } #define LCD 1 #define PDP 2 case LCD: case PDP: enum tvtype { LCD, PDP }; enum tvtype code; 컴퓨터는 알기 쉬우나 사람은 기억하기 어렵다. 기호 상수를 작성할 때 오류를 저지를 수 있다. 컴파일러가 중복이 일어나지 않도록 체크한다. Slide 22 (of 25)
23
typedef typedef은 새로운 자료형(type)을 정의(define) C의 기본 자료형을 확장시키는 역할
typedef old_type new_type; Slide 23 (of 25)
24
typedef의 예 기본자료형 재정의된 자료형 int INT32 short INT16 unsigned int UINT32
unsigned short UINT16 unsigned char UCHAR, BYTE char CHAR typedef int INT32; typedef unsigned int UINT32; INT32 i; // int i;와 같다. UINT32 k; // unsigned int k;와 같다. typedef struct point { int x; int y; } POINT; POINT p,q; typedef struct complex { double real; double imag; } COMPLEX; COMPLEX x, y; typedef enum { FALSE, TRUE } BOOL; BOOL condition; // enum { FALSE, TRUE } condition; typedef char * STRING_PTR; STRING_PTR p; // char *p; Slide 24 (of 25)
25
Q & A Slide 25 (of 25)
Similar presentations