Menu
Coddy logo textTech

Şekil Kapsayıcısı

Coddy'nin C Journey'sinin Object Oriented Programming 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! 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.h ve shape.c: Temel Shape arayüzün ve process_shape işlevi.
  • circle.h ve circle.c: Constructor'ı ve alan hesaplamasıyla Circle uygulaman.
  • rectangle.h ve rectangle.c: Constructor'ı ve alan hesaplamasıyla Rectangle uygulaman.
  • main.c: Sihir burada gerçekleşir. Herhangi bir şekil türünü tutabilen bir Shape* 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:

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

2, 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* 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 %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 çı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

Kendi başına pratik yap: Online C derleyicisi