구조체란 무엇인가 ? 예: 학생관리 프로그램의 각 학생에 대한 기록(record) 구조체는 여러 자료형 변수들의 집합체이다.

Slides:



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

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
1 16 유도 자료형 학기. Perfect C 2 구조체 (struct)  구조체의 필요성  책에 대한 정보를 살펴보면 매우 다양  struct  서로 다른 자료형의 변수들을 묶어서 만든 하나의 새로운 자료형을 구조체 (struct)  구조체는 연관된.
제2장 C 언어의 확장 C++(1).
Part 12 구조체와 공용체 안산1대학 디지털정보통신과 임 성 국.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
제14장 동적 메모리.
제 9 장 구조체와 공용체.
Part 13 동적 할당 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
Part 12 구조체와 공용체 ©우균, 창병모 ©우균, 창병모.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
2007 1학기 16 구조체.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
23장. 구조체와 사용자 정의 자료형 2.
자료구조 실험 PSLab. 이태호.
14장. 포인터와 함수에 대한 이해.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
C#.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
나만의 자료 형을 만들 수 있다. C는 int, float, char 등의 자료 형을 제공한다.
구조체.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
Chapter 08. 함수.
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
제 6 장 함수(functions).
구조체 (Structure).
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 23. 구조체와 사용자 정의 자료형2.
Chapter 11 구조체.
제 4 장 Record.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
7 생성자 함수.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

구조체란 무엇인가 ? 예: 학생관리 프로그램의 각 학생에 대한 기록(record) 구조체는 여러 자료형 변수들의 집합체이다. 한 학생에 대한 자료들을 한 곳에 모아서 관리하면 편리 한 학생의 이름, 학번, 나이, 전화번호, 전공 등 구조체는 여러 자료형 변수들의 집합체이다. 구조체 구문 구조 struct 구조체명 {    자료형1 멤버명1;    자료형2 멤버명2;        ... }; 멤버 변수 혹은 필드 변수 구조체를 구성하는 변수

구조체 정의 1 구조체 정의 구조체 변수 선언 struct student { char name[20]; int stud_id;     char year;     char major[20];  }; 구조체 변수 선언 struct student  s1, s2;

구조체 정의 2 형정의(typedef) 사용하여 구조체 자료형 이름 정의 구조체 형 변수선언 typedef struct {     char name[20];      int stud_id;       char year;     char major[20]; } STUD; 구조체 형 변수선언     STUD s1, s2;

구조체 정의 3 구조체 정의할 때 변수 함께 선언 struct student { char name[20];     int stud_id;       char year;     char major[20]; } s1, s2;

구조체 정의 4 구조체 이름을 붙이지 않고 구조체와 변수 동시 선언 struct { char name[20];     int stud_id;       char year;     char major[20]; } s1, s2;

구조체 변수를 위한 기억공간 구조체 변수를 위한 기억공간 struct student 형의 변수를 위한 기억공간 할당 구조체의 각 멤버들을 위한 기억공간을 연속적으로 할당 struct student 형의 변수를 위한 기억공간 할당

struct.c 실행결과: struct student 크기: 48 변수 s의 크기: 48

구조체 변수 사용 구조체 변수에 포함된 멤버 변수에 접근하기 위해서 점 연산자를 사용한다. 구문 형식 구조체변수.멤버명 예를 들어 s1.name = “홍길동"; s1.stud_id = 20060101; s1.year = 2; s1.major = "컴퓨터과학";

student.c 실행결과: 이름: 아람이 학번: 20060101 학년: 2 전공: 컴퓨터과학 아람이 학생의 정보

12.2 구조체 배열과 포인터

구조체 배열 구조체 배열의 각 원소는 하나의 구조체이다. 구문 형식 struct 구조체명 배열명[원소의 개수]; 예를 들어 구조체 배열의 각 원소는 하나의 구조체이다.  구문 형식 struct 구조체명 배열명[원소의 개수]; 예를 들어 struct student stud[100]; 구조체 배열 초기화 예 struct student stud[] = {     {“홍길동", 20060101, 2, "컴퓨터과학"},     {“홍영희", 20060405, 2, "영문학"},      ...     {"호돌이", 20061113, 1, "의학" } };

구조체 배열 멤버 사용 예를 들어 stud 배열의 2번째 구조체의 멤버 사용 stud[1].name stud[1].stud_id  stud[1].year stud[1].major

실행결과 실행결과: 입력할 학생수: 4 이름: 홍길동 학번: 20060101 학년: 2 전공: 컴퓨터과학 이름: 홍영희 학번: 20060405 전공: 영문학 이름: 호돌이 학번: 20060104 이름: 꾀돌이 학번: 20050206 학년: 3 전공: 전자공학 실행결과: * 컴퓨터과학 전공 학생 * 이름: 홍길동 학번: 20060101 학년: 2 이름: 호돌이 학번: 20060104 총 2 명입니다.

