580 likes | 1.1k Views
C 언어 및 실습 C Language and Practice. Chap 10. 구조체와 유니온 ( 공용체 ). 단원의 개요. 단원의 학습목표. 학습 유의점. 1. 구조체를 이해하기 위해 구조체의 필요성과 함께 일반 형식에 대해 알아본다 . 2. 구조체의 개념을 이해하고 구조체의 구성 요소들에 대해 알아본다 . 3. 구조체에 대한 정보를 함수로 전달하는 형식과 사용방법에 대해 알아본다 . 4. 구조체와 유사한 자료 구조인 유니온 (union) 의 개념과 사용 방법을 이해한다.
E N D
C언어 및 실습C Language and Practice Chap 10. 구조체와 유니온(공용체)
단원의 개요 단원의 학습목표 학습 유의점 1. 구조체를 이해하기 위해 구조체의 필요성과 함께 일반 형식에 대해 알아본다. 2. 구조체의 개념을 이해하고 구조체의 구성 요소들에 대해 알아본다. 3. 구조체에 대한 정보를 함수로 전달하는 형식과 사용방법에 대해 알아본다. 4. 구조체와 유사한 자료 구조인 유니온(union)의 개념과 사용 방법을 이해한다. 1. 구조체의 멤버들은 일반적인 변수들과 동일하게 선언하는 것을 단지 묶어서 선언하는 것임을 이해한다. 2. 구조체에 대한 포인터는 연결 리스트 예를 통해 이해한다. 3. 구조체를 함수의 인수로 사용할 때에는 구조체의 멤버, 구조체의 번지 또는 구조체의 배열을 이용할 수 있다는 것을 파악한다. 4. 유니온과 구조체는 외관상으로는 동일하지만 기억장소의 사용법이 다르다는 것을 그림과 예제 프로그램을 이용하여 이해한다. 단원의 학습계획 사용된 함수와 선행처리기 1. 구조체의 개념 구조체를 선언하는 일반형식과 구조체의 참조 방식을 이해한다. 2. 구조체 멤버 참조 구조체의 구성 요소들은 일반변수라는 사실을 이해한다. 3. 구조체에 대한 구조체를 포인터로 활용하는 형식과 방법을 포인터 숙지한다. 4. 구조체와 함수 호출 프로그램과 함수 사이에 구조체 자료를 전달하는 형식과 방법을 이해한다. 5. 유니온체 여러 변수들이 동일한 메모리를 사용하는 유니온의 개념과 사용 방법을 이해한다. • 함 수 : sqrt(x) : x**(1/2) = root(x) • 형 식 : double sqrt(double); getch( ) • 형 식 : intgetch(void); putch( ) • 형 식 : intputch(int);
구조체 book char char title[20] title[20] 구조체 book 제목 float float value value 저자 페이지수 가격 책 char char author[25] author[25] int int pages pages 구조체의 개념 • 구조체는 여러 개의 서로 다른 자료형 변수들을 묶어서 하나의 자료구조 단위로 처리할 수 있도록 구조화한 형태 • 배열: 동일한(같은)자료형들로 구성, 구조체 :서로 다른 자료형으로 혼합구성 • 큰 프로그램 작성에서 복잡한 자료를 구성하는데 편리 • cf. 책에 있는 제목/저자/출판사/발행일/페이지수/가격 등의 속성을 구조체로 묶어 하나의 자료구조 단위로 처리 book을나타낼 수 있는 구성요소(맴버)집합 제목 저자 페이지수 가격
구조체 book char char title[20] title[20] float float value value char char author[25] author[25] int int pages pages 구조체의 개념 • 구조체는 여러 개의 서로 다른 자료형 변수들을 묶어서 하나의 자료구조 단위로 처리할 수 있도록 구조화한 형태 • 배열은 동일한 자료형, 구조체는 서로 다른 자료[데이터 ]형들으로혼합구성됨 • 큰 프로그램에 있어서 복잡한 자료를 구성하는데 편리 • cf. 책에 있는 제목/저자/출판사/발행일/페이지수/가격 등의 속성을 구조체로 묶어 하나의 자료구조 단위로 처리 제목 페이지수 책 저자 가격
C언어에서 정의한 7가지 자료형선언 방법 1) int a; // 정수형 선언 2) float b; // 실수형선언 3) double c; // 배정도 실수형선언 4) char e; // 문자형선언 5) int ( char, float, double) d[10]; // 정수형( 문자, 실수 ,배정도) 배열선언 6) // 구조체 선언 structbook{ char title[20]; char author[25]; float value; }; 구조체 book char title[20] float value char author[25] int pages 구조체의 개념 7) //공용체(유니온) 선언 unionbook{ char title[20]; char author[25]; float value; }; • 구조체 선언 • 구조체의 선언은 대개 원시 코드 파일(프로그램)의 선두 부분에서 변수나 함수를 정의하기 전에 선언 • 구조체 선언의 일반 형식 : 표기법 : struct구조체명{ 구성 요소들의 자료형 선언; } 구조체선언의 예 structbook{ char title[20]; char author[25]; intpages; float value; } 구조체명 / 태그(tag) 구성 요소들 (멤버)
char char title[20] title[20] float float value value char char author[25] author[25] 구조체변수 선언예( 1)통합선언, 2)분리선언 ) 1) structbook{ char title[20]; char author[25]; float value; } book1; 2) structbook{ char title[20]; char author[25]; float value; }; structbook book1; 구조체의 개념 -structuer • 구조체 변수 • 구조체 변수(book1, book2): book 이라는 구조체를 자료형으로 갖는 변수 • 구조체를 프로그램에서 사용하기 위해 구조체 변수를 선언 • 구조체 변수 선언의 2가지 일반 형식 :< 구조체명과 구조체변수의 통합.분리선언> • 구조체 변수 선언의 예 표기법 1 : struct[구조체명]{ 구성 요소들의 자료형 선언; } 구조체 변수들; < 구조체명과 구조체변수의 통합선언> 표기법 2 : struct구조체명{ 구성 요소들의 자료형 선언; } ; struct구조체명구조체변수들; < 구조체명과 구조체변수의 분리선언> structbook{ // 구조체명 생략불가 char title[20]; char author[25]; float value; }; structbookbook1,book2; //구조체명,구조체변수들 structbook{// 구조체명 생략가능 char title[20]; char author[25]; float value; } book1, book2; //선언된 구조체변수들 book1과 book2는 같은 book구조(title,author,value)의 자료형으로 선언된 변수들( 즉, 구조체변수)임
char title[20] float value char author[25] 구조체변수 초기값 선언예( 1)통합선언, 2)분리선언 ) 1) structbook{ char title[20]; char author[25]; float value; } book1 ={ … }; 2) structbook{ char title[20]; char author[25]; float value; }; structbook book1={ … }; 구조체의 개념 • 구조체의 초기화 • 구조체의 초기화도 배열과 마찬가지로 일반 변수의 초기화 규칙에 따라 초기화 할 수 있음(7장 10pp~) • external이나 static으로 선언하는경우에 구조체의 초기화가 생략되면 모든 구성 요소들의 값은 0으로 자동초기화 • 구조체 초기화의 일반 형식 : 표기법 1 : struct구조체명{ 구성 요소들의 자료형 선언; } 구조체 변수= { 초기값들 }; 표기법 2 : struct구조체명구조체 변수= { 초기값들} ; cf. 구성요소의 초기값들은 콤마로 구분 표기법 1 <구조체명과 구조체변수의 통합선언> structbook{ char title[20]; char author[25]; floatvalue; } book1 = { “Operating systems”,“Stallings”, 6000.0} ; 표기법 2 <구조체명과 구조체변수의 분리선언>:초기값 선언,수행문장내 어디든 구조체변수 선언이 용이structbook{ char title[20]; char author[25]; floatvalue; }; structbookbook1= { “Operating systems”, “Stallings”, 6000.0} ;
char title[20] float value char author[25] 구조체의 개념 • 구조체의 초기화<구조체명과 구조체변수의 통합선언의 예> (1) 구조체 변수 book1이 초기화된 경우, 각 구성요소(구조체변수.구성요소)의 값 참조? structbook{ char title[20]; char author[25]; floatvalue; } book1 ={ “operating systems”,“Stallings”,6000 } ; book1.author ? book1.title ? book1.value ? 구조체변수(book1)의 구성요소들의 저장한(초기화된) 값 참조? 구조체변수.구성요소(멤버)
구조체의 개념 • 구조체의 초기화<구조체명과 구조체변수의 분리선언의 예> (2) 구조체 변수 book2의 구성요소 value가0.0으로 초기화된 경우, 구성요소 의 값 참조? • book2.title, book2.author은 “Operating systems”, “Stallings”로 차례로 초기화되나 book2.value는 0.0 초기화 됨. structbook{ char title[20]; char author[25]; floatvalue; }; structbookbook2 = { “Operating systems”, “Stallings” } ; book2.value book2.author book2.title 구조체변수(book2)의 구성요소들의 저장한(초기화된) 값 참조?
구조체 구성요소(멤버) 참조 • 구조체의 구성요소(struct member)를 참조하는 데에는 멤버 연산자(.)를 사용하여 구조체변수.구성요소(member)에 저장된 내용을 읽음 • 구조체 멤버 참조의 일반형식 : • 구조체변수(book1).구조체 구성요소 참조의 예 • book1.title /* book1의 title 구성요소 */ • book1.author /* book1의 author 구성요소 */ • book1.value /* book1의 value 구성요소 */ • 구조체 변수(book2)의구성요소들 참조 : book2.title , book2.author , book2.value 구조체변수.구성요소(멤버) structbook{ char title[20]; char author[25]; float value; } book1, book2; 구조체명: book 구조체 구성요소 : title, author, value 구조체변수 : book1, book2
구조체의 프로그램 book 구조를갖는 구조체변수 book1의 생성(초기값입력) structbook{ char title[20]; char author[25]; floatvalue; }; #include <stdio.h> structbook { char title[20]; char auther[25]; float value; }; structbookbook1 = {"Operating system", “Stallings", 15000.0}; structbookbook2 = {"Database system", " Korth", }; // value의 초기값이 없음 void main() { printf("구조체변수 : book1\n"); // 구조체변수 book1 printf("책의제목: %s \n", book1.title); printf("책의저자: %s \n", book1.auther); printf("책의가격: %7.1f \n\n", book1.value); printf("구조체변수 : book2\n"); // 구조체변수 book2 printf("책의제목: %s \n", book2.title); printf("책의저자: %s \n", book2.auther); printf("책의가격: %7.1f \n\n", book2.value);//초기값 없음 } book 구조를갖는 구조체변수 book2의 생성(초기값입력) structbook{ char title[20]; char author[25]; floatvalue; };
structbook structbook park[0] structbook park[1] : : title title title title author author author author value value value value structbook park[9] 구조체 멤버 참조 • 구조체의 배열은 배열 표시인 대괄호( [첨자 ] )를 사용하여 표현 • 구조체 배열 선언의 일반형식 : • Park의구조체 변수명으로 book 구조체를10개를 선언 . struct구조체명구조체변수[첨자] ; structbook{ char title[20]; char author[25]; float value; }; structbookpark; structbookpark[10] ; park[0].value park[0].author park[0].title park[9].value park[9].author park[9].title
구조체 구성요소(멤버) 참조 • 구조체 배열의 구성요소(멤버, struct member)를 참조할 때, 배열의 첨자는 구조체 변수에 붙는다. • 구조체배열의 구성요소 표시를 위한 일반형식 : • 구조체 배열의 구성요소 표기의 예 • 구조체 구성요소(멤버)에 대한 요약 • 일반적인 모든 자료형이 구조체의 구성요소로 쓰일 수 있다. • 구조체내 각 구성요소들은 이름이 달라야 한다. • 구조체가 다른 구조체의 멤버로 쓰일 경우 미리 선언되어 있어야 한다. • 구조체내 멤버는 멤버 연산자(.)를 사용해야 참조할 수 있다. . : 구성요소(멤버) 연산자 ->park[1].value -> 맞음( O ) 구조체변수[첨자].구성요소(맴버) Park[9].title -> 맞음( O ) Park[1].value -> 맞음( O ) park.value[1] -> 틀림( X )
structbook park[0] park[1] title author value : : park[9] 구조체배열에서 구조체 구성요소(멤버)의 참조 structbook{ char title[20]; char author[25]; float value; }; structbookpark[10] = { {“C언어및실습”, “주수종”, 12000.0 }, {“공학입문”, “홍길동”, 13000.0 }, {….}, {….},… {“수학-미적분”,“스마트”, 20000.0 } }; park[0].title = “C언어및실습” C언어및실습 주수종 12000.0 park[1].author = “홍길동” 공학입문 홍길동 13000.0 park[9].value = 20000.0 구조체배열 구조체변수[첨자].구성요소 수학-미적분 스마트 20000.0 구조체변수.구성요소(멤버)
구조체 멤버 참조의 예(각각의구조체변수를 이용) book 구조를갖는 구조체변수 book1의 생성(초기값입력) book 구조를갖는 구조체변수 book2의 생성(초기값입력) book 구조를갖는 구조체변수 book3의 생성(초기값입력) structbook{ char title[20]; char author[25]; floatvalue; }; structbook{ char title[20]; char author[25]; floatvalue; }; structbook{ char title[20]; char author[25]; floatvalue; }; #include <stdio.h> struct book { char title[20]; char auther[25]; float value; }; structbook book1 = {"Self-Study C 언어", "주수종", 14000 .0}; struct book book2 = {"공학입문", "홍길동", 13000.0}; struct book book3 = {"수학미적분","스마트", 20000.0}; void main() { printf("구조체변수book1 \n");//구조체변수book1 printf("책의제목: %s \n", book1.title); printf("책의저자: %s \n", book1.auther); printf("책의가격: %7.1f \n\n", book1.value); printf("구조체변수book2 \n"); // 구조체변수book2 printf("책의제목: %s \n", book2.title); printf("책의저자: %s \n", book2.auther); printf("책의가격: %7.1f \n\n", book2.value); printf("구조체변수book3 \n"); // 구조체변수 book3 printf("책의제목: %s \n", book3.title); printf("책의저자: %s \n", book3.auther); printf("책의가격: %7.1f \n\n", book3.value); }
structbook park[0] park[1] title author value park[2] 구조체 구성요소(멤버) 참조의 예(구조체배열의이용) #include <stdio.h> struct book { char title[20]; char auther[25]; float value; }; struct book park[3] = { {"Self-Study C 언어", "주수종", 14000 .0}, {"공학입문", "홍길동", 13000.0}, {"수학미적분","스마트", 20000.0}}; void main() { inti; for(i=0; i<3; i++) { printf("책의제목park[%d} : %s \n", i, park[i].title); printf("책의저자park[%d} : %s \n", i, park[i].auther); printf("책의가격park[%d} : %7.1f\n\n", i, park[i].value); } } Self-Study C 언어 주수종 14000.0 공학입문 홍길동 13000.0 수학-미적분 스마트 20000.0 park[i].title park[i].author park[i].value i = 0. 1, 2
중첩된 구조체(nested structure) • 중첩된 구조체 • 하나의 구조체 내에 또 다른 구조체가 중첩(nested)된 경우 • 중첩된 구조체를 이용하면 구조체의 모양은 복잡하나 프로그램이 편리함 • 중첩된 구조체의 형식 : 구조체명2가 구조체명1을 포함있음 표기법 : struct구조체명1{ 구성 요소들의 자료형 선언; : }; struct구조체명2 { struct구조체명1구조체변수(들); 구성요소들의 자료형 선언; : }; struct구조체명2구조체변수={초기값,.., {초기값들} , 초기값}; /* 중첩된 구조체의 초기화 */
structbook { char title[20]; char first[15]; char last[10]; float value; } guide; 중첩내부구조체명author, 구조체변수names last first 중첩된 구조체( Nested structure) • 중첩된 구조체에 초기값 선언 및 구조체 구성요소( 맴버) 참조 structauthor { char first[15]; char last[10]; }; structbook { char title[20]; structauthornames; float value; }; : static structbookguide = {“computer network”, {“Andrew”, “Tanenbaum” }, 6000.0}; 중첩외부구조체명: book, 구조체변수 guide title value 외부구조체변수(guide)의 구성요소들 참조? 내부구조체변수(names)의 구성요소들 참조? computer network Andrew 6000.0 Tanenbaum guide.title guide.names.first guide.names.last guide.value 외부구조체변수[.내부구조체변수].구성요소(멤버)
중첩내부구조체명author, 구조체변수names last first 중첩된 구조체( Nested structure) 중첩외부구조체명: book, 구조체변수 guide #include <stdio.h> structauthor{ //구조체 author char first[15]; char last[10]; }; structbook { char title[20]; structauthor names; // 구조체book내에 구조체 author 가중첩됨 float value; }; void main() { static structbookguide ={"Computer network", {"Andrew", "Tanenbaum" }, 6000.0 }; /* guide는구조체 book의 구조체변수, names는 구조체 author의 구조체변수임 */ printf("책의제목guide.title : %s \n", guide.title); printf("책의저자명 이름guide.names.first : %s \n", guide.names.first); //중첩된구조체부분 printf("책의저자명성guide.names.last : %s \n", guide.names.last); //중첩된구조체부분 printf("책의가격guide.value : %7.1f\n\n", guide.value); } title value computer network Andrew 6000.0 Tanenbaum guide.title guide.names.first guide.names.last guide.value
구조체에 대한 포인터 • 구조체에 대한 포인터 • 구조체 변수를 다루는 것보다 구조체에 대한 포인터를 다루는 것이 쉽다. • 다른 구조체에 대한 포인터를 가지는 구조체는 다양한 기능을 구사할 수 있다. • 중첩된 구조체에 대한 포인터의 선언은 구조체가 선언될 때 가능 • 구조체에 대한 포인터 선언의 일반 형식 : 표기법 : 구조체 포인터 사용 struct구조체명{ 구성 요소들의 자료형 선언; : } ; struct구조체명구조체포인터; 구조체포인터선언 예 structauthor { char first[LEN]; char last[LEN]; } ; structauthor names; structauthor* sptr; sptr = &name; 표기법 : 구조체 변수 사용 struct구조체명{ 구성 요소들의 자료형 선언; : }; struct구조체명구조체변수; 구조체변수선언 예 structauthor { char first[LEN]; char last[LEN]; }; structauthornames;
구조체변수 names(구조체명:author) last first # include <stdio.h> # define LEN 25 structauthor{ char first[LEN]; char last[LEN]; }; void main() { static structauthor names = {"Harby", "Deitel"}; structauthor*ptr; ptr= &names; //&names는 구조체변수 names의 시작번지 임 printf("구조체 변수 names 사용\n"); printf("책의저자명 이름names.first : %s \n", names.first); printf("책의저자명성names.last : %s \n\n", names.last); printf("구조체 포인터ptr사용[ names 와 (*ptr) 은 같음] \n"); printf("책의저자명 이름(*ptr).first : %s \n", (*ptr).first); printf("책의저자명성(*ptr).last : %s \n\n", (*ptr).last); printf("구조체 포인터ptr사용[ (*ptr) 와 ptr-> 은 같음] \n"); printf("책의저자명 이름 ptr->first : %s \n", ptr->first); printf("책의저자명 성 ptr->last : %s \n\n", ptr->last); } 구조체에 대한 포인터 • 구조체에 대한 포인터 선언 # include <stdio.h> # define LEN 25 structauthor { char first[LEN]; char last[LEN]; }; void main() { static structauthornames = {“Harby”, “Deitel”}; structauthor*ptr; ptr = &names; : } names.last (*ptr).last ptrlast names.first (*ptr).first ptrfirst
‘.’연산자의 우선순위가 ‘*’보다 높기 때문에 반드시괄호가 필요 구조체에 대한 포인터 • 포인터에 의한 구조체 구성요소를 참조하는 두 가지 방식 (1) 간접 멤버 연산자: ‘->’를 사용하는 방식 (2)간접연산자: ‘.’를 사용하는 방식 • 다음 세가지 참조방법은 표기만 다른 뿐 구조체의 참조결과는 같다. 표기법 : 포인터 -> 구조체의 구성요소 예 : ptr->value; /* book1[0].value , ptr= &book1[0]일때*/ ptr->title; /* book1[0].title , ptr= &book1[0]일때*/ 표기법 : (*포인터변수) . 구조체의 구성요소 예 : (*ptr).value; /* book1[0].value, ptr= &book1[0] 일때*/ (*ptr).title; /* book1[0].title , ptr= &book1[0] 일때*/ book1[0].title, (*ptr).title, ptr->title ptr = &book1[0] 일때
구조체변수 names(구조체명:author) last first 중첩된구조체에 대한 구조체포인터 • 중첩된 구조체에 대한 구조체포인터 선언 #define LEN 25 structauthor { charfirst[LEN]; char last[LEN]; }; structbook { char title[LEN]; structauthornames; float value; } void main() { static structbookbook1[2] = { {“Operating system”, {“Harbym”, “Deitel”}, 6000}, {“Architecture”, {“Moris”, “Mano”}, 4500} }; structbook*ptr; ptr = &book1[0] } 구조체변수 book1(구조체명: book), 구조체포인터ptr title value book1[0].title(*ptr).title ptrtitle book1[0].value (*ptr).value ptrvalue book1[0].names.last (*ptr).names.last ptrnames.last book1[0].names.first (*ptr).names.first Ptrnames.first 다음포인터: ptr+1= &book1[1]의 기억 위치
names(구조체명:author) last first 중첩된 구조체에 대한 포인터 구조체변수선언 및 초기화: structbook book1[2] = {"Operating system", {"Harby m", "Deitel"}, 6000.0}, {"Architecture", {"Moris", "Mano"}, 4500.0} }; 구조체포인터선언: structbook*ptr; ptr= &book1[0] book1(구조체명: book), ptr title value 400 구조체명 book book1[0] ptr = &book1[0]일때/* struct book *ptr; */ book1[0].title =(*ptr).title = ptr->title book1[0].names.first = (*ptr).names.first = ptr->names.first book1[0].names.last= (*ptr).names.last = ptr-> names.last book1[0].value = (*ptr).value = ptr->value Operating systems 450 book1[0].title =(*ptr).title = ptrtitle Book1[0].value =(*ptr).value = ptrvalue 425 book1[0].names.last =(*ptr).names.last = ptrnames.last book1[0].names.first =(*ptr).names.first = Ptrnames.first Harbym 475 Deitel 6000.0 479 book1[1] ptr ++ptr = &book1[1]일때 book1[1].title =(*ptr).title = ptr->title book1[1].names.first = (*ptr).names.first = ptr->names.first book1[1].names.last = (*ptr).names.last = ptr->names.last book1[1].value = (*ptr).value = ptr->value Architecture 504 Moris 529 Mano 554 4500.0 558
중첩된 구조체의 맴버참조(구조체배열, 구조체포인터) for(i=0; i<2; i++) { printf("구조체배열book1[%d}.title : %s \n", i, book1[i].title); printf("구조체포인터(*ptr).title : %s \n", (*ptr).title); printf("구조체포인터ptr->title : %s \n\n", ptr->title); printf("구조체배열book1[%d}.names.first : %s \n", i, book1[i].names.first ); printf("구조체포인터(*ptr).names.first : %s \n", (*ptr).names.first ); printf("구조체포인터ptr->names.first : %s \n\n", ptr->names.first ); printf("구조체배열book1[%d}.names.last : %s \n", i, book1[i].names.last ); printf("구조체포인터(*ptr).names.last : %s \n", (*ptr).names.last ); printf("구조체포인터ptr->names.last : %s \n\n", ptr->names.last ); printf("구조체배열book1[%d}.value : %7.1f \n", i, book1[i].value); printf("구조체포인터(*ptr).value : %7.1f \n", (*ptr).value); printf("구조체포인터ptr->value : %7.1f \n\n", ptr->value); ptr++; printf("================================================= \n\n"); } } # include <stdio.h> # define LEN 25 structauthor { char first[LEN]; char last[LEN]; }; struct book { char title[LEN]; structauthor names; float value; }; void main() { intI; static structbookbook1[2] = { {"Operating system", {"Harby m", "Deitel"}, 6000.0}, {"Architecture", {"Moris", "Mano"}, 4500.0} }; structbook *ptr; ptr= &book1[0]; /*book1:구조체변수, book1[2]:구조체배열, *ptr : 구조체에대한포인터*/ i=0 i=1
structbook park[0] park[1] title author value : : park[9] 구조체 구성요소(멤버) 참조 1) 구조체배열변수이용 -14pp structbook{ char title[20]; char author[25]; float value; }; 구조체변수[첨자].구성요소(멤버)의 변수 structbookpark[10] = { {“C언어및실습”, “주수종”, 12000.0}, {“공학입문”, “홍길동”, 13000.0 }, {….}, {….},… {“수학-미적분”,”스마트”, 20000.0 }}; park[0].title =“C언어및실습” C언어및실습 주수종 12000.0 park[1].author = “홍길동” 공학입문 홍길동 13000.0 park[9].value = 20000.0 수학-미적분 스마트 20000.0
structbook ptr ++ptr title author value : : ++ptr 구조체 구성요소(멤버)참조 2) 구조체포인터 이용 structbook{ char title[20]; char author[25]; float value; }; 포인터 구성요소(멤버)의 변수 또는(*포인터). 구성요소(멤버)의 변수 structbookpark[10] = { {“C언어및실습”, “주수종”, 12000.0}, {“공학입문”, “홍길동”, 13000.0 }, {….}, {….},… {“수학-미적분”,”스마트”, 20000.0 }}; structbook *ptr; ptr = &park[0]; ptrtitle= “C언어및실습” = (*ptr). Title C언어및실습 주수종 12000.0 ptrauthor = “홍길동” = (*ptr).author 공학입문 홍길동 13000.0 ptrvalue = 20000.0 = (*ptr).value 수학-미적분 스마트 20000.0
structbook { char title[20]; char first[15]; char last[10]; float r-price; float h-price; } guide = {초기값들 }: 구조체와 함수 • 구조체에 대한 정보를 함수로 전달하는 방법( Call By Value개념) (1) 구조체의 멤버 사용 • 구조체의 구성요소(멤버)가 단 하나의 값(즉, int, char, float, double 중 하나, 혹은 포인터)을 갖는 변수라면 구조체가 함수의 인자로 전달 가능 • 구조체의 구성요소(멤버)를 함수의 인자로 전달 #include <stdio.h> float avg(float x, float y); // 함수에 구조체 정보값전달방법( Call By Value) : struct book { char title[20]; char first[15]; char last[10]; float r_price; float h_price; }; void main( ) { struct book guide// 구조체변수 guide 선언 = {"Distributed Systems", "George", "Coulouris", 28000.0, 32000.0} ; printf(“Call By Value : R-price and H-price의평균값= $%.2f\n\n", avg(guide.r_price, guide.h_price)); } float avg(float x, float y) // x= r_price, y= h_price { return((x+y)/2); ]} : : float avg(float x, float y) { return((x+y)/2); } void main() { structbookguide; printf("The Avg. of R-price and H-price is $%.2f\n", avg(guide.r_price, guide.h_price)); }
structbook { char title[20]; char first[15]; char last[10]; float r-price; float h-price; } guide = {초기값들…..}; 구조체와 함수 • 구조체에 대한 정보를 함수로 전달하는 방법(Call By Address개념) (2) 구조체의 번지 사용 • 함수의 인수로 구조체의 번지를 사용하는 것으로 번지는 단 하나의 값이기 때문에 이 방법이 좋음 • 구조체의 번지를 함수의 인자로 전달 #include <stdio.h> float avg(struct book *money); // 함수에구조체정보값전달방법(Call By Address) struct book { char title[20]; char first[15]; char last[10]; float r_price; float h_price; }; void main( ) { struct book guide = {"Distributed Systems", "George", Coulouris“ ,28000.0, 32000.0} ; printf("Call By Address: R-price and H-price의평균값= $%.2f\n\n", avg( &guide ) ) ; } float avg(struct book * money) // money = &guide { return((money->r_price + money->h_price)/2); // 또는return(((*money).r_price +(*money).h_price)/2); } : : float avg(struct book *money) // money = &guide { return((money->r_price + money->h_price)/2); } void main() { printf("The Avg. of R-price and H-price is $%.2f\n", avg(&guide)); } guide[0]의 시작번지 money->r_price=같음= (*money).price money->h_price=같음= (*money).price
struct book { char title[20]; char first[15]; char last[10]; float r-price; float h-price; } guide[2] = {초기값들…..}; 구조체와 함수 • 구조체에 대한 정보를 함수로 전달하는 방법( call by Result 개념) (3) 구조체의 배열 사용 • 배열명은배열의 시작 번지를나타내기 때문에 함수의 인수로 전달 가능 • 함수로 구조체 배열을전달 : : float avg(money) struct book *money; { float total; inti; for(i=0, total=0; i<2; i++, money++) total+=(money->r_price + money->h_price)/2; return(total/i); // i++에 의해 i에 2가 대입됨 } void main() { printf("The Avg. of R-price and H-price is $%.2f\n", avg(guide)); } &guide 배열 guide
#include <stdio.h> float avg(struct book *money); // 함수에배열구조체정보값전달방법(Call By Result) struct book { char title[20]; char first[15]; char last[10]; float r_price; float h_price; }; void main() { static struct book guide[2] = { {"Distributed Systems","George","Coulouris",28000,.0 32000.0} , {"Architecture", "Moris", "Mano", 26000.0, 30000.0} }; printf("guide의주소= %d, &guide[0]의주소= %d \n", guide, &guide[0]); //배열구조체명이 포인터임 printf("Call By Result: R-price and H-price의평균값= $%.2f\n\n", avg( guide ) ) ; } float avg(struct book * money) // money = guide { float total=0; inti; for(i=0; i<2; i++) { total+=(money->r_price + money->h_price)/2; printf(" Total_ [%d] == %8.2f\n", i, total); money++; } return(total/i); // i에 2가 대입됨 ???? } #include <stdio.h> float avg(float x, float y); // 함수에 구조체 정보값전달방법( Call By Value) : struct book { char title[20]; char first[15]; char last[10]; float r_price; float h_price; }; void main( ) { struct book guide = {"Distributed Systems","George","Coulouris",28000.0, 32000.0} ; printf(“Call By Value : R-price and H-price의평균값= $%.2f\n\n", avg(guide.r_price, guide.h_price)); } float avg(float x, float y) // x= r_price, y= h_price { return((x+y)/2); ]} 구조체와 함수 #include <stdio.h> float avg(struct book *money); // 함수에구조체정보값전달방법(Call By Address(=Reference)) struct book { char title[20]; char first[15]; char last[10]; float r_price; float h_price; }; void main( ) { struct book guide = {"Distributed Systems", "George", Coulouris“ ,28000.0, 32000.0} ; printf("Call By Address: R-price and H-price의평균값= $%.2f\n\n", avg( &guide) ) ; } float avg(struct book *money) // money = &guide { return((money->r_price + money->h_price)/2); // 또는return(((*money).r_price +(*money).h_price)/2); }
유니온(union) • 유니온(union : 공용체) • 자료형이 다른 변수들에게 동일한 메모리 공간을 공유하여 사용하도록 해 주는 자료구조 • 한 번에 여러 구성요소(맴버)중에서 단 하나의 구성요소만을 사용하도록 함 • 각 구성요소를 동시에 기억시킬 수 없음( 구성요소중 하나의 기억장소만 제공) • 유니온 선언의 일반 형식은 예약어“union”을 사용하는 것을 제외하면 구조체(struct)와 동일 • 유니온 변수 선언( 구조체변수 선언과의 비교) • 일반 형식 : 표기법 1: union유니온명{ 구성 요소들의 자료형 선언; } 유니온변수; 표기법 1: struct구조체명{ 구성 요소들의 자료형 선언; } 구조체변수; 표기법 1: union유니온명{ 구성 요소들의 자료형 선언; }; union유니온명유니온변수; 표기법 1: struct구조체명{ 구성 요소들의 자료형 선언; }; strcut구조체명구조체변수;
••• ••• ••• ••• ••• ••• -> 25 bytes -> 25 bytes -> 25 bytes -> 4 bytes 유니온명book 유니온(union) • 유니온 변수 선언 • 유니온 구조 선언의 예 • 선언한 유니온변수의 크기(byte ?) 확인 예 union book{ char title[25]; char author[25]; float value; }; unionbook book1; unionbook min[5]; unionbook *ptr; #include <stdio.h> void main() { union book{ char title[25]; char author[25]; float value; }book1; //유니온변수book1 로선언 printf("Union size is %d Bytes\n\n", sizeof(book1)); } union 선언에서 Turbo C에서는 25 bytes로 나타남 Visual Studio(C++)에서는 선언된 실수형 4 bytes 의 곱의 수의 크기인 28 bytets로 제공함.
유니온(union) • 유니온 멤버 참조 • 유니온의 멤버를 참조하는 일반 형식 : • 유니온 구조와 유니온 멤버의 참조 유니온변수명. 멤버 : 예, int_or_float.inum 유니온포인터변수명->멤버 : 예, pabc= &abc (*pabc).fnum또는 pabc->fnum # include <stdio.h> union int_or_float { intinum; float fnum; }; void main() { static union int_or_floatabc; // 유니온변수명abc선언 union int_or_float* pabc; // 유니온포인터변수명pabc선언 pabc = &abc; abc.inum = 25; //유니온변수명.멤버 printf("유니온변수abc를사용한abc.inum의값= %d \n\n", abc.inum); pabc->fnum = 13.4; // 유니온포인터명.멤버. (*pabc).fnum = 13.4; 선언과같음 printf("pabc->fnum = 13.4; 수행후,유니온변수abc를사용한abc.inum의값= %d \n\n", abc.inum); // abc.inum값이25인지확인해보세요? Yes, No? printf("유니온포인터변수pabc를사용한pabc->fnum = %3.1f, (*pabc).fnum = %3.1f \n\n", pabc->fnum, (*pabc).fnum); } union int_or_float{ // 유니온구조int_or_float는 4bytes로 선언됨 intinum; float fnum; }; union int_or_floatabc; Union int_or_float *pabc; pabc= &abc; abc.inum= 25; //유니온변수(4bytes)에 정수형 25가 저장 pabc->fnum = 13.24 // 25는 지워지고 실수형13.24가 저장 유니온변수명 유니온명 유니온포인터변수명
유니온은 한 순간에 하나의 멤버만 사용가능 -> compile error -> 4 bytes -> 4 bytes 유니온(union) • 유니온의 초기화 • 유니온의 초기화는 구조체와 동일하나 초기값은 첫 번째 멤버에만 주어짐 • 유니온의 초기화 • 유니온과 구조체의 차이점(크기?) union wk{ inti; float f; }; union wka = {10}; /* 4bytes 변수 a.i=10 수행가능 */ union wkb = { 5, 3.14 }; /* 4bytes 변수 b.i=5와b.f= 3.14 둘중 하나만 수행함 */ 유니온 변수명 union wk { inti; float f; } b; struct 구조체 wk 유니온 wk -> 4 bytes -> 8 bytes
유니온(union) # include <stdio.h> // 유니온변수와 구조체변수의 크기 비교 union wk{ inti; float f; } wka; // 유니온 변수 wka(4바이트) 선언 structwka{ inti; float f; } wkb; // 구조변수 wkb(8바이트) 선언 void main() { printf("유니온 변수와 구조체변수의 크기를 확인하시오? \n"); printf("유니온 변수 wka의 크기는 = %d Bytes\n", sizeof(wka)); printf("구조체변수wkb의크기는 = %d Bytes\n\n", sizeof(wkb)); }
단원의 개요 단원의 학습목표 학습 유의점 1. 구조체를 이해하기 위해 구조체의 필요성과 함께 일반 형식에 대해 알아본다. 2. 구조체의 개념을 이해하고 구조체의 구성 요소들에 대해 알아본다. 3. 구조체에 대한 정보를 함수로 전달하는 형식과 사용방법에 대해 알아본다. 4. 구조체와 유사한 자료 구조인 유니온(union)의 개념과 사용 방법을 이해한다. 1. 구조체의 멤버들은 일반적인 변수들과 동일하게 선언하는 것을 단지 묶어서 선언하는 것임을 이해한다. 2. 구조체에 대한 포인터는 연결 리스트 예를 통해 이해한다. 3. 구조체를 함수의 인수로 사용할 때에는 구조체의 멤버, 구조체의 번지 또는 구조체의 배열을 이용할 수 있다는 것을 파악한다. 4. 유니온과 구조체는 외관상으로는 동일하지만 기억장소의 사용법이 다르다는 것을 그림과 예제 프로그램을 이용하여 이해한다. 단원의 학습계획 사용된 함수와 선행처리기 1. 구조체의 개념 구조체를 선언하는 일반형식과 구조체의 참조 방식을 이해한다. 2. 구조체 멤버 참조 구조체의 구성 요소들은 일반변수라는 사실을 이해한다. 3. 구조체에 대한 구조체를 포인터로 활용하는 형식과 방법을 포인터 숙지한다. 4. 구조체와 함수 호출 프로그램과 함수 사이에 구조체 자료를 전달하는 형식과 방법을 이해한다. 5. 유니온 여러 변수들이 동일한 메모리를 사용하는 유니온의 개념과 사용 방법을 이해한다. • 함 수 : : sqrt(x) : x**(1/2) = root(x) • 형 식 : double sqrt(double); getch( ) • 형 식 : intgetch(void); putch( ) p • 형 식 : intputch(int);
구조체 student 구조체 human 이름 학번 학과 학년 이름 직업 생일 연락처 나이 성별 구조체의 개념 : 3~5pp 참조 • 구조체 선언 • 실습 1 : 다음을 구조체로 선언하시오.
구조체의 개념 : 7~10pp 참조 • 구조체의 초기화(실습2) • 실습 2-1 : 구조체를 사용하여 학생들의 정보를 저장하는 변수들을 선언하고 초기화 하시오. • 실습 2-2 : 자신의 가족에 대한 정보를 저장하는 변수들을 선언하고 초기화하시오.
구조체 멤버 참조 : 9pp,14~16pp 참조 • 구조체 멤버 참조 • 실습 3 : 실습 2-1에서 선언하고 초기화한 구조체 변수들에 대하여 구조체 멤버 참조를 통해 같은 멤버끼리 출력하시오. • 실행 결과 • 실습 4 : 실습 3에서 선언하고 초기화한 구조체 변수들을 배열로 만들어 구조체 멤버 참조를 통해 같은 멤버끼리 출력하시오.
구조체 멤버 참조 : 10~13pp 참조 • 구조체 멤버 참조 • 실습 5-1 : 2차원 상의 좌표(x,y)의 정보를 저장할 수 있는 구조체를 정의하고 사용자 입력을 통해 두 점의 중점의 좌표를 구하는 프로그램을 작성하시오. • 실행 결과
구조체 멤버 참조 : 10~13pp 참조 • 구조체 멤버 참조 • 실습 5-2 : 2차원 상의 좌표(x,y)의 정보를 저장할 수 있는 구조체를 정의하고 사용자 입력을 통해 두 점 사이의 거리를 구하는 프로그램을 작성하시오. • 두 점 p1(x1, y1), p2(x2, y2) 사이의 거리 : • 제곱근을 반환하는 함수 • 실행 결과 함수 원형 : double sqrt(double); 사 용 예 : #include <math.h> : double a; a = sqrt(5.25);
중첩된 구조체(nested structure) : 17~19pp 참조 • 중첩된 구조체 • 보기 10-7 : 중첩된 구조체의 예 • 실습 6 : 보기 10-7의 중첩된 구조체를 사용하여 본교재의 정보를 초기화하고 이를 출력하시오 struct author { char first[15]; char last[10]; }; struct book { char title[20]; struct author names; float value; } : static struct book guide = {computer network, {Andrew, Tanenbaum }, 6000 };
구조체에 대한 포인터 : 17~19pp 참조 • 보기 10-8 : 중첩된 구조체에 대한 포인터 선언 #define LEN 25 struct author { char first[LEN]; char last[LEN]; }; struct book { char title[LEN]; struct author names; float value; } void main() { static struct book book1[2] = { {“operating system”, {“harby m”, “deitel”}, 6000}, {“architecture”, {“moris”, “mano”}, 4500} }; struct book *ptr; } ptr == &book1[0]의 기억 위치 ptr+1 == &book1[1]의 기억 위치
구조체에 대한 포인터 : 17~19pp 참조 • 실습 7 : 보기 10-8의 데이터를 포인터를 사용하여 같은 멤버끼리 출력하시오 • 실행결과 #define LEN 25 struct author { char first[LEN]; char last[LEN]; }; struct book { char title[LEN]; struct author names; float value; }; {“operating system”, {“harby m”, “deitel”}, 6000}, {“architecture”, {“moris”, “mano”}, 4500}
구조체와 함수 : 28pp참조 • 구조체에 대한 정보를 함수로 전달하는 방법 • 보기 10-11 : 구조체의 멤버를 함수의 인자로 전달( call-by-value) #include <stdio.h> struct author { char first[15]; char last[10]; }; struct book { char title[20]; struct author names; float r_price; float h_price; } guide={"opreating system", {"william", "stallings"}, 15000,13000}; float avg(float x, float y) { return((x+y)/2); } void main() { extern struct book guide; printf("The Avg. of R-price and H-price is $%.2f\n", avg(guide.r_price, guide.h_price)); }
구조체와 함수 : 29pp 참조 • 구조체에 대한 정보를 함수로 전달하는 방법 • 보기 10-12 : 구조체의 번지를 함수의 인자로 전달( Call-by-address) #include <stdio.h> struct author { char first[15]; char last[10]; }; struct book { char title[20]; struct author names; float r_price; float h_price; } guide={"opreating system", {"william", "stallings"}, 15000,13000}; float avg(struct book * money) // money = &guide 임 { return((money->r_price + money->h_price)/2); } void main() { printf("The Avg. of R-price and H-price is $%.2f\n", avg(&guide)); }
구조체와 함수 : 30pp 참조 • 구조체에 대한 정보를 함수로 전달하는 방법 • 보기 10-13 : 함수로 구조체 배열을 전달( call-by-result) #include <stdio.h> struct author { char first[15]; char last[10]; }; struct book { char title[20]; struct author names; float r_price; float h_price; } guide[2]={"opreating system", {"william", "stallings"}, 15000,13000, "computer networks", {"Andrew", "Tanenbaum"}, 18000,15000}; float avg(money) struct book *money; { float total; inti; for(i=0, total=0; i<2; i++, money++) total+=(money->r_price + money->h_price)/2; return(total/i); /* i=2 */ } void main() { float avg(); printf("The Avg. of R-price and H-price is $%.2f\n", avg(guide)); }
구조체와 함수 : 28~31pp 참조 • 구조체에 대한 정보를 함수로 전달하는 방법 • 예제 1 : 이름의 첫문자, 성별, 나이를 차례로 입력한다. 만일 9를 입력하면 중지하고 입력된 모든 자료를 화면에 표시하는 프로그램 #include <stdio.h> #define SIZE 100 #define LIST struct list LIST { char initial; char sex; char age; }; void inpt(LIST *pman) { char in[6], sx[6]; intag; printf("\n Initial Sex Age => "); scanf("%ls %ls %d", in, sx, &ag); pman->initial = *in;/* 복합연산자(a *= 1)가 아님,*in은 in에 저장된 번지에 있는 값 */ pman->sex = *sx; pman->age=ag; }