42
멘멘멘 7 멘멘 11.08.23

멘토링 7 주차

Embed Size (px)

DESCRIPTION

멘토링 7 주차. 11.08.23. 동적 메모리 할당. 정적 할당 (Static Allocation) 변수선언에 의하여 변수의 타입에 맞는 크기만큼 메모리를 할당 동적 할당 (Dynamic Allocation) 포인터 변수를 사용하여 실행 중에 기억장소를 할당. int a; // int 타입 크기 만큼의 공간을 할당 (4 바이트 ) char c; //char 타입 크기 만큼의 공간 할당 (1 바이트 ) - PowerPoint PPT Presentation

Citation preview

Page 1: 멘토링 7 주차

멘토링 7 주차

11.08.23

Page 2: 멘토링 7 주차

dynamic allocation2

동적 메모리 할당

정적 할당 (Static Allocation) 변수선언에 의하여 변수의 타입에 맞는 크기만큼 메모리를

할당

동적 할당 (Dynamic Allocation) 포인터 변수를 사용하여 실행 중에 기억장소를 할당

int a; //int 타입 크기 만큼의 공간을 할당 (4 바이트 )char c; //char 타입 크기 만큼의 공간 할당 (1 바이트 )float f[10]; //float 타입 크기 만큼의 공간을 10 개 할당 (4 바이트 * 10)

int *p; // 포인터 변수 선언p = (int *) malloc(4); //4 바이트의 메모리 공간을 할당하여 시작주소를 반환하여 p 에 대입free(p); //p 에 할당된 메모리 공간을 해제

Page 3: 멘토링 7 주차

dynamic allocation 3

메모리 관리 함수 메모리 할당과 해제에 관련된 함수

(<stdlib.h>)

함수 원형 기능 사용 예

void * malloc(unsigned int)void * malloc(size_t)

매개변수의 바이트 만큼 메모리를 할당하여 주소를 반환

int *ip;ip = (int *) malloc(sizeof(int));*ip = 100;

void * calloc(size_t , size_t)두 번째 매개변수의 크기를 첫 번째 매개변수 개수만큼 메모리를 할당하여 초기화한 후 주소 값을 반환

int *ip;ip = (int *) calloc(2, sizeof(int));*ip = 200; *(ip+1) = 300;

void * realloc(void *, size_t)

첫 번째 매개변수의 주소공간에 두 번째 매개변수의 크기를 추가하여 메모리를 할당하여 새로운 주소를 반환

int *ip, *rp;ip = (int *) malloc(sizeof(int) * 2);rp=(int *) realloc(ip, sizeof(int)*3);

void free(void *)매개변수를 기본 주소로 갖는 메모리 해제 free(ip);

free(rp);

Page 4: 멘토링 7 주차

dynamic allocation 4

malloc() 함수원형 void * malloc(size_t) 지정한 바이트 수 만큼 힙 영역의 메모리 공간을 할당하여 주소를 반환하는

함수 변수타입의 크기 , 배열의 크기에 따른 바이트 수를 계산하여 매개변수로

사용 할당된 공간은 초기화 되지 않는다 메모리 공간이 부족한 경우엔 NULL 값 반환 사용 예

(1) 하나의 값을 저장할 공간 확보int *ip;ip = (int *) malloc(sizeof(int)); // 저장할 값의 자료 형 크기로 메모리할당if (ip != NULL) *ip = 100;

ip 100 int 형의 크기 (4 바이트 )

Page 5: 멘토링 7 주차

dynamic allocation5

(2) 배열 공간 확보

int *ap;ap = (int *) malloc(sizeof(int) * 5); //int 형의 크기 만큼 5 개 공간 확보 *ap = 1; //ap[0] *(ap+1) = 2; //ap[1]*(ap+4) = 9; //ap[4]

ap 1 int 형의 크기 (4 바이트 ) * 52

char *str;str = (char *) malloc(100); // 길이 99 인 문자열 저장 공간 확보gets(str);

(3) 문자열 공간 확보

str char 형의 크기 (1 바이트 ) * 100

… 9

ap[0] ap[1] … ap[4]

Page 6: 멘토링 7 주차

dynamic allocation6

malloc.c malloc() 을 사용한 동적 메모리 할당 예#include <stdlib.h>

