11장 구조체의 기본문법

JongseokLee·2021년 7월 31일
0

C 프로그래밍 기초

목록 보기
11/15
post-thumbnail

11장 구조체의 기본문법

1. 구조체 이해하기

1) 구조체의 개념

  • 여러 종류의 기본 자료형들을 묶어 놓은 것
  • 사용자 정의 자료형
  • 구조체에 묶여있는 각각의 자료형을 멤버(member) 또는 필드(field)라고 함
  • 구조체를 정의한 후 고조체 변수를 선언하여 사용함

2) 구조체 정의

  • struct 키워드 사용
  • 구조체 이름은 대문자를 사용하여 정의 (소문자도 가능)
  • 일반적으로 함수 외부에 선언

3) 구조체 변수 선언

  • 구조체 정의와 동시에 변수 선언 가능
  • 구조체 정의와 별도로 변수 선언 가능

4) 구조체 멤버의 사용

  • 점(.)을 이용하여 멤버 사용

5) 구조체 변수의 복사

  • 구조체 멤버 변수 모두 복사됨

6) 구조체 포인터

  • 구조체를 가리키는 포인터 변수

2. 구조체 활용하기

1) 함수에서 구조체 사용하기

  • 함수의 인수, 매개변수, 반환값으로 사용 가능
  • 값에 의한 호출과 참조에 의한 호출 사용 가능

2) 중첩 구조체 사용하기

  • 구조체 내부에 또 다른 구조체를 선언
  • 점(.)을 연속으로 사용하여 구조체를 사용함

3) 공용체(union)

  • 공용체 멤버 변수들은 동일한 메모리 공간을 공유(메모리 공간 절약)
  • union 키워드를 사용하여 공용체 정의
  • 공용체 변수 선언 후 사용
  • 공용체 멤버 변수는 점(.)으로 참조

4) 열거형(enumeration)

  • 기호 상수들을 모아놓은 자료형 : 상수값은 0부터 1씩 증가됨
  • enum 키워드를 사용하여 정의
  • 열거형 변수 선언 후 사용

5) typedef 문

  • 복잡한 자료형의 별명을 정의하는 키워드
  • 새로운 자료형의 이름 끝에는 "_t"를 붙임
  • 일반 자료형, 공용체, 구조체, 열거형과 같이 사용

3. 단원 실습

1) 구조체를 활용하여 가족의 신상을 입력받아 출력하시오


#include <stdio.h>
#define SIZE 4
void print_family();
char* trans_relation(int relation);
typedef enum RELATIONSHIP { FATHER, MOTHER, BROTHER, SISTER } RS_t;    // 가족관계 열거형
typedef struct MEMBER {
	RS_t relation;          // 가족관계
	char l_name[20];    // 이름
	int age;                 // 나이
	char phone[20];      // 전화번호
} MB_t;
typedef struct FAMILY {
	char f_name[20];       // 아빠 성
	char m_name[20];      // 엄마 성
	MB_t f_member[SIZE];  // 가족 구성원 배열 4명
} FM_t;
FM_t f_value;   // 전역변수 선언
int main()
{
	// 입력받기
	printf("가족(아빠)의 성을 입력하세요 = ");
	scanf_s("%s", f_value.f_name, sizeof(f_value.f_name));
	printf("가족(엄마)의 성을 입력하세요 = ");
	scanf_s("%s", f_value.m_name, sizeof(f_value.m_name));
	for (int i = 0; i < SIZE; i++) {
		printf("%d 번째 가족 신상을 입력합니다.\n", i + 1);
		printf("가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = ");
		scanf_s("%d", &f_value.f_member[i].relation);
		getchar();
		printf("이름을 입력하세요 = ");
		scanf_s("%s", f_value.f_member[i].l_name, sizeof(f_value.f_member[i].l_name));
		getchar();
		printf("나이를 입력하세요 = ");
		scanf_s("%d", &f_value.f_member[i].age);
		getchar();
		printf("전화 번호를 입력하세요 = ");
		scanf_s("%s", f_value.f_member[i].phone, sizeof(f_value.f_member[i].phone));
		getchar();
	}

	print_family();  // 가족 현황을 출력

}

void print_family() {
	printf("######################################\n");
	printf("관계\t성명\t나이\t전화번호\n");
	for (int i = 0; i < SIZE; i++) {
		char* a = trans_relation(f_value.f_member[i].relation);
		char* b = f_value.f_name;;
		if (f_value.f_member[i].relation == MOTHER)
			b = f_value.m_name;
		char* c = f_value.f_member[i].l_name;
		int d = f_value.f_member[i].age;
		char* e = f_value.f_member[i].phone;
		printf("%s\t%s %s\t%d\t%s\n", a, b, c, d, e);
	}
}

char* trans_relation(int relation) {
	char* result = NULL;
	switch (relation) {
	case FATHER:
		result = "Father";
		break;
	case MOTHER:
		result = "Mother";
		break;
	case BROTHER:
		result = "Brother";
		break;
	case SISTER:
		result = "Sister";
		break;
	default:
		result = "UNKNOWN";
		break;
	}
	return result;
}

<Result>


가족(아빠)의 성을 입력하세요 = 박
가족(엄마)의 성을 입력하세요 = 김
1 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 0
이름을 입력하세요 = 장군
나이를 입력하세요 = 50
전화 번호를 입력하세요 = 010-1111-2222
2 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 1
이름을 입력하세요 = 사랑
나이를 입력하세요 = 40
전화 번호를 입력하세요 = 010-2222-3333
3 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 2
이름을 입력하세요 = 왕자
나이를 입력하세요 = 20
전화 번호를 입력하세요 = 010-3333-4444
4 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 3
이름을 입력하세요 = 공주
나이를 입력하세요 = 15
전화 번호를 입력하세요 = 010-4444-5555
######################################
관계    성명    나이    전화번호
Father  박 장군 50      010-1111-2222
Mother  김 사랑 40      010-2222-3333
Brother 박 왕자 20      010-3333-4444
Sister  박 공주 15      010-4444-5555
profile
DataEngineer Lee.

0개의 댓글