Menu
Coddy logo textTech

Const Doğruluğu

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 8 / 61.

Metot olarak işlev gören işlevler yazarken bazıları nesneyi değiştirmelidir (player_take_damage gibi), diğerleri ise hiçbir şeyi değiştirmeden yalnızca verileri okumalıdır. const anahtar sözcüğü, bu ayrımı derleyici düzeyinde zorunlu kılmanızı sağlar.

Bir işaretçi parametresini const olarak işaretleyerek, işlevin işaret ettiği verileri değiştirmeyeceğine söz vermiş olursun. Yanlışlıkla bir üyeyi değiştirmeye çalışırsan derleyici bir hata üretir:

typedef struct {
    int x;
    int y;
} Point;

// Bu fonksiyon noktayı yalnızca OKUYABİLİR
void point_print(const Point *self) {
    printf("(%d, %d)\n", self->x, self->y);
    // self->x = 10;  // ERROR: const pointer üzerinden değiştirilemez
}

// Bu fonksiyon noktayı DEĞİŞTİREBİLİR
void point_move(Point *self, int dx, int dy) {
    self->x += dx;
    self->y += dy;
}

const Point *self parametresi, hem derleyiciye hem de diğer programcılara point_print işlevinin bir "getter" veya salt okunur işlem olduğunu belirtir. Buna const doğruluğu adı verilir: değişikliğin gerekli olmadığı her yerde const kullanmak.

Bu uygulama hataları erkenden yakalar. Bir görüntüleme işlevi yazarken yanlışlıkla bir alanı değiştirirseniz derleyici, hatanın programınıza sızmasına izin vermek yerine sizi hemen durdurur.

challenge icon

Görev

Kolay

Bir sıcaklık değerini depolayan ve hem salt okunur hem de değiştirme işlemleri sağlayan bir Temperature modülü oluşturalım. Bu, yalnızca verileri okuyan işlevlerle verileri değiştiren işlevleri açıkça ayırt etmek için const işaretçilerini kullanma pratiği yapmanıza yardımcı olacak.

Üç dosya oluşturacaksınız:

  • temperature.h: Tek bir Temperature üyesine sahip bir double celsius yapısı tanımlayın. Ayrıca üç işlev tanımlayın:
    • temp_display: Temperature'a bir const işaretçisi alır ve mevcut sıcaklığı yazdırır (salt okunur)
    • temp_adjust: Temperature'a normal bir işaretçi ve bir double miktarı alır, ardından miktarı celsius değerine ekler (değiştirir)
    • temp_to_fahrenheit: Temperature'a bir const işaretçisi alır ve Fahrenheit'a dönüştürülmüş değeri döndürür (salt okunur)
    TEMPERATURE_H sembolüyle include guard'ları kullanın.
  • temperature.c: Üç işlevin tamamını uygulayın. temp_display işlevi Current: {celsius}C biçiminde yazdırmalıdır. temp_to_fahrenheit işlevi celsius * 9.0 / 5.0 + 32.0 döndürmelidir. const işaretçileri kullanan işlevlerin yapının verilerini değiştiremeyeceğini unutmayın.
  • main.c: Bir Temperature oluşturun, işlemleri gerçekleştirin ve sonuçları görüntüleyin.

İki girdi alacaksınız: başlangıç Celsius değeri (double olarak) ve ayarlama miktarı (double olarak).

Ana dosyanızda:

  1. Başlangıç Celsius değeriyle bir Temperature başlatın
  2. Başlangıç sıcaklığını göstermek için temp_display işlevini çağırın
  3. Sıcaklığı ayarlama miktarı kadar değiştirmek için temp_adjust işlevini çağırın
  4. Güncellenmiş sıcaklığı göstermek için temp_display işlevini tekrar çağırın
  5. temp_to_fahrenheit kullanarak Fahrenheit dönüşümünü yazdırın

Sonuçları şu biçimde yazdırın:

Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}F

Tüm sıcaklık değerlerini bir ondalık basamak gösterecek şekilde yazdırmak için %.1f kullanın.

Örneğin, başlangıç değeri 20.0 ve ayarlama değeri 5.0 olduğunda çıktı şöyle olur:

Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0F

Kendin dene

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

int main() {
    double initial_celsius, adjustment;
    scanf("%lf", &initial_celsius);
    scanf("%lf", &adjustment);
    
    // TODO: Bir Temperature struct oluştur ve initial_celsius ile başlat
    
    // TODO: Başlangıç sıcaklığını göstermek için temp_display'i çağır
    
    // TODO: Sıcaklığı adjustment miktarı kadar değiştirmek için temp_adjust'i çağır
    
    // TODO: Güncellenmiş sıcaklığı göstermek için temp_display'i tekrar çağır
    
    // TODO: temp_to_fahrenheit kullanarak Fahrenheit dönüşümünü yazdır
    // Biçim: "Fahrenheit: %.1fF\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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi