Menu
Coddy logo textTech

図形コンテナ

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 48/61。

challenge icon

チャレンジ

簡単

Shape Drawer プロジェクトをいよいよ完成させましょう!Circles と Rectangles の混在したコレクションを保持する shape コンテナを作成し、その中を反復処理して合計面積を計算します。これにより、ポリモーフィズムの真の力を実証します。

これまでに作成したすべてのものを基に、完成したプロジェクトには次のものが含まれます。

  • shape.hshape.c:基底 Shape インターフェースと process_shape 関数。
  • circle.hcircle.c:コンストラクターと面積計算を備えた Circle の実装。
  • rectangle.hrectangle.c:コンストラクターと面積計算を備えた Rectangle の実装。
  • main.c:ここで処理の核心が行われます。任意の shape 型を保持できる Shape* ポインターの array を作成します。Circles と Rectangles を混在させて格納し、その後 array をループして、すべての shapes の合計面積を計算して表示します。

プログラムには次の入力が与えられます。

  1. 作成する shapes の数
  2. 各 shape について:type indicator(circle には c、rectangle には r)と、それに続く dimensions

コンテナ内の各 shape について、Shape* ポインターを通じて自分で drawarea を呼び出し(shapes[i]->draw(shapes[i])shapes[i]->area(shapes[i]))、その面積を累計に加えます。ここでは shape.cprocess_shape使用しないでください。これは各 shape について余分な Area: 行を出力しますが、期待される出力には含まれていないためです。すべての shapes の処理後、合計面積を小数点以下 2 桁で、Total Area: X.XX の形式で出力します。

入力が 3、続いて c 5.0r 4.0 3.0c 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

入力が 2、続いて r 6.0 4.0r 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

重要な点は、array が Shape* ポインターを格納していることです。各要素が実際には Circle なのか Rectangle なのかを気にする必要はありません。反復処理を行い、各ポインターを通じて drawarea を呼び出すと、それぞれの shape がどのように構築されたかに基づいて、正しい実装が自動的に実行されます。これがポリモーフィズムの実際の動作です。1 つのループ、1 つのインターフェース、複数の振る舞いです。

具体的な shapes に埋め込まれた Shape メンバーへのポインターを array に格納する必要があることを忘れないでください。circle の面積計算には π として 3.14159 を使用します。

重要:shape type character の読み取り: scanf("%d", &n) で shapes の数を読み取った後、type character を読み取る各 subsequent call では、input buffer に残った改行をスキップする必要があります。これを行うには、format string の先頭にスペースを使用します。

scanf(" %c", &type);  // note the space before %c

先頭のスペースがない場合、scanf は意図した cr ではなく、前の入力から残った改行文字を読み取ります。その結果、shape type のチェックが黙って失敗し、出力が生成されません。

自分で試してみよう

#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: 図形の数を読み取る
    // TODO: circles、rectangles、および Shape* ポインタ用の配列を割り当てる
    // TODO: 各図形をループし、種類と寸法を読み取り、
    //       図形を作成し、その基底へのポインタを shapes 配列に格納する
    // TODO: shapes 配列をループし、shapes[i]->draw(...) と
    //       shapes[i]->area(...) を直接呼び出して合計面積を累積する
    //       (process_shape を呼び出さないこと: 余分な Area 行を出力する)
    // TODO: 合計面積を次の形式で出力する: Total Area: X.XX
    // TODO: 割り当てたメモリを解放する
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