#define MAX 5

void main()

{

char *cp; int *ip; double *dp; int *ap; char *str; int i;

cp=(char *)malloc(sizeof(char));

ip=(int *)malloc(sizeof(int));

dp=(double *)malloc(sizeof(double));

ap=(int *)malloc(sizeof(int) * MAX);

str = (char *)malloc(10);

*cp ='A'; *ip = 100; *dp = 23.5;

for (i=0;i<MAX;i++) { *(ap+i) = i+1; } //ap[i] = i+1

printf(">> 문자열 입력 : "); gets(str);

printf("*cp = %c\n", *cp); printf("*ip = %d\n", *ip);

printf("*dp = %.2f\n", *dp); printf("str = %s\n", str);

printf("array = ");

for (i=0;i<MAX;i++) { printf("%d ", *(ap+i)); }

free(cp); free(ip); free(dp); free(ap); free(str);

}

Page 7: 멘토링 7 주차

dynamic allocation 7

2 차원 배열 동적 할당mallocarray2.c 이중포인터를 사용한 2 차원 배열 (n*m) 동적 할당 예

#include <stdlib.h>

void main(){

int n=3,m=4;

int i, j, k=0;

int **p; //2 차원 배열구조를 위해 이중포인터로 선언

p=(int **)malloc(n*sizeof(int *)); // 행의 크기 (n) 만큼 포인터 타입을 저장할 공간할당

for (i=0;i<n;i++)

p[i]=(int *)malloc(m*sizeof(int)); // 열의 크기 (m) 만큼 각 포인터에 공간할당

for (i=0;i<n;i++) {

for (j=0;j<m;j++) { *(*(p+i)+j) = ++k; } // == p[i][j]

}

for (i=0;i<n;i++) {

for (j=0;j<m;j++) { printf("%d ", p[i][j]); }

printf("\n");

}

for (i=0;i<n;i++) { free(p[i]); } // 각 포인터에 할당된 공간 해제

free(p); // 포인터들의 공간 해제

}

p[0]

p[1]

p[2]

p

p[2][0]

p[2][1]

p[2][2]

p[2][3]

p[0][0]

p[0][1]

p[0][2]

p[0][3]p[1][0]

p[1][1]

p[1][2]

p[1][3]

Page 8: 멘토링 7 주차

dynamic allocation8

연습문제1)ID 리스트를 동적으로 구성하여 검색하는 프로그램 작성

< 처리조건 >

-ID list 의 인원수를 입력하여 동적으로 배열의 공간을 할당

-ID list 에 인원수 (n) 만큼 id 를 추가하는 함수 구현

void input(char **idlist, int n)

- 유효성 검사 함수 구현

:ID 를 매개변수로 넘겨서 길이 (8 자리 ) 와

영숫자로 구성되었는가를 확인

char * chkID(char *);

반환값 : 유효한 경우 - NULL

길이가 범위 내의 값이 아니면 “길이오류” 영 숫자가 아니면 “형식오류”

-ID list 에서 특정 ID 를 검색하는 함수 구현

: 검색할 id 를 반복 입력하여 회원인지 아닌지를 확인하는 함수

void search(char **idlist, int n)

< 출력예시 >* 회원 수 입력 : 3>>ID 입력 : a123>>ID 입력 : b333>>ID 입력 : c123456789=> 길이오류>>ID 입력 : d!@#=> 형식오류>>ID 입력 : e999* 회원 목록 *a123b333e999>> 검색할 ID 입력 ( 종료 :q) a123입력한 ID 는 회원입니다>> 검색할 ID 입력 ( 종료 :q) sdsd입력한 ID 는 회원이 아닙니다>> 검색할 ID 입력 ( 종료 :q) q

Page 9: 멘토링 7 주차

구조체

Page 10: 멘토링 7 주차

struct 10

구조체 (Struct)

여러 형태의 자료를 하나의 자료 형으로 통합하여 관리하는 구조

예 : 성적처리를 위한 데이터 구조/* (1) 일반 자료형 선언 형태 */

char name[30]; // 성명 int kor; // 국어 int eng; // 영어 int math; // 수학 int sum; // 총점 float avg; // 평균

