Hepsini Bir Araya Getirme
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 54 / 63.
Görev
KolayÖnceki derslerde oluşturduğunuz tüm fonksiyonları entegre ederek kişi yönetim sisteminizi tamamlayın. Programınız şunları yapmalıdır:
- Önceki derslerdeki şu üyelere sahip aynı
Contactstruct tanımını kullanın:- 50 boyutunda bir karakter dizisi
name - 20 boyutunda bir karakter dizisi
phone - 40 boyutunda bir karakter dizisi
email - Bir tam sayı
age
- 50 boyutunda bir karakter dizisi
- Önceki derslerdeki şu işleri yapan aynı
createContactfonksiyonunu kullanın:- Bir
Contactstruct'ı için dinamik olarak bellek ayırır - Tüm üyeleri varsayılan değerlere başlatır
- Kişiye bir işaretçi (pointer) döndürür
- Bir
- Önceki derslerdeki şu işleri yapan aynı
populateContactfonksiyonunu kullanın:- Parametre olarak bir
Contactstruct işaretçisi alır - Kullanıcıdan girdi ister ve tüm kişi alanlarını doldurur
- Girdi verilerini doğrular
- Parametre olarak bir
- Şu işleri yapan bir
displayContactfonksiyonu yazın:- Parametre olarak bir
Contactstruct'ına sabit (constant) bir işaretçi alır - Her alanı tam olarak şu formatta kendi satırına yazdırır:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Parametre olarak bir
- Şu işleri yapan
updateContactadında bir fonksiyon yazın:- Parametre olarak bir
Contactstruct işaretçisi alır - Hiçbir şey döndürmez (void)
- Şunları yazdırarak kullanıcıdan hangi alanı güncelleyeceğini seçmesini ister:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Kullanıcının seçimini okur ve ilgili alanı günceller:
- Seçim 1 ise:
Enter new name:yazdırır ve ismi günceller - Seçim 2 ise:
Enter new phone:yazdırır ve telefonu günceller - Seçim 3 ise:
Enter new email:yazdırır ve e-postayı günceller - Seçim 4 ise:
Enter new age:yazdırır ve yaşı günceller - Seçim geçersizse (1-4 arası değilse):
Invalid choiceyazdırır
- Seçim 1 ise:
- Başarılı bir güncellemeden sonra
Contact updated successfullyyazdırır
- Parametre olarak bir
- Main fonksiyonunda, eksiksiz bir kişi yönetimi iş akışı uygulayın:
createContactfonksiyonunu kullanarak bir kişi oluşturun- Kişi oluşturmanın başarılı olup olmadığını kontrol edin
- Başlangıç kişi verilerini doldurmak için
populateContactfonksiyonunu çağırın --- Initial Contact ---yazdırın- Başlangıç kişi bilgilerini göstermek için
displayContactfonksiyonunu çağırın --- Updating Contact ---yazdırın- Bir alanı değiştirmek için
updateContactfonksiyonunu çağırın --- Updated Contact ---yazdırın- Güncellenmiş kişi bilgilerini göstermek için
displayContactfonksiyonunu tekrar çağırın - Dinamik olarak ayrılan belleği serbest bırakın
Contact management completedyazdırın
Not: Bu dersteki displayContact fonksiyonu basit bir format kullanır — ek ayrıntı veya birim olmadan her alan için bir satır (örneğin, yaş "25 years old" olarak değil, düz bir sayı olarak yazdırılır). Test vakaları buna bağlı olduğundan, çıktınızın yukarıda gösterilen formatla tam olarak eşleştiğinden emin olun.
Bu final görevi, kişi yönetim sisteminizin tüm bileşenlerini bir araya getirir: struct tanımı, dinamik bellek ayırma, veri girişi ve doğrulama, formatlı görüntüleme ve veri değiştirme. Tüm süreç boyunca fonksiyon organizasyonu ve işaretçilerin doğru kullanımını uygularken, dinamik olarak ayrılmış bir struct'ın oluşturulmasından temizlenmesine kadar tüm yaşam döngüsünü göstereceksiniz.
Kendin dene
#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;
}Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları6Bellek Yönetimi
Stack ve Heap BellekDinamik Bellek Ayırma - malloc()Bellek Ayırma için sizeof() KullanımıBellek Ayırma Hatasını Kontrol Etmefree() ile Belleği Serbest Bırakmacalloc() ile Bellek AyırmaÖzet: Dinamik Dizi9Proje: Basit Kişi Kaydı
Proje: Kişi Struct'ını TanımlamaKişi Oluşturma Fonksiyonu