나의 IT일지
구조체 배열 본문
구조체는 배열과 같이 변수의 집합이지만, 변수는 같은 자료형을 가진 변수의 집합인 저장공간으로, 하나의 속성에 여러 데이터를 저장하고 관리할 때 사용한다. 하지만 구조체는 다른 자료형인 변수여도 하나의 집합으로 만든 자료형으로, 여러 속성을 가진 대상의 데이터를 저장, 관리할 때 사용한다.
#include<stdio.h>
#include<string.h>
void find(char*);
//선생님의 신상정보(이름 주소 전번 강의과목 생일)를 구조체로 저장
struct teacher {
char name[11];
char address[30];
char tel[11];
char lesson[20];
long birth;
};
void main() {
char name[100];
int a;
printf("이름 입력:");
scanf("%s", name);
find(name);
}
void find(char* find_name) {
struct teacher teacher1 = { "이창호","서울특별시","aaaa-bbbb","C언어",850217 };
struct teacher teacher2 = { "김성주","부산광역시","abcd-efgh","linux",900418 };
struct teacher teacher3 = { "고성진","인천광역시","cccc-dddd","Cisco",891130 };
int i;
for (i = 0; i < 3; i++) {
if (!strcmp(teacher1.name, find_name)) {
printf("%s의 주소:%s\n", teacher1.name, teacher1.address);
printf("%s의 전화번호:%s\n", teacher1.name, teacher1.tel);
printf("%s의 강의과목:%s\n", teacher1.name, teacher1.lesson);
printf("%s의 생일:%d\n", teacher1.name, teacher1.birth);
return;
}
else if (!strcmp(teacher2.name, find_name)) {
printf("%s의 주소:%s\n", teacher2.name, teacher2.address);
printf("%s의 전화번호:%s\n", teacher2.name, teacher2.tel);
printf("%s의 강의과목:%s\n", teacher2.name, teacher2.lesson);
printf("%s의 생일:%d\n", teacher2.name, teacher2.birth);
return;
}
else if (!strcmp(teacher3.name, find_name)) {
printf("%s의 주소:%s\n", teacher3.name, teacher3.address);
printf("%s의 전화번호:%s\n", teacher3.name, teacher3.tel);
printf("%s의 강의과목:%s\n", teacher3.name, teacher3.lesson);
printf("%s의 생일:%d\n", teacher3.name, teacher3.birth);
return;
}
}
printf("입력한 이름이 목록에 없다.");
}
위의 코드는 같은 속성의 종류를 가진 구조체를 여러개 사용한 코드이다. 이렇게 같은 속성을 가진 구조체들을 묶어서 사용하지 않으면, 코드가 길어지게 된다. 그래서 우리는 구조체를 묶어서 사용하는 구조체 배열을 알아야 한다.
구조체 배열
구조체 배열이란 구조체 변수를 요소로 가지고 있는 배열로, 같은 형태를 가진 구조체를 모아 데이터를 쉽게 처리하기 위해서 사용된다.
sturct 구조체명 배열명[배열크기]
위의 구조는 구조체의 배열을 만드는 구조로, 구조체선언을 통해 필드의 구성을 저장한 구조체를 배열 크기만큼 생성한다.
이때, 구조체선언을 통해 저장공간(필드의 저장공간의 합)을 정의하고, 배열의 형태를 정하는 자료형을 구조체형이라고 하며, "sturct 구조체명"이 구조체형의 구조이다.
#include<stdio.h>
struct member {
char name[10];
char tel[20];
};
void main() {
struct member members[3];
for (int i = 0; i < 3; i++) {
printf("%d번째 맴버의 이름:", i + 1);
scanf("%s", members[i].name);
printf("%d번째 맴버의 전화번호:", i + 1);
scanf("%s", members[i].tel);
}
printf("----------------------------------------------------------\n");
for (int i = 0; i < 3; i++) {
printf("%d번째 맴버 이름: %s\n", i + 1, members[i].name);
printf("%d번째 맴버 수업: %s\n", i + 1, members[i].tel);
}
}
위의 코드는 구조체의 배열을 통해 맴버의 이름과 전화번호를 저장하는 코드이다. 이때, 데이터를 저장할 때 반복문을 통해 저장하고 것을 확인 할 수 있다. 이는 배열은 반복문을 사용할 수 있는 구조를 가지고 있기 때문이다. 배열은 요소번호만 변경하면 서로 다른 저장공간이기에 반복문을 사용할 수 있는 것이다.
#include<stdio.h>
#include<string.h>
void find(char*);
//선생님의 신상정보(이름 주소 전번 강의과목 생일)를 구조체로 저장
struct teacher {
char name[11]; //11byte
char address[30]; //30
char tel[11]; //11
char lesson[20]; //20
long birth; //4
};
void main() {
char name[100];
int a;
printf("이름 입력:");
scanf("%s", name);
find(name);
}
void find(char* find_name) {
struct teacher teachers[3]={
{"이창호", "서울특별시", "aaaa-bbbb", "C언어", 850217 },
{ "김성주", "부산광역시", "abcd-efgh", "linux", 900418 },
{ "고성진", "인천광역시", "cccc-dddd", "Cisco", 891130 }
};
int i;
for (i = 0; i < 3; i++) {
if (!strcmp(teachers[i].name, find_name)) {
printf("%s의 주소:%s\n", teachers[i].name, teachers[i].address);
printf("%s의 전화번호:%s\n", teachers[i].name, teachers[i].tel);
printf("%s의 강의과목:%s\n", teachers[i].name, teachers[i].lesson);
printf("%s의 생일:%d\n", teachers[i].name, teachers[i].birth);
return;
}
}
printf("입력한 이름이 목록에 없다.");
}
위의 코드는 맨 처음의 예시를 반복문으로 고쳐서 재작성한 코드로, 구조체가 추가될 경우, 맨 처음의 예시는 조건문을 만들어야 하지만 위의 코드는 반복문의 숫자만 수정하면 되기에, 구조체가 많으면 많을 수록 배열의 사용이 더 유용하다는 것을 알 수 있다.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
구조체 내 구조체 (1) | 2023.03.04 |
---|---|
구조체 포인터 (1) | 2023.03.03 |
구조체 기본 (0) | 2023.03.01 |
동적 메모리 할당 2 (0) | 2023.02.28 |
동적 메모리 할당 1 (0) | 2023.02.25 |