/* (2) 구조체 선언 형태 */ struct grade{ // 구조체 이름(Tag) char name[30]; int kor; int eng; int math; int sum; float avg; };

struct grade sc; // 구조체 변수 선언

구조체구성요소(mem-ber)

Page 11: 멘토링 7 주차

struct11

구조체 정의 구조체 멤버를 이용하여 새로운 구조체 자료형을

정의하는 구문 구조체 멤버

구조체를 구성하는 데이타들 ( 구성요소 , member) 구조체 정의 구문에서는 각 구성요소의 초기값을 대입할

수 없음 한 구조체 내부에서 선언되는 구조체 멤버의 이름은 모두

유일

Page 12: 멘토링 7 주차

struct12

구조체 변수 선언 정의된 구조체 이름의 자료형으로 구조체 변수 선언

Page 13: 멘토링 7 주차

struct 13

다양한 구조체 변수 선언 형태

// 구조체 정의struct grade{ char name[30]; int kor; int eng; int mat; float avg; };// 변수선언struct grade st1;

// 구조체 정의 ( 구조체명 포함 ) 에서 변수선언struct grade{ char name[30]; int kor; int eng; int mat; float avg; }st1;

// 구조체정의에서 변수선언struct { char name[30]; int kor; int eng; int mat; float avg; }st1;

name name[0] name[1] … name[29]

kor sizeof(int)

eng sizeof(int)

mat sizeof(int)

avg sizeof(float)

st1

Page 14: 멘토링 7 주차

struct14

사용자 정의 데이터 형 (typedef ) 데이터형의 이름을 새롭게 정의하기 위한 명령 형식

typedef 데이터 형 새 이름 예제

typedef char * STRING; // 문자열을 STRING 형으로 정의 typedef unsigned char BYTE; typedef struct{ // 구조체를 복소수 (COMPLEX) 형으로 정의 float r; // 실수부 float i; // 허수부 }COMPLEX;

STRING str; // 변수 str 을 문자열 형으로 선언 BYTE i; // 변수 i 를 BYTE 형으로 선언 COMPLEX num; // 변수 num 을 복소수로 선언

Page 15: 멘토링 7 주차

struct15

typedef 를 이용한 구조체 정의 구조체 정의 후 변수 선언에 사용될 자료 형을

간단하게 표현하기 위한 자료 형 정의 방법

typedef 로 구조체 정의 정의된 구조체를 더 간단하게 선언struct book {

char title[50]; // 제목char author[50]; // 저자char publish[50]; // 출판사int pages; // 페이지수int price; // 가격

}; typedef struct book book ;…book yourbook; book mybook;

Page 16: 멘토링 7 주차

struct16

구조체 변수의 초기화 구조체 변수 선언 시 중괄호 ({}) 를 이용하여

구조체 구성요소의 자료형에 맞추어 초기값 지정 구성요소의 정의된 순서에 맞추어 초기값이 저장 구성요소의 개수보다 적을 경우 남은 부분은 0 로

초기화 예

struct grade{ char name[30]; int kor; int eng; float avg; };main (){ struct grade st1={“kim min ho”, 100, 100}; ...}

i m m i n h o \0 • • • k 100 100 0

name[30] kor eng avg

Page 17: 멘토링 7 주차

struct 17

구조체 구성요소 (member) 참조 구조체를 구성하는 구성요소를 표현하기 위해 멤버연산자 (.) 를 이용 < 형식 > 구조체변수 . 구성요소 < 예 > 구조체변수 . 구성요소 = 값 ; 변수 = 구조체변수 . 구성요소

structDemo.c 구조체를 사용한 성적처리 예

#include <stdio.h>struct grade{ // 구조체 정의 char name[30]; int kor; int eng; int math; int sum; float avg; };main (){ struct grade st1; // 구조체 변수 선언 printf(" 성명 국어 영어 수학 점수 입력 : "); // 구조체 구성요소에 값을 입력 scanf("%s %d %d %d", st1.name, &st1.kor, &st1.eng, &st1.math); st1.sum = st1.kor + st1.eng + st1.math; // 구조체 구성요소를 이용한 계산 st1.avg = st1.sum / 3.0; printf("name =%s, sum=%d, average= %.2f\n", st1.name, st1.sum, st1.avg); // 구조체 구성요소의 값을 출력}

Page 18: 멘토링 7 주차

struct18

연습문제 (1) 회원정보를 구조체로 구성하여 회원가입프로그램을 작성

< 처리조건 > 회원 정보 : id(9), pwd(9), age 반복 입력 , id 에 “ quit” 가 입력되면 종료 나이가 20 세 미만이면 “ 20 세 이상만 회원가입이 가능합니다 .” 메시지

출력 나이가 20 세 이상이면 가입 축하 인사와 회원 정보 출력

< 출력예시 >>>ID( 종료 -quit): hong>>Password : h1234>>age : 10**20 세이상만 회원가입이 가능합니다 .>>ID( 종료 -quit): kim>>Password : k4040>>age : 30** 회원가입을 축하합니다 .[ID:kim Password:k4040 age:30]>>ID( 종료 -quit): quit** 프로그램을 종료합니다 .

Page 19: 멘토링 7 주차

struct19

같은 구조체를 가지는 여러 자료를 관리하기 위한 구조 형식 struct 구조체이름 배열명 [ 크기 ];

예 struct grade st1[10];

배열구조

st1[0]

st1[1]

...

st1[9]

name kor eng math sum avg

st1[0].name st1[0].ko r st1[0].eng st1[0].math st1[0].sum st1[0].avg st1[1].name st1[1].kor st1[1].eng st1[1].math st1[1].sum st1[1].avg

st1[9].name st1[9].kor st1[9].eng st1[9].math st1[9].sum st1[9].avg

구조체 배열

Page 20: 멘토링 7 주차

struct 20

구조체 배열 예제

structArray.c 구조체 배열을 사용한 성적처리 예#include <stdio.h>#define MAXST 10struct grade{ char name[30]; int kor; int eng; int math; int sum; float avg; };main (){ int i; struct grade st1[MAXST]; // 크기 10 인 구조체 배열 선언 for ( i = 0; i < MAXST; i++){

printf("%d 번째 학생성명 국어 영어 수학점수 입력 : ", i+1);scanf("%s %d %d %d", st1[i].name, &st1[i].kor, &st1[i].eng, &st1[i].math); st1[i].sum = st1[i].kor + st1[i].eng + st1[i].math;st1[i].avg = (float) st1[i].sum / 3;printf("name =%s, sum=%d, average= %.2f\n", st1[i].name, st1[i].sum,

st1[i].avg); }}

