Введение
Часть 1. Базовые возможности Swift
Часть 2. Контейнерные типы данных
Часть 3. Основные возможности Swift
Часть 4. Введение в разработку приложений
Глава 5. Нетривиальные возможности Swift
1 из 2

Практические и теоретические задания

Задание 1

Вам даны две переменные. Первая дробного типа хранит в себе расстояние в километрах. Вторая целочисленная хранит в себе время в секундах, за которое преодолели данное расстояние.

Найдите скорость в метрах в минуту.

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

// расстояние
var lengthOfPath = Double(52)
// время
var seconds = Int(360)
// вычисление скорости в метрах в минуту
var v = (lengthOfPath*1000) / (Double(seconds)/60)

Задание 2

Даны два целочисленных трехзначных числа. Найти шестизначное, образованное слиянием данных чисел в одно. К примеру из чисел 111 и 222 должно получиться 111222. При этом конечный результат должен иметь тип Int .

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

var a = 166
var b = 556
var c = Int("\(a)\(b)")

Задание 3

  1. Объявите две целочисленные переменные типов Int8 и UInt8. В одну из них запишите максимальное значение, которое может принять параметр типа UInt8, в другую — минимальное значение, которое может принять параметр типа Int8. Обратите внимание на то, какое значение в какую переменную может быть записано.
  2. Выведите полученные значения на консоль.
Правильный ответ

//1
var a: Int8 = Int8.min
var b: UInt8 = UInt8.max

//2
print(a)
print(b)

Задание 4

  1. Объявите две целочисленные однотипные переменные, при этом тип данных первой должен быть задан неявно, а второй — явно. Обеим переменным должны быть присвоены значения.
  2. Поменяйте значения переменных местами.
  3. Выведите получившиеся значения на консоль. При этом в каждом варианте выводимых данных текстом напишите, какую переменную вы выводите.
Подсказка

Для того, чтобы поменять местами значения переменных, вам потребуется использовать еще одну переменную, которая будет служить буфером.

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

//1
var c: Int = 50
var d = 100

//2
var tmp = 0
tmp = c
c = d
d = tmp

//2 еще один вариант
(c, d) = (d, c)

//3
print("Значение переменной c = \(c)")
print("Значение переменной d = \(d)")

Задание 5

  1. Объявите два параметра. Первый из них должен быть константой типа Float с произвольным числовым значением, второй — переменной типа Double с произвольным значением.
  2. Установите новое произвольное значение всем параметрам, для которых эта операция возможна.
Правильный ответ

let parameterOne: Float = 3.14
var parameterTwo: Double = 19.054
parameterTwo = 9.42

Установка нового значения для констант невозможна. Именно по этой причине попытка установки значения для параметра parameterOne приведет к ошибке.

Задание 6

1) Объявите три константы: одну типа Int со значением 18, вторую типа Float со значением 16.4 и одну типа Double со значением 5.7.
2) Найдите сумму всех трех констант и запишите ее в переменную типа Float.
3) Найдите произведение всех трех констант и запишите его в переменную типа Int. Помните, что вам необходимо получить результат с минимальной погрешностью (т.е. с максимальной точностью).
4) Найдите остаток от деления константы типа Float на константу типа Double и запишите ее в переменную типа Double.
5) Выведите на консоль результаты всех трех операций

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

//1
// параметры могут быть объявлены в одну строку (как показано ниже)
// либо каждый параметр в своей строке

// при объявлении данных параметров тип данных можно указать
// только для second, т.к. для остальных он определяется
// неявно именно так, как этого требует задание
let first = 18
let second: Float = 16.4
let third = 5.7

//2
// тип данных переменной указывать не требуется
// он определяется по переданному значению
var sum = Float(first) + second + Float(third) // 40.1

//3
// два параметра имеют десятичные знаки после запятой
// и для того, чтобы обеспечить максимальную точность,
// необходимо высчитать произведение в типе Float или Double
// и только потом переводить в Int.
// в ном случае, если значение каждой переменной сразу переводить
// в Int, то десятичные цифры будут просто отброшены
var multi = Int( Float(first) * second * Float(third) ) // 1682
// для примера посмотрите на второй вариант подсчета суммы
// разница в результате очень существенная
var multi2 = first * Int(second) * Int(third) // 1440

//4
var res = Double(second.truncatingRemainder(dividingBy: Float(third))) // 5
// обратите внимание на то, что ответ получился слегка странным,
// имеющим много знаков после точки.
// это связано с тем, что при округлении Float в Double (операция Double(second))
// новое число несколько теряет в своей точности:
Double(second) // 16.39999961853027 вместо 16.4
// причиной этому являются используемые в Swift стандарты
// и принципы работы с числами с плавающей точкой
// одинарной и двойной точности

//5
print(sum)
print(multi)
print(res)

Задание 7

1) Объявите переменные a и b целочисленного типа данных и проинициализируйте им значения 2 и 3.
2) Вычислите значение уравнения (a+4b)(a–3b)+a2 и выведите результат на консоль.

Подсказка

Самый простой способ получить квадрат числа — умножить его на себя дважды. К примеру a в квадрате будет выглядеть как a*a.

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

// 1
var a = 2
var b = 3

// 2
var res = (a + 4 * b)*(a - 3 * b)+a * a // -94
print(res)

Задание 8

1) Объявите переменные c и d и присвойте им значения 1.75 и 3.25.
2) Вычислите значение уравнения 2(c+1)2+3(d+1) и выведите результат на консоль.
3) Какой тип данных будет у результата математического выражения?

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

