Урок 5. Условная конструкция If/else
Главная / Уроки / Страница блока Основы / Урок 5. Условные конструкции / Задача 5. Условная конструкция if
15 Ноября 2022
Задача 5.1
Используйте условную конструкцию if и оператор &&. Что бы отобразить имя в принт, вам понадобится интерполяция.
Представьте что вы разрабатываете приложение, и первое что видит пользователь это экран регистрации. Создайте два свойства, для имени и для возраста пользователя.
Выведите на консоль приветствие: “Welcome, <….>!” , только в том случае если у пользователя имя “Tim” и возраст не меньше 18.
let name = "Tim"
let age = 17
if name == "Tim" && age >= 18 {
print("Welcome, \(name)!")
}
Все свойства этого задания должны быть константами.
Здесь мы используем логический оператор И (&&) чтобы именно два условия вернули ture, если мы используем оператор ИЛИ (||), то будет возможность не учитывать один из параметров, либо возраст, либо имя.
Обратите внимание что мы интерполируем в строку свойство name, а не хардкодим данные, просто прописывая их ручками.
Следующее решение так же считается хорошим и верным:
let name = "Timbo"
let age = 17
let nameInDatabase = "Tim"
if name == nameInDatabase && age >= 18 {
print("Welcome, \(name)!")
}
Почему такой вариант хороший. Давайте представим экран регистрации. У пользователя есть два текстовых поля, для имени и возраста. Он вносит данные, и эти данные сохраняются в свойствах name и age, то есть эти свойства инициализируются в момент внесения пользователем данных. Далее он нажимает на кнопку, и запускается процесс обработки внесенных значений, то есть мы запускаем конструкцию if, в которой берем свойство name и сравниваем его с значением из нашей импровизированной базы nameInDatabase , либо из того места где мы будем хранить эти данные.
Для значения 18 не нужно создавать свойства, потому как здесь идет конкретное значение, людей ниже 18 лет не пускать.
Если вы сделали дополнительную ветку else, где определили ошибочный принт, это тоже не считается ошибкой:
if name == nameInDatabase && age >= 18 {
print("Welcome, \(name)!")
} else {
print("error")
}
Обратите внимание на синтаксис, перед открывающей фигурной скобкой должен быть пробел, после закрывающей тоже один пробел. На следующей строке прописываем условие, обязательно условие сносить на новую строку, следующая запись будет не рекомендованной:
if name == nameInDatabase && age >= 18 { print("Welcome, \(name)!")}
Такой код тяжело читать и понимать.
Если вы создали дополнительные свойства для условий, то это будет перебор:
let nameEquality = name == nameInDatabase
if nameEquality && age >= 18 {
print("Welcome, \(name)!")
}
Задача 5.2
У вас должно быть два объявленных свойства. Следом условная конструкция if с веткой else.
Давайте вспомним задачу 3.4, и попытаемся решить ее несколько иначе
Мы снова разрабатываем приложение для университета. Наше приложение будет проверять проходит абитуриент по балам или нет.
Создайте свойство для балов одного из абитуриентов, и инициализируйте его любым значением от 1 до 100.
Проверьте проходит ли абитуриент по балам на свою специальность, если проходной бал начинается от 80 до 100, и если проходит, то выведите на консоль приветствие: “Вы набрали <…> баллов. Поздравляем, вы прошли! “. В том случае если пользователь не прошел, то выведите на консоль сколько ему не хватило баллов: “Вам не хватило <…> баллов попробуйте в следующий раз”
Используйте только пройденные концепции урока.
let score = 89
let passingScore = 80
if score >= passingScore {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
} else {
let result = passingScore - score
print("Вам не хватило \(result) баллов попробуйте в следующий раз")
}
Если вы определили условие под отрицательные значения, то это тоже отличное решение:
let score = 89
let passingScore = 80
if score < 0 {
print("Не корректные данные!")
} else if score >= passingScore {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
} else {
let result = passingScore - score
print("Вам не хватило \(result) баллов попробуйте в следующий раз")
}
Будет ошибкой, если вы условие с не корректными данными определите в конце следующим образом:
if score >= passingScore {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
} else if score < passingScore {
let result = passingScore - score
print("Вам не хватило \(result) баллов попробуйте в следующий раз")
} else {
print("Не корректные данные")
}
Во вторую ветку попадают все значения в том числе 0 и отрицательные. а все что больше входного параметра попадает в первую ветку, поэтому ветка else никогда не будет выполнена.
Все свойства этого задания должны быть константами.
Как вы видите, в отличии от решения в задании 3.4, здесь мы создали дополнительное свойство для проходного балла passingScore, так как это значение мы будем использовать в расчетах, а не просто в сравнении, и в расчетах совсем не очевидно за что отвечает цифра 80:
let score = 89
if score >= 80 {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
} else {
let result = 80 - score
print("Вам не хватило \(result) баллов попробуйте в следующий раз")
}
Так же обратите внимание что для расчетов у нас создано дополнительное локальное свойство result, не лучшим решением будет выносить все расчеты в print:
let score = 89
if score >= 80 {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
} else {
print("Вам не хватило \(80 - score) баллов попробуйте в следующий раз")
}
Обратите внимание на синтаксис, именно так должна выглядеть конструкция if с веткой else, следующий синтаксис будет считаться не корректным:
let score = 89
if score >= 80 {
print("Вы набрали \(score) баллов. Поздравляем, вы прошли! ")
}
else {
print("Вам не хватило \(80 - score) баллов попробуйте в следующий раз")
}
Так же нет смысла свойство result определять за пределами условной конструкции, контекст не предполагает дальнейшего его использования.
Задача 5.3
Создайте свойство для количества тикетов, инициализируйте его любым целочисленным значением. Так же у вас должно быть свойство для цены за игрушку, свойство для начисленной суммы и свойство для доплаты. В условной конструкции if вы определяете какая сумма будет начислена, после условной конструкции рассчитываете доплату.
Представьте заведение с игровыми автоматами, за каждую победу игроку выдаются тикеты, которые он может обменять на баллы. 1 балл равен 1 рублю. после этого игрок может купить игрушку с вычетом этих баллов.
Давайте теперь напишем программу.
Игрок приносит в кассу какое то количество тикетов (это может быть любое число от 1 до 50, больше игрок за день не может выиграть), кассир их вносит в базу, а программа должна начислить за принятые тикеты определенную сумму на бонусную карту.
За 20 тикетов начисляют 100 баллов, за 30 – 200 баллов, за 40 – 300 баллов. Лишние тикеты возвращаются игроку.
Определите какую сумму начислят клиенту на карту за тикеты, и рассчитайте сколько ему нужно будет доплатить за игрушку, стоимостью 450 рублей. Выведите следующий результат на консоль: “Вам начислено на карту клиента <….> рублей, осталось доплатить <….> рублей”
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
let addedValue: Int
if ticket >= 40 {
accruedAmount = 300
} else if ticket >= 30 {
accruedAmount = 200
} else if ticket >= 20 {
accruedAmount = 100
} else {
accruedAmount = 0
}
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
Можно было инициализировать свойство addedValue сразу, но в таком случае ее придется сделать переменной и убрать ветку else:
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
var addedValue = 0
if ticket >= 40 {
accruedAmount = 300
} else if ticket >= 30 {
accruedAmount = 200
} else if ticket >= 20 {
accruedAmount = 100
}
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
И еще одно решение будет считаться корректным:
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
var addedValue = 0
if ticket >= 20 && ticket < 30 {
accruedAmount = 100
} else if ticket >= 30 && ticket < 40 {
accruedAmount = 200
} else if ticket >= 40 {
accruedAmount = 300
}
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей.")
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
if ticket >= 40 {
accruedAmount = 300
} else if ticket >= 30 {
accruedAmount = 200
} else if ticket >= 20 {
accruedAmount = 100
} else {
accruedAmount = 0
}
let addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
var addedValue = 0
if ticket >= 40 {
accruedAmount = 300
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
} else if ticket >= 30 {
accruedAmount = 200
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
} else if ticket >= 20 {
accruedAmount = 100
addedValue = toyPrice - accruedAmount
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
} else {
accruedAmount = 0
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(addedValue) рублей")
}
Здесь происходит дублирование кода из условия в условие. Дублировать код плохо, а у вас print, повторяется слово в слово в каждой ветке. То же касается расчета. Так быть не должно, если вы видите что дублируете код, то значит ваш код требует оптимизации.
Еще большей ошибкой будет определить конечные расчеты в принт:
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
if ticket >= 40 {
accruedAmount = 300
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(toyPrice - accruedAmount) рублей")
} else if ticket >= 30 {
accruedAmount = 200
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(toyPrice - accruedAmount) рублей")
} else if ticket >= 20 {
accruedAmount = 100
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(toyPrice - accruedAmount) рублей")
} else {
accruedAmount = 0
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(toyPrice - accruedAmount) рублей")
}
Либо таким образом:
let ticket = 33
var accruedAmount = 0
let toyPrice = 450
if ticket >= 40 {
accruedAmount = 300
} else if ticket >= 30 {
accruedAmount = 200
} else if ticket >= 20 {
accruedAmount = 100
} else {
accruedAmount = 0
}
print("Вам начислено на карту клиента \(accruedAmount) рублей, осталось доплатить \(toyPrice - accruedAmount) рублей")
Никогда не выносите расчеты в print.
Теперь что касается условия, здесь нужно было использовать оператор >=, если вы определили ==, то это будет не совсем верным решением, потому что у пользователя на руках может быть и 33 и 41 тикет.
Так же будет не лучшим решением определять отдельную условную конструкцию под каждое условие:
if ticket >= 40 {
accruedAmount = 300
}
if ticket >= 30 {
accruedAmount = 200
}
if ticket >= 20 {
accruedAmount = 100
}
Здесь компилятор проверяет каждое условие. В корректном варианте выше, компилятор находит верное условие и спрыгивает с условной конструкции if, в вашем же случае, компилятор проверяет их все, это не оптимально и затрачивает ресурсы.
Задача 5.4
Необходимо создать свойство для результата спортсмена, так же свойство для категории и разряда. По условию задачи категория и результат спортсмена вам известен (Придумайте любые значения), а вот разряд нужно найти, поэтому пока можете задать для него значение 0, что будет значить что пока разряда нет. Первым делом вам нужно определить спортсмен является мужчиной или женщиной. Далее взять его результат и проверить, входит он в нужный диапазон или нет, и в зависимости от диапазона задать разряд. Не бойтесь использовать одно условие в другом условии.
Давайте разработаем приложение для тренера по бегу, он будет вносить в приложение пол спортсмена и секунды, за которые спортсмен пробежал 100 метровку.
Напишите программу, которая будет показывать на какой разряд пробежал спортсмен.
Есть две категории Мужчина и Женщина
1 разряд у мужчин дают от 10.95 – 11.44, у женщин от 12.65 – 13.44
2 разряд у мужчин дают от 11.55 – 12.04 , у женщин от 13.45 – 14.34
3 разряд у мужчин дают от 12.05 – 12.84, у женщин от 14.35 – 15.34
Выведите результат на консоль: “Спортсмену присвоен <….> разряд по бегу на дистанцию 100 метров, в категории <….> “
Используйте только пройденные концепции урока.
Ребята, задание достаточно сложное для новичков, поэтому если у вас не получилось его решить, то пожалуйста не расстраивайтесь, а просто прочитайте подробный разбор и попытайтесь понять как строится логика.
let gender = "Женщина"
let result = 12.05
var rank = 0
if gender == "Мужчина" {
if result <= 11.44 {
rank = 1
} else if result <= 12.04 {
rank = 2
} else if result <= 12.84 {
rank = 3
}
} else {
if result <= 13.44 {
rank = 1
} else if result <= 14.34 {
rank = 2
} else if result <= 15.34 {
rank = 3
}
}
print("Спортсмену присвоен \(rank) разряд, по бегу на дистанцию 100 метров, в катигории \(gender)")
Если вы определили дополнительные свойства для нормативных секунд, то это не будет считаться ошибкой, напротив, будет воспринята как хорошее решение. Так как мы работаем с нормативами, а эти данные должны доставаться из какой то базы.
В качестве второй ветки я использую else без условия, потому что в контексте у нас всего две категории, если первая ветка вернет false, то мы попадем во вторую.
Так же одна условная конструкция if здесь лучше подходит, нежели создавать две:
if gender == "Мужчина" {
if result <= 11.44 {
rank = 1
} else if result <= 12.04 {
rank = 2
} else if result <= 12.84 {
rank = 3
}
}
if gender == "Женшина"{
if result <= 13.44 {
rank = 1
} else if result <= 14.34 {
rank = 2
} else if result <= 15.34 {
rank = 3
}
}
Это же касается и внутренних условий.
Еще еще вариант не оптимального решения:
let sex = "women"
let time: Double = 12.70 // Значение с плавающей точкой, прописывать тип данных явно здесь не нужно.
var level = 0
var category = ""
if (10.95...11.44) ~= time && sex == "men" {
category = "Мужчины"
level = 1
} else if (12.65...13.44) ~= time && sex == "women" {
category = "Женщины"
level = 1
} else if (11.55...12.04) ~= time && sex == "men" {
category = "Мужчины"
level = 2
} else if (13.45...14.34) ~= time && sex == "women" {
category = "Женщины"
level = 2
} else if (12.05...12.84) ~= time && sex == "men" {
category = "Мужчины"
level = 3
} else if (14.35...15.34) ~= time && sex == "women" {
category = "Женщины"
level = 3
}
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(category).")
Такой код тяжелее обслуживать в дальнейшем. Что бы изменить женщин на девушек, вам необходимо будет пройтись по всему коду и руками внести изменения в нужных местах. Это увеличивает время отладки.
Есть еще более не оптимальное решение:
let menCategory = "Мужчины"
let womenCategory = "Женщины"
var level = 0
var time: Double = 14.35
if (10.95...11.44) ~= time {
level = 1
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(menCategory).")
} else if (12.65...13.44) ~= time {
level = 1
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(womenCategory).")
} else if (11.55...12.04) ~= time {
level = 2
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(menCategory).")
} else if (13.45...14.34) ~= time {
level = 2
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(womenCategory).")
} else if (12.05...12.84) ~= time {
level = 3
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(menCategory).")
} else if (14.35...15.34) ~= time {
level = 3
print("Спортсмену присвоен \(level) разряд по бегу на дистанцию 100 метров, в категории \(womenCategory).")
}
Практически тоже самое решение что и предыдущее, но здесь повторяется print, в каждом из условий, он почти одинаковый, меняется только категория, нужно стараться выносить повторяющийся код из условий. Так же этот код не оптимальный, за счет того, что нормативы могут поменяться в следующем году, и если у женщин, например, изменить норматив первого уровеня на (11.40…13.40) то если женщина пробежит 11.42 она автоматически попадет в первую мужскую категорию, а вам придется переписывать весь код, что бы адаптировать его под изменяющиеся значения.
В варианте, где мы для конкретной категории определяем нормативы (самый первый корректный вариант), исправить данные на много легче.
Поддержите наш проект, и помогите изменить подход к обучению!
Развивайся вместе с нами
Поддержите наш проект, и помогите изменить подход к обучению!
Address List
Social Networks
Поддержите наш проект, и помогите изменить подход к обучению!
Social Networks