Menu
Coddy logo textTech

Kişi Görüntüleme Fonksiyonu

Coddy'nin C Journey'sinin Logic & Flow 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 formatlı bir şekilde görüntüleyen bir fonksiyon oluşturun. Bu ders, ihtiyacınız olacak üç yeni dize fonksiyonunu tanıtmaktadır: fgets(), strcspn() ve strchr() — her biri gereksinimlerden önce aşağıda açıklanmıştır.

Bu derste kullanılan yeni fonksiyonlar:

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

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

  1. Önceki derslerdeki şu üyelere sahip aynı Contact struct 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
  2. Önceki derslerdeki şu işleri yapan aynı createContact fonksiyonunu kullanın:
    • Bir Contact struct'ı için dinamik olarak bellek ayırır
    • Tüm üyeleri varsayılan değerlere başlatır
    • Kişiye bir işaretçi döndürür
  3. Şu işleri yapan bir populateContact fonksiyonu yazın:
    • Parametre olarak bir Contact struct işaretçisi alır
    • Her dize alanını (name, phone, email) okumak için fgets() kullanır, böylece boşluk içeren isimler kabul edilir
    • Okuduktan sonra her dize alanından sondaki yeni satırı kaldırmak için strcspn() kullanır
    • Tam sayı yaş alanını okumak için scanf("%d", ...) kullanır
    • Not: populateContact fonksiyonunun bu sürümü telefon numarası uzunluk doğrulaması içermez — test girdileri 555-1234 gibi kısa telefon numaraları kullandığından bunu eklemeyin
  4. displayContact adında bir fonksiyon yazın:
    • Parametre olarak bir Contact struct'ı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 formatta 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 ismin uzunluğunu hesaplar ve şunu yazdırır: Name length: [length] characters
      • Yaşa göre nesil kategorisini belirler ve şunu yazdırır:
        • Eğer yaş 0 ile 12 arasındaysa: Generation: Child
        • Eğer yaş 13 ile 19 arasındaysa: Generation: Teenager
        • Eğer yaş 20 ile 39 arasındaysa: Generation: Young Adult
        • Eğer yaş 40 ile 59 arasındaysa: Generation: Middle-aged Adult
        • Eğer yaş 60 veya üzerindeyse: Generation: Senior
      • strchr() kullanarak e-postanın '@' karakterini içerip içermediğini kontrol eder ve şunu yazdırır:
        • Eğer '@' bulunursa: Email format: Valid
        • Eğer '@' bulunamazsa: Email format: Invalid
  5. Ana fonksiyonda (main):
    • createContact fonksiyonunu kullanarak bir kişi oluşturun
    • Kişi oluşturmanın başarılı olup olmadığını kontrol edin
    • Kişi verilerini doldurmak için populateContact fonksiyonunu çağırın
    • Formatlı kişi bilgilerini göstermek için displayContact fonksiyonunu çağırın
    • Dinamik olarak ayrılan belleği serbest bırakın
    • Program completed successfully yazdırın

Bu zorluk, bir struct'a sabit bir işaretçi alan ve fonksiyonun orijinal verileri değiştirememesini sağlayan bir görüntüleme fonksiyonunun nasıl oluşturulacağını gösterir. Boşluk içeren dizeleri okumak için fgets(), sondaki yeni satırları temizlemek için strcspn(), bir işaretçi aracılığıyla struct üyelerine erişmek için ok operatörünü, karakter arama için strchr() ve veri kategorizasyonu için koşullu mantık kullanma pratiği yapacaksınız. Parametre bildiriminde const kullanımı, görüntüleme fonksiyonu 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;
}

Logic & Flow bölümündeki tüm dersler