// 1
var c = 1.75
var d = 3.25

// 2
var res = 2*(c+1)*2+3*(d+1) //23.75
print(res)

// 3
// Тип данных переменной res - Double
// о функции type(of:) вы узнаете в конце главы
// она позволяет определить тип переданного параметра
type(of: res) // Double.Type

Задание 9

1) Объявите константу length и запишите в нее произвольное целочисленное значение.
2) Вычислите площадь квадрата с длиной стороны, равной length.
3) Вычислите длину окружности радиусом length.
4) Получите произведение полученных значений

Подсказка

1) Формула для расчета площади квадрата S = lenght2
2) Формула для расчета длины окружности P = 2πR

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

//1
let length = 11

//2
let sSquare = length*length // 121

//3
// обратите внимание, что в формуле участвуют как
// дробные, так и целые числа
// вариант 1
let pCircle1 = Double(2) * 3.14 * Double(length) // 69.08
// вариант 2 (менее точный)
let pCircle2 = 2*Int( 3.14 * Double( length ) ) // 68

//4
let result = Double(sSquare) * pCircle1 // 8358.68

Задание 10

1) Объявите переменную типа String и запишите в нее произвольный строковый литерал.
2) Объявите константу типа Character, содержащую произвольный символ латинского алфавита.
3) Объявите две переменные типа Int и запишите в них произвольные значения.
4) Одним выражением объедините в строковый литерал переменную типа String, константу типа Character и сумму переменных типа Int, а результат запишите в новую константу.
5) Выведите данную константу на консоль.

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

// 1
var str = "Swift"

// 2
// в данном случае необходимо явно указать тип данных
// т.к. в ином случае Swift установит его равным String
let char: Character = "A"

// 3
var a = 12
var b = 9

// 4
// вариант 1
let res = "\(str) \(char) \(a + b)" // "Swift A 21"
// вариант 2
let res2 = str + String(char) + String(a + b) // "SwiftA21"

Задание 11

Выведите на консоль букву W, составленную из символов «звездочка» (*), расположенных в три строки.
*   *   *
 * * * *
  *   *  

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

print("*   *   *")
print(" * * * *")
print("  *   *")

Задание 12

1) Объявите три переменные: в первую запишите номер дня в месяце, во вторую запишите название месяца, в третью запишите год. Тип данных переменных выберите самостоятельно
2) Выведите на консоль дату в формате «2021 январь 01», используя данные, записанные в объявленные ранее переменные.

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

//1
var day = "11"
var month = "январь"
var year = "2021"

//2
print("\(year) \(month) \(day)")

Задание 13

1) Объявите две логические переменные. Значение первой должно быть равно true, второй — false.
2) Получите результат операции логического И и логического ИЛИ, где в качестве операндов используются данные переменные

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

//1
var a = true
var b = false

//2
a && b // false
a || b // true

Задание 14

Без использования Xcode (в уме или с помощью ручки и бумаги) вычислите результат следующих логических выражений:

  • ( ( true && false ) || true )
  • true && false && true || ( true || false )
  • false || ( false || true ) && ( true && false )
Правильный ответ

true
true
false

Задание 15

1) Объявите строковую константу и запишите в нее ваше имя.
2) Объявите переменную типа Float и запишите в нее ваш вес в килограммах.
3) Объявите переменную типа Int и запишите в нее ваш рост в сантиметрах.
4) Вычислите ваш индекс массы тела и запишите его в переменную. Формула для расчета ИМТ: ИМТ = вес[кг] / рост [в метрах в квадрате]
5) Выведите на консоль текст, содержащий ваши имя и индекс массы тела. При этом используйте значения из объявленных переменных

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

//1
var name = "Василий"

//2
var weight: Float = 73.0

//3
var height = 183

//4
// обратите внимание, что рост указан в сантиметрах
// а в формуле используется в метрах
var heightM = Float(height) / 100 // 1.79
var index = weight / (heightM * heightM)  // 21.7982

//5
print("Меня зовут \(name). Мой ИМТ - \(index)")

Задание 16

Посмотрите на код ниже

let a: Int = 46
let b: Int = 10
// 1
let answer1: Int = (a * 100) + b
// 2
let answer2: Int = (a * 100) + (b * 100)
// 3
let answer3: Int = (a * 100) + (b / 10)
// 4
let answer4: Int = (b / 100) * 12 + Int((Double(a) / 0.01))

С помощью калькулятора (без использования Xcode) определите значения всех четырех выражений.

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

1 — 4610

2 — 5600

3 — 4601

4 — 4600

Все выражения, кроме четвертого, скорее всего не вызвали у вас проблем. В четвертом обратите внимание, что левая часть выражения (где используется b) равно 0, т.к. тип данных целочисленный, а при делении 10 на 100 получается 0,1, у которого просто отбрасывается дробная часть.

Задание 17

В выражении ниже расставьте скобки, так, чтобы они соответствовали порядку вычисления и не изменяли итоговый результат. Например, выражение 3 + 1 * 2 должно было бы превратиться в 3 + (1 * 2).

5 * 3 - 4 / 2 * 2
Правильный ответ

(5 * 3) - ((4 / 2) * 2)

Задание 18

  1. Объявите две константы a и b типа Double и проинициализируйте им произвольные значения.
  2. Рассчитайте среднее значение a и b и сохранить результат в константе типа Float с именем average.
Правильный ответ

// 1
let a: Double = 12.2
let b: Double = 5.4

//2
let average = Float(a + b) / 2 // 8.8