トラック
/
C++
C++
/
演習
/
ラザニア
ラザニア

ラザニア

学習演習

はじめに

基本

C++の旅の最初は、変数、関数呼び出し、コメントから始めます。

コメント

コメントには、1行コメントと複数行コメントの2種類があります。 同じ行の//より後ろは、すべてコンパイラーに無視されます。 複数行コメントは、Cスタイルのコメントとも呼ばれます。 /*と*/で囲みます。 この間にあるものも、すべて無視されます。

変数

C++は型付き言語です。 すべての型はコンパイル時に判明している必要があり、ふつうは明示的に書く必要があります。 変数の型を後から変更することはできません。 yearsという名前の整数の変数は、次のように宣言します。

int years;

変数は宣言と同時に初期化するのがよい習慣です。 C++には、そのための仕組みがいくつか用意されています。 波括弧を使う書き方はモダンなC++に沿っていますが、イコールを使う書き方もよく使われます。

int tomatoes{80};
int potatoes = 40;
Caution

C++では、初期化していない変数を使うこともできます。 変数を意図的に設定するまで、その値は未定義で、何が入っているかわかりません。 設定前に使ってしまうエラーや未定義動作を避けるために、必ず初期化することをおすすめします。 未定義動作は、それまで問題なく動いていたプログラムを、最悪のタイミングでクラッシュさせることがあります。 どんなに強調してもしすぎることはありません。未定義動作は絶対に避けてください。

算術演算

*、+、-のような算術演算子は、3 * 2やtomatoes + potatoesのような式の一部になります。

変数の更新

型が変わらない範囲であれば、変数に値を再代入できます。

tomatoes = tomatoes - 5; // tomatoes is now 75
potatoes = (32 * 2) + 11; // potatoes is now 75 as well

関数

関数には、名前、戻り値の型、(空の場合もある)仮引数リストがあります。 常に47を返すalways_fortysevenという関数は、次のようになります。

int always_fortyseven() {
    return 47;
}

次は、仮引数を1つ持つvip_feeです。

int vip_fee(int standard_fee) {
    /*
    vip_fee calculates the vip fee based on the standard_fee.
    */
    int vip_multi{3};
    return standard_fee * vip_multi;
}

こちらはtotal_feeで、3つの仮引数を持ち、別の関数を呼び出しています。

int total_fee(int vips, int adults, int kids) {
    /*
    total_fee calculates the total price for a group of VIP and adult guests with kids.
    Kids get a flat discount on the standard fee.
    VIP guest fees are calculated by calling vip_fee.
    */
    int standard_fee{30};
    int kids_discount{15};

    int kids_total_fee = kids * (standard_fee - kids_discount);
    int vips_total_fee = vips * vip_fee(standard_fee);
    int adult_total_fee = adults * standard_fee;

    return vips_total_fee + adult_total_fee + kids_total_fee;
}

C++の関数は、ほかの言語のようには、最後の文の値を返しません。 コードをコンパイルするには、returnというキーワードが必要です。

空白

空白はソースコードの整形に使われ、スペース、タブ、改行などがあります。 コンパイラーは不要な空白を無視するので、コードを組み立てるために空白を活用できます。 空白をうまく使うと、コードが読みやすくなります。 整形の流儀はいくつかありますが、どれも慣習的なもので、コンパイラーが強制するものではありません。

// Formatting makes it easier to find bugs

int eggs_yolks =  3;
int      yeast = 15;

int flour=500;int sugar=200;// compact, but difficult to read

説明

ルシアンのガールフレンドがもうすぐ家に帰ってきますが、二人の結婚記念日のディナーはまだ作れていません!

この演習では、ルシアンがお気に入りのレシピ本を見ながら絶品ラザニアを作れるように、コードを書いていきます。

ラザニアの調理時間に関する4つのタスクがあります。

1. オーブンでの想定焼き時間(分)を定義する

引数を取らず、ラザニアをオーブンに入れておくべき時間を分単位で返すovenTime()関数を定義します。 レシピ本によると、想定されるオーブンでの焼き時間は40分です:

ovenTime();
// => 40

2. オーブンでの残りの焼き時間(分)を計算する

remainingOvenTime(int actualMinutesInOven)関数を定義します。この関数は、ラザニアをオーブンに入れてから実際に経過した時間を分単位で引数として受け取り、前のタスクで定義した想定焼き時間をもとに、ラザニアをあと何分オーブンに入れておく必要があるかを返します。

remainingOvenTime(30);
// => 10

3. 準備時間(分)を計算する

preparationTime(int numberOfLayers)関数を定義します。この関数は、ラザニアに重ねた層の数を引数として受け取り、1層あたり2分かかるものとして、ラザニアの準備に何分かかったかを返します。

preparationTime(2);
// => 4

4. 経過時間(分)を計算する

elapsedTime(int numberOfLayers, int actualMinutesInOven)関数を定義します。この関数は2つの引数を取ります。1つ目の引数はラザニアに重ねた層の数、2つ目の引数はラザニアをオーブンに入れてからの経過時間(分)です。この関数は、ラザニアの調理に費やした時間を分単位で返します。これは、準備にかかった時間と、その時点でラザニアがオーブンにあった時間の合計です。

elapsedTime(3, 20);
// => 26
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
C++ Exercism

ラザニアを始める準備はできましたか?

Exercismに登録すれば、19個のコンセプト100個の演習、そして本物の人間によるメンタリングとともに、C++を学んでマスターできます。すべて無料です。