Ввод с клавиатуры: readLine(stdin) | Курс по Nim, урок 9
Необходимые знания
Урок 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 канал
Авторизуйтесь, чтобы оставить комментарий.
Нет комментариев.
Тут может быть ваша реклама
Пишите info@aisferaic.ru