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