Şekil Kapsayıcısı
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 48 / 61.
Görev
KolayShape Drawer projesini büyük finaline taşıyalım! Circle ve Rectangle'ların karışık bir koleksiyonunu tutan bir şekil kapsayıcısı oluşturacak, ardından toplam alanı hesaplamak için bunların üzerinde yineleme yapacaksın: polimorfizmin gerçek gücünü göstereceksin.
Şimdiye kadar oluşturduğun her şeyin üzerine inşa ederek, eksiksiz projen şunları içerecek:
shape.hveshape.c: Temel Shape arayüzün veprocess_shapeişlevi.circle.hvecircle.c: Constructor'ı ve alan hesaplamasıyla Circle uygulaman.rectangle.hverectangle.c: Constructor'ı ve alan hesaplamasıyla Rectangle uygulaman.main.c: Sihir burada gerçekleşir. Herhangi bir şekil türünü tutabilen birShape*pointer dizisi oluşturacaksın. Bu diziyi Circle ve Rectangle'ların bir karışımıyla dolduracak, ardından tüm şekillerin toplam alanını hesaplayıp görüntülemek için dizi üzerinde döngü kuracaksın.
Programın aşağıdaki girdileri alacak:
- Oluşturulacak şekillerin sayısı
- Her şekil için: bir tür göstergesi (
ccircle,rrectangle için), ardından boyutları
Kapsayıcındaki her şekil için draw çıktısını yazdır. Tüm şekilleri işledikten sonra toplam alanı 2 ondalık basamakla Total Area: X.XX biçiminde yazdır.
3, ardından c 5.0, r 4.0 3.0, c 2.0 girdileriyle örnek:
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.112, ardından r 6.0 4.0, r 3.0 2.0 girdileriyle örnek:
Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00Temel fikir, dizinin Shape* pointer'larını saklamasıdır. Her öğenin aslında Circle mı yoksa Rectangle mı olduğunu önemsemez. Her pointer üzerinden yineleme yapıp draw ve area çağrısı yaptığında, her şeklin nasıl oluşturulduğuna bağlı olarak doğru uygulama otomatik şekilde çalışır. İş başındaki polimorfizm budur: tek döngü, tek arayüz, birden çok davranış.
Somut şekillerinin gömülü Shape üyelerine yönelik pointer'ları dizide saklaman gerekeceğini unutma. Circle alanı hesaplamalarında π için 3.14159 kullan.
Önemli: şekil türü karakterini okuma: Şekillerin sayısını scanf("%d", &n) ile okuduktan sonra, tür karakterini okumaya yönelik sonraki her çağrı, girdi tamponunda kalan yeni satırı atlamalıdır. Bunu yapmak için biçim string'inin başında bir boşluk kullan:
scanf(" %c", &type); // note the space before %cBaştaki boşluk olmadan scanf, amaçlanan c veya r yerine önceki girdiden kalan yeni satır karakterini okur; bu da şekil türü kontrolünün sessizce başarısız olmasına ve çıktı üretilmemesine neden olur.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Şekillerin sayısını oku
// TODO: circles, rectangles ve Shape* işaretçileri için diziler ayır
// TODO: Her şekli döngüyle gez, tipini ve boyutlarını oku,
// şekli oluştur ve shapes dizisinde tabanına bir işaretçi sakla
// TODO: shapes dizisini döngüyle gez, her şekil üzerinde draw çağır,
// ve toplam alanı biriktir
// TODO: Toplam alanı şu formatta yazdır: Total Area: X.XX
// TODO: Ayrılan belleği serbest bırak
return 0;
}
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi9Proje: Şekil Çizici
Projeye Genel BakışDaire UygulamasıDikdörtgen UygulamasıPolimorfik KullanımŞekil KapsayıcısıKendi başına pratik yap: Online C derleyicisi