Функции (func) в Swift

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

Задание 1

Будет ли корректно выполняться данный код? Если нет, то укажите почему и по-возможности исправьте ошибки

func mult(_ a: Double, _ b: Double) -> Double {
 a * b
}
Правильный ответ

Функция написана корректно. Оператор return не обязательно должен быть в коде, когда тело функции состоит из одного выражения.

 

Задание 2

Разработайте функцию, которая принимает на вход значение типа Bool, преобразует его в строку и возвращает. То есть передав true типа Bool должно вернуться "true" типа String, то же самое и для false.

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

func booleanToString(_ b: Bool) -> String {
   return String(b)
}

Возможно вы решили данную задачу с помощью оператора ветвления. Ваш вариант так же будет верным.

 

Задание 3

Напишите функцию, которая принимает на вход массив с элементами типа Int, а возвращает целое число — сумму всех положительных элементов переданного массива.
К примеру для массива [1,-2,3,4,-5] должно быть возвращено 1+3+4 = 8

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

func sumOfPositives(_ a: [Int] ) -> Int{
    var result = 0
    for i in a {
        // тернарная форма оператора ветвления позволяет сократить код
        // вы оожете использовать сокращенный или стандартный синтаксис
        result += i>0 ? i : 0
    }
    return result
}
//внутри цикла for применяется терная
sumOfPositives([1,-2,3,4,-5]) //8

 

Задание 4

Напишите функцию, которая принимает на вход массив типа [Int] и, в случае, если количество элементов > 0, то возвращает целое число — произведение всех элементов переданной коллекции. Если количество элементов = 0, то возвращается 0.
Пример:
[1,2,3,4] -> 1 * 2 * 3 * 4 = 24

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

func grow(_ a: [Int]) -> Int {
    var result = 0
    if a.count > 0 {
        result = 1
        for i in a {
            result *= i
        }
    }
    return result
}
grow([1,2,3,4]) //24
grow([]) //0

 

Задание 5

Используя перегрузку (overloading) создайте две одноименные функции, которые могут принимать два однотипных параметра (Int или Double) и возвращают их произведение
Пример:
(4, 5) -> 4 * 5 = 20
(4.1, 5.2) -> 4.1 * 5.2 = 21.32

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

func multi(_ a: Int, _ b: Int) -> Int {
    return a*b
}
func multi(_ a: Double, _ b: Double) -> Double {
    return a*b
}
multi(4.1, 5.2) //21.32
multi(4, 5) //20

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

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

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


