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

Домашняя работа к главе 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 заданий доступны только подписчикам

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


31 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.

  17. bearlovessun:

    Почему в справке Xcode по sqrt и pov ничего нет? В книге тоже пока этого не было. Подскажите, где в справке можно смотреть весь синтаксис Swift? Я и так понял, что это значит квадратный корень и возведение в степень, но тем не менее, я так и не понял, где подробно смотреть синтаксис свифта, кроме гугла…

  18. alisham93:

    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»)
    }

  19. saragashev:

    Ребят, я чуть голову не сломал решая 4 задание, оказывается я такого и не смог бы решить, нету в 13-ой главе таких операторов=(

  20. Даниил Старцев:

    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(«Треугольник не существует»)
    }

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