Page 21: 멘토링 7 주차

struct21

구조체 배열 초기화// 도서정보 구조체

struct book {

char author[50];

char title[50];

int pages;

};

 // 도서목록

struct book clang[3] =

{ {"Deitel", "C How To Program", 600},

{"Al Kelly", "A Book On C", 700},

{"Stephen Prata", "C Primer Plus", 800} };

Page 22: 멘토링 7 주차

struct22

구조체 변수의 주소를 가지는 포인터 형

예 )struct grade *stp, *stp2, st1, st2[10]; stp = &st1; stp2 = st2;

구조체 포인터의 구성요소 참조

1) 포인터의 참조연산자 (*) 이용 (*stp).kor = 100; (*stp).eng = 90; (*stp).math = 97; (*stp).sum = (*stp).kor + (*stp).eng + (*stp).math;

2) 구조체 포인터 참조 연산자 ('->' ) 이용 구조체포인터 -> 멤버변수 = 값 ; 변수 = 구조체포인터 -> 멤버변수 ;

stp->kor = 100; stp->eng = 90; stp->math = 97; stp->sum = stp->kor + stp->eng + stp->math;

구조체 포인터

Page 23: 멘토링 7 주차

struct23

structPoint.c 구조체 포인터를 사용한 성적처리 예#include <stdio.h>#define MAXST 10struct grade{ char name[30]; int kor; int eng; int math; int sum; float avg; };main (){ int i; struct grade st1[MAXST], *stp; stp = st1; // 구조체 포인터에 배열주소 대입 printf("10 명의 성명 , 국어 , 영어 , 수학 점수 입력 \n"); for ( i = 0; i < MAXST; i++){ // 포인터 참조연산자로 배열요소 접근 scanf("%s %d %d %d", (*stp).name, &(*stp).kor, &(*stp).eng, &(*stp).math); (*stp).sum = (*stp). kor + (*stp). eng + (*stp). math; // 포인터 참조연산자로 접근// st1[i].sum = st1[i].kor + st1[i].eng + st1[i].math; // 배열인덱스로 요소로 접근 stp->avg = stp->sum / 3.0; // 구조체 포인터 참조연산자로 접근 printf("name =%s, sum=%d, average= %.2f\n", stp->name, stp->sum, stp->avg); stp++; // 구조체 포인터 증가 }}

구조체 포인터 예제

Page 24: 멘토링 7 주차

struct24

1. 구조체의 구성요소를 함수의 매개변수로 이용

2. 구조체를 매개변수로 이용

/* 함수호출 */st1.sum = sum_fun(st1.kor,st1.eng,st1.math);/* 함수정의 */int sum_fun(int a, int b, int c){ return(a + b + c);}

/* 함수호출 */st1.sum = sum_fun(st1); /* 함수정의 */int sum_fun(struct grade st){ return(st.kor + st.eng + st.math);}

구조체와 함수

Page 25: 멘토링 7 주차

struct25

3. 구조체 주소를 매개변수로 이용

/* 함수호출 */sum_fun(&st1); /* 함수정의 */sum_fun(struct grade *st){ st->sum = st->kor + st->eng + st->math;}

Page 26: 멘토링 7 주차

struct26

4. 구조체 배열을 함수에 이용

//structFunction.c, 구조체 배열을 매개변수로 하는 함수사용 예 ( 성적처리 )#include <stdio.h>#define MAXST 10struct grade{ char name[30]; int kor; int eng; int math; int sum; float avg; };void get_data(struct grade *st, int n);void make_data(struct grade *st, int n);void put_data(const struct grade *st, int n);

main (){ int i; struct grade st1[MAXST]; int num; printf(">> 입력할 학생의 수는 ? "); scanf("%d", &num); get_data(st1, num); // 데이터를 입력하는 함수 호출 make_data(st1,num); // 총점 , 평균을 계산하는 함수 호출 put_data(st1, num); // 데이터를 출력하는 함수 호출 }

Page 27: 멘토링 7 주차

struct27

//structFunction.c 계속 // 구조체 배열에 각 점수를 입력 받는 함수 void get_data(struct grade *st, int n){ // 구조체 배열을 포인터로 받아서 처리 int i; printf("%d 명의 성명 , 국어 , 영어 , 수학 점수 입력 \n", n); for ( i = 0; i < n; i++, st++){ printf("%d : ", i + 1); scanf("%s %d %d %d", st->name, &st->kor, &st->eng, &st->math); // 각 점수를 입력 }}// 구조체 배열의 총점과 평균 계산 함수void make_data(struct grade *st, int n){ int i; for ( i = 0; i < n; i++, st++){

st->sum = st->kor + st->eng + st->math; // 총점계산st->avg = (float) st->sum / 3; // 평균계산

}}// 구조체 배열 출력 함수void put_data(const struct grade *st, int n){ int i; for ( i = 0; i < n; i++, st++) printf("name =%s, sum=%d, average= %.2f\n", st->name, st->sum, st->avg); // 출력}

Page 28: 멘토링 7 주차

struct28

연습문제 (2) 구조체 배열을 이용한 성적처리 수정

(1)grade 구조체에 학점 (grd) , 등수 (rank) 데이터 추가(2)make_data 함수에서 학점 구하는 함수 호출

char grd_make(float avg)

: 평균을 받아서 학점을 return

90 이상 100 이하 : A, 80 이상 90 미만 : B, 70 이상 80 미만 : C,

60 이상 70 미만 : D, 60 미만 : F

(3) 등수 구하는 함수 작성rank_make(struct grade *st, int n)

Page 29: 멘토링 7 주차

struct29

