使用 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 BirthdayYou 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()
  • 另請注意,名稱中的第二個字詞開頭是大寫。這種樣式稱為「駝峰式大小寫」,讓名稱更清楚易懂。還有一些名稱範例,像是 drawReallyCoolFancyBorderprintBirthdayMessage
  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(),並傳遞 agelayers 的數量。
  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. 在現有函式的下方,建立內含引數 agelayers 的函式 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 概念。