Урок 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

Поддержите наш проект, и помогите изменить подход к обучению!