Menu
Coddy logo textTech

円の実装

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

challenge icon

チャレンジ

簡単

Circleを実装してShape Drawerプロジェクトの構築を続けましょう。Shape基底構造体を埋め込み、独自の描画ロジックと面積ロジックを提供する具体的な図形です。

前のレッスンで作成した基盤をもとに、次のファイルを追加してプロジェクトを拡張します。

  • shape.h:前のレッスンで作成した基底Shapeインターフェースを保持します。DrawFunc型とAreaFunc型の関数ポインタを含めます。
  • circle.h:ここでCircle構造体を定義します。円はShapeを<ここでのfirst member>として埋め込みます(アップキャストでfirst memberルールを利用できます)。さらに、型doubleradiusフィールドを追加します。radiusを受け取り、値としてCircleをreturnsするconstructor function create_circleをDeclareします。
  • circle.c:ここで円固有の動作をImplementします。
    • draw_circleDrawing Circle with radius: X.XXをPrintsします(radiusは小数点以下2桁で表示)
    • area_circle:π × radius²をReturnsします(πには3.14159を使用)
    • create_circleCircleを初期化し、埋め込まれたShapeのfunction pointerをdraw_circlearea_circleを指すように設定し、radiusを設定して、そのcircleをReturnsします
  • main.c:すべてを組み合わせます。入力としてradiusの値を読み取り、constructorを使用してcircleをCreateし、埋め込まれたShapeのfunction pointerを通じてdrawareaの両方をCallします。areaを小数点以下2桁でPrintsします。

プログラムは1つの入力、つまりradiusの値(浮動小数点数)を受け取ります。

入力が5.0の場合の出力例:

Drawing Circle with radius: 5.00
Area: 78.54

入力が3.5の場合の出力例:

Drawing Circle with radius: 3.50
Area: 38.48

重要なポイントは、CircleShapeをfirst memberとして含んでいるため、circle.base.drawおよびcircle.base.area(または埋め込むmemberに付けた名前)を通じてfunction pointerにaccessできることです。これらのfunctionsをCallするときは、Shape memberへのpointerを渡します。すべてのheader fileでinclude guardsを使用することを忘れないでください。

自分で試してみよう

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: create_circle を使って Circle を作成する
    
    // TODO: 埋め込まれた Shape の関数ポインタ経由で draw を呼び出す
    
    // TODO: 埋め込まれた Shape の関数ポインタ経由で area を呼び出す
    // そして小数点以下2桁で出力する: "Area: %.2f\n"
    
    return 0;
}

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

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