Menu
Coddy logo textTech

Şekil Kapsayıcısı

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 61.

challenge icon

Görev

Kolay

Shape 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.h ve shape.c: Temel Shape arayüzün ve process_shape işlevi.
  • circle.h ve circle.c: Yapıcısı ve alan hesaplamasıyla Circle uygulaman.
  • rectangle.h ve rectangle.c: Yapıcısı ve alan hesaplamasıyla Rectangle uygulaman.
  • main.c: Sihir burada gerçekleşir. Herhangi bir şekil türünü tutabilen bir Shape* 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:

  1. Oluşturulacak şekillerin sayısı
  2. Her şekil için: boyutlarının ardından bir tür göstergesi (c daire, r dikdö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.11

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

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

Baş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

Kendi başına pratik yap: Online C derleyicisi