본문 바로가기

프로그램언어/C언어

c언어 구조체와 공용체

1. 구조체
구조체란 서로 다른 데이터 타입의 집합을 의미하며 사용자가 직접 새로운 데이터 타입을 만드는 데이터 타입을 말한다. 이 때 사용하는 명령어는 'struct'이다.

구조체의 정의

struct 구조체명 { 
     멤버 변수 선언1 
     멤버 변수 선언2 
     ... 
}; 


2. 구조체 멤버 참조 방법
일반 변수 : .(온점)
포인터 변수 : ->(화살표)

 

 

소스코드 소스코드(입력 및 출력)

#include <stdio.h>
struct score {
     char name[10];
     int kor;
     int com;
     int mat;
};

void main() {
    struct score x= {"홍길동", 70, 80, 90};

    printf("x.name : %s\n", x.name);
    printf("x.kor  : %d\n", x.kor);
    printf("x.com  : %d\n", x.com);
    printf("x.mat  : %d\n", x.mat);
}

 

실행결과]

x.name : 홍길동
x.kor   : 70
x.com  : 80
x.mat   : 90

#include <stdio.h>
struct score {
    char name[10];
    int kor;
    int com;
    int mat;
};

void main() {
    struct score x;

    scanf("%s %d %d %d", x.name, &x.kor, &x.com, &x.mat);

    printf("x.name : %s\n", x.name);
    printf("x.kor  : %d\n", x.kor);
    printf("x.com  : %d\n", x.com);
    printf("x.mat  : %d\n", x.mat);
}

입력 데이터]

홍길동 70 80 90

 

실행결과]

x.name : 홍길동 
x.kor   : 70 
x.com  : 80 
x.mat   : 90

소스코드

소스코드(입력 및 출력)

#include <stdio.h>
struct score {
     char name[10];
     int kor;
     int com;
     int mat;
};

void main() {
    struct score x[2]= {{"홍길동", 70, 80, 90},
                              {"일지매", 80, 70, 80}};

    for(int i=0; i<2; i++) {
        printf("x[%d].name : %s\n", i, x[i].name);
        printf("x[%d].kor  : %d\n", i, x[i].kor);
        printf("x[%d].com  : %d\n", i, x[i].com);
        printf("x[%d].mat  : %d\n\n", i, x[i].mat);
    }
}

 

실행 결과]

x[0].name : 홍길동
x[0].kor   : 70
x[0].com  : 80
x[0].mat   : 90

x[1].name : 일지매
x[1].kor   : 80
x[1].com  : 70
x[1].mat   : 80

#include <stdio.h>
struct score { 
     char name[10]; 
     int kor; 
     int com; 
     int mat; 
}; 

void main() { 
    struct score x[2];

    for (int i = 0; i < 2; i++) {
        scanf("%s", x[i].name);
        scanf("%d %d %d", x[i].kor, x[i].com, x[i].mat);
    } 


    for(int i=0; i<2; i++) { 
        printf("x[%d].name : %s\n", i, x[i].name); 
        printf("x[%d].kor  : %d\n", i, x[i].kor); 
        printf("x[%d].com  : %d\n", i, x[i].com); 
        printf("x[%d].mat  : %d\n\n", i, x[i].mat); 
    } 
}

 

입력 데이터]

홍길동 70 80 90

일지매 80 70 80

 

실행 결과] 왼쪽과 동일

소스코드

소스코드(입력 및 출력)

#include <stdio.h>
struct score { 
     char name[10]; 
     int kor; 
     int com; 
     int mat; 
}; 

void main() { 
    struct score x[2]= {{"홍길동", 70, 80, 90}, 
                              {"일지매", 80, 70, 80}}; 

    struct score *p;
    p=x;

    for(int i=0; i<2; i++) {
        printf("p->name : %s\n", p->name);
        printf("p->kor  : %d\n", p->kor);
        printf("p->com  : %d\n", p->com);
        printf("p->mat  : %d\n\n", p->mat);
        p++;
    }
}

 

실행 결과]

p->name : 홍길동
p->kor   : 70
p->com  : 80
p->mat   : 90

p->name : 일지매
p->kor   : 80
p->com  : 70
p->mat   : 80

#include <stdio.h>
struct score { 
     char name[10]; 
     int kor; 
     int com; 
     int mat; 
}; 

