구조체.

Slides:



Advertisements
Similar presentations
1.1 구조체란 1.2 중첩 구조체 1.3 구조체와 배열 1.4 구조체와 포인터 1.5 구조체와 함수 1.6 공용체와 열거형.
Advertisements

Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
제2장 C 언어의 확장 C++(1).
구조체란 무엇인가 ? 예: 학생관리 프로그램의 각 학생에 대한 기록(record) 구조체는 여러 자료형 변수들의 집합체이다.
Part 12 구조체와 공용체 안산1대학 디지털정보통신과 임 성 국.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
2007 1학기 16 구조체.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
23장. 구조체와 사용자 정의 자료형 2.
14장. 포인터와 함수에 대한 이해.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
C#.
C언어: 구조체 (Structures).
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 08. 함수.
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
구조체 배열 실습: 평점이 최고인 학생의 정보를 출력하기
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
구조체 (Structure).
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
Chapter 10 데이터 검색1.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 23. 구조체와 사용자 정의 자료형2.
Chapter 11 구조체.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
Chapter 16. 메모리 동적 할당.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
6 객체.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

구조체

한 학생과 관련된 여러 형태의 데이터를 묶어서 처리할 수 있으므로 배열보다 효율적이다. 구조체의 형 선언과 멤버 참조 구조체는 배열과 달리 다른 형태의 자료형도 묶어서 처리할 수 있다. 한 학생과 관련된 여러 형태의 데이터를 묶어서 처리할 수 있으므로 배열보다 효율적이다. - 5명의 학생에 대한 학번과 학점을 처리하는 예 학점순서로 정렬하면 학번 배열도 정렬해야 한다.

▶ 구조체는 형틀을 먼저 선언한다. 구조체를 사용하기 위해서는 먼저 원하는 구조체의 형태를 컴파일러에게 알려줘야 한다. - 학생 구조체를 선언하는 예 새로 만든 구조체 형으로 변수를 선언한다.

▶ 구조체의 변수는 멤버를 참조하여 사용한다. 배열은 배열요소의 형태가 같으므로 주소계산에 의해 각 멤버의 참조가 가능하지만 구조체는 각 멤버의 형태가 다르므로 멤버참조연산자(.)로 직접 멤버를 참조해야 한다. #include <stdio.h> struct student{ int num; double grade; }; int main() { struct student s1; s1.num=2; s1.grade=2.7; printf(“학번 : %d\n”, s1.num); printf(“학점 : %.1lf\n”, s1.grade); return 0; } // 구조체 변수 선언 // 구조체 멤버 참조

구조체의 멤버로는 배열, 포인터변수, 이미 정의된 다른 구조체의 변수 등 모든 응용자료형을 사용할 수 있다. ▶ 구조체에는 다양한 멤버를 사용할 수 있다. 구조체의 멤버로는 배열, 포인터변수, 이미 정의된 다른 구조체의 변수 등 모든 응용자료형을 사용할 수 있다. 멤버로 배열을 사용하는 예 struct profile{ int age; double height; char name[20]; }; // 나이를 저장할 멤버 // 키를 저장할 멤버 // 이름을 저장할 멤버 struct profile pf; // 구조체 변수의 선언 strcpy(pt.name, “홍길동”); printf(“%s\n”, pf.name); name멤버의 사용

▶ 구조체에는 다양한 멤버를 사용할 수 있다. 멤버로 포인터변수를 사용하는 예 struct profile{ int age; double height; char *np; }; // 나이를 저장할 멤버 // 키를 저장할 멤버 // 이름을 연결할 포인터변수 멤버 // 구조체 변수의 선언 // 포인터변수 멤버에 문자열 연결 struct profile pf; pf.np=“홍길동”; - 포인터변수를 멤버로 사용하는 경우 키보드로부터 문자열 입력은 불가능하다(문자열을 저장할 기억공간이 없다!).

구조체의 멤버로 다른 구조체의 변수를 사용하는 예 ▶ 구조체에는 다양한 멤버를 사용할 수 있다. 구조체의 멤버로 다른 구조체의 변수를 사용하는 예 struct student{ struct profile pf; int num; double grade; }; // 이미 선언된 구조체를 멤버로 사용 struct student s1; // 구조체 변수의 선언 - 구조체의 멤버로 구조체를 사용한 경우 멤버참조연산자를 두 번 사용 하여 멤버를 참조해야 한다.

