Напишите код, который будет выводить на консоль персонализированное приветствие пользователю в зависимости от его имени.
Пусть в константе name
хранится имя пользователя. Используя операторы управления (условия if
и ветвления switch
) реализуйте различный вывод на консоль в зависимости от значения в константе name
Покажите варианты решения с использованием switch
и if
. Определите вывод на консоль для трех произвольных имен, а так же в блоке «во всех остальных случаях» (default
и else
).
//Вариант 1 let name = "Vasiliy" switch name { case "Vasiliy": print("Привет, Василий") break; case "Alex": print("Привет, Алексей") break; case "Helga": print("Привет, Ольга") break; default: print("Привет, пользователь") break; } //Вариант 2 if name == "Vasiliy"{ print("Привет, Василий") }else if name == "Alex" { print("Привет, Алексей") }else if name == "Helga"{ print("Привет, Ольга") }else{ print("Привет, пользователь") }
У вас есть логическая переменная open
, которая может принять одно из двух доступных значений (true
или false
)
var open = true
Вам необходимо создать новую переменную типа String
и инициализировать ей строковое значение:
— если open равно true
, то инициализировать «открыто»
— если open равно false
, то инициализировать «закрыто»
//Наиболее очевидным вариантом станет использование оператора условия if, а точнее его тернарной формы var message = open ? "открыто" : "закрыто" //Конечно же вы можете реализовать данную задачу и через стандартную форму оператора if //в этом случае переменную нужно создать вне оператора if, т.к. в ином случае она будет локальной и недоступной вне его тела var message2 = "" if open { message2 = "открыто" }else{ message2 = "закрыто" }
Вам даны три переменные var1
, var2
и var3
целочисленного типа Int
Составьте программу, в конце которой в константе result
будет находиться наибольшее из трех целочисленных значений.
var var1 = 2 var var2 = 23 var var3 = 16 // Способ 1 //временная переменная var tmp = 0 //двумя условиями проверим, какое из чисел самое больше //сперва найдем наиболее из первых двух //потом сравним его с третьим tmp = var1 > var2 ? var1 : var2 tmp = tmp > var3 ? tmp : var3 let result = tmp // Способ 2 // использовать полную форму оператора условия var tmp2 = 0 // мы можем задать самые разные варианты условий // или даже использовать вложенные условия if var1 > var2 && var1 > var3 { tmp2 = var1 }else if var2 > var1 && var2 > var3 { tmp2 = var2 }else{ tmp2 = var3 } let result2 = tmp2 // Способ 3 (от Vlados) var tmp3 = [var1, var2, var3] let result3 = tmp3.max()
Вы имеете три переменные-кортежа, содержащие координаты точек
Напишите программу, которая определяет, может ли существовать треугольник с заданными координатами вершин
// Способ 1 (от Vlados и disconnect) // Координаты var (a, b, c): ((Double,Double), (Double,Double), (Double, Double)) = ((1, 1), (1, 3), (3, 1)) // Вычислим длины сторон let aB = sqrt ((pow(b.0-a.0, 2)) + (pow(b.1-a.1, 2))) let aC = sqrt ((pow(c.0-a.0, 2)) + (pow(c.1-a.1, 2))) let bC = sqrt ((pow(c.0-b.0, 2)) + (pow(c.1-b.1, 2))) // Сравниваем грани var faceBc = (aB + aC) > bC var faceAc = (aB + bC) > aC var faceAb = (aC + bC) > aB // Треугольник существует только тогда, когда сумма длин любых двух его сторон больше длины третьей if faceBc && faceAc && faceAb { print("True triangle") } else { print("False triangle") } // Способ 2 //переменные с координатами var point1 = (-100,1) var point2 = (10,2) var point3 = (6,12) //определяем длину отрезков var line1 = sqrt( pow(Double(point2.0 - point1.0), 2) + pow(Double(point2.1 - point1.1), 2) ) var line2 = sqrt( pow(Double(point2.0 - point3.0), 2) + pow(Double(point2.1 - point3.1), 2) ) var line3 = sqrt( pow(Double(point1.0 - point3.0), 2) + pow(Double(point1.1 - point3.1), 2) ) if line1+line2>line3 { print("Такой треугольник существует") }else{ print("Такой треугольник не существует") }
31 Comments
В задании 3, как я думаю, лучше использовать стартовое значение для tmp взятое из переменных var1, var2 или var3.
В текущем примере все работает, но в общем случае, при всех отрицательных значениях переменных var, мы получим неверный ответ
Не вдаваясь в детали решения попробовал вариант со всеми отрицательными значениями, и в итоге получил верный ответ. Не могли бы показать пример входных данных, при которых ответ будет некорректным?
aovedernikov прав.
Если задать tmp = 0, то при всех переменных меньше 0, tmp окажется самым большим числом.
Вот мой вариант ответа:
В решении задачи 4 — надо проверить попарно суммы всех длин сторон для существования треугольника
согласен с aovedernikov:
// Я решил сделать вот так:
var var1 = 1
var var2 = 2
var var3 = 3
var tmp = [var1, var2, var3]
let result = tmp.max()
// Так правильно будет?
Все верно. Внес в ответы.
//Еще один способ реализовал
var var1 = 1, var2 = 2, var3 = 3, result = 0
switch (var1, var2, var3) {
case (var1, var2, var3) where
var1 > var2 && var1 > var3: result = var1
case (var1, var2, var3) where
var2 > var1 && var2 > var3: result = var2
default:
result = var3
}
print(result) // 3
Владос, красавчик! Я бы ни когда не догадался до такого лаконичного ответа. Я нагородил целую портянку, открыл ответы, а там есть решение в одну строчку.
// 4 задание — решение
// Координаты
var (a, b, c): ((Double,Double), (Double,Double), (Double, Double)) = ((1, 1), (1, 3), (3, 1))
// Вычислим длины сторон
var aB = sqrt ((pow(b.0-a.0, 2)) + (pow(b.1-a.1, 2)))
var aC = sqrt ((pow(c.0-a.0, 2)) + (pow(c.1-a.1, 2)))
var bC = sqrt ((pow(c.0-b.0, 2)) + (pow(c.1-b.1, 2)))
var message = «»
// Сравниваем грани
var faceBc = (aB + aC) >= bC
var faceAc = (aB + bC) >= aC
var faceAb = (aC + bC) >= aB
// Треугольник существует только тогда, когда сумма длин любых двух его сторон больше длины третьей
if faceBc && faceAc && faceAb {
message = «True triangle»
} else {
message = «False triangle»
}
print(message)
// Сравниваем грани
var faceBc = (aB + aC) >= bC
var faceAc = (aB + bC) >= aC
var faceAb = (aC + bC) >= aB
Зачем ставили >= , а не > ?
Ведь если сумма двух граней будет равна третьей, то это получается просто линия, а не треугольник.
В остальном делал также, только для прокачки пробую не только условный if-else, но и через switch инструкции и тернарный оператор условия.
Внес в ответы. Спасибо!
Василий, пара моментов.
1. В некоторых ответах для заданий со switch после каждого case идет break. В офф. книге Apple читал, что так нужно было делать только в obj-c вроде. В Swift это не обязательно. Все равно же выполнение кода прекращается, как только найдено первое совпадение.
2. В задании 8 скакнули немного вперед с Optionals. В итоге я подзапутался немного. В целом, если не ставить знака вопроса в этих выражениях «oneFigure.value?.0», то будет ошибка, т.к. необходимо разворачивание опционала в том или ином виде.
Сначала вообще, как в вашей книге, хотел пытался итерироваться внутренним циклом по значениям словаря — опциональным картёжным координатам )), но они не соответствует Sequence.
1) Вы полностью правы. Изначально это было показано еще в первом издании просто как пример для тех, кто уже программировал ранее на других языках. Согласен, что стоит убрать, просто сделав оговорку.
2) Перенес задание к следующий раздел.
Спасибо!
// Способ 2
//переменные с координатами
var point1 = (-100,1)
var point2 = (10,2)
var point3 = (6,12)
//определяем длину отрезков
var line1 = sqrt(
pow(Double(point2.0 — point1.0), 2) +
pow(Double(point2.1 — point1.1), 2)
)
var line2 = sqrt(
pow(Double(point2.0 — point3.0), 2) +
pow(Double(point2.1 — point3.1), 2)
)
var line3 = sqrt(
pow(Double(point1.0 — point3.0), 2) +
pow(Double(point1.1 — point3.1), 2)
)
if line1+line2>line3 {
print(«Такой треугольник существует»)
}else{
print(«Такой треугольник не существует»)
}
Нужно добавить в if line1+line2>line3 && line1+line3>line2 && line2+line3>line1 аналогично с 1 способом
Для защиты от «дурака» добавил еще одно условие :
if triangleCord1.0 == triangleCord2.0 && triangleCord1.0 == triangleCord3.0 ||
triangleCord1.1 == triangleCord2.1 && triangleCord1.1 == triangleCord3.1 {
print («Фигура являеться прямой!»)
Если координаты будут в одной из плоскостей равны.
В первом задании, обязательно ли использовать break во всех кейсах? Он по сути там не нужен
Нет, совершенно не обязательно. Сделано скорее для демонстрации, чтобы акцентировать внимание на том, что работа прерывается.
Задание 5
var daysOfTheWeekRu = [«Понедельник», «Вторник», «Среда», «Четверг», «Пятница», «Суббота», «Воскресенье»]
var daysOfTheWeekEn = [«Monday», «Tuesday», «Wednesday», «Thursday», «Friday», «Saturday», «Sunday»]
var days: [String] = []
var lang = false ? «ru» : «en»
switch lang {
case «ru»:
days = daysOfTheWeekRu
case «en»:
days = daysOfTheWeekEn
default:
break
}
print(days) // [«Monday», «Tuesday», «Wednesday», «Thursday», «Friday», «Saturday», «Sunday»]
То, что вы инициализируете значение переменной lang через Bool(false) не корректно и не будет использоваться вами в приложении. А что, если языков у вас три? Как тогда отработает строка var lang = false ? “ru” : “en” ? Как в этом случае поставить третий язык?
Всем привет
в задании 3
я делал один из вариантов как в
// Способ 3 (от Vlados)
var tmp3 = [var1, var2, var3]
let result3 = tmp3.max()
Не сразу получилось вывести результат на консоль…
пришлось чуть подправить
let result3 = tmp3.max()!
//потому что
type(of: result3) //Optional.Type
вот здесь нашёл чё-как https://metanit.com/swift/tutorial/2.8.php
Что то я не понял как в задании 2 var message = open ? «открыто» : «закрыто» будет работать?
Вместо open же должен быть логический оператор типа bool. Можно полный код программы, пожалуйста.
я решил 7ое задание вот так
typealias Operation = (Double,Double,Character)
let (one,two,operation): Operation = (3.1,33.0,»/»)
var c = 0.0
switch operation {
case «*»:
c=one*two
case «/»:
c=one/two
case «+»:
c=one+two
case «-«:
c=one — two
default:
break
}
print (c)
Это правильно? Не понимаю зачем в ответах объявляются локальные константы а и b
Вариант решения 7 задания
typealias Operation = (operandOne: Double, operandTwo: Double, operation: Character)
let oper: Operation = (5, 2.5, «-«)
var result: Double = 0
switch oper {
case (_, _, «+»):
result = oper.operandOne + oper.operandTwo
case (_, _, «*»):
result = oper.operandOne * oper.operandTwo
case (_, _, «/»):
result = oper.operandOne / oper.operandTwo
case (_, _, «-«):
result = oper.operandOne — oper.operandTwo
default:
break
}
print(«Результат операции ‘\(oper.operation)’ = \(result)»)
Это правильно или нет?
Спасибо, Виктор. По вашему варианту решения мне было легче разобраться с задачей☺️
Задание 3 (еще одно решение)
var var1 = 5
var var2 = 3
var var3 = 7
let result = max(max(var1, var2), max(var2, var3))
print(result)
В 7ом задании не плохо было бы учесть проверку на деление на 0.
Почему в справке Xcode по sqrt и pov ничего нет? В книге тоже пока этого не было. Подскажите, где в справке можно смотреть весь синтаксис Swift? Я и так понял, что это значит квадратный корень и возведение в степень, но тем не менее, я так и не понял, где подробно смотреть синтаксис свифта, кроме гугла…
Zadanie 3:
sdelal ego bez tmp…
var var1 = 30
var var2 = 25
var var3 = 27
let result : Int
if var1 > var2 && var1 > var3 {
result = var1
print(«var1 bolshe»)
}
else if var2 > var1 && var2 > var3 {
result = var2
print(«var2 bolshe»)
}
else {
result = var3
print(«var3 bolshe»)
}
Ребят, я чуть голову не сломал решая 4 задание, оказывается я такого и не смог бы решить, нету в 13-ой главе таких операторов=(
4 задание такое решение годится?
//Вы имеете три переменные-кортежа, содержащие координаты точек
var pointA = (x1: 2,y1: 2)
var pointB = (x2: 1,y2: 1)
var pointC = (x3: 3,y3: 3)
//Напишите программу, которая определяет, может ли существовать треугольник с заданными координатами вершин
var square = ((pointB.x2 — pointA.x1) * (pointC.y3 — pointA.y1) — (pointC.x3 — pointA.x1) * (pointB.y2 — pointA.y1)) / 2
if square > 0 {
print(«Треугольник существует, его площадь = \(square)»)
} else {
print(«Треугольник не существует»)
}