Menu
Coddy logo textTech

Özet: Jenerik Dizi

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

challenge icon

Görev

Kolay

Bir GenericArray kapsayıcısı oluşturalım: void* işaretçilerini kullanarak aynı koleksiyonda tamsayılar ve dizelerden oluşan bir karışımı tutabilen esnek bir veri yapısı.

Kodunuzu üç dosyada organize edeceksiniz:

  • generic_array.h: Üç üyeye sahip GenericArray struct'ını Define edin: işaretçileri hold etmek için bir void** array, mevcut count için bir int ve kapasite için bir int. array oluşturma, elements ekleme, index'e göre elements alma ve array'i serbest bırakma function prototiplerini Declare edin.
  • generic_array.c: Kapsayıcınızın işlevselliğini Implement edin:
    • create_array: verilen başlangıç kapasitesine sahip bir GenericArray allocate eder ve count değerini 0 olarak başlatır
    • add_element: bir sonraki kullanılabilir yuvaya bir void* işaretçisi kaydeder ve count değerini artırır (kapasitenin yeterli olduğunu varsayın)
    • get_element: belirtilen index konumundaki void* değerini döndürür
    • free_array: items array'ini ve GenericArray struct'ının kendisini serbest bırakır
  • main.c: Hem tamsayıları hem de dizeleri depolayarak generic array'inizi gösterin. Eklenecek elements sayısını okuyun; ardından her element için bir type indicator (i tamsayı, s dize için) ve sonrasında değeri okuyun. Tüm elements eklendikten sonra array boyunca Iterate edin ve her değeri yazdırın. Tamsayılar için sayıyı doğrudan yazdırın. Dizeler için metni doğrudan yazdırın.

Programınız şunları alacaktır:

  1. Eklenecek elements sayısı
  2. Her element için: bir type indicator (i veya s) ve ardından değer

Tamsayılar eklerken int için bellek allocate edin ve işaretçiyi kaydedin. Dizeler eklerken bellek allocate edin ve dizeyi copy edin. Geri alırken yazdırmak için uygun türe Cast edin.

Important: Yazdırma sırasında türleri takip etmek için main içinde basit bir paralel type indicator array'i kullanabilir veya type indicator karakterini her element ile birlikte depolayabilirsiniz.

Girdilerin 3, ardından i 42, s Hello, i 100 olduğu durumdaki örnek çıktı:

42
Hello
100

Girdilerin 4, ardından s World, s Generic, i -5, s Arrays olduğu durumdaki örnek çıktı:

World
Generic
-5
Arrays

Header dosyanızda include guard kullanmayı unutmayın. Kapsayıcının kendisinin hangi türleri depoladığını bilmesi gerekmez. Yalnızca void* işaretçilerini tutar. Türü bilme sorumluluğu, elements ekleyen ve alan koda aittir.

Kendin dene

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: n kapasiteli bir GenericArray oluştur
    
    // TODO: Türleri takip etmek için paralel bir dizi oluştur (n boyutunda char dizisi)
    
    // TODO: Her eleman için:
    // - Tür göstergesini oku (i veya s)
    // - Değeri oku
    // - Eğer tamsayıysa: int için bellek ayır, değeri sakla, diziye ekle
    // - Eğer string ise: string için bellek ayır, değeri kopyala, diziye ekle
    // - Tür göstergesini paralel dizine kaydet
    
    // TODO: Diziyi dolaş ve her elemanı yazdır
    // - Paralel dizinden türü kontrol et
    // - void* değerini uygun türe geri cast et ve yazdır
    
    // TODO: Ayrılan tüm belleği serbest bırak (tamsayılar, string'ler ve dizi)
    
    return 0;
}

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

Kendi başına pratik yap: Online C derleyicisi