▶ 다양한 멤버를 가진 구조체를 사용한 프로그램 #include <stdio.h> struct profile{ int age; double height; char *np; }; struct student{ struct profile pf; int num; double grade; int main() { struct student s1; s1.pf.age=23; s1.pf.height=187.5; s1.pf.np="홍길동"; s1.num=5; s1.grade=4.4; printf("이름 : %s\n", s1.pf.np); printf("나이 : %d\n", s1.pf.age); printf(" 키 : %.1lf\n", s1.pf.height); printf("학번 : %d\n", s1.num); printf("학점 : %.1lf\n", s1.grade); return 0; }

구조체변수도 배열과 같이 중괄호를 사용하여 초기화 한다. ▶ 구조체변수의 초기화 구조체변수도 배열과 같이 중괄호를 사용하여 초기화 한다. - profile구조체 변수를 초기화하는 예 struct profile{ int age; double height; char name[20]; }; // 나이를 저장할 멤버 // 키를 저장할 멤버 // 이름을 저장할 멤버 구조체의 형틀선언, 변수선언, 초기화를 동시에 할 수 있다.

▶ 학생 데이터를 구조체로 처리하는 프로그램 예 - 세 명의 데이터 중에서 학점이 가장 높은 학생의 학번, 이름, 학점을 출력한다. #include <stdio.h> struct student{ int num; char name[20]; double grade; }; int main() { struct student s1={315, "홍길동", 2.4}, s2={247, "이순신", 3.7}, s3={330, "세종대왕", 4.4}; struct student max; max=s1; if(s2.grade > max.grade) max=s2; if(s3.grade > max.grade) max=s3; printf("학번 : %d\n", max.num); printf("이름 : %s\n", max.name); printf("학점 : %.1lf\n", max.grade); return 0; } // 학생 데이터에 대한 구조체 선언 // 학번을 저장할 멤버 // 이름을 저장할 멤버 // 학점을 저장할 멤버 // 구조체 변수의 선언과 초기화 // 학점이 가장 높은 학생의 데이터를 저장할 구조체 변수 // 처음에 홍길동의 학점이 가장 높다고 가정한다. // 각 학생의 학점을 비교하여 학점이 가장 높은 // 학생의 데이터가 max에 저장되도록 한다. // 학점이 가장 높은 학생의 각 데이터를 출력한다.

구조체변수는 대입연산으로 모든 멤버들을 복사할 수 있다. ▶ 구조체는 대입연산이 가능하다. 배열은 대입연산이 불가능하다. int ary1[5]={10,20,30,40,50}; int ary2[5]; ary2 = ary1; // 불가능하다. 각 배열요소를 일일이 대입해야 한다! 구조체변수는 대입연산으로 모든 멤버들을 복사할 수 있다. struct student s1={315, “홍길동”, 2.4}; struct student max; max=s1;

구조체는 대입연산이 가능하므로 함수의 전달인자로 줄 수 있다. ▶ 구조체변수를 함수의 전달인자로 사용하자. 구조체는 대입연산이 가능하므로 함수의 전달인자로 줄 수 있다. - 최고학점의 학생 데이터를 함수로 출력해 보자. 함수의 호출 max_prn(max); // 구조체변수를 전달인자로 주고 호출한다. 함수의 정의 void max_prn(struct student max) { printf(“학번 : %d\n”, max.num); printf(“이름 : %d\n”, max.name); printf(“학점 : %d\n”, max.grade); } // 매개변수는 구조체변수를 선언한다.

▶ 구조체를 리턴하는 함수 구조체를 사용하면 포인터 없이도 두 변수의 값을 바꿀 수 있다. - 로보트의 양쪽 시력을 바꾸는 프로그램 예 #include <stdio.h> struct vision{ double left; double right; }; struct vision exchange(struct vision); int main() { struct vision robot; printf("로보트의 시력을 입력하세요(좌, 우) : "); scanf("%lf%lf", &robot.left, &robot.right); robot=exchange(robot); printf("바뀐 로보트의 시력(좌, 우) : %.1lf, %.1lf\n", robot.left, robot.right); return 0; } struct vision exchange(struct vision robot) { double temp; temp=robot.left; robot.left=robot.right; robot.right=temp; return robot; }

