Строки: склейка & и превращение числа в строку $ | Курс по Nim, урок 8
Необходимые знания
Урок 1, Терминал и папки: первые команды: команда cd. Урок 4, Ошибка компилятора: как её читать: папка nim-kurs в редакторе, создание файла, адрес ошибки и столбец в редакторе. Урок 5, Переменная: var и let: объявление. Урок 6, Тип значения: int, float, string, bool: тип, строка. Урок 7, Арифметика: + - * / div mod: оператор, длинное сообщение type mismatch.
Чем закончился урок 7
Программа из файла traty.nim печатает пять строк, последние три 1649, 549, 549.6666666666666. Вторая строка у вас может быть своя.
Откройте терминал и перейдите в папку nim-kurs. Эту же папку откройте в редакторе кода.
Так выглядит traty.nim после урока 7. Если файла нет или он не собирается, сохраните в него этот текст.
Пример traty.nim
echo "Учёт трат"
echo "Программа считает мои расходы"
var total = 0
total = total + 350
total = total + 1200
total = total + 99
echo total
echo total div 3
echo total / 3
На Mac команды этого урока не запускались.
Склейка &
Программа учёта трат печатает числа без подписи. Подпись добавляют склейкой.
Строка это значение типа string, текст в кавычках, урок 6.
Склейка соединяет две строки в одну новую. Склейку делает оператор &.
Создайте файл gorod.nim в папке nim-kurs. Наберите строки из примера в английской раскладке, кроме русских слов, и сохраните файл.
Пример gorod.nim
let city = "Казань"
let title = "Город: " & city
echo title
echo "Город:" & city
Наберите в терминале:
nim c -r --hints:off gorod.nim
Вывод в PowerShell и Linux:
Город: Казань
Город:Казань
Строки вывода по порядку:
1) Город: Казань: строка 2 файла склеивает "Город: " со значением city и записывает новую строку в title. Строка 3 печатает title.
2) Город:Казань: в строке 4 после двоеточия в кавычках нет пробела. Сам & пробел не добавляет.
Число в строку: $
Число & не склеивает. Его сначала превращают в строку оператором $: $7 даёт строку "7".
Создайте файл poezdka.nim в папке nim-kurs. Наберите строки из примера и сохраните файл.
Пример poezdka.nim
let days = 7
let price = 1250.5
let paid = true
let note = "Дней: " & $days
echo note
echo "Цена: " & $price
echo "Оплачено: " & $paid
echo days + 1
echo "Вдвое: " & $(days * 2)
echo "Дней: ", days
Наберите:
nim c -r --hints:off poezdka.nim
Вывод в PowerShell и Linux:
Дней: 7
Цена: 1250.5
Оплачено: true
8
Вдвое: 14
Дней: 7
Строки вывода по порядку:
1) Дней: 7: строка 4 превращает значение days в строку "7" и склеивает с подписью. Строка 5 печатает note.
2) Цена: 1250.5: строка 6, $ у значения float.
3) Оплачено: true: строка 7, $ у значения bool.
4) 8: строка 8 прибавляет к days единицу. $ в строке 4 сделал новое значение "7", а переменная days осталась int.
5) Вдвое: 14: $ действует на то, что стоит сразу справа, в строке 9 это (days * 2) целиком. Без скобок $days * 2 значит ($days) * 2. Строку на число не умножить: type mismatch.
6) Дней: 7: строка 10, echo печатает значения подряд. Пробел echo не ставит, он взят из кавычек "Дней: ".
Строки 5 и 10 напечатали одно и то же. Для печати хватает запятых: echo сам применяет $ к каждому значению. Но значения string в программе не остаётся. & даёт значение string: его записывают в переменную, как note в строке 4, печатают позже или склеивают дальше.
Строка и число без $
Откройте файл poezdka.nim в редакторе. В строке 4 уберите $ и сохраните файл. Снова наберите команду сборки.
Имя Anna в путях у вас будет своё.
Вывод в PowerShell:
C:\Users\Anna\nim-kurs\poezdka.nim(4, 25) Error: type mismatch
Expression: "Дней: " & days
[1] "Дней: ": string
[2] days: int
Expected one of (first mismatch at [position]):
[1] proc `&`(x, y: char): string
[1] proc `&`(x: char; y: string): string
[1] proc `&`[T](x, y: sink seq[T]): seq[T]
[1] proc `&`[T](x: sink seq[T]; y: sink T): seq[T]
[2] proc `&`(x, y: string): string
[2] proc `&`(x: string; y: char): string
[2] proc `&`[T](x: sink T; y: sink seq[T]): seq[T]
В Linux отличается только начало пути: /home/anna/nim-kurs/.
Две строки [1] и [2] с отступом под Expression, как и в уроке 7, это значения слева и справа от &. Слева string, справа int, а среди кандидатов такой пары нет. Список читать не нужно.
Адрес: строка 4, столбец 25. Поставьте курсор прямо перед &: нижняя строка редактора покажет столбец 21.Компилятор считает русскую букву за два столбца, редактор за один. Левее & четыре русские буквы, поэтому номер в сообщении на 4 больше.
Значит, в строке с русскими буквами место ошибки ищите по тексту из Expression, здесь "Дней: " & days. Адрес указывает на его оператор &, как на * в уроке 7.
Верните $ в строку 4, сохраните файл и соберите его ещё раз: снова шесть строк вывода.
Задание
Откройте файл traty.nim в редакторе. Строки 1-6 оставьте. Из двух средних остаётся целое.
1) строку echo total замените строкой, которая печатает Всего: 1649 с помощью & и $
2) строку echo total div 3 замените строкой, которая печатает Среднее: 549, тоже с помощью & и $
3) строку echo total / 3 удалите
Сохраните файл. Наберите:
nim c -r --hints:off traty.nim
Снова откройте файл traty.nim в редакторе. В строке 7, где Всего, уберите $. Сохраните файл. Снова наберите команду сборки.
Верно, если:
1) после первой сборки за двумя прежними строками вывода идут Всего: 1649 и Среднее: 549
2) при второй сборке компилятор печатает type mismatch, адрес: строка 7, столбец 21. Курсор прямо перед & даёт в редакторе столбец 16.Ниже стоят [1] "Всего: ": string и [2] total: int
Если вывод другой, исправьте строку файла, сохраните файл и снова соберите его:
1) Всего:1649: в кавычках после двоеточия нет пробела. Допишите его.
2) первая сборка дала type mismatch: $ пропущен или действует не на то значение. Выражение после $ берётся в скобки, как в строке 9 файла poezdka.nim.
3) undeclared identifier: '&$': между & и $ нет пробела. Поставьте пробелы с обеих сторон &.
4) вторая сборка прошла без ошибки: между строкой и числом стоит запятая. Замените её на &.
5) вторая сборка дала столбец 22 или 23 либо прошла без ошибки, хотя запятой нет: в строке 7 лишний $. Там $ нужен только перед total, остальные уберите.
Верните $ в строку 7, сохраните файл и соберите его ещё раз: снова Всего: 1649 и Среднее: 549. С этой версии traty.nim начнётся урок 9.
Итоги
& склеивает две строки и пробел сам не ставит. $ превращает значение int, float или bool в строку, сама переменная не меняется. echo с запятыми сам превращает значения в строки и только печатает их. Строку и число без $ не склеить: сборка даёт type mismatch. Правее русских букв столбец в сообщении больше, чем в редакторе: место ошибки ищите по Expression.
В уроке 9 разберу ввод с клавиатуры: readLine(stdin).
Код урока
Примеры этого урока лежат в репозитории курса, папка lesson_08.
Предыдущий урок: Арифметика: + - * / div mod
Следующий урок: Ввод с клавиатуры: readLine(stdin)
Подписывайтесь на мой Telegram канал
Авторизуйтесь, чтобы оставить комментарий.
Нет комментариев.
Тут может быть ваша реклама
Пишите info@aisferaic.ru