Урок 6. Тернарный оператор
Главная / Уроки / Страница блока Основы / Урок 6. Тернарный оператор / Задача 6. Тернарный оператор
30 Октября 2022
Задача 6.1
Сперва необходимо создать все необходимые свойства, которые можно использовать в коде. В Задании сказано что у пользователя может либо быть, либо не быть карта, поэтому здесь необходимо определить логическое свойство. Далее по заданию в зависимости от карты нам дают определенную скидку, а это значит, что нам нужно свойство для хранения этой скидки, можно задать для него начальное значение 0. Так же в задании есть стоимость, поэтому нам нужно еще одно свойство. Когда вы определите все необходимые свойства, нужно приступать к решению самой задачи. Сперва определяете скидку в зависимости от наличия карты, а в конце конечную стоимость.
В праздничный день в магазин игрушек приходит покупатель, если у пользователя есть карта клиента то ему в этот день дают 30 процентную скидку, если нет то 15 процентов.
Посчитайте сколько заплатит пользователь за игрушку стоимостью 760 рублей, если у него есть карта.
Это задание нужно решить с использованием тернарного оператора
let price = 760
var sale = 0
let clientCard = false
var discountedPrice = 0
sale = clientCard ? 30 : 15
discountedPrice = price - (price * sale) / 100
свойства price и clientCard я ни где в контексте не меняю, поэтому они должны быть константами.
Свойства sale и discountedPrice у меня изменяются, поэтому они являются переменными.
Если вы создали свойства для каждой из скидок, это не будет ошибкой, но в данном варианте можно было обойтись и без них. Конечно все будет зависеть от идеи вашей программы, если это какие то фиксированные значения, которые используются только в одном месте, то создавать для них свойства не имеет смысла, И в целом и так понятно что это именно значение скидки, потому что мы это значение присваиваем к свойству sale: sale = clientCard ? 30 : 15 то есть в зависимости от условия, мы свойству sale присвоим либо 30, либо 15.
Так же не будет ошибкой, если вы реализовали следующим образом:
let price = 760
var sale = 0
let clientCard = false
var discountedPrice = 0
discountedPrice = clientCard
? price - (price * 30) / 100
: price - (price * 15) / 100
Результат работы тернарного оператора, обязательно, нужно было сохранить в дополнительном свойстве, иначе вы не сможете его использовать:
let price = 760
var sale = 0
let clientCard = false
clientCard
? price - (price * 30) / 100
: price - (price * 15) / 100
Если я захочу, дальше в коде использовать цену, например отобразить в print, то у меня не будет такой возможности.
Есть еще одно не до конца продуманное решение:
let price = 760
let clientCard = true
let cardDiscount = 30
let sale = 15
clientCard
? (price * cardDiscount) / 100
: (price * sale) / 100
Вроде все выглядит хорошо, но здесь вы рассчитываете только стоимость скидки, тогда как нужно высчитать сколько нужно заплатить в результате.
Есть еще один момент, можно было не создавать дополнительное свойство discountedPrice, а сразу менять значения у свойства price:
var price = 760
let clientCard = true
let cardDiscount = 30
let sale = 15
price -= clientCard
? (price * cardDiscount) / 100
: (price * sale) / 100
Но в таком случае мы меняем начальное значение самого товара, и следующий покупатель, будет исходить из новой цены, а нам этого не нужно. Поэтому лучшим решением будет создать дополнительное свойство discountedPrice
Давайте рассмотрим последнее решение, и основные ошибки:
var card = true
var price = 760.0
var discount = 0.0
price -= card == true
? (price/100) * 30
: (price/100) * 15
Во первых отсутствие пробелов у оператора деления price / 100, код должен дышать.
Во вторых card == true, грамотный программист никогда не напишет такого условия, потому что само свойство card является логическим, оно само по себе возвращает логическое значение. Если нам нужно будет сравнить с false, мы не будем писать card == false, мы будем использовать частичку отрицания перед логическим свойством: !card
Задача 6.2
Для поиска секунд используйте оператор %
Рассчитайте количество полных минут в 2170 секундах. Если секунд не будет то выводим на консоль сообщение : “<…> минут”, если есть секунды то выводим сообщение <…> минут и <…> секунд.
Это задание нужно решить с использованием тернарного оператора
let seconds = 2170
let minutes = seconds / 60
let restOfSeconds = seconds % 60
restOfSeconds == 0
? print("\(minutes) минут.")
: print("\(minutes) минут и \(restOfSeconds) секунд.")
Обратите внимание как можно сносить тернарный оператор, если строка слишком длинная. Если вы проверяете на не равенство restOfSeconds != 0, это тоже считается верным решением, только в этом случае первый и второй принт нужно поменять местами.
При этом лучше создать дополнительные свойства для вычислений, иначе вы будете дублировать код:
var minute = 2170
minute % 60 != 0
? print("\(minute/60) минут и \(minute % 60) секунд")
: print("\(minute/60) минут")
Посмотрите сколько дублируемых действий, плюс ко всему отсутствие пробелов у оператора minute/60. Это не корректно, не нужно лепить код, в один монолит. Код это книга, которая нуждается в пробелах: minute / 60.
Ну и свойство minute здесь должна быть константой, потому что в коде вы его ни где не меняете.
Поддержите наш проект, и помогите изменить подход к обучению!
Развивайся вместе с нами
Поддержите наш проект, и помогите изменить подход к обучению!
Address List
Social Networks
Поддержите наш проект, и помогите изменить подход к обучению!
Social Networks