Vorsprung durch Technik

블로그 이미지

MSNU

동적 메모리 할당:구조체(struct):공용체(Union):열거 데이터 유형(enumeration data type)

myPPT 2015. 4. 24. 15:10






















































멘토링 7주차 11.08.23 동적 메모리 할당 . 정적 할당 (Static Allocation) . 변수선언에 의하여 변수의 타입에 맞는 크기만큼 메모리를 할당 int a; //int 타입 크기 만큼의 공간읁 할당 (4바이트) char c; //char 타입 크기 만큼의 공간 할당 (1바이트) float f[10]; //float 타입 크기 만큼의 공간읁 10개 할당 (4바이트 * 10) . 동적 할당 (Dynamic Allocation) . 포인터 변수를 사용하여 실행 중에 기억장소를 할당 int *p; //포인터 변수 선언 p = (int *) malloc(4); //4바이트의 메모리 공간읁 할당하여 시작주소륷 반환하여 p에 대입 free(p); //p에 할당된 메모리 공간읁 해제 메모리 관리 함수 . 메모리 할당과 해제에 관련된 함수 () 함수 원형 기능 사용 예 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); 3 malloc() . 함수원형 void * malloc(size_t) . 지정한 바이트 수 만큼 힙 영역의 메모리 공간을 할당하여 주소를 반환하는 함 수 . 변수타입의 크기 , 배열의 크기에 따른 바이트 수를 계산하여 매개변수로 사용 . 할당된 공간은 초기화 되지 않는다 . 메모리 공간이 부족한 경우엔 NULL값 반환 . 사용 예 (1)하나의 값을 저장할 공간 확보 int *ip; ip = (int *) malloc(sizeof(int)); //저장핝 값의 자료 형 크기로 메모리핝 당 if (ip != NULL) *ip = 100; 100 int형의 크기 (4바이트) ip 4 (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] int형의 크기 (4바이트) * 5 ap 1 2 … 9 ap[0] ap[1] … ap[4] (3)문자엱 공간 확보 char *str; str = (char *) malloc(100); //길이 99인 문자엱 저장 공간 확보 gets(str); char 형의 크기 (1바이트) * 100 str … malloc.c malloc() 을 사용한 동적 메모리 할당 예 #include #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> 문자열 입력 : "); 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 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 -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 *회원 목록 * a123 b333 e999 >>검색핝 ID입력 (종료:q) a123 입력한 ID는 회원입니다 >>검색핝 ID입력 (종료:q) sdsd 입력한 ID는 회원이 아닙니다 >>검색핝 ID입력 (종료:q) q 8 구조체 구조체(Struct) . 여러 형태의 자료를 하나의 자료 형으로 통합하여 관리 하는 구조 . 예 : 성적처리를 위한 데이터 구조 /* (1) 일반 자료형 선언 형태 */ /* (2) 구조체 선언 형태 */ char name[30]; // 성명 struct grade{ // 구조체 이른 (Tag) int kor; // 국어 char name[30]; int eng; // 영어 int kor; int math; // 수학 int eng; 구조체 int sum; // 총점 int math; 구성요소 (member) float avg; // 평균 int sum; float avg; }; struct grade sc; //구조체 변수 선언 10 구조체 정의 . 구조체 멤버를 이용하여 새로운 구조체 자료형을 정 의하는 구문 . 구조체 멤버 . 구조체를 구성하는 데이타들 (구성요소, member) . 구조체 정의 구문에서는 각 구성요소의 초기값을 대입할 수 없음 . 한 구조체 내부에서 선언되는 구조체 멤버의 이름은 모두 유일 11 구조체 변수 선언 . 정의된 구조체 이름의 자료형으로 구조체 변수 선언 13 다양한 구조체 변수 선언 형태 //구조체정의struct grade{ char name[30]; int kor; int eng; int mat; float avg; }; //변수선언struct grade st1; //구조체정의에서변수선언struct { char name[30]; int kor; int eng; int mat; float avg; }st1; //구조체정의(구조체명포함)에서변수선언struct grade{ 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 14 사용자정의 데이터 형 (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 읁 복소수로 선언 15 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; 16 구조체 변수의 초기화 . 구조체 변수 선언 시 중괄호 ({})를 이용하여 구조체 구성요소의 자료형에 맞추어 초기값 지정 . 구성요소의 정의된 순서에 맞추어 초기값이 저장 . 구성요소의 개수보다 적을 경우 남은 부분은 0로초 기화struct grade{ char name[30]; . 예 int kor; int eng; float avg; }; main (){ struct grade st1={“kim min ho”, 100, 100}; ... } k i m m i n h o \0 . . . 100 100 0 name[30] kor eng avg 17 구조체 구성요소 (member) 참조 . 구조체를 구성하는 구성요소를 표현하기 위해 멤버연산자 (.) 를 이용 <형식> 구조체변수.구성요소 <예> 구조체변수.구성요소 = 값; 변수 = 구조체변수.구성요소 structDemo.c 구조체를 사용한 성적처리 예 #include 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); //구조체 구성요소의 값을 출력 } 18 연습문제(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 **프로그램읁 종료합니다 . 19 구조체 배열 . 같은 구조체를 가지는 여러 자료를 관리하기 위한 구조 . 형식 struct 구조체이름 배열명 [크기]; . 예 struct grade st1[10]; . 배열구조 name kor eng math sum avg st1[0] st1[1] ... st1[9] 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 20 구조체 배열 예제 structArray.c 구조체 배열을 사용한 성적처리 예 #include #define MAXST 10 struct 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); } } 21 구조체배열초기화//도서정보구조체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} }; //도서정보구조체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} }; 22 구조체 포인터 . 구조체 변수의 주소를 가지는 포인터 형 예)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; 23 구조체 포인터 예제 structPoint.c 구조체 포인터를 사용한 성적처리 예 #include #define MAXST 10 struct 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;iavg = stp->sum / 3.0; //구조체 포인터 참조연산자로 접근 printf("name =%s, sum=%d, average= %.2f\n", stp->name, stp->sum, stp->avg); stp++; //구조체 포인터 증가 } } 24 구조체와 함수 1. 구조체의 구성요소를 함수의 매개변수로 이용 /* 함수호출 */ st1.sum = sum_fun(st1.kor,st1.eng,st1.math); /* 함수정의 */ int sum_fun(int a, int b, int c){ return(a + b + c); } 2. 구조체를 매개변수로 이용 /* 함수호출 */ st1.sum = sum_fun(st1); /* 함수정의 */ int sum_fun(struct grade st){ return(st.kor + st.eng + st.math); } 25 3. 구조체 주소를 매개변수로 이용 /* 함수호출*/ sum_fun(&st1); /* 함수정의*/ sum_fun(struct grade *st){ st->sum = st->kor + st->eng + st->math; } 26 27 4. 구조체배열을함수에이용//structFunction.c, 구조체배열을매개변수로하는함수사용예(성적처리) #include #define MAXST 10 struct 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); // 데이터를출력하는함수호출} //structFunction.c, 구조체배열을매개변수로하는함수사용예(성적처리) #include #define MAXST 10 struct 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); // 데이터를출력하는함수호출} 28 //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); //출력} //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); //출력} 연습문제(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) 29 구조체 배열과 동적 할당 30 //structMalloc.c, 구조체배열의동적할당을사용한성적처리예#include #include 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); } 중첩 구조체 . 하나의 구조체 안에 또 다른 구조체를 포함하고 있는 구조 .도서관리예제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 31 32 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"); } 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"); } 중첩 구조체 동적할당 . 여러 개의 데이타를 관리할 때 입력 데이타가 있을 경우만 공간을 확보하여 메모리 공간 절약 . 도서관리를 위한 도서리스트에서 도서정보가 있을 경우만 동적 할당 blist num book 종류 도서명저자 요약 0 1 … Max 33 //도서관리프로그램(book.c) #include #include #include #define MAXSIZE 10 typedef 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; }//while output_rtn(blist, idx); //도서정보출력함수호출} //main //도서관리프로그램(book.c) #include #include #include #define MAXSIZE 10 typedef 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; }//while output_rtn(blist, idx); //도서정보출력함수호출} //main 34 <출력결과> >>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"); } } <출력결과> >>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"); } } 35 공용체(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]; 공용체 초기화 . 첫 멤버의 자료형의 초기 값으로만 저장이 가능 . 같은 유형의 변수 값으로 대입 가능 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; //구성요소륷 접근하면 해당 변수형의 값 대입 가능 37 공용체 사용 . 공용체 변수의 구성요소 접근에 멤버참조연산자 (.) 이용 . 공용체 포인터 변수의 구성요소 접근에 간접멤버연산자 (->) 이용 union1.c 공용체 변수사용 예 //union 선언 //출력결과 union u_type{ u1.c = A, u1.i = 65, u1.d = 0.000 char c; u2.c = A, u2.i = 65, u2.d = 0.000 int i; u1.c = d, u1.i = 100, u1.d = 0.000 double d; u1.c = ? u1.i = 171798692, u1.d = 55.780 } typedef union u_type unionType; //union type define main(){ 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); } 38 union2.c 공용체포인터변수사용 예 typedef union{ //union 타입 선언 //출력결과 short i; u.i = 100, u.f = float f; 106955552.000 } uType; u.i = -26214, u.f = 5.300 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); } 39 열거 데이터 유형 (enumeration data type) . 연관성 있는 정수형 상수목록 집합을 정의하는 구문 . 요소는 정수 상수 값으로 변경되어 처리 . 0부터 시작하여 1씩 증가된 값이 할당 . 요소에 초기값 부여시 다음 요소는 1증가된 값으로 할당 . 모든 요소에 직접 값 설정 가능 선언 형식 enum tag_name { enumeration_list } variable_list; //enum1.c enum 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; 40 enum2.c 열거형 사용 예 #include 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; Two+ Six = 8 One + Three = 4 printf(" Six + Seven = %d\n",c); Six + Seven = 13 } 41 enum3.c 열거형활용 예 #include 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"); } 42





'myPPT' 카테고리의 다른 글

기본권 총론  (0) 2015.04.30
표현의 자유와 제한  (1) 2015.04.26
금융 상품 배타적 사용권 제도  (0) 2015.04.22
C 언어 - 포인터  (0) 2015.04.18
Complex dielectric constant of non-polar solids - Dipolar relaxation  (0) 2015.04.16
Posted by MSNU






favicon

Vorsprung durch Technik

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 분류 전체보기 (993)
    • myPPT (813)
    • 시리즈 (164)
      • 연소 (14)
      • 경제 (5)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바