Menu
Coddy logo textTech

Özet: Jenerik Dizi

Coddy'nin C Journey'sinin Object Oriented Programming 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ı koleksiyon içinde tam sayılar ve dizelerin bir karışımını tutabilen esnek bir veri yapısı.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • generic_array.h: Üç üyeli GenericArray yapısını (struct) tanımlayın: işaretçileri tutmak için bir void** dizisi, mevcut sayı için bir int ve kapasite için bir int. Diziyi oluşturma, eleman ekleme, dizine göre eleman alma ve diziyi serbest bırakma işlevleri için fonksiyon prototiplerini bildirin.
  • generic_array.c: Kapsayıcınızın işlevselliğini uygulayın:
    • create_array — verilen bir başlangıç kapasitesiyle bir GenericArray tahsis eder ve count değerini 0 olarak başlatır
    • add_element — bir sonraki boş yuvaya bir void* işaretçisi depolar ve count değerini artırır (kapasitenin yeterli olduğunu varsayın)
    • get_element — belirtilen dizindeki void* değerini döndürür
    • free_array — items dizisini ve GenericArray yapısının kendisini serbest bırakır
  • main.c: Hem tam sayıları hem de dizeleri depolayarak genel dizinizi gösterin. Eklenecek eleman sayısını okuyun, ardından her eleman için bir tür göstergesi (tam sayı için i, dize için s) ve ardından değeri okuyun. Tüm elemanları ekledikten sonra, dizi boyunca ilerleyin ve her değeri yazdırın. Tam sayı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 eleman sayısı
  2. Her eleman için: bir tür göstergesi (i veya s) ve ardından değer

Tam sayı eklerken, int için bellek tahsis edin ve işaretçiyi saklayın. Dize eklerken, bellek tahsis edin ve dizeyi kopyalayın. Geri alırken, yazdırmak için uygun türe geri dönüştürün (cast).

Önemli: Yazdırma için türleri takip etmek amacıyla, main içinde basit bir paralel tür göstergeleri dizisi kullanabilir veya her elemanın yanında tür göstergesi karakterini saklayabilirsiniz.

Girdiler 3, ardından i 42, s Hello, i 100 olduğunda örnek çıktı:

42
Hello
100

Girdiler 4, ardından s World, s Generic, i -5, s Arrays olduğunda örnek çıktı:

World
Generic
-5
Arrays

Başlık dosyanızda include guard kullanmayı unutmayın. Kapsayıcının kendisinin hangi türleri sakladığını bilmesine gerek yoktur — sadece void* işaretçilerini tutar. Türü bilme sorumluluğu, elemanları ekleyen ve geri 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şturun
    
    // TODO: Türleri takip etmek için paralel bir dizi oluşturun (n boyutunda char dizisi)
    
    // TODO: Her bir eleman için:
    // - Tür göstergesini okuyun (i veya s)
    // - Değeri okuyun
    // - Eğer tamsayıysa: int için bellek ayırın, değeri saklayın, diziye ekleyin
    // - Eğer dizgi (string) ise: string için bellek ayırın, değeri kopyalayın, diziye ekleyin
    // - Tür göstergesini paralel dizinizde saklayın
    
    // TODO: Dizi üzerinde döngü kurun ve her bir elemanı yazdırın
    // - Türü paralel dizinizden kontrol edin
    // - void* türünü uygun türe geri dönüştürün (cast) ve yazdırın
    
    // TODO: Ayrılan tüm belleği serbest bırakın (tamsayılar, dizgiler ve dizi)
    
    return 0;
}

Object Oriented Programming bölümündeki tüm dersler