Арифметика: + - * / div mod | Курс по Nim, урок 7
Необходимые знания
Урок 1, Терминал и папки: первые команды: команда cd. Урок 4, Ошибка компилятора: как её читать: папка nim-kurs в редакторе, создание файла, сообщение cannot open, адрес ошибки, кандидаты. Урок 5, Переменная: var и let: объявление, присваивание. Урок 6, Тип значения: int, float, string, bool: тип, сообщение type mismatch.
Чем закончился урок 6
Программа из файла traty.nim печатает три строки, последняя из них сумма 1550. Вторая строка у вас может быть своя.
Откройте терминал и перейдите в папку nim-kurs. Эту же папку откройте в редакторе кода.
Так выглядит traty.nim после урока 6. Если файла нет или он не собирается, сохраните в него этот текст.
Пример traty.nim
echo "Учёт трат"
echo "Программа считает мои расходы"
var total = 0
total = total + 350
total = total + 1200
echo total
На Mac команды этого урока не запускались.
Операторы
Программа учёта трат будет считать среднюю трату. Для этого нужно деление. Целые числа делятся двумя способами: с дробной частью и без неё.
Оператор это знак или слово, которое задаёт действие над значениями.
Создайте файл minuty.nim в папке nim-kurs. Наберите строки из примера в английской раскладке и сохраните файл.
Пример minuty.nim
let minutes = 135
echo minutes + 15
echo minutes - 15
echo minutes * 2
echo minutes / 60
echo minutes div 60
echo minutes mod 60
echo 10 + minutes * 2
echo (10 + minutes) * 2
Наберите в терминале:
nim c -r --hints:off minuty.nim
Вывод в PowerShell и Linux:
150
120
270
2.25
2
15
280
290
Строки вывода по порядку:
1) 150: строка 2 файла складывает, результат int.
2) 120: строка 3 вычитает, результат int.
3) 270: строка 4 умножает, результат int.
4) 2.25: строка 5 делит оператором /. Результат всегда float, даже у двух целых.
5) 2: строка 6 выполняет целое деление div. Дробная часть отбрасывается, результат int.
6) 15: строка 7 вычисляет остаток от деления mod: в 135 минутах 2 часа, остаётся 15 минут. Результат int.
7) 280: строка 8 сначала умножает, потом прибавляет 10.
8) 290: в строке 9 скобки, поэтому сначала идёт сложение.
Порядок действий
Сначала выполняются *, /, div, mod, потом + и -.
Целое и дробное вместе
Создайте файл ves.nim в папке nim-kurs. Наберите строки из примера и сохраните файл.
Пример ves.nim
var weight: float = 2
echo weight
weight = 2.75
let boxes = 3
echo boxes * weight
Наберите:
nim c -r --hints:off ves.nim
Имя Anna в путях у вас будет своё.
Вывод в PowerShell:
C:\Users\Anna\nim-kurs\ves.nim(5, 12) Error: type mismatch
Expression: boxes * weight
[1] boxes: int
[2] weight: float
Expected one of (first mismatch at [position]):
[1] func `*`[T](x, y: set[T]): set[T]
[1] proc `*`(x, y: float): float
[1] proc `*`(x, y: float32): float32
[1] proc `*`(x, y: int16): int16
[1] proc `*`(x, y: int32): int32
[1] proc `*`(x, y: int8): int8
[1] proc `*`(x, y: uint): uint
[1] proc `*`(x, y: uint16): uint16
[1] proc `*`(x, y: uint32): uint32
[1] proc `*`(x, y: uint64): uint64
[1] proc `*`(x, y: uint8): uint8
[2] proc `*`(x, y: int): int
[2] proc `*`(x, y: int64): int64
В Linux отличается только начало пути: /home/anna/nim-kurs/.
Сборка не прошла, поэтому программа не запускалась. Список внизу читать целиком не нужно. Читайте сообщение сверху:
1) Адрес: строка 5, столбец 12, там стоит *.
2) type mismatch, перевод: "несовпадение типов".
3) Expression, перевод: "выражение". Это запись, из которой получается значение, здесь boxes * weight.
4) Две строки [1] и [2] с отступом не адрес: это значения слева и справа от *. Причина ошибки здесь: слева int, справа float.
5) Expected one of (first mismatch at [position]), перевод: "ожидался один из вариантов, первое несовпадение в позиции [номер]". Ниже идут кандидаты: варианты * для разных типов. Номер перед кандидатом показывает, какое значение не подошло первым: [1] левое, [2] правое.
В списке у каждого кандидата значения слева и справа, x и y, одного типа. Поэтому пары int и float здесь нет.
Приведение типа
Приведение типа делает из значения одного типа значение другого: float(boxes), int(weight). Компилятор сам не приводит значение переменной типа int к float, и наоборот. Нужна явная запись. Сама переменная не меняется.
Откройте файл ves.nim в редакторе. Замените строку 5 на две строки:
echo float(boxes) * weight
echo boxes * int(weight)
Сохраните файл. Снова наберите команду сборки.
Вывод в PowerShell и Linux:
2.0
8.25
6
Строки вывода по порядку:
1) 2.0: строка 2 печатает weight. Строка 1 записала целое число 2, написанное в коде, в переменную типа float, и получилось 2.0. Такое число компилятор приводит сам: weight * 2 соберётся, а boxes * 2.5 нет.
2) 8.25: строка 5 умножает. float(boxes) даёт 3.0, поэтому оба значения float.
3) 6: строка 6 умножает. int(weight) отбрасывает дробную часть 2.75 и даёт 2, округления нет.
Ошибки в этих командах
type mismatch у div. Набирать не нужно, это на случай ошибки. Сообщение для строки 5 echo weight div 2:
C:\Users\Anna\nim-kurs\ves.nim(5, 13) Error: type mismatch
Expression: weight div 2
[1] weight: float
[2] 2: int literal(2)
Expected one of (first mismatch at [position]):
[1] proc `div`(x, y: int): int
[1] proc `div`(x, y: int16): int16
[1] proc `div`(x, y: int32): int32
[1] proc `div`(x, y: int64): int64
[1] proc `div`(x, y: int8): int8
[1] proc `div`(x, y: uint): uint
[1] proc `div`(x, y: uint16): uint16
[1] proc `div`(x, y: uint32): uint32
[1] proc `div`(x, y: uint64): uint64
[1] proc `div`(x, y: uint8): uint8
int literal(2) значит целое число 2, написанное в коде. Среди кандидатов нет float: div и mod работают только с целыми. Исправление: замените div на /, сохраните файл и снова соберите его.
Задание
Откройте файл traty.nim в редакторе. Первые две строки echo оставьте. Среднее это сумма, разделённая на число трат. Трат теперь три. Допишите строки:
1) перед строкой echo total прибавьте к total число 99
2) после строки echo total напечатайте целое среднее
3) следующей строкой напечатайте дробное среднее
Сохраните файл. Наберите:
nim c -r --hints:off traty.nim
Снова откройте файл traty.nim в редакторе. Последними строками допишите комиссию fee:
let fee: float = 50.5
echo total + fee
Сохраните файл. Снова наберите команду сборки.
Откройте файл и исправьте строку echo total + fee приведением типа, чтобы в результате осталась дробная часть. Сохраните файл. Снова наберите команду сборки.
Верно, если:
1) после первой сборки за двумя прежними строками идут 1649, 549, 549.6666666666666
2) при второй сборке компилятор печатает type mismatch, адрес указывает на echo total + fee, столбец 12, ниже стоят total: int и fee: float. Список кандидатов читать не нужно
3) после исправления последняя строка 1699.5
Если вывод другой, исправьте строку, сохраните файл и снова соберите его:
1) 549 и 549: в дробном среднем стоит div. Замените его на /.
2) дважды 549.6666666666666: в целом среднем стоит /. Замените его на div.
3) 549.0: div стоит внутри float(...), дробная часть уже отброшена. Замените div на /.
4) 1699 вместо 1699.5 или снова type mismatch: приведено не то значение. Приведите total.
Откройте файл, удалите строки с fee, сохраните файл и соберите его ещё раз: снова 1649, 549, 549.6666666666666. С этой версии traty.nim начнётся урок 8.
Итоги
/ всегда даёт float, остальные операторы у двух целых дают int. Значения переменных int и float в одном действии приводят к одному типу: float(...), int(...). int(...) отбрасывает дробную часть. Причина длинного type mismatch стоит в строках [1] и [2] под Expression.
В уроке 8 разберу строки: склейку & и превращение числа в строку $.
Код урока
Примеры этого урока лежат в репозитории курса, папка lesson_07.
Предыдущий урок: Тип значения: int, float, string, bool
Подписывайтесь на мой Telegram канал
Авторизуйтесь, чтобы оставить комментарий.
Нет комментариев.
Тут может быть ваша реклама
Пишите info@aisferaic.ru