사이먼's 코딩노트

[C언어] 구조체&동적 할당 문제풀이 본문

C언어

[C언어] 구조체&동적 할당 문제풀이

simonpark817 2024. 2. 28. 22:32
  • 이번에는 여지껏 배운 구조체와 동적할당에 관한 문제를 풀어봅시다.
  • 문제는 다음과 같습니다.
  • 사용자는 사람의 수, 해당 사람의 이름과 나이를 입력하고 입력받은 만큼 저장하여 각 사람의 이름과 나이를 출력한다.
  • 우리는 총 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