구조체 배열과 동적 할당//structMalloc.c, 구조체 배열의 동적 할당을 사용한 성적처리 예#include<stdio.h>#include<stdlib.h>typedef struct{ int num; int kor; int eng; int mat; float avg;} sctype; // 구조체 타입 정의main() { sctype *sc, *scp; // 구조체 포인터 변수 선언 int i, n; printf(" 학생 수 입력 ="); scanf("%d", &n); sc = (sctype *) calloc(n, sizeof(sctype)); // 구조체 크기를 학생수 (n) 만큼 확보 scp = sc; // 확보된 메모리의 주소를 대입 for (i=0; i < n; i++, scp++){ // 포인터를 증가시키면서 구조체에 데이터 입력 scp->num = i + 1; printf("%d 번 입력 \n", scp->num); printf(" 국어 :"); scanf("%d", &scp->kor); printf(" 영어 :"); scanf("%d", &scp->eng); printf(" 수학 :"); scanf("%d", &scp->mat); scp->avg = (scp->kor + scp->eng + scp->mat) / 3.0; } printf(" 번호 국어 영어 수학 평균 \n"); for (i=0; i < n; i++, sc++) printf("%4d %3d %3d %3d %5.2f\n", sc->num, sc->kor, sc->eng, sc->mat, sc->avg);}

Page 30: 멘토링 7 주차

struct30

중첩 구조체

하나의 구조체 안에 또 다른 구조체를 포함하고 있는 구조

도서관리 예제typedef struct{

char kind[10]; // 분류char bname[20]; // 서명char author[10]; // 저자char abstract[30]; // 요약

} ctype; // 도서정보 구조체

