Menu
Coddy logo textTech

하나로 합치기

Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 54번째.

challenge icon

챌린지

쉬움

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

  1. 이전 학습에서 사용한 것과 동일한 Contact struct 정의를 사용하며, 다음 멤버를 포함해야 합니다.
    • 크기가 50인 문자 배열 name
    • 크기가 20인 문자 배열 phone
    • 크기가 40인 문자 배열 email
    • 정수 age
  2. 이전 학습에서 사용한 것과 동일한 createContact 함수를 사용하며, 이 함수는 다음을 수행해야 합니다.
    • Contact struct를 위한 메모리를 동적으로 할당합니다.
    • 모든 멤버를 default 값으로 초기화합니다.
    • 연락처를 가리키는 포인터를 반환합니다.
  3. 이전 학습에서 사용한 것과 동일한 populateContact 함수를 사용하며, 이 함수는 다음을 수행해야 합니다.
    • Contact struct를 가리키는 포인터를 매개변수로 받습니다.
    • 사용자 입력을 요청하고 모든 연락처 필드를 채웁니다.
    • 입력 데이터를 검증합니다.
  4. 다음 조건을 만족하는 displayContact 함수를 작성합니다.
    • Contact struct를 가리키는 상수 포인터를 매개변수로 받습니다.
    • 각 필드를 다음과 정확히 같은 형식으로 한 줄씩 출력합니다.
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. updateContact라는 이름의 함수를 작성합니다. 이 함수는 다음 조건을 만족해야 합니다.
    • Contact struct를 가리키는 포인터를 매개변수로 받습니다.
    • 아무것도 반환하지 않습니다(void).
    • 다음 내용을 출력하여 사용자가 업데이트할 필드를 선택하도록 요청합니다.
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • 사용자의 선택을 읽고 해당 필드를 업데이트합니다.
      • 선택이 1이면 Enter new name: 을 출력하고 name을 업데이트합니다.
      • 선택이 2이면 Enter new phone: 을 출력하고 phone을 업데이트합니다.
      • 선택이 3이면 Enter new email: 을 출력하고 email을 업데이트합니다.
      • 선택이 4이면 Enter new age: 를 출력하고 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"가 아니라 일반 숫자로 출력됩니다). 테스트 케이스가 이에 의존하므로 출력이 위에 표시된 형식과 정확히 일치하는지 확인하세요.

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

직접 해보기

#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;
}

논리 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러