Menu
CoddyTech

Tinjauan Ulang: Generic array

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 53 dari 61.

challenge icon

Tantangan

Mudah

Mari buat container GenericArray: struktur data fleksibel yang dapat menampung campuran bilangan bulat dan string dalam koleksi yang sama menggunakan pointer void*.

Kamu akan mengatur kodemu dalam tiga file:

  • generic_array.h: Definisikan struct GenericArray dengan tiga anggota: array void** untuk menampung pointer, sebuah int untuk jumlah saat ini, dan sebuah int untuk kapasitas. Deklarasikan prototipe fungsi untuk membuat array, menambahkan elemen, mengambil elemen berdasarkan indeks, dan membebaskan array.
  • generic_array.c: Implementasikan fungsionalitas container-mu:
    • create_array: mengalokasikan GenericArray dengan kapasitas awal yang ditentukan dan menginisialisasi jumlah menjadi 0
    • add_element: menyimpan pointer void* di slot kosong berikutnya dan menambah jumlah (anggap kapasitasnya mencukupi)
    • get_element: mengembalikan void* pada indeks yang ditentukan
    • free_array: membebaskan array items dan struct GenericArray itu sendiri
  • main.c: Demonstrasikan generic array-mu dengan menyimpan bilangan bulat dan string. Baca jumlah elemen yang akan ditambahkan, lalu baca indikator tipe (i untuk bilangan bulat, s untuk string) diikuti nilainya untuk setiap elemen. Setelah menambahkan semua elemen, lakukan iterasi melalui array dan cetak setiap nilai. Untuk bilangan bulat, cetak angkanya secara langsung. Untuk string, cetak teksnya secara langsung.

Programmu akan menerima:

  1. Jumlah elemen yang akan ditambahkan
  2. Untuk setiap elemen: indikator tipe (i atau s) diikuti nilainya

Saat menambahkan bilangan bulat, alokasikan memori untuk int dan simpan pointer-nya. Saat menambahkan string, alokasikan memori dan salin string tersebut. Saat mengambil elemen, lakukan cast kembali ke tipe yang sesuai untuk mencetaknya.

Penting: Untuk melacak tipe saat mencetak, kamu dapat menggunakan array paralel sederhana yang berisi indikator tipe di main, atau menyimpan karakter indikator tipe bersama setiap elemen.

Contoh output saat inputnya adalah 3, lalu i 42, s Hello, i 100:

42
Hello
100

Contoh output saat inputnya adalah 4, lalu s World, s Generic, i -5, s Arrays:

World
Generic
-5
Arrays

Ingat untuk menggunakan include guard di file header-mu. Container itu sendiri tidak perlu mengetahui tipe yang disimpannya. Container hanya menampung pointer void*. Tanggung jawab untuk mengetahui tipe berada pada kode yang menambahkan dan mengambil elemen.

Coba sendiri

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

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Buat GenericArray dengan kapasitas n
    
    // TODO: Buat array paralel untuk melacak tipe (array char berukuran n)
    
    // TODO: Untuk setiap elemen:
    // - Baca penanda tipe (i atau s)
    // - Baca nilainya
    // - Jika integer: alokasikan memori untuk int, simpan nilainya, lalu tambahkan ke array
    // - Jika string: alokasikan memori untuk string, salin nilainya, lalu tambahkan ke array
    // - Simpan penanda tipe dalam array paralelmu
    
    // TODO: Telusuri array dan cetak setiap elemen
    // - Periksa tipe dari array paralelmu
    // - Konversikan void* kembali ke tipe yang sesuai, lalu cetak
    
    // TODO: Bebaskan semua memori yang dialokasikan (integer, string, dan array)
    
    return 0;
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online