使用 Kotlin 建立生日訊息

1. 簡介

在本程式碼研究室中,您將建立一個 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!".

完成的程式碼應會如下所示。

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. 執行程式碼。
  2. 請確認輸出窗格顯示祝 Rover 生日快樂!,且下方顯示您已經 5 歲了!和 5 歲是值得好好慶祝的年齡!
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

加入生日蛋糕

生日訊息需要一張生日主題圖像。例如蛋糕。您可以額外輸出幾行使用鍵盤與 println() 字母和符號的程式碼,藉此在生日訊息中加入蛋糕。

接續上方解決方案程式碼。

  1. 在程式碼的 Happy Birthday 和 You are already 5 兩個 println() 陳述式之間,加入下列這行輸出陳述式,如下所示。這樣就能建立蛋糕。最後一個 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. 建立及使用變數

將 Rover 的年齡儲存在變數中

  1. 您會發現在目前完成的程式碼中,重複了兩次相同的年齡數字。

您可以將這個數字在同一處儲存為變數,不必再重複。這就像是將數字放入箱中並取名。之後您就可以在需要這個值的時候使用該變數名稱。此外,如果年齡改變,您只需在同一處變更程式即可。變更變數後,所有使用該變數的地方都會輸出正確的年齡值。

  1. 將以下程式碼加入程式,做為 main() 函式中的第一行程式碼,用來建立名為 age、值為 5 的變數,如下所示。(這行程式碼必須放在 println() 陳述式前面)。
val age = 5

這一行代表:

  • val 是 Kotlin 使用的特殊字詞,稱為「關鍵字」,用來表示後面接著的是變數名稱。
  • age 為變數名稱。
  • = 讓 age (在其左側) 的值與右側的值相同。在數學中,會使用單一等號來表示兩側的值相同。與在數學中的不同,在 Kotlin 中,會使用單一等號來為左側的已命名變數指派右側的值。

開發人員會說:這行程式碼宣告名為 age 的變數,其被指派的值為 5。

如要在輸出陳述式中使用變數,您需要在變數周圍加上幾個符號,向系統說明接下來出現的是變數,而非文字。系統需要輸出該變數的值,而不是輸出文字。您只要在前面加上美元符號的大括號內放入變數即可,如下所示。

${variable}
  1. 將程式碼中兩個輸出陳述式的數字 5 改成 age 變數,如下所示。
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. 執行程式碼後,兩條訊息應會顯示相同的年齡。
  2. 將變數的值變更為其他值。舉例來說,您可以不用年份而用天數來表示 Rover 的年齡。只要將年齡乘以 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}!")

此外,您可以在輸出陳述式中擁有多個變數。

  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. 按一下滑鼠右鍵開啟選單,然後選擇「Select All」。
  3. 按下 backspace 鍵或 delete 鍵刪除所有程式碼。
  4. 複製下列程式碼並貼到編輯器中。
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. 執行程式,查看控制台中顯示的橫幅。
=======================
Happy Birthday, Jhansi!
=======================

建立函式來輸出邊框

您剛剛貼上並執行的程式碼是一個名為 main() 的函式,其中包含三個輸出陳述式。當您按下「Run」(執行) 按鈕時,系統會執行函式及其中所有的程式碼。

您的 Kotlin 程式一律須具有 main() 函式。此外,您可以自行建立並使用函式。就像變數讓您不必重複作業一樣,函式可以讓您不必多次撰寫相同的程式碼。程式碼中橫幅頂部和底部的輸出陳述式完全相同。讓我們建立並使用函式輸出這些邊框。

  1. 在編輯器的 main() 函式下方插入空白行,讓您預留一些空間處理工作。系統會忽略空白行,您可以在任何有助於管理程式碼的地方插入空白行。
  2. 建立函式。請先輸入 fun 關鍵字,再輸入名稱、printBorder、一組括號 (),以及一組大括號 {},如下所示。
fun printBorder() {}

關於命名函式。

  • 請注意 printBorder 函式的名稱開頭是小寫英文字母和動詞。絕大多數的函式名稱都以小寫英文字母和動詞開頭,且名稱應說明函式的用途。例如:print() 或這邊的 printBorder()。
  • 另請注意,名稱中的第二個字詞開頭是大寫。這種樣式稱為「駝峰式大小寫」,讓名稱更清楚易懂。還有一些名稱範例,像是 drawReallyCoolFancyBorder 和 printBirthdayMessage。
  1. 將 printBorder 函式的右大括號 } 放到新的一行,並在兩個大括號之間加入空白行,以騰出空間加入更多程式碼。將右大括號 } 單獨放在一行,可以讓函式的結束位置一目瞭然。
  2. 在 main() 函式中,複製邊框的輸出陳述式,並貼到 printBorder() 函式的大括號之間。

完成的 printBorder() 函式應會如下所示。

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

如要使用或呼叫函式,請使用加上括號的函式名稱。請注意,這是您一直以來使用 println() 的方式!因此,如要使用 printBorder 函式,請在程式碼中任何需要的地方呼叫 printBorder()。

  1. 在 main() 函式中,用呼叫 printBorder() 函式的 println(),來取代輸出邊框線的程式碼行。完成的程式碼應如下所示。
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. 執行程式碼,確保一切運作如常。

請注意,在不變更輸出內容的情況下,為了使其更臻完善或方便作業而變更程式碼的行為稱為「重構」。

重複邊框格式

您可以看到邊框線實際上是相同符號一直重複。因此,與其說:

「輸出由 23 個符號組成的字串」

您可以說:

「輸出這 1 個符號 23 次」。

只要在程式碼中使用 repeat() 陳述式即可。

  1. 在 printBorder() 函式中,使用 repeat() 陳述式輸出等號 23 次。
  2. 請使用 print(),而非使用 println(),以免在輸出每個「=」後跳至新的一行。

程式碼如下。現在有了輸出等號的單一指示,您可以使用 repeat() 陳述式重複該指示 23 次。

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!
=======================

使用引數變更邊框

如何建立使用不同符號 (例如下方符號) 的邊框?

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

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

您可以分別為這些不同符號定義獨立的函式。不過,有個更有效率的方法。您可以重複使用已撰寫的函式,使函式更具彈性,能夠適用於不同類型的符號。

函式的一大優點是,您可以使用引數來提供輸入內容。您在先前的程式碼研究室中認識 main() 時,曾短暫接觸這個概念。這個步驟中,您會在 printBorder() 函式中加入引數,來輸出您提供的任何邊框格式。

  1. 在 main() 頂部為邊框格式建立名為 border 的變數。即可保留邊框的重複文字。
val border = "%"
  1. 現在,請將 border 變數做為引數,傳遞至對 printBorder() 函式的兩個呼叫中。您只要將 border 放置在括號中 () 即可,就像您提供要輸出的文字給 println() 一樣。

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. 前往「Console」查看程式的輸出內容,卻發現畫面仍顯示先前的邊框?
=======================
Happy Birthday, Jhansi!
=======================

這不是預期的結果!您嘗試建立以「%」符號繪製的邊框,但程式仍顯示以「=」符號繪製的邊框。在後續步驟中,您將調查發生問題的原因。

  1. 注意編輯器中的灰色驚嘆號。這個圖示代表警告。警告會指出您需要注意的程式碼問題,但不會阻止程式碼執行。7579663a694ef6bd.png
  2. 將滑鼠游標懸停在驚嘆號上,就會出現訊息。系統顯示「"Parameter 'border' is never used."」警告,說明輸出內容的問題。您將新的邊框字串傳遞給函式,但並沒有將該字串用於輸出。
  3. 變更 printBorder() 函式,讓函式不要輸出「=」,而是使用傳遞到 border 中的內容。這就像是把 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() 函式中的一行程式碼,您會如何輸出像這樣的生日橫幅?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

修改函式,使其包含兩個引數

如要使用長度超過 1 個字元的其他格式 (例如 "'-._,-'") 的話該怎麼辦?重複 23 次這個格式太冗長了。您可以重複 4 次。要達成這個目的,您可以在 printBorder() 的 repeat() 陳述式中變更重複次數。不過您有更好的做法!

您可以根據兩個條件定義更精美的邊框:

  • 重複的格式 (已完成)
  • 格式的重複次數

您可以為格式和重複次數各自建立變數,然後將這兩項資訊傳遞至 printBorder() 函式。

  1. 在 main() 中,將邊框變更為 "'-._,-'" 格式。
val border = "`-._,-'"
  1. 執行程式碼,您會發現格式太長了。
  2. 在 main() 中的 border 定義下方,為重複次數建立名為 timesToRepeat 的新變數。將值設為 4。
val timesToRepeat = 4
  1. 在 main() 中呼叫 printBorder() 時,加上重複次數做為第二個引數。請以半形逗號分隔兩個引數。
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) {

注意事項:

  • 半形逗號會分隔兩個引數。
  • timesToRepeat 是引數的名稱,
  • 後面加上冒號 : 符號,
  • 而關於類型:Int. timesToRepeat 是數字,所以您必須將其設為類型 Int (整數的簡稱),而不是類型 String。
  1. 在 printBorder() 中,將 repeat 變更為使用 timesToRepeat 引數 (而非數字 23)。printBorder() 程式碼應會如下所示。
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. 執行程式碼。輸出內容會如下所示。
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. 為了讓輸出內容完美顯示,請在「生日快樂」訊息的開頭插入兩個空格。輸出內容就會如下所示。
`-._,-'`-._,-'`-._,-'`-._,-'
  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. 建立一個多層且點上蠟燭的蛋糕

在這項工作中,您將升級生日蛋糕程式碼,使其配合任何年齡產生正確的蛋糕尺寸和正確數量的蠟燭。

  • 您總共會建立三個函式來繪製一個點上蠟燭的多層蛋糕。
  • 您將在一個 repeat() 內部使用另一個 repeat(),建立所謂的「巢狀迴圈」。
  • 建構這個程式碼的方式,適用於建構任何程式,先從大方向開始,再加入細節。這就是所謂的「由上而下開發」。
  • 這個練習的操作說明並沒有很詳細,如果遇到問題,請參考完成的程式碼。

以下是您即將烘焙的蛋糕圖像:

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

操作說明如下。

建立 main() 函式

  1. 將編輯器中的程式碼重設為 Hello, world! 程式。
  2. 您不會用到 main() 的引數,因此可以將其移除。
  3. 在 main() 中建立變數 age,並將其設為 24。
  4. 在 main() 中建立第二個變數 layers,並將其設為 5。
  5. 在 main() 中呼叫函式 printCakeCandles(),並傳遞 age。這會造成錯誤發生,因為尚未建立該函式。
  6. 同樣地,請呼叫函式 printCakeTop(),並傳遞 age。
  7. 最後,請呼叫函式 printCakeBottom(),並傳遞 age 和 layers 的數量。
  8. 如要解決錯誤,請在每一行的開頭加上 //,即可註解排除三個函式呼叫,如下所示。這項技巧讓您可以在不觸發錯誤的情況下,撰寫程式碼草稿。
  9. 執行程式時,應不會發生錯誤,且程式不執行任何動作。

main() 函式應會如下所示。

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

建立 printCakeTop()

printCakeTop() 函式是一行等號,用於輸出蛋糕頂端,幾乎與您先前在程式碼研究室中建立的 printBorder() 函式相同。

==========================
  1. 在 main() 函式下方新增空白行,然後建立函式 printCakeTop(),接收 Int 類型的 age 引數。
  2. 在內部使用 repeat() 陳述式輸出單一等號 age 次,再加上 2 個等號。額外的兩個等號是為了讓蠟燭不會從蛋糕的側面掉下來。
  3. repeat() 完成後,請在結尾輸出一行空白行。
  4. 移除 main() 中 printCakeTop() 程式碼行開頭的兩個 // 符號,因為該函式已存在。
printCakeTop(age)

完成的函式如下。

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. 執行程式碼以查看蛋糕頂端。

建立 printCakeCandles()

每支蠟燭都由兩個符號組成:半形逗號 (,) 代表燭焰,豎線號 (|) 代表燭體。

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

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

如要用一個函式達成這點,請在函式中插入兩個 repeat() 陳述式,一個用於燭焰,另一個用於燭體。

  1. 在 main() 函式和 printCakeTop() 函式下方,建立一個新函式 printCakeCandles(),接收 Int 類型的 age 引數。
  2. 在內部使用 repeat() 陳述式輸出一個半形逗號 , 來代表燭焰。
  3. 重複 age 次。
  4. 在結尾輸出一行空白行。
  5. 新增輸出陳述式,用來輸出一個嵌入蠟燭的空間。
  6. 在下方重複上述步驟來建立第二個 repeat() 陳述式,用來使用豎線號 | 輸出燭體。
  7. 在結尾使用 println() 輸出新的一行。
  8. 移除 main() 中 printCakeCandles() 程式碼行開頭的兩個 // 符號。
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)。
  • 如要顯示蛋糕底部,請先重複 @ 符號 age + 2 次,即可顯示一層蛋糕。接著,重複輸出一層蛋糕 layers 次。

重複 @ 符號 age + 2 次,繪製一層蛋糕

  1. 在現有函式的下方,建立內含引數 age 和 layers 的函式 printCakeBottom(),兩個引數都是 Int 類型。
  2. 在函式中,使用 repeat() 陳述式輸出一層「at」@ 符號 age + 2 次。在結尾顯示空白行,如下所示。
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. 在 main() 中,移除 printCakeBottom(age, layers) 該行程式碼開頭的兩個 // 符號。
  2. 執行程式碼,確認是否顯示一行蛋糕底部。
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

巢狀 repeat() 陳述式

如要輸出多層相同的蛋糕底部,您可以這樣說:

第 1 層,重複符號 12 次:@@@@@@@@@@@@

第 2 層,重複符號 12 次:@@@@@@@@@@@@

第 3 層,重複符號 12 次:@@@@@@@@@@@@

或者您可以更簡潔地說:

重複三層:

重複顯示符號 12 次。

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

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

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

現在,您可以巧妙地使用 repeat() 陳述式來進行。您可以將一個 repeat() 陳述式放在另一個 repeat() 陳述式中。這樣就能在 repeat() 陳述式中建立 repeat() 陳述式,用來顯示特定次數的符號,繪製特定層數的蛋糕。

使用巢狀 repeat() 輸出蛋糕層

  1. 請在函式中的所有程式碼周圍放置第二個 repeat() 陳述式。重複此循環 layers 次。
  2. 請只移除 main() 中 printCakeBottom() 程式碼行的兩個 //。
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+Reload 重新載入頁面。
  • 稍候片刻,然後再試一次。

8. 摘要

  • 使用 ${} 在輸出陳述式的文字中包圍變數和計算。例如:${age},其中 age 是變數。
  • 使用 val 關鍵字和名稱建立變數。設定後即無法變更值。使用等號為變數指派值。例如文字和數字。
  • String 是使用引號括住的文字,例如 "Hello"。
  • Int 是一個正整數或負整數,例如 0、23 或 -1024。
  • 您可以將一或多個引數傳遞至函式中使用,例如:fun printCakeBottom(age:Int, layers:Int) {}
  • 使用 repeat() {} 陳述式重複多次一組指示。例如:repeat (23) { print("%") } 或 repeat (layers) { print("@@@@@@@@@@") }
  • 「迴圈」是指多次重複指示的指示。repeat() 陳述式是迴圈的範例。
  • 您可以建立巢狀迴圈,也就是將迴圈放入迴圈內。舉例來說,您可以在 repeat() 陳述式中建立 repeat() 陳述式,輸出特定次數、特定列數的符號,就像您輸出蛋糕層時一樣。

使用函式引數的摘要:如要針對函式使用引數,您必須執行三項操作:

  • 在函式定義中加入引數和類型:printBorder(border: String)
  • 在函式中使用引數:println(border)
  • 在呼叫函式時提供引數:printBorder(border)

9. 瞭解詳情

以下官方文件提供您在這個程式碼研究室中學到的 Kotlin 概念。