typedef struct{ char num[4]; // 도서번호 ctype book; // 도서정보 구조체}btype; // 도서카드 구조체

btype bcard; // 도서카드 변수 선언

bcard num

book kind

bname

author

abstract

Page 31: 멘토링 7 주차

struct31

main(){ btype bcard;

printf("book input : \n"); printf(" 도서번호 : "); gets(bcard.num); printf(“ 분 류 : "); gets(bcard.book.kind); // 구조체 구성요소접근 연산자 (.)이용 printf(" 도 서 명 : "); gets(bcard.book.bname); printf(" 저 자 : "); gets(bcard.book.author); printf(" 요 약 : "); gets(bcard.book.abstract);

printf("=============================\n"); printf(" 도서번호 : "); puts(bcard.num); printf(“ 분 류 : "); puts(bcard.book.kind); printf(" 도 서 명 : "); puts(bcard.book.bname); printf(" 저 자 : "); puts(bcard.book.author); printf(" 요 약 : "); puts(bcard.book.abstract); printf("=============================\n");}

중첩구조체 구성요소 접근

Page 32: 멘토링 7 주차

struct32

여러 개의 데이타를 관리할 때 입력 데이타가 있을 경우만 공간을 확보하여 메모리 공간 절약

도서관리를 위한 도서리스트에서 도서정보가 있을 경우만 동적 할당

중첩 구조체 동적할당

blistnum book 종류 도서명 저자 요약

0

1

Ma

x

Page 33: 멘토링 7 주차

struct33

// 도서관리 프로그램 (book.c)#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXSIZE 10typedef struct{ char kind[10]; char bname[20]; char author[10]; char abstract[30];} ctype; typedef struct{ char num[4]; ctype *book; // 구조체 포인터 }btype;void input_rtn(btype *blist); // 도서정보 입력 함수 void output_rtn(btype *blist, int idx); // 도서정보 출력함수 main(){

btype blist[MAXSIZE]; char in_num[4];int idx=0;while(idx < MAXSIZE){

printf("book input : \n");printf(">> 도서번호 ( 종료 -999) : "); gets(in_num); if (atoi(in_num) >= 999) break;strcpy(blist[idx].num, in_num); // 입력 값을 도서번호로 복사input_rtn(&blist[idx]); // 도서정보 입력 함수 호출idx = idx + 1;

}//whileoutput_rtn(blist, idx); // 도서정보 출력함수 호출

} //main

Page 34: 멘토링 7 주차

struct34

< 출력결과 >>>book input :>> 도서번호 (999: 종료 ) : 1>> 종 류 : 시 >> 도 서 명 : 성산포에서>> 저 자 : 이생진>> 요 약 : 섬마을이야기>>book input :>> 도서번호 (999: 종료 ) : 2>> 종 류 : 소설>> 도 서 명 : 압록강은 흐른다>> 저 자 : 이미륵>> 요 약 : 오랜 이국에서의 여정과 어머님에 대한 지극한 사랑과 회고>>book input :>> 도서번호 (999: 종료 ) : 999=============================도서번호 : 1종 류 : 시도 서 명 : 성산포에서저 자 : 이생진요 약 : 섬마을이야기=============================도서번호 : 2종 류 : 소설도 서 명 : 압록강은 흐른다저 자 : 이미륵요 약 : 오랜 이국에서의 여정과 어머님에 대한 지극한 사랑과 회고=============================

void input_rtn(btype *blist){ ctype *bp; bp = (ctype *)malloc(sizeof(ctype)); // 도서정보 공간확보 printf(">> 종 류 : "); gets(bp->kind); printf(">> 도 서 명 : "); gets(bp->bname); printf(">> 저 자 : "); gets(bp->author); printf(">> 요 약 : "); gets(bp->abstract); blist->book = bp; // 입력된 도서정보를 대입}

void output_rtn(btype *blist, int idx){ int i; printf("=============================\n"); for (i=0; i < idx; i++, blist++){ printf(" 도서번호 : "); puts(blist->num); printf(" 종 류 : "); puts(blist->book->kind); printf(" 도 서 명 : "); puts(blist->book->bname); printf(" 저 자 : "); puts(blist->book->author); printf(" 요 약 : "); puts(blist->book->abstract); printf("=============================\n"); }}

Page 35: 멘토링 7 주차

struct35

공용체(Union)

같은 메모리를 서로 다른 데이터형으로 사용하기 위한 데이터 구조 공용체로 선언된 변수들은 한번에 하나의 변수만 사용가능 공용체 정의

구조체와 같은 형태로 정의 공용체 크기는 내부 구성변수 중 가장 큰 것의 크기로 설정

union u_type {char c;int i;double d;

} data1;

공용체의 정의 형식

union [tag_name] { data_type member_name1; data_type member_name2; … data_type member_nameN;} [variable_name];

Page 36: 멘토링 7 주차

struct36

공용체 초기화 첫 멤버의 자료형의 초기 값으로만 저장이 가능 같은 유형의 변수 값으로 대입 가능

typedef union u_type unionType;

unionType data2 = {'A'}; // 첫 멤버인 char 유형으로만 초기화 가능// unionType data1 = {10}; // 에러 발생// unionType data2 = {10.3}; // 에러 발생

unionType data3 = data2; // 같은 유형의 변수의 값 대입 가능 data3.i = 100; // 구성요소를 접근하여 해당 변수형의 값 대입 가능 data3.d = 34.6; // 구성요소를 접근하면 해당 변수형의 값 대입 가능

Page 37: 멘토링 7 주차

struct37

공용체 사용

공용체 변수의 구성요소 접근에 멤버참조연산자 (.) 이용 공용체 포인터 변수의 구성요소 접근에 간접멤버연산자 (->) 이용

union1.c 공용체 변수사용 예

//union 선언union u_type{ char c; int i; double d;} typedef union u_type unionType; //union type definemain(){ union u_type u1 = {'A'}; //union 초기화 unionType u2 = u1; //union type 변수대입 printf("u1.c = %c, u1.i = %d, u1.d = %.3f\n ", u1.c, u1.i, u1.d); printf("u2.c = %c, u2.i = %d, u2.d = %.3f\n ", u2.c, u2.i, u2.d); u1.i = 100; //union 구성요소 접근 값 설정 printf("u1.c = %c, u1.i = %d, u1.d = %.3f\n ", u1.c, u1.i, u1.d); u1.d = 55.78; //union 구성요소 접근 값 설정 printf("u1.c = %c, u1.i = %d, u1.d = %.3f\n ", u1.c, u1.i, u1.d);}

// 출력결과u1.c = A, u1.i = 65, u1.d = 0.000 u2.c = A, u2.i = 65, u2.d = 0.000 u1.c = d, u1.i = 100, u1.d = 0.000 u1.c = ? u1.i = 171798692, u1.d = 55.780

Page 38: 멘토링 7 주차

struct 38

union2.c 공용체 포인터 변수 사용 예

typedef union{ //union 타입 선언 short i; float f;} uType;

main(){ uType u, *uptr; //union 변수 , 포인터 변수 선언

uptr = &u; //union 변수의 주소를 포인터 변수에 대입

u.i = 100; //union 변수의 구성요소 접근 , 값 설정 printf("u.i = %d, u.f = %.3f\n", u.i, u.f); uptr -> f = 5.3f; //union 포인터변수의 구성요소 접근 , 값 설정 printf("u.i = %d, u.f = %.3f\n", u.i, u.f);}

// 출력결과u.i = 100, u.f = -106955552.000u.i = -26214, u.f = 5.300

Page 39: 멘토링 7 주차

struct 39

열거 데이터 유형 (enumeration data type)

연관성 있는 정수형 상수목록 집합을 정의하는 구문 요소는 정수 상수 값으로 변경되어 처리 0 부터 시작하여 1 씩 증가된 값이 할당 요소에 초기값 부여시 다음 요소는 1 증가된 값으로 할당 모든 요소에 직접 값 설정 가능

선언 형식

enum tag_name { enumeration_list } variable_list;

//enum1.cenum week { sun, mon, tue, wed, thu, fri, sat } d1, d2; // 열거 형 변수 선언enum month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };enum month m1, m2;enum shape {circle, tri=3, rect=4, star=7, dia}; // 열거형 선언d1 = sun; // 열거 형 변수에 상수 값 대입d1 = 6; // 열거 형 변수에 정수 값 대입m1 = may;m2 = 12;

Page 40: 멘토링 7 주차

struct40

enum2.c 열거 형 사용 예

#include <stdio.h>

enum su { zero, one, two, three, four, five, six, seven, eight, nine, ten }; //

열거 형 선언

typedef enum su suType; // 열거 형을 새로운 타입으로 정의

void main(void) {

suType a, b, c;

a = two + six; // 열거 형의 요소를 사용하여 정수형 계산

printf(" Two + Six = %d\n",a);

b = one + three;

printf(" One + Three = %d\n",b);

c = six + seven;

printf(" Six + Seven = %d\n",c);

}

Two + Six = 8 One + Three = 4 Six + Seven = 13

Page 41: 멘토링 7 주차

struct41

enum3.c 열거형 활용 예

#include <stdio.h>typedef enum { red=1, blue, green, yellow, violet} colorType;void main(void) { colorType a; int n; while (1){

printf("** 색과 성격 테스트 **\n");

printf(" 좋아하는 색의 번호를 고르세요 \n");

printf("1. 빨강 , 2. 파랑 , 3. 녹색 , 4. 노랑 , 5. 보라 \n");

printf(" 선택 (1-5), 종료 (9) :"); scanf("%d", &n); if (n == 9) break; a = n; switch (a) {

case red : printf(" 빨강 : 끊임없이 도전하는 타입입니다 .\n"); break;

case blue : printf(" 파랑 : 정직하고 순진무구한 타입입니다 .\n "); break;

case green : printf(" 녹색 : 고독을 즐기는 성격입니다 \n"); break;

case yellow : printf(" 노랑 : 화창한 날씨처럼 늘 행복해 보이는 사람입니다 .\n"); break;

case violet : printf(" 보라 : 흔들림없는 신념의 소유자입니다 .\n"); break;

default : printf(" 선택한 번호에 해당하는 색이 없습니다 .\n"); } }

printf(" 수고하셨습니다 ...\n"); }

Page 42: 멘토링 7 주차

struct42

연습문제(1) 별자리를 열거형으로 구성하여 메뉴로 별자리를

선택하면 별자리의 날짜범위를 출력하는 프로그램 작성 물병자리 1 월 20 일 ~2 월 18 일 물고기자리 2 월 19 일 ~3 월 20 일 양자리 3 월 21 일 ~4 월 19 일 황소자리 4 월 20 일 ~5 월 20 일 쌍둥이자리 5 월 21 일 ~6 월 21 일 게자리 6 월 22 일 ~7 월 22 일 사자자 7 월 23 일 ~8 월 22 일 처녀자리 8 월 23 일 ~9 월 23 일 천칭자리 9 월 24 일 ~10 월 22 일 전갈자리 10 월 23 일 ~11 월 22 일 사수자리 11 월 23 일 ~12 월 24 일 염소자리 12 월 25 일 ~1 월 19 일