Создайте сообщение о дне рождения в Kotlin

В этой лаборатории кода вы создадите короткую программу на Kotlin, которая печатает сообщение о дне рождения с тортом и баннером ко дню рождения.

Предпосылки

  • Как открывать и редактировать код в https://try.kotlinlang.org/ , браузерном инструменте программирования Kotlin.
  • Поймите "Hello world!" из лаборатории кода «Напишите свою первую программу на Kotlin».
  • Как использовать println() для записи текста в консоль онлайн-редактора кода Kotlin.

Чему вы научитесь

  • Как напечатать более сложный текст из вашей программы.
  • Как выполнять базовые вычисления в Kotlin и сохранять результаты в переменных для последующего использования.
  • Как создать функцию для вывода одной и той же строки несколько раз.
  • Как создать цикл, который печатает фрагмент текста несколько раз.

Что вы будете строить

  • Вы создадите короткую программу, которую сможете использовать для печати сообщений о дне рождения, текстового изображения торта и баннера.

Что вам нужно

  • Компьютер с доступом в Интернет и современный веб-браузер, например, последняя версия Chrome .

Настройте свой стартовый код

  1. В браузере откройте https://try.kotlinlang.org/ . Откроется браузерный инструмент программирования Kotlin.
  2. В проводнике убедитесь, что Примеры > Привет, мир! > Самая простая версия > Выбирается SimplestVersion.kt , и редактор кода показывает Hello world! программа.
  3. Если вы видите код с вашими предыдущими изменениями, это нормально. Восстановите исходное состояние программы, щелкнув стрелку «Отменить » рядом с именем файла.

  1. В определении fun main() удалите аргумент args: Array<String> , потому что вы не собираетесь его использовать. Он предусмотрен в коде, указанном по умолчанию в редакторе, но не является обязательным. Первая строка вашей программы теперь должна выглядеть так, как показано ниже.
fun main(){
  1. Внутри fun main() замените "Hello, world!" текст с надписью "Happy Birthday, Rover!" .
  2. Ниже этого, все еще внутри фигурных скобок, добавьте еще две строки для печати: "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. Убедитесь, что на вкладке « Консоль » отображается «С днем ​​рождения, Ровер!» а ниже Вам уже 5! а 5 лет - лучший возраст для праздника!

Добавить праздничный торт

Поздравлению с днем ​​рождения нужна тематическая картинка. Типа, торт. Вы можете добавить торт к своему сообщению о дне рождения, напечатав дополнительные строки, которые используют буквы и символы на вашей клавиатуре и println() .

Продолжайте с кода решения выше.

  1. В своем коде, между двумя операторами println() для Happy Birthday и You are already 5 добавьте следующие строки операторов печати, как показано ниже. Это создает торт. В последнем операторе 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. Запустите свой код, и результат должен выглядеть так, как показано на скриншоте ниже.

Сохранить возраст Ровера в переменной

  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. Измените значение переменной на другое. Например, вы можете указать возраст Ровера в днях, а не в годах. Для этого умножьте возраст на 365, опуская високосные годы. Вы можете сделать этот расчет прямо при создании переменной, как показано ниже.
val age = 5 * 365
  1. Запустите свой код еще раз и обратите внимание, что оба сообщения теперь показывают возраст в днях.

  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. Добавьте Rover к сообщению о возрасте, используя переменную name , как показано ниже.
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!")
}

Поздравляем! Теперь вы можете создавать сообщения с текстом, графику, созданную из символов, использовать переменные для хранения чисел и текста и печатать текст с использованием переменных.

В этом задании вы создадите баннер дня рождения, а затем узнаете, как упростить этот код, используя приемы повторения и повторного использования кода, и почему это хорошо.

Создайте стартовый баннер ко дню рождения

  1. В https://try.kotlinlang.org/ поместите курсор где-нибудь внутри кода.
  2. Щелкните правой кнопкой мыши, чтобы открыть контекстное меню, и выберите « Выделить все» (Ctrl-A) .
  3. Нажмите клавишу возврата или удаления, чтобы удалить весь код.
  4. Скопируйте и вставьте код ниже в редактор.
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. Запустите вашу программу, чтобы увидеть баннер, напечатанный в консоли.
=======================
Happy Birthday, Jhansi!
=======================

Создайте функцию для печати границы

Код, который вы только что вставили и запустили, представляет собой функцию с именем main() , содержащую три оператора печати. Когда вы нажимаете кнопку « Выполнить» , система выполняет функцию и весь код внутри нее.

Ваша программа на 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() замените строки кода, выводящие линию границы с помощью 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() , чтобы не переходить на новую строку после печати каждого "=".

Вот код. Теперь у вас есть единственная инструкция для печати знака равенства, а чтобы повторить эту инструкцию 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!
=======================

Используйте аргументы, чтобы изменить границу

Что, если вы хотите создать границы, которые используют разные символы, такие как приведенные ниже?

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

******************************************************* **

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

Вы можете определить отдельную функцию для каждого из этих различных символов. Однако есть более эффективный способ сделать это. Вы можете повторно использовать уже написанную функцию и сделать ее более гибкой, чтобы она работала для разных типов символов.

Отличительной чертой функций является то, что вы можете вводить в них данные, используя аргументы. Вы ненадолго столкнулись с этим в предыдущей кодовой лаборатории, когда познакомились с 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. Запустите свой код. Ваш код не выполняется, и вместо этого вы видите значки ошибок рядом с вашим кодом.

  1. Посмотрите на представление « Проблемы » и увидите сообщение об ошибке.

Как и раньше, в сообщении указывается, где находится ошибка, и дается подсказка, что это может быть. Важная часть: 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() вызывает printBorder(border) с border в качестве аргумента. Ваш код должен работать без ошибок.
  2. Посмотрите на вывод вашей программы в консоли , и она все еще показывает ту же границу, что и раньше?
=======================
Happy Birthday, Jhansi!
=======================

Это не предполагаемое поведение! Вы попытались сделать рамку с символом "%", но программа все еще печатает рамку с символом "=". На следующих шагах вы узнаете, почему это происходит.

  1. В редакторе обратите внимание на серый восклицательный знак. Этот значок указывает на предупреждение. Предупреждения — это проблемы с вашим кодом, на которые вам нужно обратить внимание, но они не мешают вашему коду работать.

  1. Переключитесь на представление « Проблемы» и прочитайте предупреждение. Пишет: "Parameter 'border' is never used." Это предупреждение объясняет проблему с выводом. Вы передаете в функцию новую строку для границы, но не используете ее для печати.
  1. Измените 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 раза. Для этого вы можете изменить количество повторений в операторе repeat() функции printBorder() . Тем не менее, вы можете сделать что-то лучше!

Вы можете определить более красивую границу на основе двух вещей:

  • Шаблон для повторения (который вы уже сделали)
  • Количество раз, которое вы хотите повторить шаблон

Вы можете создать переменные для каждого шаблона и количества повторений, а затем передать обе части информации в 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 — это число, поэтому вместо того, чтобы делать его типа String , вам нужно сделать его типа Int , что является сокращением от целого числа, целого числа.
  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()
}

Поздравляем! С функциями, аргументами, переменными и повторяющимся циклом вы изучили основные строительные блоки, которые используются почти во всех программах.

Сделайте перерыв, а затем займитесь следующей задачей ниже, где вы создадите больше функций и циклов, и вы получите возможность построить гигантский торт с нужным количеством свечей всего за несколько строк программирования.

В этом задании вы собираетесь обновить код праздничного торта, чтобы он всегда был нужного размера с нужным количеством свечей для любого возраста.

  • Всего вы создадите три функции для рисования слоеного пирога со свечами.
  • Вы будете использовать repeat() внутри другого repeat() , создавая так называемый «вложенный цикл».
  • То, как вы создадите этот код, — это то, как вы можете создать любую программу, начиная с общей картины и добавляя детали. Это называется «развитие сверху вниз».
  • Инструкции для этой практики не такие подробные, и вы можете обратиться к готовому коду, если застряли.

Вот фото торта, который вы будете печь:

А вот инструкции.

Создайте основную функцию

  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() , которая принимает один аргумент age типа Int .
  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() , которая принимает один аргумент age типа Int .
  2. Внутри используйте оператор repeat() , чтобы напечатать одну запятую , пламени.
  3. Повторите этот age раз.
  4. В конце выведите пустую строку.
  5. Добавьте оператор print() , чтобы напечатать один пробел для вставки свечей.
  6. Ниже повторите шаги, чтобы создать второй оператор repeat() для печати тел свечей с вертикальной линией |.
  7. В 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 ).
  • Чтобы распечатать дно торта, вы сначала повторяете символ 'at' @ age + 2 раза, чтобы напечатать один слой. Затем вы повторяете печать одного layers раз.

Повторить слои рисования

Нарисуйте возраст символа+2 раза, чтобы создать слой

  1. Под существующими функциями создайте функцию printCakeBottom() с двумя аргументами, age layers , оба типа Int .
  2. Внутри функции используйте оператор repeat() , чтобы напечатать один слой символов 'at' @ age + 2 раза. Завершите, напечатав пустую строку, как показано ниже.
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. Запустите свой код, чтобы убедиться, что он печатает одну строку дна торта.
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

Вложенные операторы Repeat()

Чтобы напечатать несколько одинаковых слоев дна торта, вы можете сказать:

Для слоя 1 повторите символ 12 раз: @@@@@@@@@@@@

Для слоя 2 повторите символ 12 раз: @@@@@@@@@@@@

Для слоя 3 повторите символ 12 раз: @@@@@@@@@@@@

Или вы можете сказать это гораздо более кратко, как:

Повторите для трех слоев:

Повторите символ 12 раз.

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

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

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

Теперь это то, что вы можете сделать с операторами 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 . И на вашем торте всегда будет нужное количество свечей!

Окончательный вывод вашей программы должен быть:

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

Код решения

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

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

    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()
    }    
}
  • Используйте ${} , чтобы окружить переменные и вычисления в тексте операторов печати. Например: ${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)

Вот официальная документация по концепциям Kotlin, которые вы изучили в этой лаборатории кода.

Если браузерный инструмент программирования Kotlin не выполняет ваш код или выдает ошибку, подобную приведенной ниже, вы можете попробовать следующее.

  • Перезагрузите страницу с помощью SHIFT-Reload.
  • Подождите минуту, а затем повторите попытку.