void main() { 
    struct score x[2]= {{"홍길동", 70, 80, 90}, 
                              {"일지매", 80, 70, 80}}; 

    struct score *p; 
    p=x; 

 

    for (int i = 0; i < 2; i++) {
        scanf("%s", p->name);
        scanf("%d %d %d", &p->kor, &p->com, &p->mat);
        p++;
    }
    p -= 2;

    for(int i=0; i<2; i++) { 
        printf("p->name : %s\n", p->name); 
        printf("p->kor  : %d\n", p->kor); 
        printf("p->com  : %d\n", p->com); 
        printf("p->mat  : %d\n\n", p->mat); 
        p++; 
    } 
}

 

입력 데이터]

홍길동 70 80 90

일지매 80 70 70

 

실행 결과] 왼쪽과 동일

 

3. 자기 참조 구조체

구조체의 멤버로 자신과 동일한 데이터 타입의 구조체를 사용 할 수는 없지만, 구조체 포인터는 멤버로 사용할 수 있습니다. 이를 자기 참조 구조체라고하며, 연결 리스트를 구현할 때 많이 사용합니다.

 

연결 리스트 예제

#include <stdio.h>

struct linknum {
    char name[10];
    int su;
    linknum *next;
};

void main() {
    linknum x = { "홍길동", 1, NULL };
    linknum y = { "일지매", 2, NULL };
    linknum z = { "임꺽정", 3, NULL };
    linknum k = { "온달", 4, NULL };

    linknum *ptr;

    x.next = &y;
    y.next = &z;
    z.next = NULL;

    ptr = &x;

    y.next = &k;
    k.next = &z;

    while (ptr != NULL)
    {
        printf("%s, %d\n", ptr->name, ptr->su);
        ptr = ptr->next;
    }
}

 

실행 결과]

홍길동, 1
일지매, 2
온달, 4
임꺽정, 3

 

 

4. 공용체

공용체는 동일한 메모리 공간을 서로 다른 자료형이 공유해서 사용합니다. 구조체는 각 멤버들이 연속된 기억 공간에 별도로 사용되지만, 공용체는 각 멤버들이 동일한 기억 공간을 공유한다는 점이 다름니다. 그리고 선언시 ' union'이라는 명령어를 사용하여 공용체를 선언하고 사용방법은 구조체와 같습니다.

 

소스코드(공용체) 소스코드(구조체)

#include <stdio.h>
union data {
    int a;
    char b;
    short c;

};

int main() {
    union data x;

    printf("x.a의 주소 : %p\n", &x.a);
    printf("x.b의 주소 : %p\n", &x.b);
    printf("x.c 의 주소 : %p\n", &x.c);

    return 0;
}

 

실행 결과]

x.a의 주소 : 002CFE7C
x.b의 주소 : 002CFE7C
x.c 의 주소 : 002CFE7C

#include <stdio.h>

struct data { 
    int a; 
    char b; 
    short c; 

}; 

int main() { 
    struct data x; 

    printf("x.a의 주소 : %p\n", &x.a); 
    printf("x.b의 주소 : %p\n", &x.b); 
    printf("x.c 의 주소 : %p\n", &x.c);

    return 0;
}

 

실행 결과]

x.a의 주소 : 003DF9A0
x.b의 주소 : 003DF9A4
x.c 의 주소 : 003DF9A8

 

소스코드 실행 결과
#include <stdio.h>
union data { 
    int a; 
    char b; 
    short c; 
}; 

int main() { 
    union data x; 

    x.a = 100; 
    printf("x.a의 주소 : %d\n", x.a); 
    x.b = 'a'; 
    printf("x.b의 주소 : %c\n", x.b); 
    x.c = 5; 
    printf("x.c 의 주소 : %d\n", x.c); 

    return 0; 
} 
x.a의 주소 : 100 
x.b의 주소 : a 
x.c 의 주소 : 5



문제 풀어보기]

 

1. 이름, 나이, 키를 멤버변수로 하는 구조체를 정의하여 아래와 같이 출력하시오.

출력 예]
홍길동은 나이가 18세이고 키는 165입니다.

 


2. 이름, 나이, 키를 멤버변수로 하는 구조체를 정의하여 아래와 같이 출력하시오.
입력 예]
홍길동 16 150

 

출력 예]
홍길동은 나이가 16세이고 키는 150입니다.

 


3. 이름, 나이, 키를 멤버변수로 하는 구조체를 정의하여 배열변수로 선언하여 아래와 같이 출력하시오.
입력 예]
홍길동 16 150
일지매 15 148

출력 예]
홍길동은 나이가 16세이고 키는 150입니다.

일지매은 나이가 15세이고 키는 148입니다.

 


