Menu
CoddyTech

Wadah Bentuk

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

challenge icon

Tantangan

Mudah

Mari 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.h dan shape.c: interface Shape dasar dan fungsi process_shape.
  • circle.h dan circle.c: implementasi Circle dengan konstruktor dan perhitungan luasnya.
  • rectangle.h dan rectangle.c: implementasi Rectangle dengan konstruktor dan perhitungan luasnya.
  • main.c: Di sinilah keajaiban terjadi. Kamu akan membuat array pointer Shape* 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:

  1. Jumlah bentuk yang akan dibuat
  2. Untuk setiap bentuk: penanda tipe (c untuk circle, r untuk 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.11

Contoh 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.00

Inti 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 %c

Tanpa 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

Latihan sendiri: Compiler C online