Kotlin で誕生日メッセージを作成する

1. はじめに

この Codelab では、簡単な Kotlin プログラムを作成して、ケーキと誕生日バナーが表示される誕生日メッセージを出力します。

前提条件

学習内容

  • プログラムから複雑なテキストを出力する方法。
  • Kotlin で基本的な計算を行い、結果を変数に格納して後で使用できるようにする方法。
  • 同じ文字列を複数回出力する関数を作成する方法。
  • テキスト スニペットを複数回出力するループを作成する方法。

作業内容

  • 誕生日メッセージ、アスキーアートのケーキの絵、バナーを出力する簡単なプログラムを作成します。

必要なもの

  • インターネットに接続でき、最新のウェブブラウザ(Chrome の最新バージョンなど)がインストールされたパソコン。

2. Kotlin で誕生日メッセージを作成する

スターター コードをセットアップする

  1. ブラウザで、https://developer.android.com/training/kotlinplayground にアクセスします。これにより、ブラウザベースの Kotlin プログラミング ツールが開きます。
  2. fun main() 関数内のテキスト "Hello, world!""Happy Birthday, Rover!" に置き換えます。
  3. その下の中かっこ内に、出力用の "You are already 5!""5 is the very best age to celebrate!". の 2 行を追加します。

完成したコードは次のようになります。

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. コードを実行します。
  2. 出力ペインの 1 行目に Happy Birthday, Rover!(ローバー、誕生日おめでとう!)、その下に You are already 5!(もう 5 歳ですね。)5 is the very best age to celebrate!(5 歳を記念して、盛大にお祝いしましょう)と表示されることを確認します。
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

バースデー ケーキを追加する

誕生日のメッセージには、誕生日をテーマにした画像が必要です。たとえば、ケーキなどです。キーボードと println() で文字と記号を何行か出力すると、誕生日メッセージにケーキを追加できます。

上記の解答コードから続行します。

  1. コード内の Happy BirthdayYou are already 5 の 2 つの println() ステートメントの間に、以下の print ステートメントの行を追加します。これにより、ケーキが作成されます。最後の println() ステートメントでは、引用符の間にテキストが存在しないため、空白行が出力されます。
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")
    println("")

ケーキの出力前にコメントを追加すると、他のユーザーにもコードが理解しやすくなります。コードを実行しても、出力が変化することはありません。コメントが、システムに対するコマンドではなく、デベロッパー向けの情報だからです。以下に示すように、// で始まるインライン コメントに続けて、テキストを入力します。

// This is a comment line
// This is another comment
  1. ケーキを出力する前に次のコメントを追加します: // Let's print a cake!
  2. 空白行を出力する前に次のコメントを追加します: // This prints an empty line

コードは次のようになります。

