공부/C programming

11. 구조체

natom_ 2016. 5. 24. 14:43
반응형

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;
 

cs





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;
}

cs


<실행결과>




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