Tinjauan Ulang: Generic array
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 53 dari 61.
Tantangan
MudahMari 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 structGenericArraydengan tiga anggota: arrayvoid**untuk menampung pointer, sebuahintuntuk jumlah saat ini, dan sebuahintuntuk 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 0add_element: menyimpan pointervoid*di slot kosong berikutnya dan menambah jumlah (anggap kapasitasnya mencukupi)get_element: mengembalikanvoid*pada indeks yang ditentukanfree_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 (iuntuk bilangan bulat,suntuk 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:
- Jumlah elemen yang akan ditambahkan
- Untuk setiap elemen: indikator tipe (
iataus) 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
100Contoh output saat inputnya adalah 4, lalu s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysIngat 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
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia7Pointer Fungsi
Mendeklarasikan Pointer FungsiMemanggil Pointer FungsiTypedef untuk Pointer FungsiMengirim Fungsi sebagai ArgumenRangkuman: Dispatch Kalkulator10Wadah Generik
Tinjauan Ulang Pointer VoidPembungkus GenerikPertukaran GenerikPerbandingan GenerikTinjauan Ulang: Generic array2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online