Menu
Coddy logo textTech

Yardımcı Metotlar

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 10 / 61.

Şu ana kadar, struct verilerini değiştiren (player_take_damage gibi) ve bunları sadece görüntüleyen fonksiyonlar gördük. Ancak başka bir önemli kategori daha var: hiçbir şeyi değiştirmeden struct üyelerinden türetilmiş değerler hesaplayan fonksiyonlar.

Genişlik ve yükseklik değerlerini saklayan bir Rectangle yapısını (struct) düşünün. Alan saklanmaz; talep üzerine hesaplanır:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

Bunlar yardımcı metotlardır—yapının (struct) mevcut verilerini alırlar ve yeni bir değer üretirler. Sadece okuma yaptıkları, asla yazma yapmadıkları için const işaretçileri kullandıklarına dikkat edin. Hesaplanan sonuç, yapıda saklanmak yerine döndürülür.

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Bu desen, struct'larınızı yalın tutar; yalnızca temel verileri depolayın ve geri kalan her şeyi gerektiğinde hesaplayın. Ayrıca, türetilmiş değerlerin her zaman mevcut durumla tutarlı olmasını sağlar.

challenge icon

Görev

Kolay

Depolanan verilerden türetilmiş değerleri hesaplayan bir Circle modülü oluşturalım. Yapı (struct) üyelerini değiştirmeden sonuçları hesaplayan yardımcı metotlar —fonksiyonlar— yazma pratiği yapacaksınız.

Üç dosya oluşturacaksınız:

  • circle.h: Tek bir double radius üyesine sahip bir Circle yapısı bildirin. Ayrıca iki yardımcı metot bildirin:
    • circle_area — Circle yapısına bir const işaretçisi alır ve alanı döndürür
    • circle_circumference — Circle yapısına bir const işaretçisi alır ve çevreyi döndürür
    CIRCLE_H sembolü ile include guard kullanın.
  • circle.c: Her iki yardımcı metodu da uygulayın. Hesaplamalar için pi değeri olarak 3.14159 kullanın. Alan formülü pi * radius * radius ve çevre formülü 2 * pi * radius şeklindedir. Her iki fonksiyon da yarıçapı sadece okumalı —asla değiştirmemelidir.
  • main.c: Bir Circle oluşturun ve özelliklerini hesaplayıp görüntülemek için yardımcı metotları kullanın.

Bir girdi alacaksınız: dairenin radius değeri (double olarak).

Ana dosyanızda, verilen yarıçapla bir Circle başlatın, ardından alanı ve çevreyi hesaplamak ve yazdırmak için yardımcı metotlarınızı kullanın.

Sonuçları şu formatta yazdırın:

Area: {area}
Circumference: {circumference}

İki ondalık basamak görüntülemek için her iki değerde de %.2f kullanın.

Örneğin, 5.0 yarıçapı ile çıktı şöyle olacaktır:

Area: 78.54
Circumference: 31.42

Kopya kağıdı

Fonksiyonlar, struct üyelerinden türetilmiş değerleri struct'ı değiştirmeden hesaplayabilirler. Bunlara yardımcı metotlar (helper methods) denir.

Yardımcı metotlar, veriyi sadece okudukları ve asla yazmadıkları için const işaretçiler kullanırlar:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

Yardımcı metotların kullanımı:

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Bu desen, sadece temel verileri depolayıp türetilmiş değerleri talep üzerine hesaplayarak struct'ların yalın kalmasını sağlar ve mevcut durumla tutarlılığı garanti eder.

Kendin dene

#include <stdio.h>
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Verilen yarıçap ile bir Circle struct'ı oluşturun
    
    // TODO: circle_area ve circle_circumference yardımcı metotlarını kullanın
    // sonuçları hesaplamak ve yazdırmak için
    
    // Yazdırma formatı:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\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.

Object Oriented Programming bölümündeki tüm dersler