Wadah Bentuk
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 48 dari 61.
Tantangan
MudahMari tuntaskan proyek Shape Drawer dengan penutup yang meriah! Kamu akan membuat wadah bentuk yang menampung koleksi campuran Circle dan Rectangle, lalu menelusurinya untuk menghitung total luas: inilah demonstrasi kekuatan polymorphism yang sesungguhnya.
Dengan mengembangkan semua yang telah kamu buat sejauh ini, proyek lengkapmu akan mencakup:
shape.hdanshape.c: interface Shape dasar dan fungsiprocess_shape.circle.hdancircle.c: implementasi Circle dengan konstruktor dan perhitungan luasnya.rectangle.hdanrectangle.c: implementasi Rectangle dengan konstruktor dan perhitungan luasnya.main.c: Di sinilah keajaiban terjadi. Kamu akan membuat array pointerShape*yang dapat menampung tipe bentuk apa pun. Isi array itu dengan campuran Circle dan Rectangle, lalu telusuri array tersebut untuk menghitung dan menampilkan total luas semua bentuk.
Programmu akan menerima input berikut:
- Jumlah bentuk yang akan dibuat
- Untuk setiap bentuk: penanda tipe (
cuntuk circle,runtuk rectangle) yang diikuti dimensinya
Untuk setiap bentuk di dalam wadahmu, panggil draw dan area sendiri melalui pointer Shape* (shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i])), lalu tambahkan luasnya ke total berjalan. Jangan gunakan process_shape dari shape.c di sini: fungsi itu mencetak baris Area: tambahan untuk setiap bentuk, yang tidak ada dalam output yang diharapkan. Setelah memproses semua bentuk, cetak total luas dengan 2 angka desimal dalam format Total Area: X.XX.
Contoh dengan input 3, lalu c 5.0, r 4.0 3.0, c 2.0:
Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11Contoh dengan input 2, lalu r 6.0 4.0, r 3.0 2.0:
Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00Inti pentingnya adalah array-mu menyimpan pointer Shape*. Array itu tidak peduli apakah setiap elemennya sebenarnya Circle atau Rectangle. Saat kamu menelusuri array dan memanggil draw serta area melalui setiap pointer, implementasi yang tepat akan dijalankan secara otomatis sesuai dengan cara setiap bentuk dibuat. Inilah polymorphism yang bekerja: satu perulangan, satu interface, beragam perilaku.
Ingat, kamu perlu menyimpan pointer ke anggota Shape yang tertanam di dalam bentuk konkret pada array. Gunakan 3.14159 untuk π dalam perhitungan luas circle.
Penting: membaca karakter tipe bentuk: Setelah membaca jumlah bentuk dengan scanf("%d", &n), setiap pemanggilan berikutnya untuk membaca karakter tipe harus melewati karakter baris baru yang tersisa di buffer input. Gunakan spasi di awal pada string format untuk melakukannya:
scanf(" %c", &type); // note the space before %cTanpa spasi di awal, scanf akan membaca karakter baris baru yang tersisa dari input sebelumnya, bukan c atau r yang dimaksud. Akibatnya, pemeriksaan tipe bentukmu akan gagal tanpa pemberitahuan dan tidak menghasilkan output.
Coba sendiri
#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Baca jumlah bentuk
// TODO: Alokasikan array untuk lingkaran, persegi panjang, dan pointer Shape*
// TODO: Telusuri setiap bentuk, baca tipe dan dimensinya,
// buat bentuk tersebut, lalu simpan pointer ke bagian dasarnya dalam array shapes
// TODO: Telusuri array shapes, panggil shapes[i]->draw(...) dan
// shapes[i]->area(...) secara langsung, lalu jumlahkan luasnya
// (jangan panggil process_shape: fungsi ini mencetak baris Area tambahan)
// TODO: Cetak total luas dalam format: Total Area: X.XX
// TODO: Bebaskan memori yang dialokasikan
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 Rahasia2Object 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