fun main() {
    println("Happy Birthday, Rover!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. コードを実行すると、出力は次のようになります。
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 5!
5 is the very best age to celebrate!

3. 変数を作成して使用する

ローバーの年齢を変数に格納する

  1. 完成したコードで、同じ年齢が 2 回繰り返されていることにお気づきでしょうか。

この数字を繰り返すのではなく、変数として 1 か所にまとめて格納できます。これは、数字をボックスに入力して、名前を付けるようなものです。この変数名は、値が必要なときにいつでも使用できます。また、年齢が変わった場合、プログラムを 1 か所変更するだけで済みます。変数を変更すると、正確な年齢が、変数が使用されているすべての場所に出力されます。

  1. プログラムの main() 関数内の最初の行に次のコードを追加して、age という変数(値は 5)を作成します(この行は、println() ステートメントの前に配置する必要があります)。
val age = 5

この行の意味は次のとおりです。

  • val は、Kotlin で使用される特殊な単語で、「キーワード」と呼ばれ、後続するものが変数の名前であることを示します。
  • age は、変数の名前です。
  • = は、左側の age の値を右側の値と同じにします。計算では、1 つの等号を使用して、両側の値が同じであることを示します。Kotlin では、数学とは異なり、1 つの等号を使用して右側の値を左側の名前付き変数に割り当てます。

すなわち、この行は age という名前の変数を宣言し、5 という値を割り当てられています。

print ステートメント内で変数を使用するには、後続するのがテキストではなく変数であることをシステムに伝えるために、変数を特定の記号で囲む必要があります。テキストを出力する代わりに、変数の値を出力する必要があるためです。たとえば、次の例のようにドル記号の後の変数を中かっこで囲みます。

${variable}
  1. 今書いているコードで、以下のように、両方の print ステートメント内の数字 5 を、age 変数に置き換えます。
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. コードを実行すると、両方のメッセージに同じ年齢が表示されます。
  2. 変数の値を別の値に変更してみましょう。たとえば、ローバーの年齢を年ではなく日数で表示できます。まず、年齢と 365 を乗算します(うるう年は無視します)。以下のように、変数を作成するとこの計算を正しく行えます。
val age = 5 * 365
  1. コードを再度実行すると、両方のメッセージに年齢が日数で表示されるようになります。
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 1825!
1825 is the very best age to celebrate!
  1. 任意: 日数に合わせて、出力メッセージのテキストを変更できます。たとえば、次のように修正します。
You are already 1825 days old!
1825 days old is the very best age to celebrate!

変数にテキストを代入する

変数には、数値だけでなくテキストも代入できます。

  1. age を表示する変数に、誕生日を迎える人の名前を表示するための name という変数を追加して、値を "Rover" に設定します。
val name = "Rover"
  1. 以下のように、誕生日メッセージに表示する名前 Rover を変数に置き換えます。
println("Happy Birthday, ${name}!")

print ステートメントには複数の変数を含めることができます。

  1. 以下のように、name 変数を使用して、年齢のメッセージに Rover を追加します。
println("You are already ${age} days old, ${name}!")

完成したコードは次のようになります。

fun main() {

    val age = 5 * 365
    val name = "Rover"

    println("Happy Birthday, ${name}!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already ${age} days old, ${name}!")
    println("${age} days old is the very best age to celebrate!")
}

これで、テキストを使ったメッセージの作成、記号によるグラフィックの作成、数字とテキストの変数への格納、変数を使ったテキストの出力ができるようになりました。

4. 枠線付きの誕生日バナーを出力する

このタスクでは、誕生日バナーを作成して、コードの繰り返し実行と再利用の手法によってコードを簡素化する方法と、それをするべき理由を学びます。

最初の誕生日バナーを作成する

  1. https://developer.android.com/training/kotlinplayground で、コード内の任意の場所にカーソルを合わせます。
  2. 右クリックしてメニューを開き、[すべて選択] を選択します。
  3. Backspace キーまたは Delete キーを押してすべてのコードを削除します。
  4. 次のコードをコピーしてエディタに貼り付けます。
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. プログラムを実行すると、コンソールにバナーが表示されます。
=======================
Happy Birthday, Jhansi!
=======================

枠線を出力する関数を作成する

上で貼り付けて実行したコードは、3 つの print ステートメントを含む main() という関数です。実行ボタンを押すと、関数とその関数内のすべてのコードが実行されます。

Kotlin プログラムには常に main() 関数が必要です。また、独自の関数を作成して使用することもできます。変数を使用すると作業の重複を避けられるように、関数を使用すると、同じコードを何度も作成する必要がなくなります。コードでは、バナーの一番上と下の print ステートメントが完全に同じです。この枠線用に関数を作成して、出力してみましょう。

  1. エディタの main() 関数の下に空の行を挿入して、作業スペースを確保します。空白行は無視されるため、好きな場所に空白行を挿入して、コードを見やすく整理できます。
  2. 関数を作成します。以下のように、fun キーワードの後に、名前 printBorder、かっこペア ()、中かっこペア {} をそれぞれ記述します。
fun printBorder() {}

関数に名前を付けます。

  • 関数 printBorder の名前は動詞で、小文字から始めます。関数名は通常、動詞で小文字から始め、関数の機能を示す名前にします。たとえば、print()printBorder() などです。
  • また、関数名の 2 つ目の単語は大文字で始めます。「キャメルケース」と呼ばれるこのスタイルは、名前を読みやすくします。他にも例としては、drawReallyCoolFancyBorderprintBirthdayMessage などが挙げられます。
  1. printBorder 関数の右中かっこ } を改行して中かっこの間に空白行を追加し、新しいコードを記述するスペースを確保します。右中かっこ } を独立した行に配置すると、関数の終了場所を簡単に確認できます。
  2. main() 関数の内部で、枠線の print ステートメントをコピーして、printBorder() 関数の中かっこ内に貼り付けます。

完成した printBorder() 関数は次のようになります。

fun printBorder() {
    println("=======================")
}

