Şekil Kapsayıcısı
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 61.
Görev
KolayShape Drawer projesini büyük finaline taşıyalım! Circles ve Rectangles'tan oluşan karma bir koleksiyonu tutan bir şekil kapsayıcısı oluşturacak, ardından polimorfizmin gerçek gücünü göstererek toplam alanı hesaplamak için bunlar üzerinde yineleme yapacaksın.
Şimdiye kadar oluşturduğun her şey üzerine kurulacak eksiksiz projen şunları içerecek:
shape.hveshape.c: Temel Shape arayüzün veprocess_shapeişlevi.circle.hvecircle.c: Yapıcısı ve alan hesaplamasıyla Circle uygulaman.rectangle.hverectangle.c: Yapıcısı ve alan hesaplamasıyla Rectangle uygulaman.main.c: Sihir burada gerçekleşir. Herhangi bir şekil türünü tutabilen birShape*işaretçileri dizisi oluşturacaksın. Bu diziyi Circles ve Rectangles karışımıyla dolduracak, ardından tüm şekillerin toplam alanını hesaplayıp görüntülemek için dizi üzerinde döngüyle ilerleyeceksin.
Programın aşağıdaki girdileri alacak:
- Oluşturulacak şekillerin sayısı
- Her şekil için: boyutlarının ardından bir tür göstergesi (
cdaire,rdikdörtgen için)
Kapsayıcındaki her şekil için draw işaretçisi üzerinden area ve Shape* işlevlerini kendin çağır (shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i])) ve alanı devam eden toplama ekle. Burada process_shape dosyasındaki shape.c işlevini kullanma: Bu işlev her şekil için beklenen çıktıda bulunmayan fazladan bir Area: satırı yazdırır. Tüm şekilleri işledikten sonra toplam alanı 2 ondalık basamakla Total Area: X.XX biçiminde yazdır.
3 girdisiyle ve 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 girdisiyle ve 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* işaretçilerini saklamasıdır. Her öğenin gerçekte Circle mı yoksa Rectangle mı olduğunu önemsemez. Her işaretçi üzerinden yineleme yapıp draw ve area işlevlerini çağırdığında, her şeklin nasıl oluşturulduğuna bağlı olarak doğru uygulama otomatik biçimde çalışır. Bu, polimorfizmin iş başındaki hâlidir: tek döngü, tek arayüz, birden çok davranış.
Somut şekillerinin gömülü Shape üyelerine ait işaretçileri dizide saklaman gerektiğini unutma. Daire 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 okumak için yapılacak her çağrı, girdi arabelleğinde kalan yeni satırı atlamalıdır. Bunu yapmak için biçim dizesinde başa 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 hiçbir çı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: Daireler, dikdörtgenler ve Shape* işaretçileri için diziler ayır
// TODO: Her şekil için döngü yap, tipini ve boyutlarını oku,
// şekli oluştur ve shapes dizisinde tabanına bir işaretçi sakla
// TODO: shapes dizisini dolaş, shapes[i]->draw(...) ve
// shapes[i]->area(...) doğrudan çağır ve toplam alanı biriktir
// (process_shape çağırma: ekstra bir Area satırı yazdırır)
// TODO: Toplam alanı şu formatta yazdır: Total Area: X.XX
// TODO: Ayrılan belleği serbest bırak
return 0;
}
Nesne Yönelimli Programlama 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