Menu
Coddy logo textTech

円の実装

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 45/61。

challenge icon

チャレンジ

簡単

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

前回のレッスンの基礎の上に、以下のファイルを使用してプロジェクトを拡張します。

  • shape.h: 前回のレッスンの DrawFunc および AreaFunc 関数ポインタ型を含むベースの Shape インターフェースをそのまま保持します。
  • circle.h: ここで Circle 構造体を定義します。円は 最初のメンバ として Shape を埋め込み(アップキャストのための「最初のメンバのルール」を有効にします)、double 型の radius フィールドを追加します。半径を受け取り、Circle を値で返すコンストラクタ関数 create_circle を宣言します。
  • circle.c: ここで円固有の動作を実装します。
    • draw_circleDrawing Circle with radius: X.XX を出力します(半径は小数点以下2桁で表示)。
    • area_circle — π × radius² を返します(π には 3.14159 を使用してください)。
    • create_circleCircle を初期化し、埋め込まれた Shape の関数ポインタが draw_circlearea_circle を指すように紐付け、半径を設定して、その円を返します。
  • main.c: すべてをまとめます。入力として半径の値を読み取り、コンストラクタを使用して円を作成し、埋め込まれた Shape の関数ポインタを介して drawarea の両方を呼び出します。面積を小数点以下2桁で出力します。

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

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

Drawing Circle with radius: 5.00
Area: 78.54

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

Drawing Circle with radius: 3.50
Area: 38.48

重要なポイントは、Circle が最初のメンバとして Shape を含んでいるため、circle.base.drawcircle.base.area(または埋め込みメンバに付けた名前)を介して関数ポインタにアクセスできることです。これらの関数を呼び出すときは、Shape メンバへのポインタを渡してください。すべてのヘッダーファイルでインクルードガードを使用することを忘れないでください。

自分で試してみよう

#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;
}

Object Oriented Programmingのすべてのレッスン