関数を使用または呼び出すには、関数名をかっことともに使用してください。なお、これは println() を使用した場合の方法です。printBorder 関数を使用する場合は、コード内の必要な箇所で printBorder() を呼び出します。

  1. main() 関数で、println() を使用して枠線を出力するコード行を printBorder() 関数の呼び出しに書き換えます。完成したコードは次のようになります。
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. コードを実行して、すべてがこれまでと同様に動作していることを確認します。

なお、出力を変更せずに、コードを改善または作業しやすく変更することを「リファクタリング」と呼びます。

枠線のパターンを繰り返す

枠線を見ると、まったく同じ記号が繰り返されています。つまり、

「23 個の記号が並ぶ文字列を出力する」

を、

「1 つの記号を 23 回出力する」と言い換えることができそうです。

コード内でこれを行うには、repeat() ステートメントを使用します。

  1. printBorder() 関数内で、repeat() ステートメントを使用して、等号を 23 回出力します。
  2. println() ではなく print() を使用すると、「=」の出力後に新しい行に毎回移動することがなくなります。

コードは次のとおりです。これで、1 回の指示で等号を出力できるようになりました。この指示を 23 回繰り返すには、repeat() ステートメントを使用します。

fun printBorder() {
    repeat(23) {
        print("=")
    }
}
  • repeat() ステートメントは単語 repeat で始まり、その後に () が続きます。このようなステートメントは、「ループ」と呼ばれます。同じコードを何度も繰り返す、すなわちループするためです。ループを作成するその他の方法については、後ほどご説明します。
  • かっこ () 内の値は繰り返しの回数です。
  • その後に、中かっこ {} が続きます。
  • 中かっこ {} 内のコードは、繰り返し用のコードです。
  1. printBorder() 関数内で、repeat() ステートメントの右中かっこ } の後(枠線の出力後)に、println() ステートメントを追加して改行します。

コードは次のようになります。

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}

main() 関数内のコードは変更されません。また、プログラム全体は次のようになります。

fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}
  1. コードを実行します。出力は前の例と同じですが、今回は「=」記号を一度だけ使用して枠線を作成できました。
=======================
Happy Birthday, Jhansi!
=======================

引数を使って枠線を変更する

次のように、異なる記号を使用する枠線を作成したい場合はどうすればよいでしょうか。

%%%%%%%%%%%%%%%%%%%%%%%

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

記号ごとに異なる関数を定義することもできますが、より効率的な方法があります。過去に記述した関数を再利用して柔軟性が高まるように変更し、さまざまな記号で機能するようにします。

関数の便利な点は、引数を使用して入力できることです。これは、前の Codelab で main() について学んだ際に、簡単に触れました。このステップでは、printBorder() 関数に引数を追加して、さまざまなパターンの枠線を出力できるようにします。

  1. main() の上部で、border という名前の変数を枠線パターン用に作成します。この変数は枠線で繰り返されるテキストを保持します。
val border = "%"
  1. 次に、この border 変数を引数として printBorder() 関数の両方の呼び出しに渡します。これを行うには、println() で出力用のテキストを記述した場合と同様に、border をかっこ () で囲みます。

main() 関数は次のコードのようになります。

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

printBorder() 関数は、この border の値を入力として受け取り、枠線全体を出力する方法を理解します。

  1. コードを実行します。コードは実行されずに、エラーアイコンがコードの横に表示されます。dd0286b7414cea42.png
  2. 出力パネルを確認すると、エラー メッセージが表示されています。

前と同様に、メッセージにはエラー箇所だけでなく、エラー内容に関するヒントも表示されます。重要なのは、Too many arguments for public fun printBorder() の箇所です。printBorder() 関数を呼び出して、枠線を入力として渡しています。ただし、printBorder() 関数定義では、今のところ入力を受け付けません。

  1. このエラーを解決するには、枠線の引数を printBorder() 関数定義に追加します。以下のコードの最初の行を参照してください。
fun printBorder(border: String) {
    repeat(23) {
        print("=")
    }
    println()
}
  • 引数名は border です。
  • その後にコロン : が続きます。
  • String という単語は、引数の種類やタイプを説明しています。

String は、引用符で囲まれた文字で構成されるテキストです。ビーズを糸に通してつなげるとネックレスになるのと同じように考えることができます。文字をつなげると単語やテキストになるわけです。引数を String として指定すると、システムは引数を(数値などではなく)テキストとして適用できるようになります。

  1. コードを実行します。printBorder() 関数が、枠線 String を入力として受け入れるようになりました。main() 内のコードは、border を引数として printBorder(border) を呼び出します。エラーなしでコードが実行されました。
  2. コンソールでプログラムの出力を調べましょう。前回と同じ枠線が引き続き表示されるでしょうか。
