사이먼's 코딩노트
[C언어] 구조체&동적 할당 문제풀이 본문
- 이번에는 여지껏 배운 구조체와 동적할당에 관한 문제를 풀어봅시다.
- 문제는 다음과 같습니다.
- 사용자는 사람의 수, 해당 사람의 이름과 나이를 입력하고 입력받은 만큼 저장하여 각 사람의 이름과 나이를 출력한다.
- 우리는 총 3가지의 버전으로 해당 프로그램을 구현해봅시다.
- 프로그램 실행 시 출력문의 예시는 아래와 같습니다.
사람의 숫자를 입력해주세요. : 3[엔터]
1번째 사람의 이름을 입력해주세요 : aa[엔터]
1번째 사람의 나이를 입력해주세요 : 33[엔터]
2번째 사람의 이름을 입력해주세요 : bb[엔터]
2번째 사람의 나이를 입력해주세요 : 50[엔터]
3번째 사람의 이름을 입력해주세요 : cc[엔터]
3번째 사람의 나이를 입력해주세요 : 42[엔터]
1번째 사람의 이름, 나이 : aa, 33세
2번째 사람의 이름, 나이 : bb, 50세
3번째 사람의 이름, 나이 : cc, 42세
[case #1]
#include <stdio.h>
#define MAX_PEOPLE_COUNT 100
#define NAME_LEN 10
#define true 1
#pragma warning (disable: 4996)
int main(void) {
int people_ages[MAX_PEOPLE_COUNT];
char people_names[MAX_PEOPLE_COUNT][NAME_LEN];
int people_count;
while(true) {
printf("사람의 숫자를 입력해주세요 : ");
scanf("%d", &people_count);
if(people_count > MAX_PEOPLE_COUNT) {
printf("%d 이하의 숫자를 입력해주세요.\n", MAX_PEOPLE_COUNT);
continue;
}
else {
break;
}
}
for(int i = 0; i < people_count; i++) {
printf("%d번째 사람의 이름을 입력해주세요 : ", i+1);
scanf("%s", people_names[i]);
printf("%d번째 사람의 나이을 입력해주세요 : ", i+1);
scanf("%d", &people_ages[i]);
}
for(int i = 0; i < people_count; i++) {
printf("%d번째 사람의 이름, 나이 : %s, %d세\n", i+1, people_names[i], people_ages[i]);
}
return 0;
}
- 첫번째 버전은 구조체와 동적 할당을 사용하지 않고 구현하는 방법이다.
- #define을 통해 MAX_PEOPLE_COUNT 즉, 최대 사람의 수는 100으로 지정하고 NAME_LEN 즉, 이름의 최대 길이는 10으로 지정한다.
- people_ages[MAX_PEOPLE_COUNT] 는 사람의 나이를 저장하는 100개의 공간이 있는 배열이고, people_names[MAX_PEOPLE_COUNT][NAME_LEN] 은 사람의 이름을 저장하는 2차원 배열이다. 사람의 이름은 여러 문자의 조합이기 때문에 2차원 배열로 선언하였다.
- 사용자가 직접 사람의 수를 입력해야되기 때문에 해당 변수 people_count를 선언한다.
- 무한 루프를 통해 사람의 수를 입력하고 만약 해당 숫자가 최대 사람 수인 MAX_PEOPLE_COUNT를 초과한다면 사람의 수를 재입력하도록 한다.
- 사람의 수를 제대로 입력했다면 반복문을 통해 첫번째 사람부터 입력받은 사람의 수만큼 이름, 나이 주소로 이동하여 해당 값을 저장한다.
- people_names는 2차원 배열로써 그 자체로 주소값이기 때문에 scanf로 입력할 때 &를 붙이지 않고 people_ages는 선언 시 포인터 변수가 아니기 때문에 해당 주소로 이동해서 값을 저장해야되기 때문에 scanf로 입력할 때 &를 붙여야한다.
- 입력받은 값을 출력하는 출력문에서는 people_names[i]와 people_ages[i]를 통해 각 사람의 정보를 출력한다.
[case #2]
#include <stdio.h>
#define true 1
#define MAX_PEOPLE 100
#pragma warning (disable: 4996)
typedef struct _Person {
char name[20];
int age;
} Person;
int main(void) {
Person people[MAX_PEOPLE];
int people_count;
while(true) {
printf("사람의 숫자를 입력해주세요 : ");
scanf("%d", &people_count);
if(people_count > MAX_PEOPLE) {
printf("%d 이하로 입력해주세요.\n", MAX_PEOPLE);
continue;
}
else {
break;
}
}
for(int i = 0; i < people_count; i++) {
printf("%d번째 사람의 이름을 입력해주세요 : ", i+1);
scanf("%s", people[i].name);
printf("%d번째 사람의 나이를 입력해주세요 : ", i+1);
scanf("%d", &people[i].age);
}
for(int i = 0; i < people_count; i++) {
printf("%d번째 사람의 이름, 나이 : %s, %d세\n", i+1, people[i].name, people[i].age);
}
return 0;
}
- 두번째 버전은 첫번째 버전에서 구조체를 추가하여 구현하는 방법이다.
- #define을 통해 MAX_PEOPLE 즉, 최대 사람의 수를 100으로 지정한다.
- 각 사람은 이름과 나이를 가지고있기 때문에 struct 구조체를 이용하여 각 사람의 정보를 담아준다.
- struct 앞에 typedef를 작성한 이유는 구조체 자체에 사용자 지정 타입을 정의하기 위해서고 main 함수에서는 struct Person이 아닌 Person이라고만 작성해도 구조체 선언이 가능하다.
- 구조체 안에 들어간 name은 최대 20자의 이름을 가지고 있다고 가정하여 char name[20]으로 선언하였다.
- main 함수에서는 사람의 나이와 이름을 한 번에 가지고 있는 구조체 Person 타입을 통해 people이라는 변수가 최대 100명이 들어갈 수 있도록 Person people[MAX_PEOPLE] 과 같이 선언한다.
- 사용자가 직접 사람의 수를 입력하는 구문은 첫번째 버전과 동일하다.
- 사람의 수를 제대로 입력했다면 반복문을 통해 첫번째 사람부터 입력받은 사람의 수만큼 이름, 나이 주소로 이동하여 해당 값을 저장한다.
- 이 때 구조체를 사용했기 때문에 people_name[i]이 아닌 people[i].name, people.age[i]이 아닌 people[i].age과 같이 작성하여 값을 저장한다.
[case #3]
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable: 4996)
typedef struct _Person {
char name[100];
int age;
} Person;
int main(void) {
int size;
Person* people;
printf("사람의 숫자를 입력해주세요 : ");
scanf("%d", &size);
people = malloc((int)sizeof(Person) * size);
for(int i = 0; i < size; i++) {
printf("%d번째 사람의 이름을 입력해주세요 : ", i+1);
scanf("%s", people[i].name);
printf("%d번째 사람의 나이를 입력해주세요 : ", i+1);
// 주소가 아니라 &를 붙여야한다.
scanf("%d", &people[i].age);
}
for(int i = 0; i < size; i++) {
printf("%d번째 사람의 이름, 나이 : %s, %d세\n", i+1, people[i].name, people[i].age);
}
free(people);
return 0;
}
- 세번째 버전은 두번째 버전에서 동적 할당을 추가하여 구현하는 방법이다.
- 사용자가 입력한 사람의 수만큼 동적 할당을 할 예정이기 때문에 이번에는 따로 #define을 통해 최대 사람의 수를 정의하지 않는다.
- 두번째 버전과 마찬가지로 Person이라는 구조체를 선언하고 name은 최대 100자의 이름을 가지고 있다고 가정하여 char name[100]으로 선언하였다.
- main 함수에서는 size라는 총 사람의 수를 나타내는 변수를 선언하고 구조체 Person 타입을 통해 동적 할당을 받을 people이라는 변수를 Person* people과 같이 선언한다.
- scanf를 통해 size 값을 입력했다면 malloc를 통해 동적 할당을 해준다. [people = malloc((int)sizeof(Person)) * size]
- 각 사람의 나이와 이름을 입력하고 저장하는 부분은 두번째 버전과 동일하고 해당 절차가 모두 완료되면 free()를 통해 동적 할당을 종료시킨다.
반응형
'C언어' 카테고리의 다른 글
[C언어] linked List (2) | 2024.02.28 |
---|---|
[C언어] 정적 및 동적 할당 (0) | 2024.02.21 |
[C언어] 구조체(Struct) (0) | 2024.02.20 |
[C언어] 포인터&배열 문제풀이(2) (0) | 2024.02.19 |
[C언어] 포인터&배열 문제풀이(1) (0) | 2024.02.19 |