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.
Görev
KolayDepolanan 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 birdouble radiusüyesine sahip birCircleyapısı bildirin. Ayrıca iki yardımcı metot bildirin:circle_area— Circle yapısına birconstişaretçisi alır ve alanı döndürürcircle_circumference— Circle yapısına birconstişaretçisi alır ve çevreyi döndürür
CIRCLE_Hsembolü ile include guard kullanın.circle.c: Her iki yardımcı metodu da uygulayın. Hesaplamalar için pi değeri olarak3.14159kullanın. Alan formülüpi * radius * radiusve ç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.42Kopya 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi