1. 簡介
在本程式碼研究室中,您將建立一個 Kotlin 小程式,這個程式會顯示包含蛋糕和生日橫幅的生日訊息。
必要條件
- 瞭解如何在以瀏覽器為基礎的 Kotlin 程式設計工具 (https://developer.android.com/training/kotlinplayground) 中,開啟及編輯程式碼。
- 瞭解「在 Kotlin 中編寫第一個程式」程式碼研究室中的
"Hello world!"
程式。 - 瞭解如何使用
println()
,將文字寫入線上 Kotlin 程式碼編輯器的控制台。
學習目標
- 如何輸出程式中更複雜的文字。
- 如何使用 Kotlin 進行基本數學運算,並將結果儲存在變數中,以便後續使用。
- 如何建立可以多次輸出相同字串的函式。
- 如何建立可以多次輸出文字片段的迴圈。
建構目標
- 您將建立一個小程式,用來顯示生日訊息、以文字繪製的蛋糕圖像,還有橫幅。
需求條件
- 電腦可以連上網際網路且具備新版網路瀏覽器,例如最新版本的 Chrome。
2. 使用 Kotlin 建立生日訊息
設定範例程式碼
- 在瀏覽器中開啟 https://developer.android.com/training/kotlinplayground。系統會開啟使用瀏覽器的 Kotlin 程式設計工具。
- 在
fun main()
函式中,將"Hello, world!"
文字改為"Happy Birthday, Rover!"
。 - 在下方 (仍然在大括號內) 新增兩行要輸出的程式碼:
"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!")
}
- 執行程式碼。
- 請確認輸出窗格顯示祝 Rover 生日快樂!,且下方顯示您已經 5 歲了!和 5 歲是值得好好慶祝的年齡!
Happy Birthday, Rover! You are already 5! 5 is the very best age to celebrate!
加入生日蛋糕
生日訊息需要一張生日主題圖像。例如蛋糕。您可以額外輸出幾行使用鍵盤與 println()
字母和符號的程式碼,藉此在生日訊息中加入蛋糕。
接續上方解決方案程式碼。
- 在程式碼的
Happy Birthday
和You are already 5
兩個println()
陳述式之間,加入下列這行輸出陳述式,如下所示。這樣就能建立蛋糕。最後一個println()
陳述式在引號之間沒有文字,因此會輸出空白行。
println(" ,,,,, ")
println(" ||||| ")
println(" =========")
println("@@@@@@@@@@@")
println("{~@~@~@~@~}")
println("@@@@@@@@@@@")
println("")
如要協助其他使用者瞭解您的程式碼,可以在輸出蛋糕前新增註解。執行程式碼時,輸出結果不會有任何不同,因為註解是提供給您和其他開發人員的資訊,而不是給系統的指令。內嵌註解以 //
開頭,後面接著文字,如下所示。
// This is a comment line
// This is another comment
- 在輸出蛋糕前加上註解:
// Let's print a cake!
。 - 在輸出空白行前加上註解:
// 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!")
}
- 執行程式碼後,輸出內容應會如下所示。
Happy Birthday, Rover! ,,,,, ||||| ========= @@@@@@@@@@@ {~@~@~@~@~} @@@@@@@@@@@ You are already 5! 5 is the very best age to celebrate!
3. 建立及使用變數
將 Rover 的年齡儲存在變數中
- 您會發現在目前完成的程式碼中,重複了兩次相同的年齡數字。
您可以將這個數字在同一處儲存為變數,不必再重複。這就像是將數字放入箱中並取名。之後您就可以在需要這個值的時候使用該變數名稱。此外,如果年齡改變,您只需在同一處變更程式即可。變更變數後,所有使用該變數的地方都會輸出正確的年齡值。
- 將以下程式碼加入程式,做為
main()
函式中的第一行程式碼,用來建立名為age
、值為 5 的變數,如下所示。(這行程式碼必須放在println()
陳述式前面)。
val age = 5
這一行代表:
val
是 Kotlin 使用的特殊字詞,稱為「關鍵字」,用來表示後面接著的是變數名稱。age
為變數名稱。=
讓age
(在其左側) 的值與右側的值相同。在數學中,會使用單一等號來表示兩側的值相同。與在數學中的不同,在 Kotlin 中,會使用單一等號來為左側的已命名變數指派右側的值。
開發人員會說:這行程式碼宣告名為 age
的變數,其被指派的值為 5
。
如要在輸出陳述式中使用變數,您需要在變數周圍加上幾個符號,向系統說明接下來出現的是變數,而非文字。系統需要輸出該變數的值,而不是輸出文字。您只要在前面加上美元符號的大括號內放入變數即可,如下所示。
${variable}
- 將程式碼中兩個輸出陳述式的數字 5 改成
age
變數,如下所示。
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
- 執行程式碼後,兩條訊息應會顯示相同的年齡。
- 將變數的值變更為其他值。舉例來說,您可以不用年份而用天數來表示 Rover 的年齡。只要將年齡乘以 365 (忽略閏年) 即可。您可以在建立變數的當下進行計算,如下所示。
val age = 5 * 365
- 再次執行程式碼,您會發現兩條訊息現在都以天數顯示年齡。
Happy Birthday, Rover! ,,,,, ||||| ========= @@@@@@@@@@@ {~@~@~@~@~} @@@@@@@@@@@ You are already 1825! 1825 is the very best age to celebrate!
- [選用] 請變更輸出訊息的文字,使其配合天數呈現。例如,將其變更為:
You are already 1825 days old! 1825 days old is the very best age to celebrate!
將文字放入變數
您不僅可以將數字放入變數,也可以放入文字。
- 在
age
的變數下方,新增名為name
的變數代表壽星名字,並將值設為"Rover"
。
val name = "Rover"
- 用變數取代生日訊息中的名字
Rover
,如下所示。
println("Happy Birthday, ${name}!")
此外,您可以在輸出陳述式中擁有多個變數。
- 使用
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. 輸出加上邊框的生日橫幅
在這項工作中,您將建立一個生日橫幅,並利用技巧處理重複使用的程式碼,藉此學習如何簡化程式碼,以及這樣做的好處。
建立範例生日橫幅
- 在 https://developer.android.com/training/kotlinplayground 中,將游標移到程式碼內的某個位置。
- 按一下滑鼠右鍵開啟選單,然後選擇「Select All」。
- 按下 backspace 鍵或 delete 鍵刪除所有程式碼。
- 複製下列程式碼並貼到編輯器中。
fun main() {
println("=======================")
println("Happy Birthday, Jhansi!")
println("=======================")
}
- 執行程式,查看控制台中顯示的橫幅。
======================= Happy Birthday, Jhansi! =======================
建立函式來輸出邊框
您剛剛貼上並執行的程式碼是一個名為 main()
的函式,其中包含三個輸出陳述式。當您按下「Run」(執行) 按鈕時,系統會執行函式及其中所有的程式碼。
您的 Kotlin 程式一律須具有 main()
函式。此外,您可以自行建立並使用函式。就像變數讓您不必重複作業一樣,函式可以讓您不必多次撰寫相同的程式碼。程式碼中橫幅頂部和底部的輸出陳述式完全相同。讓我們建立並使用函式輸出這些邊框。
- 在編輯器的
main()
函式下方插入空白行,讓您預留一些空間處理工作。系統會忽略空白行,您可以在任何有助於管理程式碼的地方插入空白行。 - 建立函式。請先輸入
fun
關鍵字,再輸入名稱、printBorder
、一組括號()
,以及一組大括號{}
,如下所示。
fun printBorder() {}
關於命名函式。
- 請注意
printBorder
函式的名稱開頭是小寫英文字母和動詞。絕大多數的函式名稱都以小寫英文字母和動詞開頭,且名稱應說明函式的用途。例如:print()
或這邊的printBorder()
。 - 另請注意,名稱中的第二個字詞開頭是大寫。這種樣式稱為「駝峰式大小寫」,讓名稱更清楚易懂。還有一些名稱範例,像是
drawReallyCoolFancyBorder
和printBirthdayMessage
。
- 將
printBorder
函式的右大括號}
放到新的一行,並在兩個大括號之間加入空白行,以騰出空間加入更多程式碼。將右大括號}
單獨放在一行,可以讓函式的結束位置一目瞭然。 - 在
main()
函式中,複製邊框的輸出陳述式,並貼到printBorder()
函式的大括號之間。
完成的 printBorder()
函式應會如下所示。
fun printBorder() {
println("=======================")
}
如要使用或呼叫函式,請使用加上括號的函式名稱。請注意,這是您一直以來使用 println()
的方式!因此,如要使用 printBorder
函式,請在程式碼中任何需要的地方呼叫 printBorder()
。
- 在
main()
函式中,用呼叫printBorder()
函式的println()
,來取代輸出邊框線的程式碼行。完成的程式碼應如下所示。
fun main() {
printBorder()
println("Happy Birthday, Jhansi!")
printBorder()
}
fun printBorder() {
println("=======================")
}
- 執行程式碼,確保一切運作如常。
請注意,在不變更輸出內容的情況下,為了使其更臻完善或方便作業而變更程式碼的行為稱為「重構」。
重複邊框格式
您可以看到邊框線實際上是相同符號一直重複。因此,與其說:
「輸出由 23 個符號組成的字串」
您可以說:
「輸出這 1 個符號 23 次」。
只要在程式碼中使用 repeat()
陳述式即可。
- 在
printBorder()
函式中,使用repeat()
陳述式輸出等號 23 次。 - 請使用
print()
,而非使用println()
,以免在輸出每個「=」後跳至新的一行。
程式碼如下。現在有了輸出等號的單一指示,您可以使用 repeat()
陳述式重複該指示 23 次。
fun printBorder() {
repeat(23) {
print("=")
}
}
repeat()
陳述式的開頭為repeat
這個字詞,後面接著()
。這種陳述式稱為「迴圈」,因為會重複或循環多次相同的程式碼。我們之後會說明其他建立迴圈的方法。- 括號
()
中的是重複次數。 - 後面接著大括號
{}
。 - 大括號
{}
中是要重複的程式碼。
- 在
printBorder()
函式中的repeat()
陳述式右大括號 } 後面 (也就是輸出邊框後),加入println()
陳述式來輸出新的一行。
程式碼現在應會如下所示。
fun printBorder() {
repeat(23) {
print("=")
}
println()
}
main()
函式中的程式碼維持不變,整個程式看起來會像這樣。
fun main() {
printBorder()
println("Happy Birthday, Jhansi!")
printBorder()
}
fun printBorder() {
repeat(23) {
print("=")
}
println()
}
- 執行程式碼。輸出結果應與先前相同,但這次只需指定一次「=」符號就能建立邊框!
======================= Happy Birthday, Jhansi! =======================
使用引數變更邊框
如何建立使用不同符號 (例如下方符號) 的邊框?
%%%%%%%%%%%%%%%%%%%%%%%
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
您可以分別為這些不同符號定義獨立的函式。不過,有個更有效率的方法。您可以重複使用已撰寫的函式,使函式更具彈性,能夠適用於不同類型的符號。
函式的一大優點是,您可以使用引數來提供輸入內容。您在先前的程式碼研究室中認識 main()
時,曾短暫接觸這個概念。這個步驟中,您會在 printBorder()
函式中加入引數,來輸出您提供的任何邊框格式。
- 在
main()
頂部為邊框格式建立名為border
的變數。即可保留邊框的重複文字。
val border = "%"
- 現在,請將
border
變數做為引數,傳遞至對printBorder()
函式的兩個呼叫中。您只要將border
放置在括號中()
即可,就像您提供要輸出的文字給println()
一樣。
main()
函式應會如下所示。
fun main() {
val border = "%"
printBorder(border)
println("Happy Birthday, Jhansi!")
printBorder(border)
}
printBorder()
函式會將這個 border
的值做為輸入內容,並判斷如何顯示完整邊框。
- 執行程式碼。但程式碼不會執行,程式碼旁邊還會顯示錯誤圖示。
- 請查看輸出面板的錯誤訊息。
如同以往,訊息會顯示錯誤發生的位置,並給予錯誤原因的提示。關鍵處在於:Too many arguments for public fun printBorder()
。您正在呼叫 printBorder()
函式,並傳遞邊框做為輸入內容。但 printBorder()
函式定義目前不接受任何輸入。
- 修正錯誤的方法是在
printBorder()
函式定義中加入邊框的引數。請看以下程式碼的第一行。
fun printBorder(border: String) {
repeat(23) {
print("=")
}
println()
}
- 請注意,引數的名稱是
border
。 - 名稱後方有冒號
:
- 以及
String
這個字詞。這是對引數種類或類型的說明。
String
是一段由字元組成、使用引號括住的文字。就像是將珠子用線串成項鍊一樣,把字元串成字詞和文字。指定引數必須是 String
,可協助系統強制引數為文字,而不是別的,像是數字。
- 執行程式碼。
printBorder()
函式現在可接受邊框String
做為輸入內容。且main()
中的程式碼會以border
為引數呼叫printBorder(border)
。程式碼應該可以順利執行了。 - 前往「Console」查看程式的輸出內容,卻發現畫面仍顯示先前的邊框?
======================= Happy Birthday, Jhansi! =======================
這不是預期的結果!您嘗試建立以「%」符號繪製的邊框,但程式仍顯示以「=」符號繪製的邊框。在後續步驟中,您將調查發生問題的原因。
- 注意編輯器中的灰色驚嘆號。這個圖示代表警告。警告會指出您需要注意的程式碼問題,但不會阻止程式碼執行。
- 將滑鼠游標懸停在驚嘆號上,就會出現訊息。系統顯示「
"Parameter 'border' is never used."
」警告,說明輸出內容的問題。您將新的邊框字串傳遞給函式,但並沒有將該字串用於輸出。 - 變更
printBorder()
函式,讓函式不要輸出「=」,而是使用傳遞到border
中的內容。這就像是把border
當成您在函式中定義的變數!
fun printBorder(border: String) {
repeat(23) {
print(border)
}
println()
}
- 再次執行程式碼。輸出內容應會如下所示。
%%%%%%%%%%%%%%%%%%%%%%% 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()
函式的彈性。現在只要稍做變更,就能輸出不同符號的邊框。
- [選用] 如果只變更
main()
函式中的一行程式碼,您會如何輸出像這樣的生日橫幅?
*********************** Happy Birthday, Jhansi! ***********************
::::::::::::::::::::::: Happy Birthday, Jhansi! :::::::::::::::::::::::
修改函式,使其包含兩個引數
如要使用長度超過 1 個字元的其他格式 (例如 "'-._,-'"
) 的話該怎麼辦?重複 23 次這個格式太冗長了。您可以重複 4 次。要達成這個目的,您可以在 printBorder()
的 repeat()
陳述式中變更重複次數。不過您有更好的做法!
您可以根據兩個條件定義更精美的邊框:
- 重複的格式 (已完成)
- 格式的重複次數
您可以為格式和重複次數各自建立變數,然後將這兩項資訊傳遞至 printBorder()
函式。
- 在
main()
中,將邊框變更為"'-._,-'"
格式。
val border = "`-._,-'"
- 執行程式碼,您會發現格式太長了。
- 在
main()
中的border
定義下方,為重複次數建立名為timesToRepeat
的新變數。將值設為 4。
val timesToRepeat = 4
- 在
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()
中的定義。
- 修正
printBorder()
,使其一併接受重複次數做為輸入內容。請在引數後面加上半形逗號,再加上額外的引數:timesToRepeat: Int.
。函式定義的第一行看起來會如下所示。
fun printBorder(border: String, timesToRepeat: Int) {
注意事項:
- 半形逗號會分隔兩個引數。
timesToRepeat
是引數的名稱,- 後面加上冒號 : 符號,
- 而關於類型:
Int. timesToRepeat
是數字,所以您必須將其設為類型Int
(整數的簡稱),而不是類型String
。
- 在
printBorder()
中,將repeat
變更為使用timesToRepeat
引數 (而非數字 23)。printBorder()
程式碼應會如下所示。
fun printBorder(border: String, timesToRepeat: Int) {
repeat(timesToRepeat) {
print(border)
}
println()
}
- 執行程式碼。輸出內容會如下所示。
`-._,-'`-._,-'`-._,-'`-._,-' Happy Birthday, Jhansi! `-._,-'`-._,-'`-._,-'`-._,-'
- 為了讓輸出內容完美顯示,請在「生日快樂」訊息的開頭插入兩個空格。輸出內容就會如下所示。
`-._,-'`-._,-'`-._,-'`-._,-' 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() 函式
- 將編輯器中的程式碼重設為
Hello, world!
程式。 - 您不會用到
main()
的引數,因此可以將其移除。 - 在
main()
中建立變數age
,並將其設為 24。 - 在
main()
中建立第二個變數layers
,並將其設為 5。 - 在
main()
中呼叫函式printCakeCandles()
,並傳遞age
。這會造成錯誤發生,因為尚未建立該函式。 - 同樣地,請呼叫函式
printCakeTop()
,並傳遞age
。 - 最後,請呼叫函式
printCakeBottom()
,並傳遞age
和layers
的數量。 - 如要解決錯誤,請在每一行的開頭加上
//
,即可註解排除三個函式呼叫,如下所示。這項技巧讓您可以在不觸發錯誤的情況下,撰寫程式碼草稿。 - 執行程式時,應不會發生錯誤,且程式不執行任何動作。
main()
函式應會如下所示。
fun main() {
val age = 24
val layers = 5
// printCakeCandles(age)
// printCakeTop(age)
// printCakeBottom(age, layers)
}
建立 printCakeTop()
printCakeTop()
函式是一行等號,用於輸出蛋糕頂端,幾乎與您先前在程式碼研究室中建立的 printBorder()
函式相同。
==========================
- 在
main()
函式下方新增空白行,然後建立函式printCakeTop()
,接收Int
類型的age
引數。 - 在內部使用
repeat()
陳述式輸出單一等號age
次,再加上 2 個等號。額外的兩個等號是為了讓蠟燭不會從蛋糕的側面掉下來。 repeat()
完成後,請在結尾輸出一行空白行。- 移除
main()
中printCakeTop()
程式碼行開頭的兩個//
符號,因為該函式已存在。
printCakeTop(age)
完成的函式如下。
fun printCakeTop(age: Int) {
repeat(age + 2) {
print("=")
}
println()
}
- 執行程式碼以查看蛋糕頂端。
建立 printCakeCandles()
每支蠟燭都由兩個符號組成:半形逗號 (,) 代表燭焰,豎線號 (|) 代表燭體。
,,,,,,,,,,,,,,,,,,,,,,,,
||||||||||||||||||||||||
如要用一個函式達成這點,請在函式中插入兩個 repeat()
陳述式,一個用於燭焰,另一個用於燭體。
- 在
main()
函式和printCakeTop()
函式下方,建立一個新函式printCakeCandles()
,接收Int
類型的age
引數。 - 在內部使用
repeat()
陳述式輸出一個半形逗號,
來代表燭焰。 - 重複
age
次。 - 在結尾輸出一行空白行。
- 新增輸出陳述式,用來輸出一個嵌入蠟燭的空間。
- 在下方重複上述步驟來建立第二個
repeat()
陳述式,用來使用豎線號 | 輸出燭體。 - 在結尾使用
println()
輸出新的一行。 - 移除
main()
中printCakeCandles()
程式碼行開頭的兩個//
符號。
printCakeCandles(age)
- 執行程式碼以查看蛋糕頂部和蠟燭。
解決方法:
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 次,繪製一層蛋糕
- 在現有函式的下方,建立內含引數
age
和layers
的函式printCakeBottom()
,兩個引數都是Int
類型。 - 在函式中,使用
repeat()
陳述式輸出一層「at」@
符號age + 2
次。在結尾顯示空白行,如下所示。
fun printCakeBottom(age: Int, layers: Int) {
repeat(age + 2) {
print("@")
}
println()
}
- 在
main()
中,移除printCakeBottom(age, layers)
該行程式碼開頭的兩個//
符號。 - 執行程式碼,確認是否顯示一行蛋糕底部。
,,,,,,,,,,,,,,,,,,,,,,,, |||||||||||||||||||||||| ========================== @@@@@@@@@@@@@@@@@@@@@@@@@@
巢狀 repeat() 陳述式
如要輸出多層相同的蛋糕底部,您可以這樣說:
第 1 層,重複符號 12 次:@@@@@@@@@@@@
第 2 層,重複符號 12 次:@@@@@@@@@@@@
第 3 層,重複符號 12 次:@@@@@@@@@@@@
或者您可以更簡潔地說:
重複三層:
重複顯示符號 12 次。
@@@@@@@@@@@@
@@@@@@@@@@@@
@@@@@@@@@@@@
現在,您可以巧妙地使用 repeat()
陳述式來進行。您可以將一個 repeat()
陳述式放在另一個 repeat()
陳述式中。這樣就能在 repeat()
陳述式中建立 repeat()
陳述式,用來顯示特定次數的符號,繪製特定層數的蛋糕。
使用巢狀 repeat() 輸出蛋糕層
- 請在函式中的所有程式碼周圍放置第二個
repeat()
陳述式。重複此循環layers
次。 - 請只移除
main()
中printCakeBottom()
程式碼行的兩個//
。
printCakeBottom(age, layers)
- 執行程式碼查看整個蛋糕。
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 概念。