1. 구조체 개념
개념)
구조체는 프로그래머가 직접 정의하는 사용자 정의 자료형으로 다양한 자료형의 여러값을 하나의 단위로 묶어서 편리하게 관리하고 사용하게 해준다.
int형 변수는 int형 값 한개만 저장하며, int형 배열은 자료형이 모두 int형으로 같은값만 저장할 수 있다. 이에 반해 구조체 자료형은 int형, double형, char형 등 자료형이 다른 값들도 저장할 수 있다.
형식)
struct 구조체 태그명
{
자료형 멤버명1;
자료형 멤버명2;
....
자료형 멤버명n;
};
↘구조체 멤버는 변수 뿐만 아니라 배열 또는 이미 정의된 다른 구조체도 될 수 있다.
2. 구조체 정의 방법(p528, 그림11-8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
//구조체 정의
struct student_info
↘(예약어) ↘구조체 태그명(사용자가 지정)
{
char s_no[10];
char name[10];
int grade;
double GPA;
};
//구조체 변수 선언
struct student_info student;
//구조체 멤버 참조
student.grade = 4;
|
3. 구조체 선언 예제(p528, 프로그램11-1) 소스코드, 실행결과, 주석
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
#include <stdio.h>
#include <stdlib.h>
//1. 구조체 정의 - MAIN()함수 위
struct game
{
char name[7]; //선수 이름
int R1,R2,R3; //각 라운드 점수
};
int main(int argc, char *argv[]) {
//2. 구조체 변수 선언
struct game player;
double avg;
//구조체 멤버 참조(멤버연산자'.' 이용)
printf("선수 이름 >> ");
scanf("%s",player.name);
printf("1,2,3라운드 점수 : ");
scanf("%d %d %d",&player.R1, &player.R2, &player.R3);
//평균 점수 구하기
avg = (double)(player.R1+player.R2+player.R3)/3;
//결과 출력
printf("\n%s 선수의 게임 성적의 평균은 %.1lf입니다. ",player.name,avg);
return 0;
} |
cs |
<실행결과>
4. 구조체 초기화, 대입예제
(p534, 프로그램11-2 소스코드, 실행결과, 주석)
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 |
#include <stdio.h>
#include <stdlib.h>
//구조체 선언
struct person
{
char name[7];
char gender[3];
int age;
};
int main(int argc, char *argv[]) {
//구조체 변수 선언
struct person u1 = {"나태희", "여", 20},
u2 = {"유현빈", "남", 20},
u3 = {"나원빈", "남", 25};
struct person oldest;
if(u1.age>u2.age)
{
if(u1.age>u3.age)
oldest = u1;
else
oldest = u3;
}
else
{
if(u2.age>u3.age)
oldest = u2;
else
oldest = u3;
}
printf(" 이름 성별 나이\n");
printf("=====================\n");
printf(" %s\t%s\t%2d\n",u1.name,u1.gender,u1.age);
printf(" %s\t%s\t%2d\n",u2.name,u2.gender,u2.age);
printf(" %s\t%s\t%2d\n",u3.name,u3.gender,u3.age);
printf("=====================\n\n");
printf(" 최고령 사용자 >> \n\n");
printf(" %s\t%s\t%2d\n",oldest.name,oldest.gender,oldest.age);
return 0;
} |
cs |
<실행결과>
5. 구조체 배열 예제
(p538, 프로그램11-3 소스코드, 실행결과, 주석)
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 |
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //strcmp함수를 위한 헤더파일
#define N 10
//구조체 정의
struct person
{
char name[7];
char gender[3];
int age;
};
int main(int argc, char *argv[]) {
//N개의 구조체형 원소를 갖는 배열의 선언과 초기화
struct person user[N] = {{"나태희","여",20},{"유현빈","남",29},
{"나원빈","남",25},{"문건영","여",22},{"소지법","남",25},
{"나보배","여",29},{"장도건","남",32},{"고수영","여",29},
{"이나라","여",31},{"김해수","여",35}};
int male=0,female=0,sum=0,i; //남자수,여자수
//남녀 수와 전체 나이의 합 구하기
for(i=0;i<N;i++)
{
//user[i]의 gender멤버에 저장된 성별에 따라 남자수 또는 여자수를 1증가하기
if(strcmp(user[i].gender,"남")==0)
male++;
else
female++;
sum+=user[i].age; //사용자의 나이를 sum에 누적
}
//결과 출력하기
printf(" 이름 성별 나이\n");
printf("======================\n");
for(i=0;i<N;i++)
printf(" %s\t%s\t%d\n",user[i].name,user[i].gender,user[i].age);
printf("======================\n");
printf(">> 남자 : %d명\n",male);
printf(">> 여자 : %d명\n",female);
printf(">> 평균 연령 : %d살\n",sum/N);
return 0;
}
|
cs |
<실행결과>
6. 구조체포인터 개념 (사용 형식, 의미설명, 표기법)
구조체 포인터) 연결리스트, 트리와 같은 자료구조 구현에 유용
구조체 포인터 변수 선언) struct 구조체태그명 * 구조체포인터변수명;
포인터가 구조체를 가리키기) 구조체포인터변수명 = &구조체변수명;
→ '=' 좌우의 변수는 같은 구조체형
예) struct person shopper;
struct person *ptr;
ptr = &shopper;
7. 구조체포인터 사용 프로그램 예제 11-4(소스코드, 실행결과, 주석)
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <stdio.h> #include <stdlib.h> #define N 5 //1.구조체 정의(main()위) struct person { char name[7], gender[3]; int age; }; int main(int argc, char *argv[]) { int i; //2.구조체 변수 선언 struct person user[N] = {{"나태희", "여"},{"유현빈", "남"},{"나원빈", "남"}, {"문건영", "여"},{"소지법", "여"}}; struct person *ptr; //1. 구조체포인터변수 선언 //2.주소를 초기값으로 지정 ptr = user; for(i=0;i<N;i++) { printf("(%s)의 나이 : ",(*ptr).name); scanf("%d",&(*ptr).age); ptr++; } printf("\n 이름 성별 나이 \n"); printf("===============================\n"); ptr = user; for(i=0;i<N;i++) { printf("%s\t %s \t %d\n",ptr->name,ptr->gender,ptr->age); ptr++; } return 0; } |
<실행결과>
8. 함수간에 구조체 전달 방법 설명
구조체도 다른 자료형 처럼 함수의 인수 자료형으로 사용할 수 있으며 함수의 반환값 형으로도 사용할 수 있다.
함수에서 구조체를 인수로 전달하는 방법은 기본 자료형의 인수전달 방식과 같이 값에 의한 호출과 주소에 의한 호출 두가지가 있다.
① 값에 의한 호출
- 함수 호출
함수명(구조체 인수명)
- 함수정의
반환 값 자료형 함수명(struct 구조체 태그명 매개 변수명)
{
//함수 본체
}
↘인수와 매개변수 모두 같은 구조체형이어야한다.
↘반환 값이 구조체라면 함수 정의 헤더 맨 앞의 반환 값의 형을 'struct 구조체 태그명'으로 명시한다.
② 주소에 의한 호출
- 함수 호출
함수명(&구조체 인수명)
- 함수 정의
반환 값의 형 함수명(struct 구조체 태그명 *매개 변수명)
{
//함수 본체에서는 '매개변수명->멤버명'으로 인수 구조체의 멤버를 참조한다.
}
↘주소를 저장할 수 있는 것음 포인터 변수이므로 매개변수는 포인터로 선언해야한다.
↘인수가 구조체이므로 매개변수는 인수와 동일한 구조체형 포인터로 선언해야한다.
9. 구조체를 함수로 전달하는 예제 프로그램 11-5(소스코드, 실행결과, 주석)
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <stdio.h> #include <stdlib.h> #define N 5 //1.구조체 정의(main()위) struct person { char name[7], gender[3]; int age; }; //함수의 원형 선언 void input_by_address(struct person *ptr); //주소에 의한 호출 void output_by_value(struct person shopper); //값에 의한 호출 int main(int argc, char *argv[]) { struct person buyer; input_by_address(&buyer); //주소에 의한 호출 printf("\n >> 구매자 정보 : "); output_by_value(buyer); //값에 의한 호출 return 0; } //ptr이 가리키는 곳의 구조체에 자료를 입력하는 함수 void input_by_address(struct person *ptr) { printf("이름 : "); scanf("%s", ptr->name); printf("성별(남 또는 여) : "); scanf("%s", ptr->gender); printf("나이 : "); scanf("%d", &ptr->age); } //전달된 구조체의 멤버를 출력하는 함수 void output_by_value(struct person shopper) { printf("%s(%s) %d세\n",shopper.name, shopper.gender, shopper.age); } | cs |
<실행결과>
10. 함수간에 구조체 배열 전달방법, 전달형식 설명
구조체 배열을 함수에 전달하는 것은 무조건 주소에 의한 호출 방식으로 처리된다. 그러나 함수를 정의 할 때는 배열 선언 또는 포인터 선언 형식으로 작성할 수 있다.
형식) 구조체 배열 전달 : 배열 선언 방식
- 함수 호출
함수명(구조체 배열명)
- 함수 정의
반환 값의 형 함수명(struct 구조체 태그명 배열명[원소수])
{
//함수 본체
}
11. 구조체배열전달 예제: 사용자 정보입출력 프로그램 11-8(소스코드, 실행결과, 주석)
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <stdio.h> #include <stdlib.h> #define SIZE 100 //배열의 크기 지정 //1.구조체 정의(main()위) struct person { char name[7], gender[3]; int age; }; //함수의 원형 선언 void input(struct person ptr[]); //주소에 의한 호출 void print(struct person *ptr); //값에 의한 호출 int count; //정보가 입력된 전체 사용자 수로서 전역 변수 선언, 자동으로 0으로 초기화 됨 int main(int argc, char *argv[]) { struct person user[SIZE]; //원소가 SIZE개인 구조체 배열 user선언 printf(" 최대 %d명의 사용자 정보를 입력받고 출력합니다.\n",SIZE); input(user); //사용자 정보를 배열에 입력하기 print(user); //배열에 저장된 사용자 정보를 출력하기 return 0; } //전달된 배열에 사용자 정보를 입력하는 함수 void input(struct person ptr[]) { int reply; do { //user[i]의 각 멤버에 사용자 정보 입력하기 printf("%2d. 이름은? >> ",count+1); scanf("%s",ptr[count].name); printf(" 성별은(남 또는 여)? >> "); scanf("%s",ptr[count].gender); printf(" 나이는? >> "); scanf("%d",&ptr[count].age); count++; //배열에 입력한 사용자 수를 1증가하기 //지금까지 입력한 사용자 수가 배열 원소수와 같다면 입력을 그만두기 if(count == SIZE) { printf("더 이상 사용자 정보를 입력할 공간이 없습니다."); break; } //사용자 정보의 입력 여부를 묻기 printf("계속 입력하려면 1, 그만 입력하려면 0을 입력하세요. >> "); scanf("%d",&reply); }while(reply !=0); //그만하기를 원하지 않는다면 다시 반복하기 } //배열을 포인터 변수로 전달받아 배열 내용을 출력하는 함수 void print(struct person *ptr) { int i; printf("\n 이름 성별 나이 \n"); printf("==========================\n"); for(i=0;i<count;i++) { printf(" %s\t%s\t%d\n",(ptr+i)->name,(ptr+i)->gender,(ptr+i)->age); } printf("==========================\n"); } | cs |
<실행결과>
'공부 > C programming' 카테고리의 다른 글
final (0) | 2016.06.07 |
---|---|
ㅇ (0) | 2016.06.02 |
10. 포인터 (0) | 2016.05.17 |
9. 변수의 참조 영역과 지속기간 (0) | 2016.05.13 |
dd (0) | 2016.05.12 |