Курс по Nim

Ввод с клавиатуры: readLine(stdin) | Курс по Nim, урок 9

Ввод с клавиатуры: readLine(stdin) | Курс по Nim, урок 9
Михаил Омельченко
Автор
Михаил Омельченко
Опубликовано 13.11.2026
0,0
Views 13

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

Урок 1, Терминал и папки: первые команды: команда cd. Урок 3, Первая программа: от текста к исполняемому файлу: запуск исполняемого файла. Урок 4, Ошибка компилятора: как её читать: папка nim-kurs в редакторе, создание файла, адрес ошибки. Урок 5, Переменная: var и let: let. Урок 6, Тип значения: int, float, string, bool: строка, проверка типов при сборке. Урок 7, Арифметика: + - * / div mod: запись float(boxes), длинное сообщение type mismatch. Урок 8, Строки: склейка & и превращение числа в строку $: склейка.

Чем закончился урок 8

Программа из файла traty.nim печатает четыре строки, последние две Всего: 1649 и Среднее: 549. Вторая строка у вас может быть своя.

Откройте терминал и перейдите в папку nim-kurs. Эту же папку откройте в редакторе кода.

Так выглядит traty.nim после урока 8. Если файла нет или он не собирается, сохраните в него этот текст.

Пример traty.nim

echo "Учёт трат"
echo "Программа считает мои расходы"
var total = 0
total = total + 350
total = total + 1200
total = total + 99
echo "Всего: " & $total
echo "Среднее: " & $(total div 3)

На Mac команды этого урока не запускались.

Ввод с клавиатуры

Суммы в traty.nim записаны в коде, поэтому программа при каждом запуске печатает одно и то же. Ввод это текст, который вы набираете, пока программа работает.

readLine(stdin) читает одну строку ввода: программа ждёт, пока вы наберёте текст и нажмёте Enter. Запись устроена как float(boxes) в уроке 7: имя readLine, за ним в скобках значение stdin. stdin это стандартный ввод, так в коде называется ввод из терминала.

Создайте файл vvod.nim в папке nim-kurs. Наберите строки из примера в английской раскладке, кроме русских слов, и сохраните файл.

Пример vvod.nim

echo "Ваш город?"
let city = readLine(stdin)
echo "Город: " & city

Наберите в терминале:

nim c -r --hints:off vvod.nim

На вопрос наберите Казань в русской раскладке и нажмите Enter.

На экране в PowerShell и Linux:

Ваш город?
Казань
Город: Казань

Строки на экране по порядку:

1) Ваш город?: строка 1 файла печатает вопрос. На строке 2 программа ждёт ввода. Курсор стоит в начале следующей строки экрана.

2) Казань: это слово набрали вы. Enter заканчивает ввод. readLine(stdin) даёт значение "Казань". Нажатие Enter в значение не попадает. Строка 2 файла записывает это значение в city.

3) Город: Казань: строка 3 склеивает подпись со значением city.

Наберите команду сборки ещё раз в английской раскладке и на вопрос сразу нажмите Enter. Курсор перейдёт на следующую строку экрана, ниже напечатается Город: без слова. readLine(stdin) даёт пустую строку "": значение string без единого знака.

Ввод всегда строка

Создайте файл summa.nim в папке nim-kurs. Наберите строки из примера и сохраните файл.

Пример summa.nim

echo "Сколько потратили?"
let amount = readLine(stdin)
echo "Сумма: " & amount

Наберите:

nim c -r --hints:off summa.nim

На вопрос наберите 350 и нажмите Enter.

На экране в PowerShell и Linux:

Сколько потратили?
350
Сумма: 350

Вы набрали цифры, а в amount записана строка "350": readLine(stdin) всегда даёт string. Поэтому строка 3 склеивает amount с подписью без $.

Откройте файл summa.nim в редакторе. Последней строкой допишите:

echo amount + 100

Сохраните файл. Снова наберите команду сборки.

Имя Anna в путях у вас будет своё.

Вывод в PowerShell:

