기초컴퓨터프로그래밍

Size: px
Start display at page:

Download "기초컴퓨터프로그래밍"

Transcription

1 구조체 #include <stdio.h> int main() { } printf("structure\n"); printf("instructor: Keon Myung Lee\n"); return 0;

2 내용 구조체 (struct) Typedef 공용체 (union) 열거형 (enum)

3 구조체 구조체 (structure) 어떤대상을표현하는서로연관된항목 ( 변수 ) 들을하나의새로운데이터형으로정의한것 사용자가정의하는데이터형 학생 이름학과나이평점 문자열문자열정수실수 struct Student { char dept[12]; int age; float grade; int, float 등의기본데이터형과마찬가지로구조체에대하여변수, 배열, 포인터등을선언하여사용가능

4 구조체정의 구조체정의형식 struct tag 명 { member 리스트 - struct : 예약어 - tag 명 : 정의하는구조체의이름 ( 데이터형의이름 ) - member 리스트 : 구조체에포함되는멤버의데이터형과변수명 - 세미콜른 (;) 으로끝남 struct DATE { struct phonebook { struct book { int year; char title[50]; int month; char phone[14]; char author[50]; int day; int quick; struct DATE publish; int price;

5 구조체정의 struct Student { char dept[12]; int age; float grade; 구조체변수선언 struct Student st; 멤버접근 - 구조체변수. 멤버이름 구조체변수 st.age = 21; strcpy(st.dept, "software"); name dept age grade st

6 구조체변수 구조체정의를하면서동시에변수를선언하는경우 struct Student { char dept[12]; int age; float grade; struct Student st; struct Student { char dept[12]; int age; float grade; } st;

7 #include <stdio.h> struct List { char *name; char gender; int age; int main() { struct List st1, st2; st1.name = "Moon"; st1.gender = 'M'; st1.age = 25; st2.name = "Park"; st2.gender = 'F'; st2.age = 28; printf(" 이름 성별 나이 \n"); printf(" \n"); printf("%s %c %d\n", st1.name, st1.gender, st1.age); printf("%s %c %d\n", st2.name, st2.gender, st2.age); } return 0; 이름 성별 나이 Moon M 25 Park F 28

8 구조체변수의초기화 구조체변수의초기화 중괄호 ({ }) 안의초기값을콤마 (,) 로분리하여지정 초기값이주어지지않은멤버에는 0 에해당하는값부여 st struct Student { char dept[12]; int age; float grade; struct Student st = {"Daniel", "Science", 20, 4.3 name dept Daniel Science age 20 grade 4.3

9 구조체변수의대입 같은구조체변수간의대입가능 대입연산으로대응되는멤버간의복사 struct student { struct student s1 = {10, " 홍길동 ", 4.1 struct student s2; sid 10 s2 = s1; s1 name 홍길동 GPA 4.1 s2 sid 10 name 홍길동 GPA 4.1

10 구조체변수의대입 동일한멤버로구성된다른이름의구조체변수간의대입불가능 struct student { } st; struct pupil { } pp; st = pp; st.sid = pp.sid; (error) (ok)

11 #include <stdio.h> struct student{ double grade; int main() { struct student s1 = {10, " 임꺽정 ", 3.7}, s2 = {20, " 홍길동 ", 3.9}, s3 = {30, " 장길산 ", 4.1 struct student max; } max = s1; if (s2.grade > max.grade) max = s2; if (s3.grade > max.grade) max = s3; printf(" 학번 : %d\n", max.sid); printf(" 이름 : %s\n", max.name); printf(" 학점 : %.1lf\n", max.grade); return 0; 학번 : 30 이름 : 장길산학점 : 4.1

12 typedef typedef 데이터형의이름을재정의하고자할때사용 typedef int AGE; AGE myage; // int형을 AGE로다시정의 // int myage; 구조체에 typedef 정의가능 struct student { int kor; int mat; typedef struct student STUDENT; typedef 를이용하여구조체변수를선언하는방법 struct student hong; STUDENT hong;

13 구조체포인터변수 일반변수와유사하게정의 구조체포인터 struct student { struct student *p; struct student st; p = &st; p st sid name GPA 포인터를통한멤버지정 - 포인터변수 -> 멤버이름 p->gpa = 4.3;

14 #include <stdio.h> struct student { p st 1004 sid 좀해요 name 3.9 GPA int main() { struct student s = {1004, " 좀해요 ", 3.9 struct student *p; p = &s; printf(" 학번 :%d 이름 :%s 평점 :%.1f\n", s.sid, s.name, s.gpa); printf(" 학번 :%d 이름 :%s 평점 :%.1f\n", (*p).sid,(*p).name,(*p).gpa); printf(" 학번 :%d 이름 :%s 평점 :%.1f\n", p->sid, p->name, p->gpa); return 0; } 학번 :1004 이름 : 좀해요평점 :3.9 학번 :1004 이름 : 좀해요평점 :3.9 학번 :1004 이름 : 좀해요평점 :3.9

15 구조체배열 구조체배열선언 일반데이터형과동일한방법사용 struct student { int main() { struct student list[3]; // 구조체의배열선언 list[1].sid = 1001; // 구조체의배열멤버접근 strcpy(list[1].name, " 잘해요 "); list[1].gpa = 4.12; } return 0;

16 구조체배열의초기화 struct student { 구조체배열 struct student list[3] = { {1, " 잘해요 ", 4.21}, {2, " 노력해 ", 2.54}, {3, " 좀해요 ", 3.67}

17 중첩구조체 중첩구조체 (nested structure) 구조체가다른구조체형의멤버를갖는것 struct date { int year; int month; int day; struct student { char name[10]; struct date birthday; sid name GPA birthday year Month day s1 s1.sid = 1004; s1.birthday.year = 2004; struct student s1;

18 중첩구조체 구조체내부의멤버로구조체직접정의가능 struct date { int year; int month; int day; struct student { char name[10]; struct date birthday; struct student { char name[10]; struct date { int year; int month; int day; } birthday;

19 중첩구조체 중첩구조체의초기화 초기값을 { } 안에멤버의순서대로나열 struct date { int year; int month; int day; struct student { char name[10]; struct date birthday; struct student st = {10, " 홍길동 ", 3.56, 1986, 8, 5

20 중첩구조체 s1 멤버참조 struct date { int year; int month; int day; s2 sid name GPA birthday year Month day struct student { char name[10]; struct date birthday; struct student s1; struct student *s2; s1.sid s1.birthday.year s2 = &s1; s2->sid s2->birthday.year (*s2).sid (*s2).birthday.year

21 중첩구조체 자체참조구조체 정의되는구조체의포인터변수를멤버로갖는것 struct student { struct student *next; 연결리스트 (linked list) 구성에서활용 sid name GPA next sid name GPA next sid name GPA next

22 struct student { char name[10]; struct student *next; int main() { 2 임꺽정 3.6 NULL struct student s1 = {1, " 홍길동 ", 4.1, NULL struct student s2 = {2, " 임꺽정 ", 3.6, NULL struct student *head = NULL; struct student *current = NULL; head = &s1; s1.next = &s2; s2.next = NULL; current head s1 s2 1 홍길동 4.1 NULL &s2 } current = head; while (current!= NULL) { printf(" :%d :%s, 평점 :%.1f\n", current->sid, current->name, current->gpa); current = current->next; } :1 : 홍길동, 평점 :4.1 :2 : 임꺽정, 평점 :3.6

23 공용체 공용체 (union) 같은메모리영역을모든멤버가공유 기억공간의크기는멤버중에서크기가가장큰멤버로결정 선언및사용방법은구조체와동일 union share { char c; int i; c i union share ex;

24 공용체 다른멤버에의해서데이터훼손위험 #include <stdio.h> union student{ int num; double grade; num grade int main() { union student s1 = {20 } printf(" 학번 : %d\n", s1.num); s1.grade = 4.1; printf(" 학점 : %.1lf\n", s1.grade); printf(" 학번 : %d\n", s1.num); return 0; 학번 : 20 학점 : 4.1 학번 :

25 열거형 열거형 (enumeration) 변수가가질수있는값들을미리열거해놓은자료형 - 요일을나타내는변수의값은 { 일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일 } 중의하나 enum 열거형태그 { 열거형상수리스트 enum days {MON, TUE, WED, THU, FRI, SAT, SUN enum days d; d = MON; 첫번째값은정수값 0 에해당

26 열거형 #include <stdio.h> enum days {MON, TUE, WED, THU, FRI, SAT, SUN char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" int main() { enum days d; } for(d = MON; d <= SUN; d++) { printf("%d %s 이 \n", d, days_name[d]); } 0 번째요일은 Monday 입니다 1 번째요일은 Tuesday 입니다 2 번째요일은 Wednesday 입니다 3 번째요일은 Thursday 입니다 4 번째요일은 friday 입니다 5 번째요일의이름은 saturday 입니다 6 번째요일의이름은 sunday 입니다

27 요점정리 구조체는어떤대상을표현하는서로연관된항목 ( 변수 ) 들을하나의새로운데이터형으로정의한것이다. 중첩구조체는다른구조체형의멤버를갖는것이다. typedef 는데이터형의이름을재정의하고자할때사용한다. 공용체 (union) 은모든멤버가동일한메모리공간을사용하게한다. 열거형 (enum) 은변수가가질수있는값들을미리열거해놓은자료형이다.