全てをまとめる
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 54/63。
チャレンジ
簡単これまでのレッスンで作成したすべての関数を統合して、連絡先管理システムを完成させましょう。プログラムは以下の要件を満たす必要があります:
- これまでのレッスンと同じ
Contact構造体の定義を使用します。メンバーは以下の通りです:- サイズ50の文字配列
name - サイズ20の文字配列
phone - サイズ40の文字配列
email - 整数型の
age
- サイズ50の文字配列
- これまでのレッスンと同じ
createContact関数を使用します:Contact構造体のメモリを動的に割り当てます- すべてのメンバーをデフォルト値で初期化します
- 連絡先へのポインタを返します
- これまでのレッスンと同じ
populateContact関数を使用します:Contact構造体へのポインタを引数として受け取ります- ユーザーに入力を促し、すべての連絡先フィールドに値を入力します
- 入力データを検証します
- 以下の仕様で
displayContact関数を記述します:Contact構造体への定数ポインタ(const pointer)を引数として受け取ります- 各フィールドを以下の正確な形式で、それぞれの行に表示します:
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関数を呼び出して、1つのフィールドを修正します--- 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;
}