멘토링
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