Microsoft PowerPoint - 제13장 구조체

Similar documents
untitled

14 주차구조체와공용체

11장 포인터

Microsoft PowerPoint - chap-13.pptx

이번장에서학습할내용 구조체란무엇인가? 구조체의선언, 초기화, 사용 구조체의배열 구조체와포인터 구조체와함수 공용체 열거형 typedef 구조체는복잡한내용을일목요연하여정리하는데유용하게사용됩니다. 2

Microsoft PowerPoint - Lesson12.pptx

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

기초컴퓨터프로그래밍

슬라이드 1

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

윤성우의 열혈 TCP/IP 소켓 프로그래밍

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

untitled

KNK_C_05_Pointers_Arrays_structures_summary_v02

02장.배열과 클래스

untitled

Microsoft PowerPoint - chap09-1.ppt

11장 포인터

untitled

10장. 구조체

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - chap11-포인터의활용.pptx

중간고사

K&R2 Reference Manual 번역본

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chapter_09.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제11장 포인터

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제11장 포인터(강의)

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

OCW_C언어 기초

금오공대 컴퓨터공학전공 강의자료

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

ABC 9장

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - chap-06.pptx

쉽게 풀어쓴 C 프로그래밍

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - chap09.ppt

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - 07_(C_Programming)_(Korean)_Composite_Data_Types

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint - chap12-고급기능.pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

11장 포인터

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

본 강의에 들어가기 전

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

03장.스택.key

Microsoft PowerPoint - chap-03.pptx

C 프로그래밊 개요

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

PowerPoint Presentation


쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - Chapter_04.pptx


PowerPoint 프레젠테이션

<C7E0BAB9C0AFBCBA5F F30365F322E696E6464>

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - C++ 5 .pptx

ch15


비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

Transcription:

쉽게풀어쓴 C 언어 Express 제 13 장구조체

이번장에서학습할내용 구조체의개념, 정의, 초기화방법 구조체와포인터와의관계 공용체와 typedef 구조체는서로다른데이터들을하나로묶는중요한도구입니다.

자료형의분류 기본자료형 : char, int, float, double 등 자료형 파생자료형 : 배열, 열거형, 구조체, 공용체

구조체의필요성 학생에대한데이터를하나로모으려면? 학번 : 20100001( 정수 ) 이름 : 최자영 ( 문자열 ) 학점 : 4.3( 실수 ) int number; char name[10]; double grade; 와같이개별변수로나타낼수있지만묶을수가있나?

구조체의필요성 int number; char name[10]; double grade; 구조체를사용하면변수들을하나로묶을수있습니다.

구조체와배열 구조체 vs 배열 같은타입의집합 다른타입의집합

중간점검 1. 구조체와배열의차이점을이야기해보라. 2. 복소수, 날짜, 화면의좌표, 사각형등을표현하는데필요한데이터를나열해보라.

구조체선언 구조체선언형식 struct 태그 { 자료형멤버1; 자료형멤버2;... };

구조체선언 구조체선언은변수선언은아님 구조체를정의하는것은와플이나붕어빵을만드는틀을정의하는것과같다. 와플이나붕어빵을실제로만만들릭위해서는구조체변수를선언하여야한다. 구조체 구조체변수

구조체선언의예 // x 값과 y 값으로이루어지는화면의좌표 struct point { // 사각형 struct rect { int x; // x 좌표 int x; int y; // y 좌표 int y; }; int width; // 복소수 struct complex { }; int grade; double real; double imag; // 실수부 // 허수부 // 직원 struct employee { }; char name[20]; // 이름 // 날짜 struct date { int month; int day; }; int age; int gender; int salary; // 성별 // 월급 // 나이 int year; };

구조체변수선언 구조체정의와구조체변수선언은다르다.

구조체의초기화 중괄호를이용하여초기값을나열한다. struct student { int number; char name[10]; double grade; }; struct student s1 = { 24, "Kim", 4.3 };

구조체멤버참조 구조체멤버를참조하려면다음과같이. 연산자를사용한다. s1.number = 26; strcpy(s1.name, "Kim"); s1.grade = 4.3; // 정수멤버 // 문자열멤버 // 실수멤버.. 기호는구조체에서멤버를참조할때사용하는연산자입니다.

예제 #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

예제 #2 struct student { int number; char name[10]; double grade; }; 구조체선언 학번을입력하시오 : 20070001 이름을입력하시오 : 홍길동학점을입력하시오 ( 실수 ): 4.3 학번 : 20070001 이름 : 홍길동학점 : 4.300000 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;