구조체 포인터 구조체에 대한 포인터를 이용하여 구조체 참조 구조체 포인터 변수 선언 형식 예를 들어 struct 구조체명 *포인터명; 예를 들어 typedef struct {              float re;      // 실수부     float im;      // 허수부 } COMPLEX ; COMPLEX x, y[5], *p = &x;

COMPLEX 구조체 x: COMPLEX 형 변수 y: COMPLEX 배열 p: COMPLEX 형의 포인터 변수로 COMPLEX 구조체 x를 가리킨다.

구조체 포인터 사용 *p는 p가 가리키는 구조체 구조체 포인터 p가 가리키는 구조체 내의 멤버 (*p).re (*p).im 구조체 포인터 연산자 -> 사용하여 멤버 접근 구조체포인터->멤버명 == * 구조체포인터.멤버명 예를 들어  p->re   p->im

complex.c 실행결과: x     = 1.0 + 2.0 i y     = 5.0 + 10.0 i x + y = 6.0 + 12.0 i

구조체 대입 구조체 변수간의 대입이 가능하며 이 경우 모든 멤버가 한번에 대입된다. 예를 들어 COMPLEX a, b;      //  a, b는 구조체 b.re = 6; b.im = 9; a = b; 

12.3 구조체를 매개변수로 전달

구조체를 매개변수로 전달 구조체 자체 혹은 구조체 포인터를 매개변수로 전달할 수 있다. (1) 구조체 자체를 매개변수로 전달하는 방법 함수를 정의할 때 구조체를 매개변수로 선언하고 함수가 호출될 때 실 매개변수로 구조체를 전달 실 매개변수 구조체의 모든 값이 형식 매개변수에 그대로 복사 (2) 구조체 포인터를 매개변수로 전달하는 방법 구조체의 포인터를 실 매개변수로 건네주어 이 포인터로 구조체를 참조하는 방법 구조체 전체를 복사할 필요가 없으므로 시간이 적게 든다.

구조체 매개변수 예 1 두 개의 복소수를 더하는 함수 COMPLEX add_complex1(COMPLEX x, COMPLEX y) {     COMPLEX result;     result.re = x.re + y.re;     result.im = x.im + y.im     return result; } add_complex1가 리턴하는 구조체를 다른 구조체 변수에 대입      COMPLEX a, b, c; a.re = 3.0; a.im = 4.0; b.re = 2.0; b.im = 5.0; c = add_complex2(a, b);

구조체 매개변수 예 2 두 개의 복소수를 더하는 함수 add_complex2 함수 호출 COMPLEX add_complex2(COMPLEX *x, COMPLEX *y) {       COMPLEX result;    result.re = x->re + y->re;    result.im = x->im + y->im;    return result; } add_complex2 함수 호출 COMPLEX a, b, c; ... c = add_complex2(&a, &b);

12.4 공용체

공용체(union) 구조체와 비슷하게 여러 개의 멤버 변수로 구성된다 한 순간에 하나의 멤버 변수만 사용할 수 있다. 공용체 정의 union 공용체명 {    자료형1 멤버명1;    자료형2 멤버명2;        : }; 공용체 변수 선언 union 공용체명 변수명;

공용체 예 가격을 나타내는 공용체 가격은 원, 달러, 유로 중 하나로 표시 union price { int won; // 원     float dollar; // 달러     float euro;    // 유로 }; union price book_price; book_price.won = 10000;

공용체 예 멤버 변수 won, dollar, euro가 모두 한 기억공간을 공유 주의 ! 공용체 내의 다른 멤버 변수에 새로이 데이터를 대입하면 기존의 데이터는 지워진다 dollar 값을 대입하면 won 값은 지워진다. book_price.won = 10000; book_price.dollar = 39.99;

공용체 배열/포인터 공용체도 배열이나 포인터 형태로도 선언되어 사용될 수 있다. 예를 들어 공용체 배열 선언 공용체도 배열이나 포인터 형태로도 선언되어 사용될 수 있다.  예를 들어 공용체 배열 선언 union price book_prices[10];              공용체 포인터 및 변수 선언 union price book_price, *price_ptr;  공용체 주소를 공용체 포인터 변수에 대입   price_ptr = &book_price;                 

12.5 중첩 구조체

중첩 구조체(nested structure) 구조체의 멤버로서 다른 구조체를 사용할 수 있다. 복잡한 구조의 데이터를 관리하기 위해 예 struct date {    short year;   // 연도    char month;    // 월     char date;    // 일 }; struct book {    char title[50];       // 책 제목    char author[20];      // 저자    char publisher[20];   // 출판사   struct date pub_day;  // 출판일 } book1;

중첨 구조체 접근 중첩 구조체에서 내부 구조체의 멤버 접근 예 외부_구조체명.내부_구조체명.멤버명 book1.pub_day.year = 2006; 

중첩 구조체 다른 구조체에 대한 포인터를 구조체의 멤버로 사용 이 포인터 pub_day를 사용하기 위해서 struct book {     char title[50];     char author[20];           char publisher[20];                struct date *pub_day;  } book1;  이 포인터 pub_day를 사용하기 위해서 이 포인터가 실제 date 구조체를 가리키고 있어야 한다. 예를 들어, book1.pub_day = (struct date *) malloc(sizeof(struct date));

구조체에 대한 포인터 변수 book 구조체에 대한 포인터 변수 선언/사용 구조체 변수 포인터 연산자 -> 사용 예를 들어 struct book *book_ptr; book_ptr = &book1; 구조체 변수 포인터 연산자 -> 사용 외부_구조체_포인터명->내부_구조체_포인터명->멤버명 예를 들어 book_ptr->pub_day->year = 2005; book_ptr->author = "다람이";

12.6 자기 참조 구조체

자기참조 구조체 여러 권의 책에 대한 정보를 어떻게 저장해야 할까? 구조체 내에 자신을 가리킬 수 있는 포인터 변수를 선언 구조체 배열을 이용: 배열의 크기를 미리 정해야 한다. 보다 유연한 데이터 표현 방법이 필요하다. 구조체 내에 자신을 가리킬 수 있는 포인터 변수를 선언 struct book {     char title[50];     char author[20];           char publisher[20];                struct date pub_day;      struct book *next; };

자기참조 구조체 사용 struct book *ptr; // 첫 번째 책을 위한 구조체 생성 ptr = (struct book *) malloc(sizeof(struct book)); ...                                               // 첫 번째 책 자료 대입 // 두 번째 책을 위한 구조체 생성 ptr->next = (struct book *) malloc(sizeof(struct book));  ptr = ptr->next;                     // 두 번째 책 구조체를 포인터 ...                                                 // 두 번째 책 자료 대입 // 세 번째 책을 위한 구조체 생성 ptr->next = (struct book *) malloc(sizeof(struct book));                ptr = ptr->next;                           // 세 번째 책 구조체를 포인터 ...                                                // 세 번째 책 자료 대입

12.7 열거형

열거형(enumerated type) 열거형 열거형 정의 일련의 관련 정수 상수들의 집합을 하나의 자료형으로 정의 열거형은 자료형의 일종이므로 하나의 자료형으로 사용 특히 변수 값이 특정 집합으로 제한된 경우에 좋다. 열거형을 사용하면 코드가 보다 간결해지고 읽기 쉬워진다. 열거형 정의 enum 열거명 {     상수명 [= 정수값], ..., 상수명 [= 정수값] };

열거형 예 열거형 정의 실제로는 enum day 형의 변수 선언 enum day {     sun, mon, tue, wed, thu, fri, sat }; 실제로는     sun = 0, mon = 1, tue = 2, wed = 3, thu = 4, fri = 5, sat = 6 enum day 형의 변수 선언 enum day d1,d2; d1 = fri;

열거형 이용 함수 다음 요일을 리턴하는 함수 next_day() enum day next_day(enum day d) {     return (enum day)((int)d+1); }

열거형에서 초기화 열거형에서 상수명의 값을 초기화 가능하다. 열거형을 정의하면서 변수 선언도 함께 할 수도 있다. 열거형에서 상수명의 값을 초기화 가능하다. 열거형을 정의하면서 변수 선언도 함께 할 수도 있다. enum suit {     club = 1, diamond = 2, heart = 3, spade = 4 } a, b, c;

13.2 동적 할당 활용

메모리 관리 함수 자유 저장공간 메모리 관리 함수 자유 저장공간을 사용하는 이유 void *malloc(size_t size); size 바이트만큼 메모리 공간을 할당하여 이 공간의 시작주소를 void* 형으로 리턴함 size 바이트만큼 메모리 공간을 할당할 수 없으면 NULL(0)을 리턴함 void free(void *p); 인수로 주어진 포인터 p가 가리키는 공간을 해제함 자유 저장공간을 사용하는 이유 필요한 메모리 공간이 실행시간에 동적으로 결정되는 상황에 대처하기 위해 동적으로 변화하는 자료구조를 구현하기 위해 동적 자료구조 예: 리스트(list), 트리(tree)

prNint.c 임의 개수의 정수를 입력받은 후 역순으로 출력하는 프로그램 입력할 정수를 저장할 변수를 동적으로 할당함 실행결과: 몇 개의 정수를 입력하고 싶으십니까? 5 5 개의 정수를 입력해 주세요: 1 2 3 4 5 당신이 입력한 정수를 역순으로 출력합니다: 5 4 3 2 1

prNint2.c (1/2) 오류검사가 추가된 버전 오류 메시지를 표준오류스트림 stderr에 출력하는 방법은 PART 14 참고 입력한 n이 올바른 값인지 검사 malloc이 성공적으로 메모리를 할당하였는지 검사

prNint2.c (2/2) 이 결과는 컴퓨터마다 다를 수 있음 실행결과 1: 몇 개의 정수를 입력하고 싶으십니까? -3 오류: 정수 개수를 잘못 입력하였습니다. 프로그램을 종료합니다. 이 결과는 컴퓨터마다 다를 수 있음 실행결과 2: 몇 개의 정수를 입력하고 싶으십니까? 1234567890123 오류: 메모리가 부족합니다. 프로그램을 종료합니다.