Menu
Coddy logo textTech

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önetimi sisteminizi temel alarak kişi bilgilerini biçimlendirilmiş bir şekilde görüntüleyen bir işlev oluşturun. Bu derste ihtiyacınız olacak üç yeni dize işlevi tanıtılmaktadır: 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 (scanf'den farklı olarak boşluk karakterinde durmaz). Girdiyi buffer içine kaydeder ve en fazla size - 1 karakter okur. Ayrıca sona satır sonu karakteri olan '\n' karakterini kaydeder.
  • strcspn(str, "\n"): '\n' içindeki ilk str oluşumunun indeksini döndürür. fgets tarafından bırakılan sondaki satır sonunu kaldırmak için kullanılır: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): ch karakterini str içinde arar ve bulunduğu konuma bir işaretçi döndürür; bulunamazsa NULL döndürür.

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

  1. Önceki derslerdeki aynı Contact yapı tanımını, aşağıdaki üyelerle birlikte kullanın:
    • 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 age tamsayısı
  2. Önceki derslerdeki 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 bir işaretçi döndürür
  3. Aşağıdaki özelliklere sahip bir populateContact işlevi yazın:
    • Parametre olarak bir Contact yapısına işaretçi alır
    • Her dize alanını (name, phone, email), boşluk içeren adların kabul edilmesi için fgets() kullanarak okur
    • Her dize alanından okuma yaptıktan sonra sondaki satır sonunu kaldırmak için strcspn() kullanır
    • Tamsayı age alanını okumak için scanf("%d", ...) kullanır
    • Not: populateContact işlevinin bu sürümünde telefon numarası uzunluğu doğrulaması bulunmaz: test girdileri 555-1234 gibi kısa telefon numaraları kullandığından bunu eklemeyin
  4. displayContact adlı bir işlev yazın; bu işlev:
    • Parametre olarak bir Contact yapısına sabit bir işaretçi alır: const struct Contact *contactPtr
    • Hiçbir şey 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 nesil kategorisini belirler ve şunları 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
      • '@' kullanarak e-postanın strchr() karakterini içerip içermediğini kontrol eder ve şunları 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 uygulama, bir yapıya sabit işaretçi alan ve böylece işlevin özgün verileri değiştirememesini sağlayan bir görüntüleme işlevinin nasıl oluşturulacağını gösterir. Boşluk içeren dizeleri okumak için fgets(), sondaki satır sonlarını kaldırmak için strcspn(), bir işaretçi aracılığıyla yapı üyelerine erişmek için ok operatörünü, karakter aramak için strchr() işlevini ve verileri kategorilere ayırmak için koşullu mantığı kullanmayı uygulayacaksınız. Parametre bildiriminde const kullanılması, görüntüleme işlevi içinde 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