C:\Users\Anna\nim-kurs\summa.nim(4, 13) Error: type mismatch
Expression: amount + 100
  [1] amount: string
  [2] 100: int literal(100)

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: int): int
[1] proc `+`(x, y: int16): int16
[1] proc `+`(x, y: int32): int32
[1] proc `+`(x, y: int64): int64
[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
[1] proc `+`(x: float): float
[1] proc `+`(x: float32): float32
[1] proc `+`(x: int): int
[1] proc `+`(x: int16): int16
[1] proc `+`(x: int32): int32
[1] proc `+`(x: int64): int64
[1] proc `+`(x: int8): int8

В Linux отличается только начало пути: /home/anna/nim-kurs/.

Адрес: строка 4, столбец 13, там стоит +. Две строки [1] и [2] с отступом под Expression, это значения слева и справа от +. Слева amount типа string, справа число 100, написанное в коде. К строке "350" число не прибавить, как в уроке 6, хотя в ней цифры. Список кандидатов читать не нужно.

Вопроса на экране нет: сборка не прошла, и программа не запускалась. Компилятор знает тип string у amount уже при сборке, до вашего ввода. Как превратить строку в число, разберу в уроке 10.

Удалите строку 4, сохраните файл и соберите его ещё раз. На вопрос наберите 350 и нажмите Enter: снова Сумма: 350.

Задание

Откройте файл traty.nim в редакторе. Все восемь строк оставьте. После строки 2 вставьте три строки:

1) строку, которая печатает вопрос На что потратили?

2) строку, которая записывает ответ в переменную category с помощью let и readLine(stdin)

3) строку, которая с помощью & печатает Записано:, пробел и ответ

Сохраните файл. Наберите:

nim c -r --hints:off traty.nim

На вопрос наберите кафе и нажмите Enter. Затем в английской раскладке запустите программу без сборки: .\traty.exe в PowerShell, ./traty в Linux и macOS. На вопрос наберите такси и нажмите Enter.

Верно, если:

1) после сборки за двумя прежними строками идут На что потратили?, набранное вами кафе, Записано: кафе, Всего: 1649 и Среднее: 549

2) запуск без сборки печатает те же строки, только вместо кафе стоят набранное вами такси и Записано: такси

Если вывод другой, исправьте строку файла, сохраните файл и снова соберите его:

1) Записано:кафе: в кавычках после двоеточия нет пробела. Допишите его.

2) Записано: category или Записано: & category: имя category стоит внутри кавычек. Закройте кавычки после пробела, & category поставьте за ними.

3) вы набрали кафе, а после Записано: пусто: в строке с Записано нет & category. Допишите & category за кавычками. Если вы сразу нажали Enter без слова, файл верный: запустите программу ещё раз и наберите кафе.

4) has to be used (or discarded), перевод: "должно быть использовано (или отброшено)". Значение readLine(stdin) не записано в переменную. Начните строку с let category =.

5) ambiguous identifier: 'readLine', перевод: "неоднозначное имя". После readLine нет (stdin), напишите readLine(stdin).

6) type mismatch с Expression: readLine(): скобки после readLine пустые. Впишите в них stdin.

7) после двух прежних строк вопроса нет, курсор стоит на пустой строке экрана. В файле вопрос оказался ниже readLine. Наберите кафе, нажмите Enter и поставьте вопрос выше readLine.

8) На что потратили? стоит после Среднее: 549: три новые строки вставлены в конец файла. Перенесите их сразу под строку 2.

С этой версии traty.nim начнётся урок 10.

Итоги

readLine(stdin) останавливает программу, пока вы не наберёте строку и не нажмёте Enter. Нажатие Enter в значение не попадает. Сразу нажатый Enter даёт пустую строку "". Значение всегда string, даже если набраны цифры. Строку с числом не сложить: сборка даёт type mismatch.

В уроке 10 разберу модуль, import и превращение строки в число.

Код урока

Примеры этого урока лежат в репозитории курса, папка lesson_09.

Предыдущий урок: Строки: склейка & и превращение числа в строку $


Подписывайтесь на мой Telegram канал

0,0

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

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

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

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

Пишите info@aisferaic.ru

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