예제 #3 #include <math.h> struct point { int x; int y; }; int main(void) { struct point p1, p2; int xdiff, ydiff; double dist; 점의좌표를입력하시오 (x y): 10 10 점의좌표를입력하시오 (x y): 20 20 두점사이의거리는 14.142136 입니다. p2 (x,y) printf(" 점의좌표를입력하시오 (x y): "); scanf("%d %d", &p1.x, &p1.y); p1 (x,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;

중간점검 1. 구조체안에선언된각각의변수들을 이라고한다. 2. 구조체의선언에사용하는키워드는 이다. 3. 구조체의태그는왜필요하며, 태그를사용하는경우과사용하지않은경우가어떻게다른가? 4. 구조체의선언만으로변수가만들어지는가? 5. 구조체의멤버를참조하는연산자는무엇인가?

구조체를멤버로가지는구조체 struct date { int year; int month; int day; }; // 구조체선언 struct student { // 구조체선언 int number; char name[10]; struct date dob; // 구조체안에구조체포함 double grade; }; struct student s1; // 구조체변수선언 s1.dob.year = 1983; s1.dob.month = 03; s1.dob.day = 29; // 멤버참조

예제 #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)

예제 printf(" 왼쪽상단의좌표를입력하시오 : "); scanf("%d %d", &r.p1.x, &r.p1.y); p1(x,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; p2(x,y) area = w * h; peri = 2 * w + 2 * h; printf(" 면적은 %d 이고둘레는 %d 입니다.\n", area, peri); } return 0; 왼쪽상단의좌표를입력하시오 :11 오른쪽상단의좌표를입력하시오 :66 면적은 25 이고둘레는 20 입니다.

구조체변수의대입과비교 같은구조체변수까리대입은가능하지만비교는불가능하다. 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이같습니다.") // 올바른비교

중간점검 1. 구조체의변수끼리허용되는연산에는어떤것들이있는가? 2. 구조체태그와구조체변수의차이점은무엇인가? 3. 구조체멤버로구조체를넣을수있는가? 4. 구조체는배열을멤버로가질수있는가?

구조체배열 구조체를여러개모은것

구조체배열 구조체배열의선언 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;

구조체배열의초기화 구조체배열의초기화 struct student list[3] = { { 1, "Park", 172.8 }, { 2, "Kim", 179.2 }, { 3, "Lee", 180.3 } };

구조체배열예제 #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); } 학번을입력하시오 : 20070001 이름을입력하시오 : 홍길동학점을입력하시오 ( 실수 ): 4.3 학번을입력하시오 : 20070002 이름을입력하시오 : 김유신학점을입력하시오 ( 실수 ): 3.92 학번을입력하시오 : 20070003 이름을입력하시오 : 이성계학점을입력하시오 ( 실수 ): 2.87 학번 : 20070001, 이름 : 홍길동, 학점 : 4.300000 학번 : 20070002, 이름 : 김유신, 학점 : 3.920000 학번 : 20070003, 이름 : 이성계, 학점 : 2.870000 } for(i = 0; i< SIZE; i++) printf(" 학번 : %d, 이름 : %s, 학점 : %f\n", list[i].number, list[i].name, list[i].grade); return 0;

중간점검 1. 상품 5 개의정보를저장할수있는구조체의배열을정의해보라. 상품은번호와이름, 가격을멤버로가진다.

구조체와포인터 구조체를가리키는포인터 포인터를멤버로가지는구조체 순서로살펴봅시다.

구조체를가리키는포인터 구조체를가리키는포인터 struct student *p; 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);

-> 연산자 -> 연산자는구조체포인터로구조체멤버를참조할때사용 struct student *p; struct student s = { 20070001, " 홍길동 ", 180.2 }; 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);

-> 연산자 (*p).number p 가가리키는구조체변수 == p->number p 가가리키는구조체변수의멤버 number p 가가리키는구조체변수의멤버 number

예제 // 포인터를통한구조체참조 #include <stdio.h> struct student { int number; char name[20]; double grade; }; 학번 =20070001 이름 = 홍길동학점 =4.300000 학번 =20070001 이름 = 홍길동학점 =4.300000 학번 =20070001 이름 = 홍길동학점 =4.300000 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;

포인터를멤버로가지는구조체 struct date { int month; int day; int year; }; struct student { int number; char name[20]; double grade; struct date *dob; };

포인터를멤버로가지는구조체 int main(void) { struct date d = { 3, 20, 1980 }; struct student s = { 20070001, "Kim", 4.3 }; 학번 : 20070001 이름 : Kim 학점 : 4.300000 생년월일 : 1980 년 3 월 20 일 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;

구조체와함수 구조체를함수의인수로전달하는경우 구조체의복사본이함수로전달되게된다. 만약구조체의크기가크면그만큼시간과메모리가소요된다. 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; }