=======================
Happy Birthday, Jhansi!
=======================

これは想定した挙動ではありません。「%」記号で枠線を作成しようとしましたが、プログラムはまだ「=」記号の枠線を出力しています。次のステップで、その原因を調べます。

  1. エディタに、感嘆符がグレー表示されています。このアイコンは警告を表します。警告は、コードに注意の必要な問題があることを示すもので、コードの実行を妨げるものではありません。7579663a694ef6bd.png
  2. 感嘆符にカーソルを合わせると、メッセージが表示されます。「"Parameter 'border' is never used."」という警告は、出力に問題があることを示しています。枠線の新しい文字列を関数に渡しましたが、出力には使用していませんでした。
  3. 「=」を出力する代わりに、border で渡された値を使用するように printBorder() 関数を変更します。これは、関数内で定義した変数が border である場合とまったく同じように機能します。
fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}
  1. コードをもう一度実行します。出力は次のようになります。
%%%%%%%%%%%%%%%%%%%%%%%
Happy Birthday, Jhansi!
%%%%%%%%%%%%%%%%%%%%%%%

問題は解決しました。完成したコードは以下のとおりです。

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}

コードを追加せずに、printBorder() 関数の柔軟性を高めることができました。わずかな変更でさまざまな記号の枠線を出力できるようになりました。

  1. 任意: main() 関数でコードを 1 行だけ変更して以下の誕生日バナーを出力するには、どうすればよいですか?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

関数を変更して 2 つの引数を指定する

次に、2 文字以上の別のパターン、たとえば "'-._,-'" を使う場合を考えましょう。このパターンを 23 回繰り返すのはあまりにも長すぎます。4 回程度繰り返せばよいでしょう。printBorder()repeat() ステートメントの繰り返し回数を変更することで、回数の調整が可能です。ただし、他にもっと良い方法があります。

次の 2 つの点に基づいて、魅力的な枠線を定義できます。

  • 繰り返しパターン(すでに指定済み)
  • このパターンを繰り返す回数

パターンと繰り返しの回数にそれぞれ変数を作成して、両方の情報を printBorder() 関数に渡すことができます。

  1. main() で、枠線パターンを "'-._,-'" に変更します。
val border = "`-._,-'"
  1. コードを実行すると、パターンが長すぎることがわかります。
  2. main() で、border の定義の下に、繰り返し回数を表す timesToRepeat という名前の新しい変数を作成し、値を 4 に設定します。
val timesToRepeat = 4
  1. main()printBorder() を呼び出す際に、2 番目の引数として繰り返し回数を追加します。2 つの引数はカンマで区切ります。
printBorder(border, timesToRepeat)

main() 関数は次のようになります。

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

以前と同様、printBorder() の定義よりも printBorder() を呼び出す引数の方が多いため、このコードはエラーになります。

  1. 繰り返し回数を入力として受け入れるように printBorder() を修正します。引数の後にカンマを追加し、その後に引数 timesToRepeat: Int. を追加します。関数定義の最初の行は次のようになります。
