Menu
CoddyTech

Kişi Görüntüleme Fonksiyonu

Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 53 / 63.

challenge icon

Görev

Kolay

Önceki derslerdeki kişi yönetim sisteminizi temel alarak, kişi bilgilerini biçimlendirilmiş bir şekilde görüntüleyen bir işlev oluşturun. Bu derste ihtiyaç duyacağınız üç yeni dize işlevi tanıtılıyor: fgets(), strcspn() ve strchr(): gereksinimlerden önce her biri aşağıda açıklanmıştır.

Bu derste kullanılan yeni işlevler:

  • fgets(buffer, size, stdin): boşluklar da dahil olmak üzere bir girdi satırını okur (boşluk karakterinde duran scanf'den farklı olarak). Girdiyi buffer içine kaydeder ve en fazla size - 1 karakter okur. Ayrıca sonuna yeni satır karakteri '\n' ekler.
  • strcspn(str, "\n"): str içinde ilk '\n' karakterinin indeksini döndürür. fgets tarafından bırakılan sondaki yeni satır karakterini kaldırmak için kullanılır: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): str içinde ch karakterini arar ve bulunduğu konuma işaretçi döndürür; bulunamazsa NULL döndürür.

Programınız şunları yapmalıdır:

  1. Önceki derslerdekiyle aynı Contact yapı tanımını kullanın. Üyeleri:
    • Boyutu 50 olan name adlı bir karakter dizisi
    • Boyutu 20 olan phone adlı bir karakter dizisi
    • Boyutu 40 olan email adlı bir karakter dizisi
    • Bir tamsayı olan age
  2. Önceki derslerdekiyle aynı createContact işlevini kullanın. Bu işlev:
    • Bir Contact yapısı için dinamik olarak bellek ayırır
    • Tüm üyeleri varsayılan değerlerle başlatır
    • Kişiye işaretçi döndürür
  3. Şunları yapan bir populateContact işlevi yazın:
    • Parametre olarak bir Contact yapısına işaretçi alır
    • Ad, telefon ve e-posta alanlarındaki dizeleri okumak için fgets() kullanır; böylece boşluk içeren adlar kabul edilir
    • Her dize alanını okuduktan sonra sondaki yeni satır karakterini kaldırmak için strcspn() kullanır
    • Tamsayı yaş alanını okumak için scanf("%d", ...) kullanır
    • Her alanı okumadan önce, yeni satır eklemeden, ilgili istemi tam olarak yazdırır: Enter name: , Enter phone: , Enter email: , Enter age: (böylece === CONTACT DETAILS ===, Enter age: ifadesinin ardından aynı satırda görünür)
    • Not: populateContact işlevinin bu sürümünde telefon numarası uzunluğu doğrulaması yoktur: bunu eklemeyin, çünkü test girdilerinde 555-1234 gibi kısa telefon numaraları kullanılır
  4. Şunları yapan, displayContact adlı bir işlev yazın:
    • Parametre olarak bir Contact yapısına sabit işaretçi alır: const struct Contact *contactPtr
    • Değer döndürmez (void)
    • Kişi bilgilerini tam olarak şu biçimde yazdırır:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Temel bilgileri görüntüledikten sonra ek ayrıntıları hesaplar ve görüntüler:
      • strlen() kullanarak adın uzunluğunu hesaplar ve şunu yazdırır: Name length: [length] characters
      • Yaşa göre kuşak kategorisini belirler ve şunu yazdırır:
        • Yaş 0 ile 12 arasındaysa: Generation: Child
        • Yaş 13 ile 19 arasındaysa: Generation: Teenager
        • Yaş 20 ile 39 arasındaysa: Generation: Young Adult
        • Yaş 40 ile 59 arasındaysa: Generation: Middle-aged Adult
        • Yaş 60 veya üzerindeyse: Generation: Senior
      • strchr() kullanarak e-postanın '@' karakterini içerip içermediğini kontrol eder ve şunu yazdırır:
        • '@' bulunursa: Email format: Valid
        • '@' bulunmazsa: Email format: Invalid
  5. main işlevinde:
    • createContact işlevini kullanarak bir kişi oluşturun
    • Kişi oluşturma işleminin başarılı olup olmadığını kontrol edin
    • Kişi verilerini doldurmak için populateContact işlevini çağırın
    • Biçimlendirilmiş kişi bilgilerini göstermek için displayContact işlevini çağırın
    • Dinamik olarak ayrılan belleği serbest bırakın
    • Program completed successfully yazdırın

Bu alıştırma, yapıya sabit işaretçi alan bir görüntüleme işlevinin nasıl oluşturulacağını gösterir; böylece işlevin özgün verileri değiştirmesi engellenir. Boşluk içeren dizeleri okumak için fgets(), sondaki yeni satır karakterlerini kaldırmak için strcspn(), işaretçi aracılığıyla yapı üyelerine erişmek için ok operatörü, karakter aramak için strchr() ve verileri kategorilere ayırmak için koşullu mantık kullanma pratiği yapacaksınız. Parametre bildiriminde const kullanmak, görüntüleme işlevi içindeki kişi verilerinin yanlışlıkla değiştirilmesini önleyen iyi bir uygulamadır.

Kendin dene

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[50];
    char phone[20];
    char email[40];
    int age;
} Contact;

Contact* createContact() {
    Contact* contact = (Contact*)malloc(sizeof(Contact));
    if (contact == NULL) {
        return NULL;
    }
    
    strcpy(contact->name, "");
    strcpy(contact->phone, "");
    strcpy(contact->email, "");
    contact->age = 0;
    
    return contact;
}

void populateContact(Contact* contactPtr) {
    printf("Enter name: ");
    scanf("%s", contactPtr->name);
    
    printf("Enter phone: ");
    scanf("%s", contactPtr->phone);
    
    printf("Enter email: ");
    scanf("%s", contactPtr->email);
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
    
    if (contactPtr->age < 0 || contactPtr->age > 120) {
        printf("Invalid age entered\n");
    } else if (strlen(contactPtr->phone) < 10) {
        printf("Invalid phone number\n");
    } else {
        printf("Contact populated successfully\n");
    }
}

int main() {
    Contact* contact = createContact();
    
    if (contact == NULL) {
        return 1;
    }
    
    populateContact(contact);
    
    printf("Contact Information:\n");
    printf("Name: %s\n", contact->name);
    printf("Phone: %s\n", contact->phone);
    printf("Email: %s\n", contact->email);
    printf("Age: %d\n", contact->age);
    
    free(contact);
    printf("Contact deleted successfully\n");
    
    return 0;
}

Mantık & Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi