Menu
Coddy logo textTech

하나로 합치기

Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 54번째.

challenge icon

챌린지

쉬움

이전 레슨에서 만든 모든 함수를 통합하여 연락처 관리 시스템을 완성하세요. 프로그램은 다음을 수행해야 합니다:

  1. 이전 레슨과 동일한 Contact 구조체 정의를 사용하며, 다음 멤버를 포함합니다:
    • 크기가 50인 문자 배열 name
    • 크기가 20인 문자 배열 phone
    • 크기가 40인 문자 배열 email
    • 정수형 age
  2. 이전 레슨과 동일한 createContact 함수를 사용하며, 다음을 수행합니다:
    • Contact 구조체를 위한 메모리를 동적으로 할당합니다
    • 모든 멤버를 기본값으로 초기화합니다
    • 연락처에 대한 포인터를 반환합니다
  3. 이전 레슨과 동일한 populateContact 함수를 사용하며, 다음을 수행합니다:
    • Contact 구조체에 대한 포인터를 매개변수로 받습니다
    • 사용자 입력을 요청하고 모든 연락처 필드를 채웁니다
    • 입력 데이터를 검증합니다
  4. displayContact 함수를 작성하며, 다음을 수행합니다:
    • Contact 구조체에 대한 상수 포인터를 매개변수로 받습니다
    • 각 필드를 다음 형식에 맞춰 한 줄씩 출력합니다:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. updateContact라는 이름의 함수를 작성하며, 다음을 수행합니다:
    • Contact 구조체에 대한 포인터를 매개변수로 받습니다
    • 아무것도 반환하지 않습니다 (void)
    • 다음을 출력하여 사용자에게 업데이트할 필드를 선택하도록 요청합니다:
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • 사용자의 선택을 읽고 해당 필드를 업데이트합니다:
      • 선택이 1인 경우: Enter new name: 을 출력하고 이름을 업데이트합니다
      • 선택이 2인 경우: Enter new phone: 을 출력하고 전화번호를 업데이트합니다
      • 선택이 3인 경우: Enter new email: 을 출력하고 이메일을 업데이트합니다
      • 선택이 4인 경우: Enter new age: 을 출력하고 나이를 업데이트합니다
      • 선택이 유효하지 않은 경우 (1-4가 아님): Invalid choice를 출력합니다
    • 업데이트에 성공하면 Contact updated successfully를 출력합니다
  6. main 함수에서 전체 연락처 관리 워크플로우를 구현합니다:
    • createContact 함수를 사용하여 연락처를 생성합니다
    • 연락처 생성이 성공했는지 확인합니다
    • populateContact 함수를 호출하여 초기 연락처 데이터를 채웁니다
    • --- Initial Contact ---를 출력합니다
    • displayContact 함수를 호출하여 초기 연락처 정보를 표시합니다
    • --- Updating Contact ---를 출력합니다
    • updateContact 함수를 호출하여 하나의 필드를 수정합니다
    • --- Updated Contact ---를 출력합니다
    • displayContact 함수를 다시 호출하여 업데이트된 연락처 정보를 표시합니다
    • 동적으로 할당된 메모리를 해제합니다
    • Contact management completed를 출력합니다

참고: 이 레슨의 displayContact 함수는 간단한 형식을 사용합니다. 추가 세부 정보나 단위 없이 필드당 한 줄씩 출력합니다 (예: 나이는 "25 years old"가 아니라 일반 숫자로 출력됨). 테스트 케이스가 이 형식에 의존하므로 출력이 위에 표시된 형식과 정확히 일치하는지 확인하세요.

이 마지막 챌린지는 구조체 정의, 동적 메모리 할당, 데이터 입력 및 검증, 형식화된 표시, 데이터 수정 등 연락처 관리 시스템의 모든 구성 요소를 하나로 묶습니다. 생성부터 정리까지 동적으로 할당된 구조체의 전체 수명 주기를 시연하는 동시에, 전체 과정에서 함수 구성과 포인터의 올바른 사용을 연습하게 됩니다.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Contact {
    char name[50];
    char phone[20];
    char email[40];
    int age;
};

struct Contact* createContact() {
    struct Contact* contact = (struct Contact*)malloc(sizeof(struct Contact));
    if (contact != NULL) {
        strcpy(contact->name, "");
        strcpy(contact->phone, "");
        strcpy(contact->email, "");
        contact->age = 0;
    }
    return contact;
}

void populateContact(struct Contact* contactPtr) {
    printf("Enter name: ");
    fgets(contactPtr->name, sizeof(contactPtr->name), stdin);
    contactPtr->name[strcspn(contactPtr->name, "\n")] = '\0';
    
    printf("Enter phone: ");
    fgets(contactPtr->phone, sizeof(contactPtr->phone), stdin);
    contactPtr->phone[strcspn(contactPtr->phone, "\n")] = '\0';
    
    printf("Enter email: ");
    fgets(contactPtr->email, sizeof(contactPtr->email), stdin);
    contactPtr->email[strcspn(contactPtr->email, "\n")] = '\0';
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
}

void displayContact(const struct Contact *contactPtr) {
    printf("=== CONTACT DETAILS ===\n");
    printf("Name: %s\n", contactPtr->name);
    printf("Phone: %s\n", contactPtr->phone);
    printf("Email: %s\n", contactPtr->email);
    printf("Age: %d years old\n", contactPtr->age);
    printf("========================\n");
    
    printf("Name length: %lu characters\n", strlen(contactPtr->name));
    
    if (contactPtr->age >= 0 && contactPtr->age <= 12) {
        printf("Generation: Child\n");
    } else if (contactPtr->age >= 13 && contactPtr->age <= 19) {
        printf("Generation: Teenager\n");
    } else if (contactPtr->age >= 20 && contactPtr->age <= 39) {
        printf("Generation: Young Adult\n");
    } else if (contactPtr->age >= 40 && contactPtr->age <= 59) {
        printf("Generation: Middle-aged Adult\n");
    } else if (contactPtr->age >= 60) {
        printf("Generation: Senior\n");
    }
    
    if (strchr(contactPtr->email, '@') != NULL) {
        printf("Email format: Valid\n");
    } else {
        printf("Email format: Invalid\n");
    }
}

int main() {
    struct Contact* contact = createContact();
    
    if (contact != NULL) {
        populateContact(contact);
        displayContact(contact);
        free(contact);
        printf("Program completed successfully\n");
    }
    
    return 0;
}

Logic & Flow의 모든 레슨