Menu
Coddy logo textTech

Yapıları Değer ile Aktarma

Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 46 / 63.

Artık struct'lar ve struct pointer'ları ile nasıl çalışacağınızı bildiğinize göre, tüm struct'ları fonksiyonlara nasıl aktaracağınızı öğrenmenin zamanı geldi. Bir struct'ı bir fonksiyona parametre olarak geçirdiğinizde, C pass-by-value yöntemini kullanır; bu da fonksiyonun struct'ın tam bir kopyasını aldığı anlamına gelir.

Bir struct parametresi kabul eden bir fonksiyonun sözdizimi şöyledir:

void functionName(struct StructureName parameterName) {
    // Fonksiyon gövdesi
}

Tanıdık Point struct'ımızı bir örnek olarak kullanırsak:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Anlaşılması gereken temel kavram, fonksiyonun içindeki struct üzerinde yaptığınız herhangi bir değişikliğin çağıran fonksiyondaki orijinal struct'ı etkilemeyeceğidir. Bunun nedeni, fonksiyonun verinin kendi kopyasıyla çalışmasıdır.

Bu yaklaşım, orijinalinde yanlışlıkla değişiklik yapma riski olmadan struct verilerini okumak veya görüntülemek istediğinizde kullanışlıdır. Ancak, büyük struct'ları kopyalamanın bellek ve performans açısından verimsiz olabileceğini unutmayın.

challenge icon

Görev

Kolay

Struct'ların fonksiyonlara değer ile (pass-by-value) aktarılmasını gösteren bir C programı oluşturun. Programınız şunları yapmalıdır:

  1. Aşağıdaki üyelere sahip Rectangle adında bir struct tanımlayın:
    • Dikdörtgenin genişliğini saklamak için bir tam sayı width
    • Dikdörtgenin yüksekliğini saklamak için bir tam sayı height
    • Dikdörtgenin rengini saklamak için 15 boyutunda bir karakter dizisi color
  2. Aşağıdaki özelliklere sahip displayRectangle adında bir fonksiyon yazın:
    • Parametre olarak bir Rectangle struct'ı alır (değer ile aktarım - pass-by-value)
    • Dikdörtgen bilgilerini tam olarak şu formatta yazdırır:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Alanı (genişlik × yükseklik) hesaplar ve yazdırır
  3. Aşağıdaki özelliklere sahip modifyRectangle adında bir fonksiyon yazın:
    • Parametre olarak bir Rectangle struct'ı alır (değer ile aktarım - pass-by-value)
    • Dikdörtgenin hem genişliğini hem de yüksekliğini iki katına çıkarır
    • Rengi "Modified" olarak değiştirir
    • Inside modifyRectangle function: yazdırır
    • Değiştirilmiş dikdörtgeni göstermek için displayRectangle fonksiyonunu çağırır
  4. Main fonksiyonu içinde:
    • rect adında bir Rectangle değişkeni oluşturun
    • Girişten genişlik, yükseklik ve renk değerlerini okuyun ve bunları struct üyelerine atayın
    • Original rectangle: yazdırır
    • Orijinal dikdörtgeni göstermek için displayRectangle fonksiyonunu çağırın
    • Dikdörtgen ile modifyRectangle fonksiyonunu çağırın
    • After modifyRectangle call: yazdırır
    • Orijinal dikdörtgenin değişmediğini göstermek için displayRectangle fonksiyonunu tekrar çağırın

Bu meydan okuma, struct'larda değer ile aktarımın (pass-by-value) temel kavramını gösterir: Bir struct'ı bir fonksiyona aktardığınızda, fonksiyon struct'ın tam bir kopyasını alır. Fonksiyon içinde yapılan herhangi bir değişiklik yalnızca kopyayı etkiler, çağıran fonksiyondaki orijinal struct'ı etkilemez.

Kopya kağıdı

Yapıları (structs) fonksiyonlara aktarırken, C değer ile geçme (pass-by-value) yöntemini kullanır; bu, fonksiyonun yapının tam bir kopyasını aldığı anlamına gelir.

Bir yapı parametresini kabul etmek için fonksiyon sözdizimi:

void functionName(struct StructureName parameterName) {
    // Fonksiyon gövdesi
}

Bir Point yapısı ile örnek:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Temel kavram: Fonksiyon içinde yapıda yapılan değişiklikler, çağıran fonksiyondaki orijinal yapıyı etkilemez, çünkü fonksiyon verinin kendi kopyasıyla çalışır.

Bu yaklaşım, orijinalinde değişiklik yapma riski olmadan yapı verilerini okumak veya görüntülemek için kullanışlıdır, ancak büyük yapıları kopyalamak verimsiz olabilir.

Kendin dene

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

// TODO: Rectangle yapısını burada tanımlayın

// TODO: displayRectangle fonksiyonunu burada yazın

// TODO: modifyRectangle fonksiyonunu burada yazın

int main() {
    // Girdiyi oku
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Rectangle değişkenini oluşturun ve girdi değerlerini atayın
    
    // TODO: "Original rectangle:" yazdırın ve displayRectangle fonksiyonunu çağırın
    
    // TODO: modifyRectangle fonksiyonunu çağırın
    
    // TODO: "After modifyRectangle call:" yazdırın ve displayRectangle fonksiyonunu tekrar çağırın
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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