Операторы управления

Домашняя работа к главе 13

Задание 1

Напишите код, который будет выводить на консоль персонализированное приветствие пользователю в зависимости от его имени.
Пусть в константе 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("Привет, пользователь")
}

Задание 2

У вас есть логическая переменная open, которая может принять одно из двух доступных значений (true или false)
var open = true

Вам необходимо создать новую переменную типа String и инициализировать ей строковое значение:
– если open равно true, то инициализировать “открыто”
– если open равно false, то инициализировать “закрыто”

Правильный ответ

//Наиболее очевидным вариантом станет использование оператора условия if, а точнее его тернарной формы
var message = open ? "открыто" : "закрыто"
//Конечно же вы можете реализовать данную задачу и через стандартную форму оператора if
//в этом случае переменную нужно создать вне оператора if, т.к. в ином случае она будет локальной и недоступной вне его тела
var message2 = ""
if open {
    message2 = "открыто"
}else{
    message2 = "закрыто"
}

Задание 3

Вам даны три переменные 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()

 

Задание 4

Вы имеете три переменные-кортежа, содержащие координаты точек
Напишите программу, которая определяет, может ли существовать треугольник с заданными координатами вершин

Треугольник существует только тогда, когда сумма длин любых двух его сторон больше длины третьей.

Правильный ответ

// Способ 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("Такой треугольник не существует")
}

Доступ закрыт

Дополнительные 5 заданий доступны только подписчикам

Оформить доступ


27 Comments

  1. aovedernikov:

    В задании 3, как я думаю, лучше использовать стартовое значение для tmp взятое из переменных var1, var2 или var3.
    В текущем примере все работает, но в общем случае, при всех отрицательных значениях переменных var, мы получим неверный ответ

    • Не вдаваясь в детали решения попробовал вариант со всеми отрицательными значениями, и в итоге получил верный ответ. Не могли бы показать пример входных данных, при которых ответ будет некорректным?

      • mr.lyubimov:

        aovedernikov прав.

        Если задать tmp = 0, то при всех переменных меньше 0, tmp окажется самым большим числом.

        Вот мой вариант ответа:

        var var1 = -33245

        var var2 = -45

        var var3 = -124

        for i in [var1, var2, var3] {

        if i > var1 {var1=i}

        }

        print(var1)

  2. aovedernikov:

    В решении задачи 4 – надо проверить попарно суммы всех длин сторон для существования треугольника

  3. Dmitriy Razvarin:

    согласен с aovedernikov:

  4. Vlados:

    // Я решил сделать вот так:

    var var1 = 1
    var var2 = 2
    var var3 = 3

    var tmp = [var1, var2, var3]
    let result = tmp.max()

    // Так правильно будет?

  5. Vlados:

    // 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)

    • disconnect:

      // Сравниваем грани
      var faceBc = (aB + aC) >= bC
      var faceAc = (aB + bC) >= aC
      var faceAb = (aC + bC) >= aB

      Зачем ставили >= , а не > ?
      Ведь если сумма двух граней будет равна третьей, то это получается просто линия, а не треугольник.

      В остальном делал также, только для прокачки пробую не только условный if-else, но и через switch инструкции и тернарный оператор условия.

  6. mosariot:

    Василий, пара моментов.
    1. В некоторых ответах для заданий со switch после каждого case идет break. В офф. книге Apple читал, что так нужно было делать только в obj-c вроде. В Swift это не обязательно. Все равно же выполнение кода прекращается, как только найдено первое совпадение.
    2. В задании 8 скакнули немного вперед с Optionals. В итоге я подзапутался немного. В целом, если не ставить знака вопроса в этих выражениях “oneFigure.value?.0”, то будет ошибка, т.к. необходимо разворачивание опционала в том или ином виде.
    Сначала вообще, как в вашей книге, хотел пытался итерироваться внутренним циклом по значениям словаря – опциональным картёжным координатам )), но они не соответствует Sequence.

    • 1) Вы полностью правы. Изначально это было показано еще в первом издании просто как пример для тех, кто уже программировал ранее на других языках. Согласен, что стоит убрать, просто сделав оговорку.
      2) Перенес задание к следующий раздел.

      Спасибо!

  7. Nikita Kosolapov:

    // Способ 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 способом

  8. bikteev:

    Для защиты от “дурака” добавил еще одно условие :
    if triangleCord1.0 == triangleCord2.0 && triangleCord1.0 == triangleCord3.0 ||
    triangleCord1.1 == triangleCord2.1 && triangleCord1.1 == triangleCord3.1 {
    print (“Фигура являеться прямой!”)

    Если координаты будут в одной из плоскостей равны.

  9. Виктор Денисевич:

    В первом задании, обязательно ли использовать break во всех кейсах? Он по сути там не нужен

  10. Дмитрий Ахмеров:

    Задание 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” ? Как в этом случае поставить третий язык?

  11. ivan_vlasov1:

    Всем привет
    в задании 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

  12. censoored:

    Что то я не понял как в задании 2 var message = open ? “открыто” : “закрыто” будет работать?
    Вместо open же должен быть логический оператор типа bool. Можно полный код программы, пожалуйста.

  13. censoored:

    я решил 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

  14. Виктор Денисевич:

    Вариант решения 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)”)

    Это правильно или нет?

  15. torin.dmitriy:

    Задание 3 (еще одно решение)

    var var1 = 5
    var var2 = 3
    var var3 = 7

    let result = max(max(var1, var2), max(var2, var3))
    print(result)

  16. mr.lyubimov:

    В 7ом задании не плохо было бы учесть проверку на деление на 0.

Добавить комментарий