4. 세 명의 이름과 국어, 영어, 수학 점수를 입력받아 과목별 점수의 합계와 평균을 구하여 출력하는 프로그램을 작성해 보시오. (배열 변수로 선언)
입력 예]
홍길동 100 90 100
임꺽정 90 70 60
일지매 90 80 90

출력 예]
 이름  국어 영어 수학 합계 평균
홍길동 100  90  100  290  96.7
임꺽정  90  70   60  220  73.3
일지매  90  80   90  260  86.7

 


5. 세 명의 이름과 국어, 영어, 수학 점수를 입력받아 과목별 점수의 합계와 평균을 구하여 출력하는 프로그램을 작성해 보시오. (포인트 변수로 선언)
입력 예]
홍길동 100 90 100
임꺽정 90 70 60
일지매 90 80 90

출력 예]
 이름  국어 영어 수학 합계 평균
홍길동 100  90  100  290  96.7
임꺽정  90  70   60  220  73.3
일지매  90  80   90  260  86.7

 


6. 5명의 이름과 키를 입력받아 키가 가장 큰은 사람의 이름과 키를 출력하는 프로그램을 작성하시오.
입력 예]
박지성 175
이승엽 180
추신수 185
최홍만 193
박주영 188

출력 예]
최홍만 193

 


7. 5명의 이름과 키를 입력받아 사람의 이름과 키를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.
입력 예]
박지성 175
이승엽 180
추신수 185
최홍만 193
박주영 188

출력 예]
박지성 175
박주영 188
이승엽 180
추신수 185
최홍만 193

 


8. 구조체 2개를 정의하고 하나는 일반 구조체, 다른 하나는 구조체 변수의 포인터를 멤버로 포한 구조체로 만든 프로그램을 작성하여 출력 하시오.
#include <stdio.h>
struct my {
    int kor;
    int math;
};
struct data {
    char name[20];
    int grade;
    struct my* point;
};

int main() {
    struct my p={100, 90};
    struct data student={"홍길동", 3};
    student.point = &p;
    printf("이름 : %s\n", student.name);
    printf("학년 : %d\n", student.grade);
    printf("국어점수 : %d점\n", (*student.point).kor);     //student.point->kor
    printf("수학점수 : %d점\n", (*student.point).math);   //student.point->math

 

    return 0;
}

출력 예]
이름 : 홍길동
학년 : 3
국어점수 : 100점
수학점수 : 90점

 


9. 이름, 전화번호, 구조체 포인터를 멤버로 가진 구조체와 몸무게, 키를 멤버로 가진 구조체를 정의하고 구조체 포인터를 통해 멤버에 접근하는 프로그램 작성하시오. (-> 연산자를 이용)
struct info { int h; int w; };
struct data { char name[10]; char tel[20]; struct info* point; };

 

출력 예]
이름 : 홍길동
전화번호 : 123-4567
키 : 160cm
몸무게 : 57kg

 

 

10. 시험 결과 각 학생의 답인아 다음과 같았다. 

이름 1번 2 3 4 5 6 7 8 9 10
학생1 1 2 3 4 1 2 3 4 4 3
학생2 1 2 3 3 1 2 3 4 1 2
학생3 3 2 3 4 2 2 3 3 1 2
학생4 1 1 2 4 1 2 3 4 3 2
학생5 1 2 3 2 1 2 3 4 1 2
정답 1 2 3 4 1 2 3 4 1 2


위 자료에 대해 0X 채점표를 출력하는 프로그램을 작성하라.

-----------------------------------------------------------------------------------------------------------

   이름        1        2        3        4         5        6        7       8        9        10        점수

-----------------------------------------------------------------------------------------------------------

  학생1        0        0        0        0        0        0        0        0        X        X        80

  학생2        0        0        0        X        0        0        0        0        0        0        90
  학생3        X        0        0        0        X        0        0        X        0        0        70
  학생4        0        X        X        0        0        0        0        0        X        X        60

  학생5        0        0        0        X        0        0        0        0        0        0        90

-----------------------------------------------------------------------------------------------------------

struct Sungjuk { char irum[10], dab[10]; //학생답안 int jdsu;  //정답수 };

'프로그램언어 > C언어' 카테고리의 다른 글

c언어 파일 입출력  (0) 2019.10.08
c언어 표준 함수  (0) 2019.10.08
c언어 사용자 정의 함수  (0) 2019.10.04
c언어 포인터  (0) 2019.10.02
c언어 배열  (0) 2019.10.02