Курс по Nim

Арифметика: + - * / div mod | Курс по Nim, урок 7

Арифметика: + - * / div mod | Курс по Nim, урок 7
Михаил Омельченко
Автор
Михаил Омельченко
Опубликовано 04.11.2026
0,0
Views 1

Необходимые знания

Урок 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 канал

0,0

Авторизуйтесь, чтобы оставить комментарий.

Комментариев: 0

Нет комментариев.

Тут может быть ваша реклама

Пишите info@aisferaic.ru

Похожие туториалы