구조체를반환하는경우 복사본이반환된다. struct student make_student(void) { struct student s; printf(" 나이 : ); scanf("%d", &s.age); printf(" 이름 : ); scanf("%s", s.name); printf(" 키 : ); scanf("%f", &s.grade); 구조체 s 의복사본이반환된다. } return s;

예제 #include <stdio.h> struct vector { float x; float y; }; struct vector get_vector_sum(struct vector a, struct vector b); int main(void) { struct vector a = { 2.0, 3.0 }; struct vector b = { 5.0, 6.0 }; struct vector sum; sum = get_vector_sum(a, b); printf(" 벡터의합은 (%f, %f) 입니다.\n", sum.x, sum.y); return 0; } a a + b b

예제 struct vector get_vector_sum(struct vector a, struct vector b) { struct vector result; result.x = a.x + b.x; result.y = a.y + b.y; a + b a b } return result; 벡터의합은 (7.000000, 9.000000) 입니다.

공용체 공용체 (union) 같은메모리영역을여러개의변수가공유 공용체를선언하고사용하는방법은구조체와아주비슷 union example { char c; int i; }; // 같은공간공유 // 같은공간공유

예제 #include <stdio.h> union example { int i; char c; }; int main(void) { union example v; 공용체선언 공용체변수선언. char 형으로참조. 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); int 형으로참조. } v.c:a v.i:65 v.c: v.i:10000

ip 주소예제 #include <stdio.h> union ip_address { unsigned long laddr; unsigned char saddr[4]; }; int main(void) { union ip_address addr; addr.saddr[0] = 1; addr.saddr[1] = 0; addr.saddr[2] = 0; addr.saddr[3] = 127; printf("%x\n", addr.laddr); } return 0; 7f000001

공용체에타입필드사용 #include <stdio.h> #include <string.h> #define STU_NUMBER 1 #define REG_NUMBER 2 struct student { int type; union { int stu_number; char reg_number[15]; } id; char name[20]; }; // 학번 // 주민등록번호

공용체에타입필드사용 void print(struct student s) { switch(s.type) { case STU_NUMBER: printf(" 학번 %d\n", s.id.stu_number); printf(" 이름 : %s\n", s.name); break; case REG_NUMBER: printf(" 주민등록번호 : %s\n", s.id.reg_number); printf(" 이름 : %s\n", s.name); break; default: printf(" 타입오류 \n"); break; } }

공용체에타입필드사용 int main(void) { struct student s1, s2; 학번 : 20070001 이름 : 홍길동주민등록번호 : 860101-1056076 이름 : 김철수 s1.type = STU_NUMBER; s1.id.stu_number = 20070001; strcpy(s1.name, " 홍길동 "); s2.type = REG_NUMBER; strcpy(s2.id.reg_number, "860101-1056076"); strcpy(s2.name, " 김철수 "); } print(s1); print(s2);

중간점검 1. 공용체의선언에사용하는 2. 키워드는 이다. 3. 공용체에할당되는메모리의크기는어떻게결정되는가?

열거형 열거형 (enumeration) 이란변수가가질수있는값들을미리열거해놓은자료형 ( 예 ) 요일을저장하고있는변수는 { 일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일 } 중의하나의값만가질수있다.

열거형의선언 enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; 태그이름 값들을나열 열거형변수선언 enum days today; today = SUN; // OK!

열거형이필요한이유 다음과같이프로그램을작성할수있다. int today; today = 0; // 일요일 today = 1; // 월요일 되도록오류를줄이고가독성을높여야된다. 0보다는 SUN라는기호상수가더바람직하다. 의미를쉽게알수있기때문이다. today에 9와같은의미없는값이대입되지않도록미리차단하는것도필요하다.

열거형초기화 enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; // SUN=0, MON=1,... enum days { SUN=1, MON, TUE, WED, THU, FRI, SAT }; // SUN=1, MON=2,... enum days { SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6 };// SUN=7, MON=1,... 값을지정하기않으면 0 부터할당

열거형의예 enum colors { white, red, blue, green, black }; enum boolean { false, true }; enum levels { low, medium, high }; enum car_types { sedan, suv, sports_car, van, pickup, convertible };

예제 #include <stdio.h> enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; char *days_name[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" }; int main(void) { enum days d; d = WED; printf("%d번째요일은 %s입니다\n", d, days_name[d]); return 0; } 3 번째요일은 wednesday 입니다

열거형과다른방법과의비교 정수사용기호상수열거형 switch(code) { case 1: printf("lcd TV\n"); break; case 2: printf("pdp TV\n"); break; } 컴퓨터는알기쉬우나사람은기억하기어렵다. #define LCD 1 #define PDP 2 switch(code) { case LCD: printf("lcd TV\n"); break; case PDP: printf("pdp TV\n"); break; } 기호상수를작성할때오류를저지를수있다. enum tvtype { LCD, PDP }; enum tvtype code; switch(code) { case LCD: printf("lcd TV\n"); break; case PDP: printf("pdp TV\n"); break; } 컴파일러가중복이일어나지않도록체크한다.

중간점검 1. 열거형의선언에사용하는키워드는 이다. 2. 열거형은어떤경우에사용되는가? 3. 열거형에서특별히값을지정하지않으면자동으로정수상수값이할당되는가?

typedef 의개념

typedef typedef 은새로운자료형 (type) 을정의 (define) C 의기본자료형을확장시키는역할 typedef old_type new_type; 새로운자료형을정의 typedef unsigned char BYTE; 기존의자료형 새로운자료형

typedef 의예 typedef unsiged char BYTE; BYTE index; // unsigned int index; 와같다. typedef int INT32; typedef unsigned int UINT32; INT32 i; // int i; 와같다. UINT32 k; // unsigned int k; 와같다.

구조체로새로운타입정의 구조체로새로운타입을정의할수있다. struct point { int x; int y; }; typedef struct point POINT; POINT a, b;

예제 #include <stdio.h> typedef struct point { int x; int y; } POINT; POINT translate(point p, POINT delta); int main(void) { POINT p = { 2, 3 }; POINT delta = { 10, 10 }; POINT result; result = translate(p, delta); printf(" 새로운점의좌표는 (%d, %d) 입니다.\n", result.x, result.y); } return 0;

예제 POINT translate(point p, POINT delta) { POINT new_p; new_p.x = p.x + delta.x; new_p.y = p.y + delta.y; } return new_p; 새로운점의좌표는 (12, 13) 입니다.

typedef 과 #define 비교 이식성을높여준다. 코드를컴퓨터하드웨어에독립적으로만들수있다 ( 예 ) int형은 2바이트이기도하고 4바이트, int형대신에 typedef을이용한 INT32나 INT16을사용하게되면확실하게 2바이트인지 4바이트인지를지정할수있다. #define을이용해도 typedef과비슷한효과를낼수있다. 즉다음과같이INT32를정의할수있다. #define UINT32 unsigned int typedef float VECTOR[2];// #define으로는불가능하다. 문서화의역할도한다. typedef을사용하게되면주석을붙이는것과같은효과

중간점검 1. typedef의용도는무엇인가? 2. typedef의장점은무엇인가? 3. 사원을나타내는구조체를정의하고이것을 typedef을사용하여서 employee라는새로운타입으로정의하여보자.

실습 : 평점이높은학생찾기 어느학교나학기가끝나면학과내에서가장평점이높은학생을선발하여서장학금을수여한다. 가장평점이높은학생을찾아서학생의이름과학번, 평점을화면에출력하는프로그램을작성하여보자.

실행결과 평점이가장높은학생은 ( 이름 : 홍길동, 학번 : 20120001, 평점 : 4.200000) 입니다.

힌트 학생에대한정보는구조체를이용하여서표현한다. 학생들이여러명 이므로구조체의배열을사용하는것이좋겠다. struct student { int number; char name[20]; double grade; }; struct student list[] = { { 20120001, 홍길동 ", 4.2 }, { 20120002, 김철수 ", 3.2 }, { 20120002, 김영희 ", 3.9 } };

소스 #include <stdio.h> struct student { int number; char name[20]; double grade; }; struct student list[] = { { 20120001, " 홍길동, 4.2 }, { 20120002, " 김철수, 3.2 }, { 20120002, " 김영희, 3.9 } };

소스 int main(void) { struct student super_stu; int i, size; size = sizeof(list)/sizeof(list[0]); super_stu = list[0]; for(i=1; i< size; i++) { if( list[i].grade > super_stu.grade ) super_stu = list[i]; } printf(" 평점이가장높은학생은 ( 이름 %s, 학번 %d, 평점 %f) 입니다 \n", super_stu.name, super_stu.number, super_stu.grade); }

도전문제 학생들에대한정보를사용자로부터받게끔프로그램을수정하라. 최대평점의학생을찾는부분을함수 get_max_stu() 로독립시켜서전체프로그램을다시작상하여보자. 은행입출금시스템을간단히구현하고여기에로그인기능을추가하여보자.

Q & A