17 Comments

  1. disconnect:

    Реализация 7 задания через Guard смотрится приятнее.

    func rentCost (days: Int) -> Int {
    let totalRentCost = 850*days
    guard days >= 3 else {return totalRentCost}
    guard days >= 7 else {return totalRentCost-550}
    return totalRentCost — 1620
    }

  2. disconnect:

    В 8 задании реализацию через цикл, можно сделать с where, вместо if.

    func testEight8 (_ array: [Int], _ b: Int) -> Bool {
    for num in array where num == b {
    return true
    }
    return false
    }

  3. Илья Кузнецов:

    задание 12 самый короткий вариант.Если количество общих элементов будет первого со вторым равно количеству элементов второго значит они одинаковые

    func fun12 (a : String, b : String) -> Bool {

    if Set(a).intersection(b).count == b.count {

    return true
    }
    return false
    }

    fun12(a: «qwe», b: «qwe»)

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

    9 задание, допускается выполнение через if ?

    func repeatFunc(repeatString: String, repeatCount: Int) -> String {
    return String(repeating: repeatString, count: repeatCount)
    }
    repeatFunc(repeatString: «Swift», repeatCount: 2) // SwiftSwift

    //(«Xcode», 0) -> «»
    func repeatFunc2(repeatString: String, repeatCount: Int) -> String {
    let repStr = «»
    if repeatCount == 0 {
    return repStr
    } else {
    return String(repeating: repeatString, count: repeatCount)
    }
    }
    repeatFunc(repeatString: «Xcode», repeatCount: 0) // «»

  5. torin.dmitriy:

    Текущее решение в задании 4 не подойдет, если в массиве внутри будет 0. Предлагаю такой вариант

    func runTask4(_ array: [Int]) -> Int {
    var result = array.count == 0 ? 0 : 1

    for num in array where num != 0 {
    result *= num
    }
    return result
    }

  6. torin.dmitriy:

    Задание 12
    func checkSameSymbols(in1: String, and: String) -> Bool {
    return Array(in1).sorted() == Array(and).sorted()
    }

  7. ageres7:

    Хотел бы дополнить ответ 10 заданияfunc ballMy    (height h: Float, boyFloor N: Int, motherFloor M: Int, ratio L: Float) -> Int {        var count = 0    //Проверка на то, что сын находится выше чем мама    count = N > M ?  1 : 0    if h > 0 && N >= 2 && L < 1 && M >= 1 {                var currentFloor = Float(N) * L                    while Float(M) < currentFloor{                currentFloor *= L                count += 2            }                }else{            print(«Переданны неверные данные»)            }    return count}ballMy(height: 10, boyFloor: 2, motherFloor: 1, ratio: 0.75)

  8. Alekschatov:

    задание 13

    по заданию допускается на вход диапазон целых чисел (а значит и отрицательных)

    решение по учебнику не учитывает введение отрицательных чисел, если требуется вернуть все простые числа (а значит не только кроме 0, 1, но и только положительных)

    поправьте, если я не прав
    нужно указать, что number > 1
    _________________________________
    func getSimpleNumbers(from range: ClosedRange<Int>) -> [Int] {
        var simpleNumbers = [Int]()
        for number in range {
            for delimeter in range {
                if [0, 1].contains(delimeter) {
                    continue
                }
                if number % delimeter == 0 && number == delimeter && number > 1 {
                    simpleNumbers.append(number)
                } else if number % delimeter == 0 && number != delimeter {
                    break
                }
                else if number < 0 {
                    print («Введен диапазон с отрицательными числами»)
                    break
                }
            }
        }
        return simpleNumbers
    }

  9. DimaVanin:

    Задание 12

    func checkSameSymbols( in: String, and: String) -> Bool {
    return `in` == and
    }
    checkSameSymbols(in: «str», and: «str») // true
    checkSameSymbols(in: «str», and: «sot») // false

  10. krovevs:

    Прошу добавить более интересный вариант решения 10 задания:

    • krovevs:

      func MyFunc (floorWeight:Float, boyFloor:Float, momFloor:Float, coefficient:Float) {
      // проверка на условие задачи
      var errorCounter = 0
      if coefficient >= 1 {print(«Коэффициент должен быть в диапозоне от 0 до 1»); errorCounter += 1}
      if momFloor < 1 {print("Минимальный этаж мамы — 1"); errorCounter += 1}
      if boyFloor < 2 {print("Минимальный этаж мальчика — 2"); errorCounter += 1}
      if boyFloor <= 0 {print("Высота этажа не может быть отрицательной"); errorCounter += 1}
      if errorCounter != 0 {exit(0)}
      //
      var countOfBallViews = 0 // задаем начальное количество взглядов на мячик
      var currentBallFloor = boyFloor
      while momFloor<(currentBallFloor*coefficient) {
      if countOfBallViews == 0 {countOfBallViews += 1} // считает первое падение
      currentBallFloor *= coefficient
      if momFloor+1<currentBallFloor { // учитывает что мячик скрылся выше этажом, и второй раз показался когда летел вниз
      countOfBallViews += 2;
      print("Прыгнул выше на этаж")
      } else {
      countOfBallViews += 1
      }
      }
      if countOfBallViews != 0 {print("Мама увидит мячик \(countOfBallViews) раз(-а)")} else {print("Мама ни разу не увидит мячик")}
      }
      MyFunc(floorWeight: 4, boyFloor: 7, momFloor: 4, coefficient: 0.75)

  11. krovevs:

    Менее производительное, но тоже решение для 11 задания:
    func MyFunc (_ a: String) -> Bool {
    let a = a.trimmingCharacters(in: .whitespaces).lowercased() // убрать из учета пробелы и большие учет регистра
    for i in Array(a) { // взятие буквы для сравнения
    var countOfRepeats = 0 // переменная для подсчета повторений
    for iTwo in Array(a) { // взятие букв которые сравниваются с первой
    if i == iTwo && countOfRepeats == 0 {
    countOfRepeats += 1 // если буквы одинаковые, то + повторение (с учетом проверяемой)
    } else if i == iTwo && countOfRepeats != 0 { // если встретилась буква после исходной, то отметить дубликат и завершить функцию
    return false
    }
    }
    }
    return true
    }
    print(MyFunc(«привет»))
    print(MyFunc(«Раз двА «))

  12. shirokov44007:

    Мой вариант решения 12 номера :

    func charCheck ( firstLetterSet: String , secondLetterSet: String ) -> Bool {

    return (Set(firstLetterSet) == Set(secondLetterSet)) == (firstLetterSet.count == secondLetterSet.count)

    }

  13. shirokov44007:

    // ЗАДАНИЕ 13

    // isPrime умеет в определение простых чисел

    func isPrime(_ number: Int) -> Bool {
    return number > 1 && !(2..<number).contains { number % $0 == 0 }

    }

    isPrime(6)

    //теперь использую isPrime в primeNumbers

    func primeNumbers ( range: ClosedRange ) -> [Int] {
    var array: [Int] = []
    for i in range {

    if isPrime(i) {array.append(i)}
    }
    return array
    }

    primeNumbers(range: 1…10) // [2, 3, 5, 7]

  14. shirokov44007:

    //ЗАДАНИЕ 14

    func exponentiation (degree: Int , num: Int) -> Int {

    let doubleDegree = Double(degree)
    let doubleNum = Double(num)
    let i = Int(pow(doubleDegree, doubleNum))
    return i

    }
    exponentiation(degree: 2, num: 3) // 8

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