Menu
Coddy logo textTech

İteratör Kalıbı

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

Iterator deseni, bir koleksiyonun temel yapısını açığa çıkarmadan öğelerine sıralı bir şekilde erişmenin bir yolunu sunar. Kullanıcılara bir diziye doğrudan erişim vermek yerine, onlara veriler arasında her seferinde bir öğe ilerlemeyi bilen bir nesne verirsiniz.

Bir yineleyici genellikle iki bilgi parçasına ihtiyaç duyar: koleksiyona bir başvuru ve geçerli konum. C dilinde bu durumu tutmak için bir yapı oluştururuz:

typedef struct {
    int* data;      // dizinin işaretçisi
    int size;       // elemanların toplam sayısı
    int current;    // mevcut konum
} IntIterator;

Yineleyici iki temel işlev sunar. has_next(), okunacak daha fazla öğe olup olmadığını kontrol eder ve next(), geçerli öğeyi döndürüp konumu ilerletir:

int has_next(IntIterator* it) {
    return it->current < it->size;
}

int next(IntIterator* it) {
    return it->data[it->current++];
}

Yineleyiciyi kullanmak temiz görünür ve dizi ayrıntılarını gizler:

IntIterator it = create_iterator(numbers, 5);
while (has_next(&it)) {
    printf("%d\n", next(&it));
}

Çağıran tarafın numbers öğesinin bir dizi olduğunu veya indekslemenin nasıl çalıştığını bilmesine hiçbir zaman gerek yoktur. Bu soyutlama, daha sonra temel veri yapısını bir diziden örneğin bağlı bir listeye değiştirmeyi, yineleyiciyi kullanan kodu değiştirmeden kolaylaştırır.

challenge icon

Görev

Kolay

Alttaki dizi yapısını açığa çıkarmadan bir tamsayı koleksiyonunda dolaşmanı sağlayan temiz bir soyutlama olan NumberList yineleyicisini oluşturalım.

Kodunu üç dosyaya ayıracaksın:

  • iterator.h: Bir tamsayı dizisine işaretçi, koleksiyonun toplam boyutu ve geçerli konumu tutan bir IntIterator yapısı tanımla. Üç işlev bildir: create_iterator (bir dizi işaretçisi ve boyut alır, başlatılmış bir yineleyici döndürür), has_next (daha fazla öğe kalıp kalmadığını kontrol eder) ve next (geçerli öğeyi döndürür ve konumu ilerletir). Include guard'ları eklemeyi unutma!
  • iterator.c: Yineleyici işlevlerini uygula. create_iterator işlevi, geçerli konum 0 olarak ayarlanmış şekilde, değer olarak bir IntIterator döndürmelidir. has_next işlevi okunacak daha fazla öğe varsa 1, aksi takdirde 0 döndürür. next işlevi geçerli konumdaki öğeyi döndürür ve ardından konumu artırır.
  • main.c: Öğe sayısını oku, ardından her tamsayı değerini bir diziye oku. Bu dizi için bir yineleyici oluştur, ardından her öğeyi kendi satırında dolaşıp yazdırmak için has_next ve next ile bir while döngüsü kullan.

Programın alacağı girdiler:

  1. Dizideki öğe sayısı
  2. Her biri ayrı bir satırda bulunan tamsayı değerleri

Tüm öğeleri yazdırmak için yineleyici desenini kullan: dolaşım döngünde doğrudan dizi indislemeye izin verilmez!

Girdiler sırasıyla 4, ardından 10, 20, 30, 40 olduğunda örnek çıktı:

10
20
30
40

Girdiler sırasıyla 3, ardından -5, 0, 100 olduğunda örnek çıktı:

-5
0
100

Girdiler sırasıyla 1, ardından 42 olduğunda örnek çıktı:

42

Yineleyici, verilerin nasıl depolandığını gizler. Ana döngün, dizi indisleri veya bellek yerleşimi hakkında hiçbir şey bilmeden yalnızca "daha fazla var mı?" ve "bir sonrakini ver" diye sorar.

Kendin dene

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

int main() {
    int n;
    scanf("%d", &n);
    
    int arr[n];
    
    // TODO: n tamsayı değerini diziye oku
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // TODO: Dizi için bir iterator oluştur
    
    // TODO: has_next ve next ile bir while döngüsü kullanarak dolaş
    // ve her elemanı kendi satırına yazdır
    // Dolaşma döngünde doğrudan dizi indekslemesi KULLANMA!
    
    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