구조체 변수가 많이 필요하면 배열로 선언하여 사용한다. 구조체 배열 구조체 변수가 많이 필요하면 배열로 선언하여 사용한다. - 주소록을 만드는 프로그램의 예(5명의 주소를 저장할 경우). struct address{ char name[20]; int age; char tel[20]; char addr[80]; }; // 이름을 저장할 멤버 // 나이를 저장할 멤버 // 전화번호를 저장할 멤버 // 주소를 저장할 멤버

구조체 배열의 참조된 배열요소는 구조체변수이므로 실제 데이터를 저장하기 위해서는 다시 멤버를 참조해야 한다. ▶ 구조체 배열의 배열요소 참조 구조체 배열의 참조된 배열요소는 구조체변수이므로 실제 데이터를 저장하기 위해서는 다시 멤버를 참조해야 한다. - list배열의 네 번째 배열요소의 age멤버를 참조할 때 - list배열의 네 번째 배열요소의 모든 멤버에 값을 저장 strcpy(list[3].name, “홍길동”); list[3].age=23; strcpy(list[3].tel, “012-345-6789”); strcpy(list[3].addr, “울릉도 동남쪽 외로운 섬 독도”);

배열의 초기화 방법을 그대로 적용한다. 단, 배열의 요소가 구조체이므로 각각의 초기값은 구조체 초기화 형식을 사용한다. ▶ 구조체 배열의 초기화 배열의 초기화 방법을 그대로 적용한다. 단, 배열의 요소가 구조체이므로 각각의 초기값은 구조체 초기화 형식을 사용한다. - list배열의 초기화 struct address list[5] = { { “홍길동”, 23, “012-345-6789”, “울릉도 독도”}, { “이순신”, 35, “111-222-3333”, “서울 건천동”}, { “장보고”, 19, “222-333-4444”, “완도 청해진”}, { “유관순”, 15, “333-444-5555”, “충남 천안”}, { “안중근”, 45, “444-555-6666”, “황해도 해주”} };

▶ 구조체 배열을 초기화하고 출력하는 예 - 배열요소의 값을 반복문으로 출력한다. #include <stdio.h> struct address { char name[20]; int age; char tel[20]; char addr[80]; }; int main() { struct address list[5]={{"홍길동", 23, "012-345-6789", "울릉도 독도"}, {"이순신", 35, "111-222-3333", "서울 건천동"}, {"장보고", 19, "222-333-4444", "완도 청해진"}, {"유관순", 15, "333-444-5555", "충남 천안"}, {"안중근", 45, "444-555-6666", "황해도 해주"}}; int i; for(i=0; i<5; i++){ printf("%10s%5d%15s%20s\n", list[i].name, list[i].age, list[i].tel, list[i].addr); } return 0; // 배열요소가 5개이므로 5번 반복

구조체 변수도 하나의 변수이므로 포인터를 구하여 사용할 수 있다. 구조체 포인터 구조체 변수도 하나의 변수이므로 포인터를 구하여 사용할 수 있다. struct score{ int kor, eng, mat; }; struct score a={90, 80, 70}; // 같은 자료형의 멤버는 함께 선언할 수 있다. // 구조체변수의 선언과 초기화 구조체 포인터변수를 선언하고 포인터를 저장하자.

포인터변수로 멤버를 참조하기 전에 먼저 구조체변수를 참조한다. ▶ 구조체 포인터변수를 사용한 멤버의 참조 포인터변수로 멤버를 참조하기 전에 먼저 구조체변수를 참조한다. - 멤버참조연산자(.)가 참조연산자(*)보다 우선순위가 높으므로 괄호가 필요하다. #include <stdio.h> struct score{ int kor, eng, mat; }; int main() { struct score a={90, 80, 70}; struct score *sp=&a; printf(“국어 : %d\n”, (*sp).kor); printf(“영어 : %d\n”, (*sp).eng); printf(“수학 : %d\n”, (*sp).mat); return 0; } // 구조체의 형틀 선언 // 구조체변수의 선언과 초기화 // 포인터변수에 포인터 저장 // 포인터변수로 구조체변수의 // 각 멤버를 참조하여 출력한다.

포인터변수가 가리키는 구조체변수의 멤버를 간단히 참조할 때 간접멤버참조연산자(->)를 사용한다. ▶ 간접멤버참조연산자(->) 포인터변수가 가리키는 구조체변수의 멤버를 간단히 참조할 때 간접멤버참조연산자(->)를 사용한다. - list 구조체배열의 데이터를 출력하는 함수를 만들자. struct address list[5] = { … }; list_prn(list); // list는 구조체배열의 배열명 // 배열명을 주고 함수를 호출한다.

구조체배열의 배열명은 첫 번째 구조체를 가리키는 포인터이므로 배열명을 받는 매개변수는 구조체 포인터변수이어야 한다. ▶ 간접멤버참조연산자(->) 구조체배열의 배열명은 첫 번째 구조체를 가리키는 포인터이므로 배열명을 받는 매개변수는 구조체 포인터변수이어야 한다. void list_prn(struct address *lp) { int i; for(i=0; i<5; i++){ printf(“%10s%5d%15s%20s\n”, lp[i].name, lp[i].age, lp[i].tel, lp[i].addr); } 매개변수 lp가 구조체 포인터변수이므로 간접멤버참조연산자로 멤버를 참조할 수 있다. // 배열표현을 포인터표현으로 바꾼다. // 간접멤버참조연산자를 사용한다.

공용체 공용체는 모든 멤버가 하나의 기억공간을 공유하며 기억공간의 크기는 멤버 중에서 크기가 가장 큰 멤버로 결정된다. union student{ int num; double grade; }; // union예약어를 사용하여 선언한다. union student s1; // 공용체 변수의 선언 공용체의 멤버참조, 배열, 포인터의 사용은 구조체와 같다. 단, 초기화 할 때는 첫 번째 멤버만 초기화가 가능하다. union student s1 = {315}; // 첫 번째 멤버인 학번만 초기화 가능하다.

공용체는 모든 멤버가 하나의 기억공간을 공유하므로 메모리를 절약할 수 있지만 다른 멤버에 의해서 데이터가 변질될 위험이 있다. ▶ 공용체의 장단점 공용체는 모든 멤버가 하나의 기억공간을 공유하므로 메모리를 절약할 수 있지만 다른 멤버에 의해서 데이터가 변질될 위험이 있다. #include <stdio.h> union student{ int num; double grade; }; int main() { union student s1={315}; printf("학번 : %d\n", s1.num); s1.grade=4.4; printf("학점 : %.1lf\n", s1.grade); return 0; } 출력 결과 학번 : 315 학점 : 4.4 학번 : -1717986918 학번의 초기값이 학점 멤버에 의해서 변질되었다.

열거형은 기억공간에 저장될 데이터의 집합을 정의한다. 열거형은 읽기 쉬운 프로그램을 작성하는데 도움이 된다. #include <stdio.h> enum season {spring, summer, fall, winter}; int main() { enum season ss; char *cp; ss=spring; switch(ss){ case spring: cp="inline"; break; case summer: cp="swimming"; break; case fall: cp="trip"; break; case winter: cp="skiing"; break; } printf("나의 레저활동 => %s\n", cp); return 0; // 열겨형 변수 선언 // 문자열을 저장할 포인터변수 // 열거멤버의 값을 변수에 대입

typedef를 사용하여 응용자료형을 간단하게 사용할 수 있다. Student s1; // 재정의된 자료형으로 간단하게 구조체변수 선언 형 선언과 동시에 재정의하는 방법도 가능하다. typedef struct { int num; double grade; } Student; // 재정의될 것이므로 자료형의 이름이 필요 없다. // 새로운 자료형의 이름을 바로 적어준다.

▶ typedef를 사용한 프로그램 예 #include <stdio.h> typedef struct { int num; double grade; } Student; void data_prn(Student *); int main() { Student s1={315, 4.2}; data_prn(&s1); return 0; } void data_prn(Student *sp) printf("학번 : %d\n", sp->num); printf("학점 : %.1lf\n", sp->grade); // 구조체의 선언과 동시에 자료형의 재정의한다. // 함수의 선언, 매개변수는 Student형의 포인터변수 // Student형의 변수 선언과 초기화 // Student 변수의 포인터를 전달한다. // Student형을 가리키는 포인터변수 // 구조체포인터변수로 멤버 참조하기