İ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.
Görev
KolayAlttaki 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 birIntIteratoryapı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) venext(geçerli öğeyi döndürür ve konumu ilerletir). Include guard'ları eklemeyi unutma!iterator.c: Yineleyici işlevlerini uygula.create_iteratorişlevi, geçerli konum 0 olarak ayarlanmış şekilde, değer olarak birIntIteratordöndürmelidir.has_nextişlevi okunacak daha fazla öğe varsa 1, aksi takdirde 0 döndürür.nextiş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çinhas_nextvenextile bir while döngüsü kullan.
Programın alacağı girdiler:
- Dizideki öğe sayısı
- 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
40Girdiler sırasıyla 3, ardından -5, 0, 100 olduğunda örnek çıktı:
-5
0
100Girdiler sırasıyla 1, ardından 42 olduğunda örnek çıktı:
42Yineleyici, 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;
}
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
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şisiKendi başına pratik yap: Online C derleyicisi