Menggabungkan Semuanya
Termasuk bagian Logika dan Alur dalam perjalanan C di Coddy. Pelajaran 54 dari 63.
Tantangan
MudahLengkapi sistem pengelolaan kontakmu dengan mengintegrasikan semua fungsi yang telah kamu buat dalam pelajaran sebelumnya. Programmu harus:
- Menggunakan definisi struct
Contactyang sama dari pelajaran sebelumnya dengan anggota:- Array karakter
nameberukuran 50 - Array karakter
phoneberukuran 20 - Array karakter
emailberukuran 40 - Bilangan bulat
age
- Array karakter
- Menggunakan fungsi
createContactyang sama dari pelajaran sebelumnya, yang:- Mengalokasikan memori secara dinamis untuk struct
Contact - Menginisialisasi semua anggota dengan nilai bawaan
- Mengembalikan pointer ke kontak
- Mengalokasikan memori secara dinamis untuk struct
- Menggunakan fungsi
populateContactyang sama dari pelajaran sebelumnya, yang:- Menerima pointer ke struct
Contactsebagai parameternya - Meminta input dari pengguna dan mengisi semua field kontak
- Memvalidasi data input
- Menerima pointer ke struct
- Menulis fungsi
displayContactyang:- Menerima pointer konstan ke struct
Contactsebagai parameternya - Mencetak setiap field pada baris tersendiri dengan format persis seperti ini:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Menerima pointer konstan ke struct
- Menulis fungsi bernama
updateContactyang:- Menerima pointer ke struct
Contactsebagai parameternya - Tidak mengembalikan apa pun (void)
- Meminta pengguna memilih field yang akan diperbarui dengan mencetak:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Membaca pilihan pengguna dan memperbarui field yang sesuai:
- Jika pilihan adalah 1: mencetak
Enter new name:dan memperbarui nama - Jika pilihan adalah 2: mencetak
Enter new phone:dan memperbarui nomor telepon - Jika pilihan adalah 3: mencetak
Enter new email:dan memperbarui email - Jika pilihan adalah 4: mencetak
Enter new age:dan memperbarui usia - Jika pilihan tidak valid, yaitu bukan 1-4: mencetak
Invalid choice
- Jika pilihan adalah 1: mencetak
- Setelah pembaruan berhasil, mencetak
Contact updated successfully
- Menerima pointer ke struct
- Di fungsi main, menerapkan alur kerja pengelolaan kontak yang lengkap:
- Membuat kontak menggunakan fungsi
createContact - Memeriksa apakah pembuatan kontak berhasil
- Memanggil fungsi
populateContactuntuk mengisi data kontak awal - Mencetak
--- Initial Contact --- - Memanggil fungsi
displayContactuntuk menampilkan informasi kontak awal - Mencetak
--- Updating Contact --- - Memanggil fungsi
updateContactuntuk mengubah satu field - Mencetak
--- Updated Contact --- - Memanggil fungsi
displayContactsekali lagi untuk menampilkan informasi kontak yang telah diperbarui - Membebaskan memori yang dialokasikan secara dinamis
- Mencetak
Contact management completed
- Membuat kontak menggunakan fungsi
Catatan: Fungsi displayContact dalam pelajaran ini menggunakan format sederhana: satu baris untuk setiap field tanpa detail atau satuan tambahan (misalnya, usia dicetak sebagai angka biasa, bukan "25 years old"). Pastikan outputmu sama persis dengan format yang ditampilkan di atas, karena kasus uji bergantung padanya.
Tantangan terakhir ini menggabungkan semua komponen sistem pengelolaan kontakmu: definisi struct, alokasi memori dinamis, input dan validasi data, tampilan terformat, serta modifikasi data. Kamu akan menunjukkan seluruh siklus hidup struct yang dialokasikan secara dinamis, mulai dari pembuatan hingga pembersihan, sambil berlatih mengatur fungsi dan menggunakan pointer dengan benar selama proses berlangsung.
Coba sendiri
#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;
}Semua pelajaran di Logika dan Alur
1Dasar-Dasar Pointer
Apa Itu Pointer?Mendeklarasikan PointerOperator Address-Of (&)Operator Dereference (*)Pointer NULLRekap: Dasar-Dasar Pointer4Proyek: Utilitas Teks Sederhana
Gambaran Umum ProyekMenghitung Karakter2Pointer dan array
Nama array sebagai pointerElemen array dan pointerAritmetika pointerMembandingkan pointerRangkuman: Menelusuri array dengan pointer5Pointer dan Fungsi
Penerusan dengan NilaiMeneruskan Pointer ke FungsiMengubah Variabel melalui PointerContoh Klasik: SwapMeneruskan Array ke FungsiRingkasan: Argumen Pointer Fungsi8Struct dan Pointer
Pointer ke StructOperator Panah (->)Mengirim Struct berdasarkan NilaiMengirim Pointer StructAlokasi Dinamis StructUlasan: Memodifikasi Struct dengan Pointer11Tantangan Rangkuman Akhir
Rangkuman: Penggabungan string DinamisRangkuman: array berisi structRangkuman: Penghitung Frekuensi Kata3Array char dan String
String sebagai array charPenanda akhir nullInput String dengan scanfMenggunakan strlen()Menggunakan strcpy()Menggunakan strcat()Menggunakan strcmp()Ulasan: Fungsi String Dasar6Manajemen Memori
Memori Stack vs. HeapAlokasi Dinamis dengan malloc()Menggunakan sizeof() untuk AlokasiMemeriksa Kegagalan AlokasiMembebaskan Memori dengan free()Alokasi dengan calloc()Ringkasan: array Dinamis9Proyek: Entri Kontak Sederhana
Proyek: Definisikan struct KontakFungsi untuk Membuat KontakLatihan sendiri: Compiler C online