하나로 합치기
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 54번째.
챌린지
쉬움이전 레슨에서 만든 모든 함수를 통합하여 연락처 관리 시스템을 완성하세요. 프로그램은 다음을 수행해야 합니다:
- 이전 레슨과 동일한
Contact구조체 정의를 사용하며, 다음 멤버를 포함합니다:- 크기가 50인 문자 배열
name - 크기가 20인 문자 배열
phone - 크기가 40인 문자 배열
email - 정수형
age
- 크기가 50인 문자 배열
- 이전 레슨과 동일한
createContact함수를 사용하며, 다음을 수행합니다:Contact구조체를 위한 메모리를 동적으로 할당합니다- 모든 멤버를 기본값으로 초기화합니다
- 연락처에 대한 포인터를 반환합니다
- 이전 레슨과 동일한
populateContact함수를 사용하며, 다음을 수행합니다:Contact구조체에 대한 포인터를 매개변수로 받습니다- 사용자 입력을 요청하고 모든 연락처 필드를 채웁니다
- 입력 데이터를 검증합니다
displayContact함수를 작성하며, 다음을 수행합니다:Contact구조체에 대한 상수 포인터를 매개변수로 받습니다- 각 필드를 다음 형식에 맞춰 한 줄씩 출력합니다:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
updateContact라는 이름의 함수를 작성하며, 다음을 수행합니다:Contact구조체에 대한 포인터를 매개변수로 받습니다- 아무것도 반환하지 않습니다 (void)
- 다음을 출력하여 사용자에게 업데이트할 필드를 선택하도록 요청합니다:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- 사용자의 선택을 읽고 해당 필드를 업데이트합니다:
- 선택이 1인 경우:
Enter new name:을 출력하고 이름을 업데이트합니다 - 선택이 2인 경우:
Enter new phone:을 출력하고 전화번호를 업데이트합니다 - 선택이 3인 경우:
Enter new email:을 출력하고 이메일을 업데이트합니다 - 선택이 4인 경우:
Enter new age:을 출력하고 나이를 업데이트합니다 - 선택이 유효하지 않은 경우 (1-4가 아님):
Invalid choice를 출력합니다
- 선택이 1인 경우:
- 업데이트에 성공하면
Contact updated successfully를 출력합니다
- 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;
}