Menu
Coddy logo textTech

ヘルパーメソッド

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

ここまで、構造体データを変更する関数(player_take_damageなど)と、単にデータを表示する関数を見てきました。しかし、もう1つ重要なカテゴリがあります。それは、何も変更せずに構造体メンバーから派生値を計算する関数です。

幅と高さを格納する Rectangle 構造体について考えてみましょう。面積は格納されず、必要に応じて計算されます。

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

これらはhelper methodsです。構造体の既存のデータを受け取り、新しい値を生成します。読み取りのみを行い、書き込みは決して行わないため、constポインターを使用していることに注目してください。計算された結果は構造体に保存されるのではなく、返されます。

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

このパターンにより、構造体を簡潔に保てます。必要不可欠なデータだけを保存し、それ以外は必要に応じて計算します。また、派生値が常に現在の状態と一致することも保証します。

challenge icon

チャレンジ

簡単

保存されたデータから派生値を計算するCircleモジュールを作成しましょう。構造体のメンバーを変更せずに結果を計算するhelper methods、つまりfunctionの記述を練習します。

3つのファイルを作成します:

  • circle.h:単一のdouble radiusメンバーを持つCircle構造体をDeclareします。また、2つのhelper methodsDeclareします:
    • circle_area:Circleへのconstポインターを受け取り、面積を返します
    • circle_circumference:Circleへのconstポインターを受け取り、円周を返します
    シンボルCIRCLE_Hを使ってインクルードガードを使用します。
  • circle.c:両方のhelper methodsImplementします。計算には、円周率の値として3.14159を使用します。面積の公式はpi * radius * radiusで、円周の公式は2 * pi * radiusです。どちらのfunctionradiusを読み取るonlyものとし、決して変更してはいけません。
  • main.c:CircleをCreateし、helper methodsを使ってそのプロパティを計算し、表示します。

入力は1つです:円のradius(double型)。

mainファイルで、与えられたradiusを使ってCircleを初期化し、その後helper methodsを使って面積と円周を計算してPrintします。

結果を次の形式でPrintします:

Area: {area}
Circumference: {circumference}

両方の値に%.2fを使用して、小数点以下2桁まで表示します。

たとえば、radius5.0の場合、出力は次のようになります:

Area: 78.54
Circumference: 31.42

自分で試してみよう

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: 与えられた半径で Circle 構造体を作成する
    
    // TODO: Use circle_area and circle_circumference helper methods
    // 結果を計算して出力する
    
    // 出力形式:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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

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