fun printBorder(border: String, timesToRepeat: Int) {

注意:

  • 2 つの引数をカンマで区切ります。
  • timesToRepeat は引数の名前です。
  • 次にコロン記号「:」が続きます。
  • さらに、型を指定します。Int. timesToRepeat が数値であるため、String 型にするのではなく、Int 型にする必要があります。これは、Integer(整数)の短縮形です。
  1. printBorder() 内で、repeat を変更して、(数値 23 ではなく)timesToRepeat 引数を使用します。コード printBorder() の内容は次のようになります。
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. コードを実行します。出力は次のようになります。
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. 出力の形を整えるために、「Happy Birthday」メッセージの先頭にスペースを 2 つ挿入します。次のように出力されます。
`-._,-'`-._,-'`-._,-'`-._,-'
  Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'

バナーの最終的なコードは以下のとおりです。

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("  Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}

これで、関数、引数、変数、繰り返しループなど、ほぼすべてのプログラミングで使用する基本的な構成要素について理解を深められました。

休憩を挟んで、次のタスクに取り組みましょう。関数やループをさらに作成して、わずか数行のプログラミングで、正しい本数のキャンドルを立てた大きなケーキを作り上げる力を身につけます。

5. 段重ねとキャンドルのあるケーキを作成する

このタスクでは、バースデー ケーキのコードをアップグレードして、どの年齢でも正しい本数のキャンドルを立てた適切なサイズのケーキを出力します。

  • 段重ねケーキとキャンドルを描画するには、合計 3 つの関数を作成します。
  • repeat() 内で別の repeat() を使用して、「ネストされたループ」と呼ばれるものを作成します。
  • 全体像から始めて、細かいところを追加するこのコードのビルド方法は、あらゆるプログラムのビルドに応用できます。これを「トップダウン開発」と呼びます。
  • この練習の手順はこれまでよりも詳細ではないため、行き詰まった場合は、完成したコードを参照してください。

以下が、これから作るケーキです。

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

手順は以下のとおりです。

main() 関数を作成する

  1. エディタでコードを Hello, world! プログラムにリセットします。
  2. main() の引数は使用しないため、削除できます。
  3. main() で変数 age を作成し、24 に設定します。
  4. main() で、2 つ目の変数 layers を作成し、5 に設定します。
  5. main() で関数 printCakeCandles() を呼び出し、age を渡します。まだ関数を作成していないため、エラーは表示されたままです。
  6. 同様に、関数 printCakeTop() を呼び出し、age も渡します。
  7. 最後に、関数 printCakeBottom() を呼び出し、agelayers の数を渡します。
  8. エラーを解消するには、以下に示すように、各行の先頭に // を追加して 3 つの関数呼び出しをコメントアウトします。これにより、エラーを発生させずにコードの下書きを作成できます。
  9. プログラムを実行するとエラーは発生せず、何も起こりません。

main() 関数は次のコードのようになります。

fun main() {
    val age = 24
    val layers = 5
    // printCakeCandles(age)
    // printCakeTop(age)
    // printCakeBottom(age, layers)
}

printCakeTop() を作成する

ケーキの一番上に等号による線を出力する printCakeTop() 関数は、この Codelab の前半で作成した printBorder() 関数とほとんど同じです。

==========================
  1. main() 関数の下に空白行を追加して printCakeTop() 関数を作成し、Int 型の引数 age を 1 つ指定します。
  2. その中に、repeat() ステートメントを使用して、age に 2 を足した回数分の等号を出力します。2 つの等号を追加したのは、キャンドルがケーキの側面から落ちないようにするためです。
  3. 最後に、repeat() が完了したら、空の行を出力します。
  4. この関数が存在するようになったため、main() で、printCakeTop() のコードの先頭にある 2 つの // 記号を削除します。
printCakeTop(age)

完成した関数を以下に示します。

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. コードを実行してケーキの上面を確認します。

printCakeCandles() を作成する

キャンドルは、それぞれ炎を表すカンマ(,)と、キャンドル本体を表す縦線(|)の 2 つの記号で構成されます。

,,,,,,,,,,,,,,,,,,,,,,,,

||||||||||||||||||||||||

これを 1 つの関数で実現するには、炎とキャンドル本体用の 2 つの repeat() ステートメントを関数に含めます。

  1. main() 関数と printCakeTop() 関数の下に新しい関数 printCakeCandles() を作成して、Int 型の引数 age を指定します。
  2. 内部では、repeat() ステートメントを使用して、炎を示すカンマ , を 1 つ出力します。
  3. これを age 分の回数繰り返します。
  4. その後、空の行を出力します。
  5. print ステートメントを追加して、キャンドルをはめ込むためのスペースを 1 つ出力します。
  6. 次に、上と同様にして 2 番目の repeat() ステートメントを作成し、縦線 | でキャンドル本体を出力します。
  7. 最後に、println() を使用して空の行を出力します。
  8. main() で、printCakeCandles() のコードの先頭にある 2 つの // 記号を削除します。
printCakeCandles(age)
  1. コードを実行して、キャンドルが乗ったケーキの上段を確認しましょう。

解答:

fun printCakeCandles(age: Int) {
    print(" ")
    repeat(age) {
        print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

printCakeBottom() を作成する

この関数では、age + 2 と同じ幅のケーキの下段を描画し、指定したレイヤ数の高さで描画します。

@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
  • つまり、関数には幅(age)と高さ(layers)の 2 つの引数が必要です。
  • ケーキの下段を出力するには、最初に「@(アット)」記号を age + 2 回繰り返してレイヤを 1 つ出力します。次に、このレイヤを layers の回数分繰り返します。

年齢に 2 を足した回数分 @ 記号を描画してレイヤを作成する

  1. 既存の関数の下に、agelayers の 2 つの引数(どちらも Int 型)を持つ関数 printCakeBottom() を作成します。
  2. 関数内で repeat() ステートメントを使用して、「@(アット)」記号のレイヤを age + 2 回分、出力します。以下に示すように、最後に空の行を出力します。
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. main() で、printCakeBottom(age, layers) のコード行の先頭にある 2 つの // 記号を削除します。
  2. コードを実行して、ケーキの下段が 1 行出力されることを確認します。
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

ネストされた repeat() ステートメント

以下のように、ケーキの下段の同じレイヤを複数出力できます。

1 番目のレイヤに、記号を 12 回繰り返して、次のように出力する: @@@@@@@@@@@@

2 番目のレイヤに、記号を 12 回繰り返して、次のように出力する: @@@@@@@@@@@@

3 番目のレイヤに、記号を 12 回繰り返して、次のように出力する: @@@@@@@@@@@@

または、次のように大幅に簡素化できます。

3 つのレイヤに対し以下のように繰り返します。

記号を 12 回繰り返します。

@@@@@@@@@@@@

@@@@@@@@@@@@

@@@@@@@@@@@@

これは、repeat() ステートメントを使うと便利に行えます。repeat() ステートメント内には、別の repeat() ステートメントを格納できます。repeat() ステートメント内に repeat() ステートメントを作成すると、記号を特定の回数繰り返して、特定の数のレイヤを出力できます。

ネストされた repeat() を使用してケーキレイヤを出力する

  1. 関数内のすべてのコードを、2 つ目の repeat() ステートメントで囲みます。このループを layers の回数分、繰り返します。
  2. main() で、printCakeBottom() の行から 2 つの // だけを削除します。
printCakeBottom(age, layers)
  1. コードを実行してケーキ全体を表示します。

printCakeBottom() の解答は次のとおりです。

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

これで、いくつかの関数とネストされた repeat ステートメントを使用して、複雑なプログラムをビルドできました。ケーキの上には、常に正確な数のキャンドルが立っています。

プログラムの最終出力は次のようになります。

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

6. 解答コード

fun main() {
    val age = 24
    val layers = 5
    printCakeCandles(age)
    printCakeTop(age)
    printCakeBottom(age, layers)
}

fun printCakeCandles(age: Int) {
    print (" ")
    repeat(age) {
          print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

7. トラブルシューティング

ブラウザベースの Kotlin プログラミング ツールでコードが実行されない場合、またはコードに関連しない予期しないエラーが発生した場合は、次の方法を試してください。

  • Shift+ 再読み込みを使用して、ページを再読み込みします。
  • しばらくして、もう一度試します。

8. まとめ

  • ${} は、print ステートメントのテキストで変数と計算を囲む場合に使用します。たとえば、${age} では、age が変数です。
  • val キーワードと名前を使用して変数を作成します。この値は一度設定すると変更できません。等号を使用して、値を変数に割り当てます。値の例には、テキストや数字などがあります。
  • String は、引用符で囲まれたテキスト("Hello" など)です。
  • Int は、0、23、-1,024 などの正または負の整数です。
  • 以下のように、使用する関数に 1 つ以上の引数を渡すことができます。fun printCakeBottom(age:Int, layers:Int) {}
  • 一連の手順を繰り返すには、repeat() {} ステートメントを使用します。たとえば、repeat (23) { print("%") }repeat (layers) { print("@@@@@@@@@@") } などです。
  • ループとは、指示を何度も繰り返す手順です。repeat() ステートメントはループの例です。
  • ループをネストする、つまりループ内でループさせることができます。たとえば、repeat() ステートメント内に repeat() ステートメントを作成して、ケーキのレイヤで行ったのと同じように、行数の回数だけ記号を出力できます。

関数の引数の使用に関する概要: 関数で引数を使用するには、次の 3 つの作業を行う必要があります。

  • 引数と型を関数の定義に追加する: printBorder(border: String)
  • 引数を関数内で使用する: println(border)
  • 関数の呼び出し時に引数を指定する: printBorder(border)

9. 詳細

以下は、この Codelab で学んだ Kotlin のコンセプトの公式ドキュメントです。