РЯП скрипт — учебник

Это интерактивный учебник: примеры запускаются прямо на странице — приложение и компилятор не нужны, перевод происходит здесь же.

Глава 0. Знакомство и установка

РЯП скрипт — язык программирования, в котором команды пишутся по-русски. Программа на РЯП — обычный текстовый файл с расширением .ряпс. Специальная программа — компилятор ryap.exe — превращает её в веб-страницу, которую открывает любой браузер: получаются программы с окнами, кнопками и даже игры с картинками.

Работать можно двумя способами:

Установка: приложение РЯПС2.7

  1. Распакуйте архив РЯПС2.7-установка.zip в любую папку.
  2. Запустите Установить.bat. Он сам скопирует приложение, добавит команду ryap.exe, подключит Sublime Text, создаст ярлыки и свяжет файлы .ряпс и .ряп. Права администратора не нужны.
  3. Установите редактор Sublime Text: зайдите на сайт sublimetext.com, нажмите Download, запустите скачанный установщик (дальше — Далее, Далее, Готово).
  4. Откройте файл примера (папка примеры) двойным щелчком — он откроется в Sublime с подсветкой. Нажмите Ctrl+B — программа скомпилируется и откроется в браузере. Ctrl+Shift+B — выбрать вариант «РЯПС» (получить файл .js).

Проверка установки: нажмите Win+R, введите cmd, Enter, в чёрном окне наберите ryap.exe -h — должна появиться справка по командам. Если появилась — всё работает.

Задания и проверки

В конце каждой главы — задания. В каждом задании: условие, форматы ввода и вывода, таблица «Например» с открытыми тестами и редактор кода.

Кнопка «Проверить» прогоняет вашу программу на открытых тестах (в таблице видно: Ввод → Ожидалось → Получил) и на скрытых тестах — по ним видно только ✓ или ✗, а вверху считается процент правильных решений. Скрытые тесты проверяют то, чего нет в примерах: другие числа, другие имена. Задание выполнено, когда процент равен 100%.

Полезно знать:

Если что-то не работает

Дальше — Глава 1: ваша первая программа. В учебнике она запускается прямо здесь, а после установки те же примеры будут работать и в Sublime.

Глава 1. Первая программа

Компьютер понимает сотни языков, но почти все они на английском. РЯП — язык программирования, где команды пишутся по-русски. Программа — это просто строки-команды, которые компьютер выполняет одна за другой.

Этот учебник живой: каждый пример можно запустить прямо здесь — кнопкой «Запустить» под редактором. Результат появится в чёрной панели ниже.

Шаг 1. Команда «окно»

Самая простая команда — окно: она показывает на экране окно с вашим текстом. Текст пишется в кавычках, после команды — скобки:

1

Попробуйте изменить текст в кавычках и запустить снова — в окне появится ваше сообщение. Текст в кавычках называется строкой.

Шаг 2. Команда «печать»

Окно каждый раз закрывать неудобно. Вторая команда — печать: она пишет текст не в окно, а в консоль — чёрную панель под редактором:

1

Каждая команда печатает свою строку. Порядок команд = порядок строк: компьютер выполняет программу сверху вниз.

Шаг 3. Переменные: программа запоминает

Программа может запомнить значение и дать ему имя — это называется переменной. А команда ЗОП задаёт пользователю вопрос и запоминает его ответ:

1

Что здесь произошло:

При запуске браузер покажет стандартное окно ввода — ответ напечатает человек на клавиатуре.

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Программа запустится прямо здесь, и проверки отметят результат. Застряли — откройте подсказку, потом решение.

Задание: Окно с приветствием

Условие задачи:

Напишите программу, которая показывает окно с текстом Привет, мир! (именно так, с запятой и восклицательным знаком).

Формат ввода: Нет.

Формат вывода: Одно окно с текстом «Привет, мир!».

Например:

ВводРезультат
—Привет, мир!
1

💡 Команда называется «окно», текст — в кавычках, после команды — скобки.
окно("Привет, мир!")

Задание: Две строки в консоль

Условие задачи:

Выведите в консоль ровно две строки — сначала Меня зовут РЯП, затем Я умею программировать.

Формат ввода: Нет.

Формат вывода: Две строки в консоли, в указанном порядке.

Например:

ВводРезультат
—Меня зовут РЯП Я умею программировать
1

💡 Две команды «печать» — одна под другой.
печать("Меня зовут РЯП")
печать("Я умею программировать")

Задание: Знакомство

Условие задачи:

Напишите программу: спросите у пользователя «Как тебя зовут?», запомните ответ в переменную и покажите окно вида Привет, <имя>! (например: Привет, Аня!).

Формат ввода: Одна строка — имя (например: Аня).

Формат вывода: Одно окно: Привет, <имя>! — с именем из ввода.

Например:

ВводРезультат
АняПривет, Аня!
1

💡 Сохраните ответ: пер имя = ЗОП("вопрос"). Потом склейте: "Привет, " + имя + "!"
пер имя = ЗОП("Как тебя зовут?")
окно("Привет, " + имя + "!")

Задание: Переменная и умножение

Условие задачи:

Создайте переменную ответ со значением 6 * 7 (именно умножением!) и выведите её в консоль.

Формат ввода: Нет.

Формат вывода: Одна строка в консоли: 42

Например:

ВводРезультат
—42
1

💡 пер ответ = 6 * 7 — а потом печать(ответ).
пер ответ = 6 * 7
печать(ответ)

Дальше — Глава 2: числа и арифметика. Справка по всем словам — в СПРАВКА.html.

Глава 2. Числа и арифметика

Компьютер изначально был создан как очень быстрый калькулятор. Числа пишутся без кавычек — кавычки только для текста. Сравните: печать("2+2") напечатает 2+2, а печать(2+2) напечатает 4.

Шаг 1. Числа с клавиатуры и четыре действия

Считать число с клавиатуры помогает команда ЦЗОП (цифровое значение от пользователя): пер возраст = ЦЗОП("Сколько тебе лет?") запомнит ответ как число, с которым можно считать. Четыре действия:

Работают +, -, * (умножение), / (деление). Скобки, как в математике, меняют порядок:

1

Шаг 2. Остаток от деления

В школе вы делили с остатком: 17 конфет на 5 друзей — каждому по 3, и 2 остаётся. За это отвечает команда остаток от деления на:

1

Если остаток равен 0 — число делится нацело. Так проверяют чётность, кратность и «каждый третий шаг».

Шаг 3. Округление

Деление даёт дроби: 7 / 2 = 3.5. Команды округления:

1

Внимание: считывается всё выражение в скобках — пишите целое снизу(7 / 2), чтобы округлить именно результат деления.

Шаг 4. Переменная-счётчик

Часто нужно увеличить значение: взять старое, прибавить один, записать обратно. Компьютер выполняет х = х + 1 именно так:

1

Этот приём — основа счёта в играх: очки, жизни, уровни растут именно так.

Задания к главе

Задание: Секунды

Условие задачи:

Напишите программу: спросите у пользователя, сколько часов, минут и секунд он хочет засечь (три вопроса командой ЦЗОП), и выведите в консоль, сколько всего это секунд.

Формат ввода: Три строки: часы, минуты, секунды (целые числа).

Формат вывода: Одна строка в консоли — общее количество секунд.

Например:

ВводРезультат
2 3 47384
1 0 03600
10 10 1036610
1

💡 Считайте: пер часы = ЦЗОП("Сколько часов?"), затем минуты и секунды. В одной минуте 60 секунд, в одном часе 60 минут.
пер часы = ЦЗОП("Сколько часов?")
пер минуты = ЦЗОП("Сколько минут?")
пер секунды = ЦЗОП("Сколько секунд?")
печать(часы * 60 * 60 + минуты * 60 + секунды)

Задание: Покупка

Условие задачи:

Напишите программу: спросите цену ручки и сколько ручек купили, затем цену тетради и сколько тетрадей. Выведите в консоль итоговую стоимость всей покупки.

Формат ввода: Четыре строки: цена ручки, количество ручек, цена тетради, количество тетрадей (целые числа).

Формат вывода: Одна строка в консоли — итоговая стоимость.

Например:

ВводРезультат
25 3 40 2155
10 5 20 3110
30 1 15 490
1

💡 Цена ручки умножить на количество ручек — это стоимость ручек. То же с тетрадями. Потом сложите.
пер цена_ручки = ЦЗОП("Цена ручки?")
пер ручки = ЦЗОП("Сколько ручек?")
пер цена_тетради = ЦЗОП("Цена тетради?")
пер тетради = ЦЗОП("Сколько тетрадей?")
печать(цена_ручки * ручки + цена_тетради * тетради)

Задание: Делим конфеты

Условие задачи:

Напишите программу: спросите, сколько конфет и сколько друзей. Выведите в консоль, сколько конфет останется, когда поделите их поровну между всеми друзьями. Обязательно используйте команду «остаток от деления на».

Формат ввода: Две строки: количество конфет, количество друзей (целые числа).

Формат вывода: Одна строка в консоли — остаток.

Например:

ВводРезультат
17 52
20 62
10 20
1

💡 печать(конфеты остаток от деления на друзья) — только сначала считайте оба числа командой ЦЗОП.
пер конфеты = ЦЗОП("Сколько конфет?")
пер друзья = ЦЗОП("Сколько друзей?")
печать(конфеты остаток от деления на друзья)

Задание: Часы и минуты (сложная)

Условие задачи:

Напишите программу: спросите, сколько минут длилась работа пользователя. Выведите строку вида X ч Y мин, где X — целые часы (используйте «целое снизу»), а Y — оставшиеся минуты (используйте «остаток от деления на»).

Формат ввода: Одна строка — всего минут (целое число).

Формат вывода: Одна строка в консоли вида «X ч Y мин».

Например:

ВводРезультат
5008 ч 20 мин
901 ч 30 мин
144024 ч 0 мин
1

💡 Часы: целое снизу(всего / 60). Минуты: всего остаток от деления на 60. Строка: печать(часы + " ч " + минуты + " мин").
пер всего = ЦЗОП("Сколько минут?")
пер часы = целое снизу(всего / 60)
пер минуты = всего остаток от деления на 60
печать(часы + " ч " + минуты + " мин")

Дальше — Глава 3: условия «если — иначе», где программа начинает принимать решения.

Глава 3. Условия: если — иначе

До сих пор команды выполнялись одна за другой, сверху вниз. Условия позволяют программе принимать решения: выполнить одни команды, если условие верно, и другие — если нет.

Шаг 1. Если — то — конец — иначе

Команда если проверяет условие. Если оно верно, выполняются команды до слова конец; слово иначе — это «в противном случае»:

1

Как читать: «если число больше 100, то — „Много!“, иначе — „Немного“». Каждая ветка заканчивается своим словом конец — и ветка перед иначе не исключение.

Шаг 2. Сравнения

РЯПСмыслJavaScript
равносовпадает==
не равноне совпадает!=
больше / меньшестрого больше / меньше>, <
большеравно / меньшеравноне меньше / не больше>=, <=
и / илиоба верны / хотя бы одно&&, ||
ненаоборот!
правда / ложьистина / ложьtrue / false

Сравнивать можно и числа, и строки: если имя равно "Аня" то …

Шаг 3. Иначе если: выбор из нескольких

Когда вариантов больше двух, помогает цепочка иначе если. Проверки идут сверху вниз: выполняется первая подошедшая ветка, остальные пропускаются. У каждой ветки свой конец — так цепочка читается легче:

1

Шаг 4. И, или, не

Условия объединяются: и — верны оба, или — хотя бы одно, не — наоборот:

1

Условие может быть сколь угодно длинным — главное, чтобы решение работало для любого числа из «Ограничений» задания, а не только для чисел из примеров. Скрытые тесты это проверяют.

Задания к главе

Задание: Знак числа

Условие задачи:

Напишите программу: спросите число. Если оно больше нуля — выведите слово плюс; если оно равно нулю — выведите ноль; если оно меньше нуля — выведите минус.

Формат ввода: Одна строка — целое число.

Формат вывода: Одна строка: «плюс», «ноль» или «минус».

Ограничения: во всех тестах −1000000000 ≤ число ≤ 1000000000.

Например:

ВводРезультат
5плюс
0ноль
-7минус
1

💡 Три проверки: если число больше 0 то … конец иначе если число меньше 0 то … конец иначе … конец
пер число = ЦЗОП("Введите число")
если число больше 0 то
	печать("плюс")
конец
иначе если число меньше 0 то
	печать("минус")
конец
иначе
	печать("ноль")
конец

Задание: Чётное или нечётное

Условие задачи:

Напишите программу: спросите число. Если оно делится на 2 без остатка — выведите чётное, иначе — выведите нечётное. Команда «остаток от деления на» подскажет.

Формат ввода: Одна строка — целое число.

Формат вывода: Одна строка: «чётное» или «нечётное».

Ограничения: во всех тестах −1000000000 ≤ число ≤ 1000000000.

Например:

ВводРезультат
4чётное
7нечётное
1

💡 если число остаток от деления на 2 равно 0 то — чётное, иначе — нечётное
пер число = ЦЗОП("Введите число")
если число остаток от деления на 2 равно 0 то
	печать("чётное")
конец
иначе
	печать("нечётное")
конец

Задание: Високосный год

Условие задачи:

Год называется високосным, если он делится на 4, но не делится на 100, или если он делится на 400. Напишите программу: спросите год и выведите да, если год високосный, и нет — иначе. Понадобятся «и», «или» и «остаток от деления на».

Формат ввода: Одна строка — год (целое число).

Формат вывода: Одна строка: «да» или «нет».

Ограничения: во всех тестах 1 ≤ год ≤ 9999.

Например:

ВводРезультат
2024да
1900нет
1

💡 Если (год остаток от деления на 4 равно 0 и год остаток от деления на 100 не равно 0) или год остаток от деления на 400 равно 0 — то да, иначе нет
пер год = ЦЗОП("Введите год")
если (год остаток от деления на 4 равно 0 и год остаток от деления на 100 не равно 0) или год остаток от деления на 400 равно 0 то
	печать("да")
конец
иначе
	печать("нет")
конец

Задание: Возраст со склонением (очень сложная)

Условие задачи:

Напишите программу: спросите возраст и выведите строку Вам X …, где после числа идёт правильное слово: год (1, 21, 101…), года (2, 3, 4, 22, 23, 24…), лет (5–20, 11–14, 25…). Исключение: 11, 12, 13, 14 — всегда «лет».

Формат ввода: Одна строка — возраст (целое число).

Формат вывода: Одна строка в консоли: «Вам … год/года/лет».

Ограничения: во всех тестах 1 ≤ возраст ≤ 999.

Например:

ВводРезультат
21Вам 21 год
5Вам 5 лет
11Вам 11 лет
1

💡 Последняя цифра решает (1 — год, 2–4 — года, иначе — лет), НО числа 11, 12, 13, 14 — всегда «лет». Проверьте сначала «от 11 до 14», потом последнюю цифру
пер возраст = ЦЗОП("Сколько лет?")
пер последняя = возраст остаток от деления на 10
если возраст большеравно 11 и возраст меньшеравно 14 то
	печать("Вам " + возраст + " лет")
конец
иначе если последняя равно 1 то
	печать("Вам " + возраст + " год")
конец
иначе если последняя большеравно 2 и последняя меньшеравно 4 то
	печать("Вам " + возраст + " года")
конец
иначе
	печать("Вам " + возраст + " лет")
конец

Задание: Треугольник (олимпиадная)

Условие задачи:

Спросите три отрезка и ответьте, можно ли из них сложить треугольник: он существует, если каждый отрезок меньше суммы двух других. Напечатайте да или нет.

Формат ввода: Три строки: длины отрезков a, b, c.

Формат вывода: Одна строка: «да» или «нет».

Ограничения: во всех тестах 1 ≤ отрезки ≤ 1000000.

Например:

ВводРезультат
3 4 5да
1 2 3нет
10 10 10да
1

💡 Достаточно проверить, что a меньше b + c, и b меньше a + c, и c меньше a + b — три сравнения через «и». Строго меньше: равенство (3, 4, 7) — это не треугольник!
пер а = ЦЗОП("Первый отрезок")
пер б = ЦЗОП("Второй отрезок")
пер в = ЦЗОП("Третий отрезок")
если а меньше б + в и б меньше а + в и в меньше а + б то
	печать("да")
конец
иначе
	печать("нет")
конец

Задание: Три по возрастанию (олимпиадная)

Условие задачи:

Спросите три числа и напечатайте их по возрастанию, через пробел. Перестановку удобно сделать через третью переменную: если а больше б то — поменять их местами (пер т = а, а = б, б = т).

Формат ввода: Три строки: числа a, b, c.

Формат вывода: Одна строка: три числа по возрастанию через пробел.

Ограничения: во всех тестах −1000 ≤ числа ≤ 1000.

Например:

ВводРезультат
3 1 21 2 3
5 5 55 5 5
-1 0 -3-3 -1 0
1

💡 Сначала упорядочьте а и б, потом б и в, потом снова а и б — после трёх проходов порядок готов. Печать: печать(а + " " + б + " " + в).
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
пер в = ЦЗОП("Третье число")
если а больше б то
	пер т = а
	а = б
	б = т
конец
если б больше в то
	пер т = б
	б = в
	в = т
конец
если а больше б то
	пер т = а
	а = б
	б = т
конец
печать(а + " " + б + " " + в)

Дальше — Глава 4: циклы. Компьютер сможет повторять команды за вас — хоть миллион раз.

Глава 4. Циклы: повторяем команды

Печатать одно и то же сто раз руками — мучение. Циклы говорят компьютеру: «повтори эти команды столько-то раз» или «повторяй, пока условие верно».

Шаг 1. Цикл со счётчиком

запустить цикл 5 раза то … конец повторяет команды 5 раз. Внутри цикла доступна переменная счетчик — она идёт по значениям 0, 1, 2, 3, 4:

1

Слова-метки: раза, раз, разов — выбирайте какое нравится.

Шаг 2. Счётчиком может быть выражение

Вместо числа можно написать любое выражение — цикл посчитает сам:

1

Часто счётчик нужен с единицы, а он идёт с нуля — тогда помогает (счетчик + 1).

Шаг 3. Накопление: копим ответ

Главный приём главы: переменная-накопитель. Перед циклом в неё кладут ноль, а в цикле прибавляют:

1

Так считают суммы, очки в играх, итоги чека.

Шаг 4. Цикл «пока» и выход из цикла

Второй вид цикла — пока: команды повторяются, пока условие верно. Важно менять внутри переменную условия, иначе цикл будет вечным. Команда выход из цикла прерывает его досрочно:

1

Прежде чем запустить «пока»-цикл, спросите себя: что изменится внутри, чтобы условие однажды стало неверным? Скрытые тесты заданий проверяют, что программа заканчивается и не виснет.

Задания к главе

Задание: Повторялка с нумерацией

Условие задачи:

Напишите программу: спросите слово (команда ЗОП) и число повторений (команда ЦЗОП). Выведите это слово в консоль N раз — каждое на новой строке, и пронумеруйте: каждая строка начинается с номера, скобки и пробела, например 1) Привет. Номера идут с 1 — а счётчик цикла, напомним, с нуля.

Формат ввода: Две строки: слово, затем число повторений N.

Формат вывода: N строк вида «<номер>) <слово>».

Ограничения: 0 ≤ N ≤ 1000. Программа должна закончиться мгновенно.

Например:

ВводРезультат
Привет 31) Привет 2) Привет 3) Привет
А 11) А
РЯП 0
1

💡 запустить цикл н раза то ... печать((счетчик + 1) + ") " + слово) ... конец — (счетчик + 1) даёт номера с единицы.
пер слово = ЗОП("Какое слово?")
пер н = ЦЗОП("Сколько раз?")
запустить цикл н раза то
	печать((счетчик + 1) + ") " + слово)
конец

Задание: Таблица умножения

Условие задачи:

Напишите программу: спросите число N и выведите 9 строк таблицы умножения на него — для i от 1 до 9 строку вида N x i = ответ (пробелы вокруг «x» и вокруг «=»). Внутри цикла счётчик идёт с нуля — пригодится выражение (счетчик + 1).

Формат ввода: Одна строка — целое число N.

Формат вывода: Девять строк вида «N x i = ответ».

Ограничения: −100 ≤ N ≤ 100.

Например:

ВводРезультат
33 x 1 = 3 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 3 x 5 = 15 3 x 6 = 18 3 x 7 = 21 3 x 8 = 24 3 x 9 = 27
00 x 1 = 0 0 x 2 = 0 0 x 3 = 0 0 x 4 = 0 0 x 5 = 0 0 x 6 = 0 0 x 7 = 0 0 x 8 = 0 0 x 9 = 0
55 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45
1

💡 запустить цикл 9 раза то ... печать(н + " x " + (счетчик + 1) + " = " + н * (счетчик + 1)) ... конец
пер н = ЦЗОП("Введите число")
запустить цикл 9 раза то
	печать(н + " x " + (счетчик + 1) + " = " + н * (счетчик + 1))
конец

Задание: Сумма от А до Б (сложная)

Условие задачи:

Напишите программу: спросите два числа — А и Б (А не больше Б) — и выведите сумму всех целых чисел от А до Б включительно. Например, для А = 2 и Б = 5 это 2+3+4+5 = 14. Считать можно и отрицательные: от −3 до 2 — это −3−2−1+0+1+2 = −3. Накопите ответ в переменную, а число шагов цикла посчитайте сами: от А до Б — это Б − А + 1 чисел.

Формат ввода: Две строки: А, затем Б (целые числа, А ≤ Б).

Формат вывода: Одна строка — сумма чисел от А до Б.

Ограничения: −10000 ≤ А ≤ Б ≤ 10000. Цикл на 20001 шаг обязан закончиться мгновенно.

Например:

ВводРезультат
2 514
3 33
-3 2-3
1

💡 пер сумма = 0; запустить цикл (б - а + 1) раза то ... внутри: сумма = сумма + а + счетчик — при счетчик 0 прибавляется само а; после цикла печать(сумма).
пер а = ЦЗОП("От какого числа?")
пер б = ЦЗОП("До какого числа?")
пер сумма = 0
запустить цикл (б - а + 1) раза то
	сумма = сумма + а + счетчик
конец
печать(сумма)

Задание: Степень двойки (сложная)

Условие задачи:

Напишите программу: спросите число N и выведите первую степень двойки, которая строго больше N. Степени двойки: 1, 2, 4, 8, 16, 32… Например, для N = 100 ответ 128. Используйте цикл «пока»: увеличивайте переменную вдвое, пока она не превысит N.

Формат ввода: Одна строка — целое число N.

Формат вывода: Одна строка — найденная степень двойки.

Ограничения: 0 ≤ N ≤ 1000000. Цикл «пока» справится мгновенно — но следите, чтобы его условие когда-нибудь стало неверным, иначе программа зависнет навсегда.

Например:

ВводРезультат
100128
12
01
1

💡 пер п = 1, потом: пока п меньшеравно н то ... п = п * 2 ... конец, после цикла печать(п)
пер н = ЦЗОП("Введите число")
пер п = 1
пока п меньшеравно н то
	п = п * 2
конец
печать(п)

Задание: Простое число (олимпиадная)

Условие задачи:

Простое число делится только на 1 и на себя: 2, 3, 5, 7, 11… Напишите программу: спросите число N и напечатайте да, если оно простое, и нет — иначе. Проверяйте делители от 2 до N − 1: если хоть один делит без остатка — число не простое.

Формат ввода: Одна строка — целое число N.

Формат вывода: Одна строка: «да» или «нет».

Ограничения: 0 ≤ N ≤ 10000. Цикл на 10000 шагов обязан закончиться мгновенно.

Например:

ВводРезультат
7да
4нет
2да
1

💡 пер простое = "да" до цикла; цикл со счётчиком от 2: запустить цикл (н - 1) раза даёт счётчик 1..н-2 — не годится, удобнее «пока»: пер д = 2, пока д меньше н то — если н остаток от деления на д равно 0 то простое = "нет"; д = д + 1. Числа 0 и 1 — не простые (проверьте их заранее).
пер н = ЦЗОП("Введите число")
пер простое = "да"
если н меньше 2 то
	простое = "нет"
конец
пер д = 2
пока д меньше н то
	если н остаток от деления на д равно 0 то
		простое = "нет"
	конец
	д = д + 1
конец
печать(простое)

Дальше — Глава 5: типы значений. Строки и числа — разные вещи, и JavaScript умеет превращать одно в другое.

Глава 5. Типы значений: строки и числа

У каждого значения есть тип: строка или число. Внешне похожи, но ведут себя по-разному — и это главный источник неожиданностей для программиста.

Шаг 1. Строка или число?

Запись в кавычках — строка (просто текст), без кавычек — число (с ним можно считать). Одинаковые цифры — разное поведение:

1

"2" + "2" — склейка: «22». 2 + 2 — сложение: 4. Помните: ЗОП приносит строку, ЦЗОП — число.

Шаг 2. Плюс хитрый, минус честный

Если в сложении участвует хотя бы одна строка — плюс склеивает. А вот минус, умножение и деление превращают строку в число и считают честно:

1

Это и есть жонглирование типами: JavaScript сам превращает значения, когда ему нужно. Удобно — но легко ошибиться.

Шаг 3. Превращения: из строки в число

Превратить строку в число помогает команда преобразовать строку в число (после неё ставьте пробел или скобку). Узнать тип значения — тип данных:

1

Шаг 4. Цифры числа: мост к олимпиадным задачам

Самая простая задача о цифрах решается без строк: последняя цифра числа — это н остаток от деления на 10; отрезать последнюю цифру — целое снизу(н / 10):

1

Эта пара приёмов в цикле «пока» умеет разбирать число на цифры — на ней построены классические олимпиадные задачи: сумма цифр, перевёртыш, палиндром. Они ждут вас в заданиях.

Задания к главе

Задание: Удвоение (жонглирование типами)

Условие задачи:

Напишите программу: спросите число командой ЗОП — ответ придёт как строка. Выведите это число, увеличенное в два раза (уже как настоящее число).

Формат ввода: Одна строка — целое число (придёт строкой).

Формат вывода: Одна строка — число, умноженное на 2.

Ограничения: −1000000 ≤ N ≤ 1000000.

Например:

ВводРезультат
510
1224
00
1

💡 «преобразовать строку в число н» превращает строку в число — дальше умножайте на 2.
пер н = ЗОП("Введите число")
печать(преобразовать строку в число н * 2)

Задание: Склейка или сложение?

Условие задачи:

Напишите программу: спросите два числа (командой ЦЗОП). Выведите в консоль две строки: сначала эти числа, записанные подряд без пробела, а под ними — их настоящую сумму.

Формат ввода: Две строки: числа N и M.

Формат вывода: Две строки: склейка «NM», затем сумма N + M.

Ограничения: −1000000 ≤ N и M ≤ 1000000.

Например:

ВводРезультат
12 341234 46
5 757 12
0 000 0
1

💡 печать("" + н + м) склеит числа как текст; печать(н + м) сложит их как числа.
пер н = ЦЗОП("Первое число")
пер м = ЦЗОП("Второе число")
печать("" + н + м)
печать(н + м)

Задание: Сумма цифр числа (олимпиадная)

Условие задачи:

Напишите программу: спросите число N и выведите сумму его цифр. Например, для 123 это 1+2+3 = 6. Последняя цифра — это н остаток от деления на 10, отрезать её — целое снизу(н / 10). Цикл «пока н больше 0».

Формат ввода: Одна строка — целое число N.

Формат вывода: Одна строка — сумма цифр.

Ограничения: 1 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.

Например:

ВводРезультат
1236
55
101
1

💡 пока н больше 0: сумма = сумма + н остаток от деления на 10; н = целое снизу(н / 10). После цикла — печать(сумма).
пер н = ЦЗОП("Введите число")
пер сумма = 0
пока н больше 0 то
	сумма = сумма + н остаток от деления на 10
	н = целое снизу(н / 10)
конец
печать(сумма)

Задание: Первая и последняя цифра

Условие задачи:

Напишите программу: спросите число N и выведите две строки: его первую цифру, затем последнюю. Первую получайте, отрезая последнюю цифру, пока не останется одна (целое снизу), последняя — это остаток от деления на 10.

Формат ввода: Одна строка — целое число N.

Формат вывода: Две строки: первая цифра, затем последняя.

Ограничения: 1 ≤ N ≤ 999999999.

Например:

ВводРезультат
12341 4
55 5
101 0
1

💡 Первая: пока н больше 9, н = целое снизу(н / 10). Последняя: н остаток от деления на 10 — считайте её ДО изменения н.
пер н = ЦЗОП("Введите число")
пер первая = н
пока первая больше 9 то
	первая = целое снизу(первая / 10)
конец
печать(первая)
печать(н остаток от деления на 10)

Задание: Перевёртыш (олимпиадная)

Условие задачи:

Напишите программу: спросите число N и выведите число из тех же цифр, но в обратном порядке. Например, 123 → 321, а 1200 → 21 (нули в начале пропадают). Собирайте ответ: р = р * 10 + н остаток от деления на 10, затем отрезайте последнюю цифру.

Формат ввода: Одна строка — целое число N.

Формат вывода: Одна строка — перевёрнутое число.

Ограничения: 1 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.

Например:

ВводРезультат
123321
120021
55
1

💡 р = 0; пока н больше 0: р = р * 10 + н остаток от деления на 10; н = целое снизу(н / 10). После цикла — печать(р).
пер н = ЦЗОП("Введите число")
пер р = 0
пока н больше 0 то
	р = р * 10 + н остаток от деления на 10
	н = целое снизу(н / 10)
конец
печать(р)

Задание: Палиндром (очень сложная)

Условие задачи:

Число-палиндром читается одинаково в обе стороны: 121, 55, 7, 12321. Напишите программу: спросите число N и выведите да, если это палиндром, и нет — иначе. Переверните число (как в задаче «Перевёртыш») и сравните с исходным.

Формат ввода: Одна строка — целое число N.

Формат вывода: Одна строка: «да» или «нет».

Ограничения: 0 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.

Например:

ВводРезультат
121да
123нет
7да
1

💡 Переверните число в переменной р (как в «Перевёртыше»), сравните: если р равно н — «да», иначе — «нет».
пер н = ЦЗОП("Введите число")
пер р = 0
пер копия = н
пока копия больше 0 то
	р = р * 10 + копия остаток от деления на 10
	копия = целое снизу(копия / 10)
конец
если р равно н то
	печать("да")
конец
иначе
	печать("нет")
конец

Дальше — Глава 6: проверка ввода. Программа научится замечать пустой ответ и защищаться от ошибок.

Глава 6. Проверка ввода: пустой ответ и мусор

Программы пишут для людей, а люди ошибаются: оставляют поле пустым или вводят слово там, где ждут число. Хорошая программа это замечает и подсказывает, а не молчит и не ломается. Учимся проверять ответ.

Шаг 1. Пустой ответ и длина строки

Если нажать «ОК», ничего не написав, ЗОП вернёт пустую строку — в ней нет ни одного символа. Сколько символов в строке, считает команда длина:

1

Теперь защитим приветствие: пустой ответ встречаем отдельной фразой

1

Запустите демо ещё раз и сотрите ответ в открывшемся окне — сработает первая ветка. Так и проверяют ввод: сначала «если ответ плохой», потом «иначе — работаем дальше».

Шаг 2. «Не число»: мусор в ЦЗОП

ЦЗОП превращает ответ в число. Но из слова «привет» числа не получится — получится особое значение «не число». У него странное свойство: оно не равно даже самому себе. Поэтому проверка н не равно н верна только тогда, когда пользователь ввёл мусор:

1

Запустите демо и введите сначала 5, потом привет — увидите обе ветки.

А пустой ответ ЦЗОП превращает в 0 — ещё одна причина проверять, что ввёл человек.

Шаг 3. Готовая проверка: проверка числа

То же самое умеет готовая команда проверка числа. Записывается как обычная команда — со скобками, которые пишете вы: проверка числа(н). Верна для настоящего числа, неверна для мусора:

1

Все проверки главы — в одной таблице:

Что проверяемКак записатьВерно, когда
Пустой ответ ЗОПимя длина равно 0строка пустая
Мусор в ЦЗОПн не равно нв н — «не число»
То же командойпроверка числа(н)в н — настоящее число

Шаг 4. Спрашиваем до правильного ответа

Цикл пока плюс проверка — и вопрос повторяется сам, пока ответ не станет нормальным. Внутри цикла обязательно переспросите — иначе цикл станет вечным:

1

Такая связка «спросил — проверил — переспросил» и есть проверка ввода. Она превращает программу из хрупкой в вежливую: человек может ошибаться сколько угодно — программа терпеливо ждёт правильный ответ.

Задания к главе

Задание: Привет, незнакомец!

Условие задачи:

Напишите программу: спросите имя (команда ЗОП). Если имя пустое (его длина 0) — выведите Привет, незнакомец!, иначе — Привет, <имя>! (например: Привет, Аня!).

Формат ввода: Одна строка — имя (может быть пустой).

Формат вывода: Одна строка: приветствие.

Ограничения: имя не длиннее 100 символов.

Например:

ВводРезультат
—Привет, незнакомец!
АняПривет, Аня!
ПётрПривет, Пётр!
1

💡 Сравните длину: если имя длина равно 0 то печать("Привет, незнакомец!") конец иначе печать("Привет, " + имя + "!") конец.
пер имя = ЗОП("Как тебя зовут?")
если имя длина равно 0 то
	печать("Привет, незнакомец!")
конец
иначе
	печать("Привет, " + имя + "!")
конец

Задание: Число или мусор

Условие задачи:

Напишите программу: спросите число (команда ЦЗОП). Если пользователь ввёл не число — выведите не число, иначе — число. Подсказка: значение «не число» не равно самому себе.

Формат ввода: Одна строка — ответ пользователя.

Формат вывода: Одна строка: «число» или «не число».

Ограничения: ответ не длиннее 20 символов.

Например:

ВводРезультат
5число
приветне число
2.5число
1

💡 если н не равно н то печать("не число") конец иначе печать("число") конец. Пустой ответ ЦЗОП превращает в 0 — это тоже число.
пер н = ЦЗОП("Введите число")
если н не равно н то
	печать("не число")
конец
иначе
	печать("число")
конец

Задание: Добейся имени

Условие задачи:

Напишите программу: спрашивайте имя (команда ЗОП), пока пользователь не введёт непустое. Затем выведите Привет, <имя>!

Формат ввода: Строки: сколько-то пустых ответов, затем имя.

Формат вывода: Одна строка: Привет, <имя>!

Ограничения: пустых ответов подряд не больше 10; итоговое имя не длиннее 100 символов.

Например:

ВводРезультат
АняПривет, Аня!
БорисПривет, Борис!
ОляПривет, Оля!
1

💡 пока имя длина равно 0 то … конец — и внутри цикла обязательно переспросите: имя = ЗОП("Пусто! Как тебя зовут?") — иначе цикл станет вечным.
пер имя = ЗОП("Как тебя зовут?")
пока имя длина равно 0 то
	имя = ЗОП("Пусто! Как тебя зовут?")
конец
печать("Привет, " + имя + "!")

Задание: Только число

Условие задачи:

Напишите программу: спрашивайте число (команда ЦЗОП), пока пользователь не введёт настоящее число. Затем выведите Принято: N — с введённым числом.

Формат ввода: Строки: сколько-то нечисловых ответов, затем число.

Формат вывода: Одна строка: Принято: <число>.

Ограничения: неверных ответов подряд не больше 10; итоговое число от −1000000 до 1000000.

Например:

ВводРезультат
мусор хлам 42Принято: 42
5Принято: 5
abc -3Принято: -3
1

💡 пока н не равно н то … конец — внутри цикла переспросите: н = ЦЗОП("Попробуйте ещё раз"). После цикла: печать("Принято: " + н).
пер н = ЦЗОП("Введите число")
пока н не равно н то
	н = ЦЗОП("Это не число! Попробуйте ещё раз")
конец
печать("Принято: " + н)

Задание: Возраст от 0 до 150 (сложная)

Условие задачи:

Напишите программу: спрашивайте возраст (команда ЦЗОП), пока ответ — не число, или меньше 0, или больше 150. Затем выведите Возраст принят: N.

Формат ввода: Строки: сколько-то неподходящих ответов, затем возраст от 0 до 150.

Формат вывода: Одна строка: Возраст принят: <число>.

Ограничения: неверных ответов подряд не больше 10.

Например:

ВводРезультат
abc -5 200 14Возраст принят: 14
30Возраст принят: 30
хлам 0Возраст принят: 0
1

💡 Условие цикла из трёх частей: пока возраст не равно возраст или возраст меньше 0 или возраст больше 150 то … переспрос … конец.
пер возраст = ЦЗОП("Сколько вам лет?")
пока возраст не равно возраст или возраст меньше 0 или возраст больше 150 то
	возраст = ЦЗОП("Так не бывает! Сколько вам лет?")
конец
печать("Возраст принят: " + возраст)

Задание: Сумма до слова «стоп» (олимпиадная)

Условие задачи:

Пользователь вводит числа строкой (команда ЗОП) — по одному за раз. Складывайте их, а когда вместо числа придёт слово стоп — выведите сумму и закончите. Слово «стоп» в сумму не входит.

Формат ввода: Строки: числа по одному, последняя строка — стоп.

Формат вывода: Одна строка — сумма введённых чисел.

Ограничения: чисел не больше 100, каждое от −1000000 до 1000000. Последний ответ — всегда стоп.

Например:

ВводРезультат
5 7 стоп12
стоп0
10 -3 стоп7
1

💡 пер сумма = 0 и пер слово = ЗОП(…). Пока слово не равно "стоп": сумма = сумма + преобразовать строку в число слово, и снова слово = ЗОП(…). После цикла — печать(сумма).
пер сумма = 0
пер слово = ЗОП("Введите число или стоп")
пока слово не равно "стоп" то
	сумма = сумма + преобразовать строку в число слово
	слово = ЗОП("Ещё число или стоп")
конец
печать(сумма)

Дальше — Глава 7: случайность. Компьютер придумает случайное число — и мы построим игру «Угадай число».

Глава 7. Функции: свои команды

До сих пор вы пользовались чужими командами: печать, ЦЗОП, длина. Функция — это команда, которую вы придумываете сами: один раз пишете, что она делает, а дальше вызываете по имени из любого места программы.

Шаг 1. Своя команда

Объявление функции: слово функция, имя, принимает аргументы, имя аргумента, начало функции, команды, конец функции. После объявления её вызывают как обычную команду — по имени со скобками:

1

имя здесь — аргумент: при каждом вызове в него подставляется то, что написано в скобках. Имя функции придумывайте как имя переменной — без пробелов.

Шаг 2. Несколько аргументов и «вернуть»

Аргументов может быть несколько — они перечисляются через запятую. Чаще всего функция не просто печатает, а вычисляет и отдаёт результат командой вернуть:

1

После вернуть функция заканчивает работу: что бы ни шло дальше внутри неё, до этого уже не дойдёт. А сам вызов сумма(10, 5) — как будто на его место встало готовое число 15.

Вызывать функцию можно и до её объявления — переводчик сам разберётся.

Шаг 3. Стрелочные функции

Короткую функцию из одного выражения удобно записывать «стрелкой»: аргументы в скобках, потом стрелочная функция, потом выражение — его значение функция и вернёт:

1

Для функции с длинным телом есть «безымянная» запись: пер ф = безимянная функция н начало функции … конец функции. Тот же смысл, но тело — любые команды.

Шаг 4. Функция вызывает себя

Функции разрешено вызывать сами себя — это называется рекурсией. Классика: факториал. Факт: н! = 1 × 2 × … × н. Рекурсивно: «факториал н — это н, умноженный на факториал (н−1)», а «факториал 1 — это 1»:

1

Без стоп-условия («меньше или равно 1») вызовы никогда бы не закончились — как цикл без изменения переменной.

РЯПJavaScript
функция ф принимает аргументы а, б начало функцииfunction ф(а, б){
конец функции}
вернуть хreturn х
(н) стрелочная функция н * 2(н) => н * 2

Задания к главе

Задание: Приветствие по имени

Условие задачи:

Напишите функцию приветствует, которая принимает имя и печатает Привет, &lt;имя&gt;!. Потом в программе спросите имя (команда ЗОП) и вызовите функцию с ним.

Формат ввода: Одна строка — имя.

Формат вывода: Одна строка: Привет, <имя>! — напечатанная функцией.

Ограничения: имя не длиннее 100 символов.

Например:

ВводРезультат
АняПривет, Аня!
МаринаПривет, Марина!
ЯПривет, Я!
1

💡 Тело функции — одна команда: печать("Привет, " + имя + "!"). В основной программе: пер имя = ЗОП(…), затем приветствует(имя).
функция приветствует принимает аргументы имя начало функции
	печать("Привет, " + имя + "!")
конец функции
пер имя = ЗОП("Как тебя зовут?")
приветствует(имя)

Задание: Площадь прямоугольника

Условие задачи:

Напишите функцию площадь, которая принимает два числа и возвращает их произведение. Потом спросите ширину и высоту (ЦЗОП) и напечатайте площадь — вызовом функции прямо внутри печать.

Формат ввода: Две строки: ширина, высота (целые числа).

Формат вывода: Одна строка — площадь.

Ограничения: 0 ≤ ширина и высота ≤ 1000.

Например:

ВводРезультат
3 412
5 525
0 70
1

💡 Внутри функции — вернуть а * б. В конце: печать(площадь(а, б)).
функция площадь принимает аргументы а, б начало функции
	вернуть а * б
конец функции
пер а = ЦЗОП("Ширина?")
пер б = ЦЗОП("Высота?")
печать(площадь(а, б))

Задание: Максимум из двух

Условие задачи:

Напишите функцию самое_большое, которая принимает два числа и возвращает большее из них (если равны — любое из них). Потом спросите два числа (ЦЗОП) и напечатайте максимум. Внимание: имя максимум в языке занято — оно означает готовую команду наибольшего из списка.

Формат ввода: Две строки: числа а и б.

Формат вывода: Одна строка — большее из чисел.

Ограничения: во всех тестах −1000000 ≤ числа ≤ 1000000.

Например:

ВводРезультат
3 77
-5 -2-2
5 55
1

💡 Если а больше б — вернуть а. Иначе — вернуть б. Каждая ветка «если» заканчивается своим «конец».
функция самое_большое принимает аргументы а, б начало функции
	если а больше б то
		вернуть а
	конец
	вернуть б
конец функции
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
печать(самое_большое(а, б))

Задание: Надёжный пароль

Условие задачи:

Пароль считается надёжным, если в нём не меньше 8 символов. Напишите функцию надёжный, которая принимает пароль и возвращает да (если длина не меньше 8) или нет. Потом спросите пароль (ЗОП) и напечатайте ответ функции.

Формат ввода: Одна строка — пароль.

Формат вывода: Одна строка: «да» или «нет».

Ограничения: пароль не длиннее 100 символов.

Например:

ВводРезультат
12345678да
парольнет
123456789012345да
1

💡 Длина строки — пароль длина. Функция с двумя «вернуть»: если длина большеравно 8 — вернуть "да", иначе вернуть "нет".
функция надёжный принимает аргументы пароль начало функции
	если пароль длина большеравно 8 то
		вернуть "да"
	конец
	вернуть "нет"
конец функции
пер пароль = ЗОП("Придумайте пароль")
печать(надёжный(пароль))

Задание: Степень числа

Условие задачи:

Напишите функцию степень, которая принимает основание и показатель и возвращает основание в степени показателя — циклом, без готовых команд возведения. Потом спросите оба числа (ЦЗОП) и напечатайте результат.

Формат ввода: Две строки: основание, показатель (целые числа).

Формат вывода: Одна строка — основание в степени показателя.

Ограничения: −1000 ≤ основание ≤ 1000, 0 ≤ показатель ≤ 30. В тестах результат помещается в обычное число.

Например:

ВводРезультат
2 101024
5 01
3 481
1

💡 пер результат = 1; запустить цикл показатель раза то результат = результат * основание конец; вернуть результат. Показатель 0 даёт 1 — цикл просто не запустится.
функция степень принимает аргументы основание, показатель начало функции
	пер результат = 1
	запустить цикл показатель раза то
		результат = результат * основание
	конец
	вернуть результат
конец функции
пер основание = ЦЗОП("Основание?")
пер показатель = ЦЗОП("Показатель?")
печать(степень(основание, показатель))

Задание: Факториал (рекурсия, олимпиадная)

Условие задачи:

Факториал числа н — произведение всех чисел от 1 до н: 5! = 1×2×3×4×5 = 120. Факториал 0 равен 1. Напишите рекурсивную функцию факториал: если н меньше или равно 1 — вернуть 1, иначе — вернуть н, умноженный на факториал (н−1). Потом спросите н (ЦЗОП) и напечатайте факториал.

Формат ввода: Одна строка — целое число н.

Формат вывода: Одна строка — н! (факториал).

Ограничения: 0 ≤ н ≤ 12. В цикле вызовов не больше 12 — мгновенно.

Например:

ВводРезультат
5120
01
11
1

💡 Два «вернуть» внутри функции: для стоп-условия (н меньшеравно 1) — вернуть 1, иначе — вернуть н * факториал(н - 1). Функция вызывает сама себя — это нормально!
функция факториал принимает аргументы н начало функции
	если н меньшеравно 1 то
		вернуть 1
	конец
	вернуть н * факториал(н - 1)
конец функции
пер н = ЦЗОП("Введите число")
печать(факториал(н))

Задание: НОД — алгоритм Евклида (олимпиадная)

Условие задачи:

НОД (наибольший общий делитель) двух чисел находят алгоритмом Евклида: пока числа различны, большее заменяй на разность большего и меньшего. Когда числа совпадут — это и есть НОД. Например, НОД(12, 18): 12→18 - 12 = 6, 12 и 6 → 12 - 6 = 6 → НОД = 6. Спросите два числа и напечатайте их НОД.

Формат ввода: Две строки: числа a и b.

Формат вывода: Одна строка — НОД.

Ограничения: 1 ≤ числа ≤ 1000000; количество шагов алгоритма невелико — программа обязана закончиться мгновенно.

Например:

ВводРезультат
12 186
7 51
10 1010
1

💡 пока а не равно б то: если а больше б то а = а - б — иначе б = б - а (каждая ветка — свой «конец»). После цикла печать(а). Классика олимпиад (см. разборы алгоритма Евклида — problems.ru, acmp.ru).
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
пока а не равно б то
	если а больше б то
		а = а - б
	конец
	иначе
		б = б - а
	конец
конец
печать(а)

Задание: Фибоначчи (рекурсия, олимпиадная)

Условие задачи:

Числа Фибоначчи: 1, 1, 2, 3, 5, 8, 13… — каждое следующее равно сумме двух предыдущих: ф(1) = ф(2) = 1, ф(н) = ф(н−1) + ф(н−2). Напишите рекурсивную функцию фибоначчи(н) и напечатайте ф(н) для введённого н.

Формат ввода: Одна строка — номер числа н.

Формат вывода: Одна строка — н-е число Фибоначчи.

Ограничения: 1 ≤ н ≤ 20; рекурсивных вызовов немного — мгновенно.

Например:

ВводРезультат
11
55
1055
1

💡 Внутри функции два «вернуть»: если н меньшеравно 2 то вернуть 1 — иначе вернуть фибоначчи(н - 1) + фибоначчи(н - 2).
функция фибоначчи принимает аргументы н начало функции
	если н меньшеравно 2 то
		вернуть 1
	конец
	вернуть фибоначчи(н - 1) + фибоначчи(н - 2)
конец функции
пер н = ЦЗОП("Номер числа Фибоначчи")
печать(фибоначчи(н))

Дальше — Глава 8: ошибки. Учимся читать сообщения переводчика и исправлять типичные промахи новичка.

Глава 8. Ошибки: программа объясняет, что не так

Ошибки — не враги, а подсказки. Даже опытные программисты видят ошибки по десять раз на дню: компьютер просто сообщает, где именно он не понял вашу мысль. Научимся читать его сообщения и ловить ошибку «в руки».

Шаг 1. Сообщение об ошибке

Вот программа с ошибкой — запустите и посмотрите, что напишет компьютер:

1

В чёрной панели появилось сообщение У вас ошибка…, а строка, где случилась беда, подсветилась красным. Разберём сообщение по частям:

Часть после ошибки («около строки 2») — самый ценный кусок. Идите на эту строку и смотрите внимательно.

Шаг 2. Словарь частых ошибок

Компьютер пишет по-английски, но переводчик переводит главное:

Видите в сообщенииЭто значит
неуместный символопечатка или знак не на своём месте
не определена/объявленапеременная не создана через пер
не является функциейвызвали не команду, а что-то другое
в синтаксисе:сломана структура: скобка, кавычка, конец
неожиданный конец вводане хватает конец или закрывающей скобки
ПРЕДУПРЕЖДЕНИЕ: не хватает закрывающих )проверьте скобки у команд

Вот как выглядит ошибка структуры — не хватает конец:

1

Компьютер ещё до запуска предупредил о нехватке скобок и указал строку — не поленитесь прочитать предупреждение до сообщения об ошибке.

Шаг 3. Ловим ошибку: попробовать выполнить

Иногда ошибка — это нормальная ситуация: пользователь ввёл чушь, файла нет, ответ пришёл пустой. Для таких случаев есть страховка — попробовать выполнить. Компьютер пытается выполнить код, а если случается ошибка — не падает, а переходит в блок уловить ошибку:

1

Смотрите: строка с ошибкой выполнилась, программа напечатала сообщение о ней — и продолжила работу. Без страховки всё, что ниже, было бы потеряно.

Шаг 4. Вне зависимости от ошибок

Иногда нужно, чтобы что-то выполнилось в любом случае — напечатался итог, закрылся файл, закончился таймер. Для этого есть блок вне зависимости от ошибок:

1

Порядок всегда такой: попробовать выполнить → уловить ошибку → вне зависимости от ошибок. Каждый блок — со своим начало и конец.

Страховка — не способ спрятать ошибку от себя. Поймав ошибку, печатайте её: печать("Проблема: " + ошибка) — иначе вы никогда не узнаете, что сломалось.

Шаг 5. Как искать ошибку самому

Когда сообщение непонятно, работает простой приём:

  1. Прочитайте номер строки — идите туда.
  2. Проверьте кавычки и скобки на этой строке.
  3. Проверьте, что все переменные созданы через пер.
  4. Не помогло — напечатайте промежуточные значения: печать("проверка: " + число) перед подозрительной строкой.
  5. Всё равно не помогло — закомментируйте половину кода однострочным

комментарием и проверьте, ушла ли ошибка. Так вы половините программу, пока не найдёте точное место.

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.

Задание: Программа не падает

Условие задачи:

Напишите программу: напечатайте Старт, затем в блоке попробовать выполнить напечатайте несуществующую переменную (например печать(несозданная)), поймайте ошибку блоком уловить ошибку и напечатайте Поймали, а после блока напечатайте Финиш. Ошибка не должна прервать программу.

Формат ввода: Нет.

Формат вывода: Три строки: Старт, Поймали, Финиш — в этом порядке.

Например:

ВводРезультат
—Старт Поймали Финиш
—Старт Поймали Финиш
—Старт Поймали Финиш
1

💡 Структура: печать("Старт"), попробовать выполнить начало печать(несозданная) конец, уловить ошибку(ошибка) начало печать("Поймали") конец, печать("Финиш").
печать("Старт")
попробовать выполнить начало
	печать(несозданная)
конец
уловить ошибку(ошибка) начало
	печать("Поймали")
конец
печать("Финиш")

Задание: Прыгаем с парашютом

Условие задачи:

Спросите слово (ЗОП). В блоке попробовать выполнить напечатайте Прыгаем!, а если слово равно ломаем — напечатайте несуществующую переменную (сломаем программу специально). Блок уловить ошибку печатает Не упали!. Последней строкой напечатайте Приземлились — при любом вводе.

Формат ввода: Одно слово (может быть «ломаем»).

Формат вывода: Прыгаем!; при «ломаем» ещё и Не упали!; последняя строка — Приземлились.

Например:

ВводРезультат
ломаемПрыгаем! Не упали! Приземлились
мирПрыгаем! Приземлились
—Прыгаем! Приземлились
1

💡 Внутри попробовать: печать("Прыгаем!"), затем если слово равно "ломаем" то печать(сломанная) конец. Ловля — печать("Не упали!").
пер слово = ЗОП("Что делаем?")
попробовать выполнить начало
	печать("Прыгаем!")
	если слово равно "ломаем" то
		печать(сломанная)
	конец
конец
уловить ошибку(ошибка) начало
	печать("Не упали!")
конец
печать("Приземлились")

Задание: Финал в любом случае

Условие задачи:

Спросите слово. Если оно равно ошибка — в блоке попробовать выполнить напечатайте несуществующую переменную (программа «сломается»), поймайте ошибку и напечатайте Починили. Блок вне зависимости от ошибок печатает Конец программы — при любом вводе.

Формат ввода: Одно слово.

Формат вывода: при «ошибка»: Починили и Конец программы; при любом другом — только Конец программы.

Например:

ВводРезультат
ошибкаПочинили Конец программы
нормаКонец программы
—Конец программы
1

💡 Внутри попробовать — только условие если слово равно "ошибка" то печать(несозданная) конец. Ловля печатает "Починили". Вне зависимости печатает "Конец программы".
пер слово = ЗОП("Введите слово")
попробовать выполнить начало
	если слово равно "ошибка" то
		печать(несозданная)
	конец
конец
уловить ошибку(ошибка) начало
	печать("Починили")
конец
вне зависимости от ошибок начало
	печать("Конец программы")
конец

Задание: Числа или мимо

Условие задачи:

Спросите значение (ЦЗОП). Если это не число — напечатайте Это не число! и спросите ещё раз. Когда введут настоящее число — напечатайте Принято: <число>.

Формат ввода: Один или несколько ответов через « | »: попытки ввода, последняя — число.

Формат вывода: Для каждого мусора строка Это не число!, в конце Принято: <число>.

Ограничения: последний ответ — число от -1000000 до 1000000.

Например:

ВводРезультат
abc 5Это не число! Принято: 5
5Принято: 5
x y 7Это не число! Это не число! Принято: 7
1

💡 Пока проверка числа(н) не равно правда — печатайте «Это не число!» и переспрашивайте. Не забудьте переспрос внутри цикла, иначе цикл вечный.
пер н = ЦЗОП("Введите число")
пока проверка числа(н) не равно правда то
	печать("Это не число!")
	н = ЦЗОП("Попробуйте ещё раз")
конец
печать("Принято: " + н)

Шаг 5. Своя ошибка: бросить ошибку

Иногда нарушение замечаете вы — например, возраст получился 999. Программа может объявить ошибку сама командой бросить ошибку:

1

Запустите с числом 999 — сообщение увидит пользователь, и выполнение прекратится. Свои ошибки лучше «Unable to read property»: они говорят человеческим языком, что именно не так.

Дальше — Глава 9: строки. Слово можно измерить, перекрасить, разрезать и склеить.

Глава 9. Строки: измеряем, перекрашиваем, режем

Строка — это не просто «текст для печати». Это значение, с которым можно работать: измерить, поменять регистр, повторить, разрезать на кусочки и склеить обратно. Всё это нужно для игр с текстом, чатов и паролей.

Шаг 1. Длина и регистр

Команда длина считает символы (мы уже проверяли ею пустой ответ). Команды в верхний регистр и в нижний регистр перекрашивают буквы:

1

Обратите внимание: длина, в верхний регистр и в нижний регистр — команды без скобок: они приклеиваются к переменной через пробел. Таких «свойств» у строк несколько, они читаются как вопросы: «слово — длина?», «слово — в верхний регистр?»

Шаг 2. Повтор строки

Команда повторить строку делает из короткой строки длинную. Скобка открывается сразу после имени команды, в ней — число повторений:

1

Это идеальный способ рисовать разделители в консольных программах:

1

Шаг 3. Разрезаем строку: разбить строку

Команда разбить строку режет строку на список кусочков. В скобках — разделитель: что считать «ножом»:

1

Если разрезать пустым разделителем (""), строка развалится на отдельные буквы — получится список символов:

1

Кусочки после разреза — это список. Со списками мы подробно познакомимся в Главе 10.

Шаг 4. Замена и склейка обратно

Команда заменить меняет кусок строки на другой: в первых скобках — что найти, во вторых — чем заменить:

1

Сама строка не меняется — команда возвращает новую строку. И по умолчанию заменяется только первое совпадение.

Обратная операция — склеить список кусочков в строку — называется объединить массив; в скобках пишут, чем соединять кусочки:

1

Шаг 5. Символ по номеру

У каждого символа в строке есть номер — и он начинается с нуля! Первый символ — номер 0, второй — 1 и так далее. Символ берут квадратными скобками:

1

Последний символ — номер «длина минус один», потому что нумерация с нуля:

1

КомандаПримерЧто делает
длинаслово длинаколичество символов
в верхний регистрслово в верхний регистрПРИВЕТ
в нижний регистрслово в нижний регистрпривет
повторить строку"-" повторить строку(10)----------
разбить строкутекст разбить строку(" ")список кусочков
объединить массивсписок объединить массив("-")строка из кусочков
заменитьтекст заменить("а", "б")новая строка с заменой

Шаг 8. Инструменты строк: срез, проверка концов, дополнение

У строк много готовых инструментов. Самый нужный — срез: вырезать часть строки по номерам символов (первый — 0):

1

Про проверку концов: начинается с и кончается на отвечают правдой/ложью — удобно для файлов и команд:

1

А заполнить слева дописывает символы до нужной длины — так делают часы «09:05» вместо «9:5»:

1

Ещё есть переписать целиком("а", "б") — заменить ВСЕ вхождения (обычный заменить меняет только первое), и включает("…") — проверить, входит ли кусок в строку.

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.

Задание: Печатная машинка

Условие задачи:

Спросите слово (ЗОП). Напечатайте его ЗАГЛАВНЫМИ БУКВАМИ (в верхний регистр), а на второй строке — количество букв (длина).

Формат ввода: Одна строка.

Формат вывода: Две строки: слово заглавными и количество символов.

Ограничения: строка не длиннее 100 символов.

Например:

ВводРезультат
АняАНЯ 3
мирМИР 3
ЯЯ 1
1

💡 печать(слово в верхний регистр), затем печать(слово длина).
пер слово = ЗОП("Введите слово")
печать(слово в верхний регистр)
печать(слово длина)

Задание: Заголовок с полосой

Условие задачи:

Спросите заголовок. Напечатайте одной строкой: заголовок, пробел и полосу из 10 дефисов — полосу делает команда повторить строку: заголовок + " " + "-" повторить строку(10).

Формат ввода: Одна строка.

Формат вывода: Одна строка: <заголовок> ---------- (ровно 10 дефисов).

Например:

ВводРезультат
АняАня ----------
ДОМДОМ ----------
Мой деньМой день ----------
1

💡 Дефис — это строка "-". Повторить её 10 раз и приклеить к заголовку через пробел.
пер заголовок = ЗОП("Введите заголовок")
печать(заголовок + " " + "-" повторить строку(10))

Задание: Крайние буквы

Условие задачи:

Спросите слово. Напечатайте его первую букву (номер 0), а на второй строке — последнюю (номер — длина минус один).

Формат ввода: Одна строка.

Формат вывода: Две строки: первая и последняя буква.

Ограничения: слово не пустое и не длиннее 50 символов.

Например:

ВводРезультат
ДомД м
приветп т
1231 3
1

💡 Первая — слово[0]. Последняя — слово[слово длина - 1].
пер слово = ЗОП("Введите слово")
печать(слово[0])
печать(слово[слово длина - 1])

Задание: Разбор приговора

Условие задачи:

Спросите фразу из слов через пробел. Напечатайте количество слов, а потом каждое слово на своей строке. Фразу на слова режет разбить строку(" "), а перебирает цикл «запустить цикл <имя> в массиве <список> то».

Формат ввода: Одна строка — слова через пробел.

Формат вывода: Первая строка — количество, дальше — слова, каждое на своей строке.

Например:

ВводРезультат
мама мыла раму3 мама мыла раму
привет1 привет
а б в г4 а б в г
1

💡 пер слова = фраза разбить строку(" "), затем печать(слова количество элементов в массиве) и цикл с печатью каждого слова.
пер фраза = ЗОП("Введите фразу")
пер слова = фраза разбить строку(" ")
печать(слова количество элементов в массиве)
запустить цикл слово в массиве слова то
	печать(слово)
конец

Задание: Шёпот через дефисы

Условие задачи:

Спросите слово. Напечатайте его строчными буквами, соединив символы через дефис: переведите в нижний регистр, разбейте на буквы и склейте списки командой объединить массив("-"). Например Мир → м-и-р.

Формат ввода: Одна строка.

Формат вывода: Одна строка: символы через дефис.

Ограничения: строка не длиннее 50 символов.

Например:

ВводРезультат
Мирм-и-р
АНЯа-н-я
Приветп-р-и-в-е-т
1

💡 пер буквы = слово в нижний регистр разбить строку(""), затем печать(буквы объединить массив("-")).
пер слово = ЗОП("Введите слово")
пер буквы = слово в нижний регистр разбить строку("")
печать(буквы объединить массив("-"))

Задание: Заменяем первое

Условие задачи:

Спросите фразу. Замените в ней первый пробел на подчёркивание командой заменить: фраза заменить(" ", "_") — и напечатайте результат. Если пробелов нет — напечатайте фразу без изменений.

Формат ввода: Одна строка.

Формат вывода: Одна строка: первый пробел заменён на _.

Например:

ВводРезультат
мама мыла рамумама_мыла раму
приветпривет
а ба_б
1

💡 `заменить` меняет только первое совпадение — это ровно то, что нужно.
пер фраза = ЗОП("Введите фразу")
печать(фраза заменить(" ", "_"))

Задание: Палиндр с пробелами (сложная)

Условие задачи:

Спросите фразу (ЗОП). Проверьте, читается ли она одинаково в обе стороны, если убрать пробелы и не различать большие и маленькие буквы (А роза упала на лапу Азора — палиндром). Напечатайте да или нет.

Формат ввода: Одна строка.

Формат вывода: да или нет.

Ограничения: длина фразы не больше 200 символов.

Например:

ВводРезультат
А роза упала на лапу Азорада
приветнет
шалашда
1

💡 Склейте слова в одну строку (разбить строку(" ") + объединить массив("")), переведите в нижний регистр, разбейте на буквы, переверните список, склейте обратно и сравните с исходной строчной строкой (равно).
пер фраза = ЗОП("Введите фразу")
пер слова = фраза разбить строку(" ")
пер сплошь = слова объединить массив("")
пер малый = сплошь в нижний регистр
пер буквы = малый разбить строку("")
буквы перевернуть массив
пер задом = буквы объединить массив("")
если задом равно малый то
	печать("да")
конец
иначе
	печать("нет")
конец

Задание: Часы с нулями (сложная)

Условие задачи:

Спросите часы и минуты (ЦЗОП) и напечатайте время в формате ЧЧ:ММ — часы и минуты всегда двумя цифрами, с нулём слева (5 и 7 минут → 05:07). Используйте заполнить слева(2, "0").

Формат ввода: Две строки: часы (0–23), минуты (0–59).

Формат вывода: Одна строка: ЧЧ:ММ.

Ограничения: 0 ≤ часы ≤ 23, 0 ≤ минуты ≤ 59.

Например:

ВводРезультат
5 705:07
0 000:00
1

💡 пер ч = ЦЗОП(...), пер м = ЦЗОП(...); печать(ч заполнить слева(2, "0") + ":" + м заполнить слева(2, "0")) — заполнение работает и на числах, и на строках.
пер ч = ЦЗОП("Сколько часов?")
пер м = ЦЗОП("Сколько минут?")
печать(ч заполнить слева(2, "0") + ":" + м заполнить слева(2, "0"))

Задание: Валидатор файла (сложная)

Условие задачи:

Спросите имя файла (ЗОП). Файл «правильный», если он начинается с "рис" и кончается на ".ряп". Напечатайте подходит или не подходит.

Формат ввода: Одна строка — имя файла.

Формат вывода: Одна строка: «подходит» или «не подходит».

Ограничения: имя не длиннее 60 символов.

Например:

ВводРезультат
рисунок.ряпподходит
1

💡 если имя начинается с("рис") и имя кончается на(".ряп") то печать("подходит") — иначе печать("не подходит"). Каждая ветка — свой «конец».
пер имя = ЗОП("Имя файла?")
если имя начинается с("рис") и имя кончается на(".ряп") то
	печать("подходит")
конец
иначе
	печать("не подходит")
конец

Дальше — Глава 10: списки. Одна переменная, в которой живёт целая коллекция значений.

Глава 10. Списки: много значений в одной переменной

До сих пор переменная хранила одно значение. Список хранит сколько угодно: список покупок, корзину в игре, десятки рекордов. Это та самая «коробка с отделениями», о которой мы говорили в главе о циклах — и с ней мы уже работали, разрезая строки.

Шаг 1. Создаём список

Список пишется в квадратных скобках, значения через запятую:

1

Команда количество элементов в массиве отвечает на вопрос «сколько тут лежит?». Обратиться к одному значению можно по номеру — как со строками, нумерация с нуля:

1

Шаг 2. Кладём и вынимаем

добавить элемент в массив кладёт значение в конец списка, удалить последний элемент в массиве вынимает его обратно:

1

Так делают любые «накопители»: очередь в игре, история ходов, дневник измерений. Классика — накопление в цикле:

1

Шаг 3. Перебираем список

Цикл умеет перебирать список сам: запустить цикл <имя> в массиве <список> то — на каждом витке <имя> получает очередное значение:

1

Перебор + условие = поиск нужного элемента:

1

Шаг 4. Ищем в списке

Две команды поиска. есть ли элемент в массиве отвечает да/нет (правда или ложь), поиск в массиве говорит номер элемента — или минус один, если элемента нет:

1

Поиск вернул 2 — у «сливы» номер 2, потому что нумерация с нуля. Минус один — универсальный ответ «такого здесь нет».

Шаг 5. Наводим порядок: сортировка и переворот

отсортировать элементы в массиве расставляет значения по порядку, перевернуть массив меняет порядок на обратный:

1

Из «по возрастанию» получаем «по убыванию»: сортируем и переворачиваем:

1

Внимание: сортировка сравнивает значения «как в словаре», то есть как текст. Для однозначных чисел (1–9) это совпадает с обычным порядком, а вот 90 окажется «больше» 500 — потому что «9» по словарю позже «5». Сортировку чисел «по-настоящему» делают своей функцией — этому учат курсы посложнее.

Шаг 6. Для любопытных: фильтр

Список можно «просеять» одной командой — отфильтровать массив. Внутри пишут правило, и остаются только значения, для которых оно верно:

1

Здесь внутри скобок спрятана крошечная функция-проверка (о функциях — Глава 7). Пока можете просто запомнить шаблон: список отфильтровать массив(безимянная функция(х) начало вернуть <условие> конец).

КомандаПримерЧто делает
количество элементов в массивес количество элементов в массивесколько лежит
добавить элемент в массивс добавить элемент в массив(5)кладёт в конец
удалить последний элемент в массивес удалить последний элемент в массивевынимает из конца
есть ли элемент в массивес есть ли элемент в массиве(5)правда/ложь
поиск в массивес поиск в массиве(5)номер или -1
отсортировать элементы в массивес = с отсортировать элементы в массиве()по порядку
перевернуть массивс перевернуть массивзадом наперёд

Шаг 6. Потрогайте список руками

Каждая кнопка — настоящая команда из главы. Нажимайте и смотрите, что происходит со списком и с какими номерами:

Интерактивный блок «список-визуал» — в разработке.

Номера в квадратных скобках — индексы. Первый элемент всегда [0] — это не ошибка, а договорённость всего программирования.

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение. Числа приходят строками: для арифметики превращайте их командой преобразовать строку в число.

Задание: Сумма чисел

Условие задачи:

Спросите числа через пробел (ЗОП). Разрежьте строку на список (разбить строку(" ")), переберите циклом и напечатайте сумму. Каждый элемент списка — строка, для сложения превратите его в число: преобразовать строку в число(х).

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Одна строка — сумма чисел.

Ограничения: чисел не больше 100, каждое от -1000 до 1000.

Например:

ВводРезультат
1 2 36
10 20 3060
55
1

💡 Накопление: пер сумма = 0 до цикла, внутри сумма = сумма + преобразовать строку в число(х).
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер сумма = 0
запустить цикл х в массиве числа то
	сумма = сумма + преобразовать строку в число(х)
конец
печать(сумма)

Задание: Самое большое

Условие задачи:

Спросите числа через пробел. Напечатайте наибольшее из них: превратите элементы в числа и переберите список, сравнивая с лучшим найденным. За стартовое лучшее возьмите первое число.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Одна строка — наибольшее число.

Ограничения: чисел не больше 100, каждое от -1000000 до 1000000.

Например:

ВводРезультат
3 9 29
10 510
-5 -2 -9-2
1

💡 пер самое = преобразовать строку в число(числа[0]), затем в цикле если число больше самое — обновляйте самое.
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер самое = преобразовать строку в число(числа[0])
запустить цикл х в массиве числа то
	если преобразовать строку в число(х) больше самое то
		самое = преобразовать строку в число(х)
	конец
конец
печать(самое)

Задание: Чётные на свет

Условие задачи:

Спросите числа через пробел. Напечатайте каждое чётное число на своей строке (помогает остаток от деления на 2). Чётных нет — не печатайте ничего.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Чётные числа, каждое на своей строке, в исходном порядке.

Ограничения: чисел не больше 100, каждое от -1000 до 1000.

Например:

ВводРезультат
1 2 3 42 4
5 7
00
1

💡 В цикле: если преобразовать строку в число(х) остаток от деления на 2 равно 0 то печать(х) конец.
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
запустить цикл х в массиве числа то
	если преобразовать строку в число(х) остаток от деления на 2 равно 0 то
		печать(х)
	конец
конец

Задание: Перевёртыш

Условие задачи:

Спросите слово. Напечатайте его наоборот: разбейте на буквы (разбить строку("")), переверните список (перевернуть массив) и склейте обратно (объединить массив("")). Например привет → тевирп.

Формат ввода: Одна строка.

Формат вывода: Одна строка — слово задом наперёд.

Ограничения: слово не длиннее 100 символов.

Например:

ВводРезультат
приветтевирп
АняянА
123321
1

💡 Три команды подряд: разбить строку(""), перевернуть массив, объединить массив("").
пер слово = ЗОП("Введите слово")
пер буквы = слово разбить строку("")
буквы перевернуть массив
печать(буквы объединить массив(""))

Задание: Есть или нет

Условие задачи:

В программе есть список: пер фрукты = ["яблоко", "груша", "слива", "ананас"]. Спросите слово. Если оно есть в списке — напечатайте Есть! Номер: <номер> (команда поиск в массиве). Если нет — напечатайте Нет такого. Помните: нумерация с нуля.

Формат ввода: Одно слово.

Формат вывода: Есть! Номер: <номер> или Нет такого.

Например:

ВводРезультат
грушаЕсть! Номер: 1
ананасЕсть! Номер: 3
бананНет такого
1

💡 поиск в массиве возвращает номер, а для «нет» — минус один: если номер равно -1 то … конец иначе … конец.
пер фрукты = ["яблоко", "груша", "слива", "ананас"]
пер слово = ЗОП("Какой фрукт?")
пер номер = фрукты поиск в массиве(слово)
если номер равно -1 то
	печать("Нет такого")
конец
иначе
	печать("Есть! Номер: " + номер)
конец

Задание: Задом наперёд

Условие задачи:

Спросите числа через пробел. Напечатайте их в обратном порядке через пробел: разбейте строку на список, переверните список и склейте обратно объединить массив(" "). Например 1 2 3 → 3 2 1.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Одна строка — те же числа в обратном порядке.

Например:

ВводРезультат
1 2 33 2 1
10 2020 10
55
1

💡 Разбить, перевернуть, склеить — три команды подряд. Печатает одна команда печать.
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
числа перевернуть массив
печать(числа объединить массив(" "))

Задание: Затопленный остров (очень сложная)

Условие задачи:

Набором целых чисел задан профиль высот одномерного острова в одномерном океане. После дождя во всех низинах острова скопилась вода — сколько влезло. Нарисуйте остров: # — почва, ~ — вода, пробел — воздух. На входе два значения: длина острова и высоты через пробел. Уровни рисуйте сверху вниз, от самой высокой вершины до единицы. Строки вывода — без лишних пробелов по краям.

Формат ввода: Два ответа через « | »: длина острова и высоты через пробел.

Формат вывода: Остров, нарисованный символами (несколько строк).

Ограничения: длина не больше 100, каждая высота от 0 до 100.

Например:

ВводРезультат
3 1 2 1# ###
3 2 1 2#~# ###
3 1 1 1###
1

💡 Вода в столбе стоит на уровне «меньшее из двух максимумов»: наивысшего столба слева и наивысшего столба справа. Сделайте два списка максимумов — слева направо и справа налево. Потом для каждого уровня сверху вниз собирайте строку: '#' если столб такой высоты, '~' если вода, ' ' — воздух. Хвостовой воздух отрежьте срезом полоса.slice(0, край + 1), а пробелы по краям уберите командой удалить пробелы.
пер н = ЦЗОП("Длина острова")
пер текст = ЗОП("Высоты через пробел")
пер высоты = текст разбить строку(" ")
пер слева = []
пер справа = []
запустить цикл н раза то
	слева добавить элемент в массив(0)
	справа добавить элемент в массив(0)
конец
пер текущий = 0
пер столб = 0
пока столб меньше н то
	если преобразовать строку в число(высоты[столб]) больше текущий то
		текущий = преобразовать строку в число(высоты[столб])
	конец
	слева[столб] = текущий
	столб = столб + 1
конец
текущий = 0
столб = н - 1
пока столб большеравно 0 то
	если преобразовать строку в число(высоты[столб]) больше текущий то
		текущий = преобразовать строку в число(высоты[столб])
	конец
	справа[столб] = текущий
	столб = столб - 1
конец
пер верх = слева[н - 1]
пер уровень = верх
пока уровень большеравно 1 то
	пер полоса = ""
	пер край = 0
	столб = 0
	пока столб меньше н то
		если преобразовать строку в число(высоты[столб]) большеравно уровень то
			полоса = полоса + "#"
			край = столб
		конец
		иначе
			если справа[столб] большеравно уровень то
				если слева[столб] большеравно уровень то
					полоса = полоса + "~"
					край = столб
				конец
				иначе
					полоса = полоса + " "
				конец
			конец
			иначе
				полоса = полоса + " "
			конец
		конец
		столб = столб + 1
	конец
	печать((полоса.slice(0, край + 1)) удалить пробелы)
	уровень = уровень - 1
конец

Задание: Сортировка выбором (сложная)

Условие задачи:

Спросите числа через пробел. Напечатайте их по возрастанию через пробел. Команда отсортировать элементы в массиве сравнивает «как в словаре» и числа испортит — сделайте сортировку сами: среди оставшихся ищите наименьшее и меняйте его местами с текущим.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Одна строка — числа по возрастанию через пробел.

Ограничения: чисел не больше 100, каждое от -1000000 до 1000000.

Например:

ВводРезультат
3 1 21 2 3
10 5 85 8 10
9 8 7 66 7 8 9
1

💡 Два вложенных цикла «пока» со своими счётчиками (м и к). Внешний идёт по местам, внутренний ищет минимум на остатке, потом обмен через запасную переменную.
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер н = числа количество элементов в массиве
пер м = 0
пока м меньше н то
	пер мин_место = м
	пер мин_значение = преобразовать строку в число(числа[м])
	пер к = м + 1
	пока к меньше н то
		если преобразовать строку в число(числа[к]) меньше мин_значение то
			мин_значение = преобразовать строку в число(числа[к])
			мин_место = к
		конец
		к = к + 1
	конец
	пер запас = числа[м]
	числа[м] = числа[мин_место]
	числа[мин_место] = запас
	м = м + 1
конец
печать(числа объединить массив(" "))

Задание: Второй максимум (олимпиадная)

Условие задачи:

Спросите числа через пробел (ЗОП) и напечатайте второй по величине — тот, который был бы вторым, если расставить все числа по убыванию (одинаковые считаются разными позициями: для 5 5 3 ответ 5). Для списка пригодится разбить строку(" ") и перебор циклом.

Формат ввода: Одна строка — числа через пробел (не меньше двух).

Формат вывода: Одна строка — второй по величине элемент.

Ограничения: чисел от 2 до 100, каждое от −1000000 до 1000000.

Например:

ВводРезультат
5 3 9 15
10 2010
7 7 77
1

💡 Два накопителя: пер максимум = ... и пер второй = ... — начинайте с очень маленького числа, например -1000000000. Имя «максимум» в языке занято — зовите переменную «самый». В цикле: если х больше самый то второй = самый, самый = х — иначе если х больше второй то второй = х.
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер самый = -1000000000
пер второй = -1000000000
запустить цикл х в массиве числа то
	если преобразовать строку в число(х) больше самый то
		второй = самый
		самый = преобразовать строку в число(х)
	конец
	иначе если преобразовать строку в число(х) больше второй то
		второй = преобразовать строку в число(х)
	конец
конец
печать(второй)

Дальше — Глава 11: случайность. Компьютер научится бросать кубик за вас.

Глава 11. Случайность: компьютер бросает кубик

Программы становятся интересными, когда их нельзя предсказать до конца. Связка команд математика-случайное число и округлить — это кубик в руках компьютера: каждый запуск даёт новое значение.

Шаг 1. Случайное число

математика-случайное число даёт дробь от 0 до 1, а округлить — округляет до целого. Вместе они умеют бросать кубик любого размера:

1

Каждая строка получает своё случайное число от 0 до 6 — запустите демо несколько раз. А чтобы получить кубик со значениями от 1 до 6, добавляем единицу:

1

Запомните пару: «случайное число * 5) + 1» — это кубик 1–6. Умножение на 5 даёт 0–5, прибавка единицы сдвигает на 1–6.

Шаг 2. Дробное случайное число

Для тонкой настройки берут дробное значение без округления — например, чтобы «с вероятностью 30%» произошло событие (дробь меньше 0.3 — примерно треть всех случаев):

1

Шаг 3. Случайный выбор из списка

Случайное число + список = случайный выбор. Номер элемента берём случайный — от 0 до «количество минус один»:

1

Так делаются предсказания, случайные реплики соперника в играх и генераторы имён:

1

Шаг 4. Угадайка

Соберём всё вместе: случайный секрет, цикл-попытки, подсказки «больше — меньше». Команда выход из цикла завершает цикл досрочно, как только вы угадали:

1

Обратите внимание: секрет задаётся один раз до цикла, а внутри цикла каждый раз задаётся новый вопрос. Если убрать строку попытка = попытка + 1, цикл станет вечным — но защита от вечных циклов остановит его и подскажет, где ошибка.

Шаг 5. Мастер случайности: подбрасываем монетку

Классика задач со случайностью — половина диапазона: 0 — «орёл», 1 — «решка»:

1

1

Запустите второй пример несколько раз: около 500, но никогда не точно — в этом и есть случайность.

Задания к главе

Задание: Угадайка

Условие задачи:

Напишите игру «Угадайка». Программа сначала запрашивает загаданное число (ЦЗОП) — в тестах оно подаётся первым вводом, а в жизни его можно сделать случайным (округлить(математика-случайное число * 99) + 1). Затем запрашивайте догадки: если догадка меньше загаданное — печатайте больше, если больше — меньше, а когда угадано — печатайте Угадал! и заканчивайте.

Формат ввода: Первая строка — загаданное число; дальше — догадки по одной.

Формат вывода: По строке на каждую догадку («больше»/«меньше») и «Угадал!» в конце.

Ограничения: 1 ≤ числа ≤ 100; загаданное всегда угадывается (последняя догадка — верная).

Например:

ВводРезультат
50 25 75 50больше меньше Угадал!
7 7Угадал!
50 100 1 50меньше больше Угадал!
1

💡 цикл «пока попытка не равно загаданное»: внутри — два «если» с печатью, в конце цикла — переспросить. После цикла — печать("Угадал!").
пер загаданное = ЦЗОП("Загадайте число")
пер попытка = ЦЗОП("Ваша догадка")
пока попытка не равно загаданное то
	если попытка меньше загаданное то
		печать("больше")
	конец
	иначе
		печать("меньше")
	конец
	попытка = ЦЗОП("Ваша догадка")
конец
печать("Угадал!")

Задание: Статистика монетки

Условие задачи:

Напишите программу: спросите сколько бросков (ЦЗОП), затем задайте N вопросов — каждый ответ это о (орёл) или р (решка). Посчитайте и напечатайте две строки: «Орлов: X» и «Решек: Y».

Формат ввода: Первая строка — N; дальше N строк — «о» или «р».

Формат вывода: Две строки: «Орлов: X» и «Решек: Y».

Ограничения: 0 ≤ N ≤ 1000. Цикл на 1000 шагов обязан закончиться мгновенно.

Например:

ВводРезультат
5 о р о о рОрлов: 3 Решек: 2
2 р рОрлов: 0 Решек: 2
0Орлов: 0 Решек: 0
1

💡 пер орлов = 0 и пер решек = 0 до цикла; внутри сравните ответ: если ответ равно "о" то орлов = орлов + 1 — иначе решек = решек + 1. После цикла две печати.
пер н = ЦЗОП("Сколько бросков?")
пер орлов = 0
пер решек = 0
запустить цикл н раза то
	пер ответ = ЗОП("о или р?")
	если ответ равно "о" то
		орлов = орлов + 1
	конец
	иначе
		решек = решек + 1
	конец
конец
печать("Орлов: " + орлов)
печать("Решек: " + решек)

Задание: Кубик до шестёрки (без проверки)

Условие задачи:

Напишите игру: бросайте кубик (округлить(математика-случайное число * 5) + 1) снова и снова, печатая каждый бросок, пока не выпадет 6. Когда выпадет — напечатайте «Понадобилось K бросков». Автопроверки нет — случайность нельзя предсказать, просто запустите пару раз и посмотрите.

Формат ввода: Нет.

Формат вывода: Строки с бросками и итоговая строка.

Ограничения: программа обязана заканчиваться: шестёрка выпадает почти наверняка за несколько бросков.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 пер бросков = 1, пер кость = ...; пока кость не равно 6 то — внутри печать(кость), бросков = бросков + 1, кость = новый бросок; после цикла печать(кость) и печать итога.
пер бросков = 1
пер кость = округлить(математика-случайное число * 5) + 1
пока кость не равно 6 то
	печать("Выпало: " + кость)
	бросков = бросков + 1
	кость = округлить(математика-случайное число * 5) + 1
конец
печать("Выпало: " + кость)
печать("Понадобилось " + бросков + " бросков")

Дальше — Глава 12: сортировки. Компьютер раскладывает всё по порядку — и мы узнаем, сколько это стоит.

Глава 12. Сортировки: порядок из хаоса

Расставить числа по возрастанию кажется простой задачей — пока не спросишь себя: как именно компьютер это делает? В этой главе вы напишете сортировку своими руками, узнаете, почему одни способы медленные, а другие быстрые, и сам увидите разницу на настоящих замерах.

Шаг 1. Готовая сортировка и её ловушка

В языке уже есть команда отсортировать элементы в массиве:

1

Со словами всё отлично. А теперь секрет:

1

1, 10, 100, 9 — потому что по умолчанию массив сортируется как строки: «100» начинается с «1», а «9» — позже. Для чисел есть специальная команда отсортировать числа — она сравнивает числа как числа:

1

с отсортировать числа меняет сам список. Если оригинал нужен нетронутым — с отсортировать копию чисел вернёт новый отсортированный список.

Шаг 2. Пузырёк: сортировка своими руками

Как бы вы отсортировали карты в руке? Пузырёк делает так: пробегает по списку, сравнивает соседей и меняет их местами, если они не по порядку. Самое большое число «всплывает» в конец за один проход:

1

Обмен двух ячеек — через третью переменную (запаска): просто «с[а] = с[б] и с[б] = с[а]» нельзя — второе присваивание затрёт первое значение. Это приём, который нужен везде.

Шаг 3. Посмотрите на пузырёк вживую

Интерактивный блок «сортировка-визуал» — в разработке.

Нажимайте «Шаг» и следите за подсвеченной парой: сколько проходов нужно, чтобы массив почти отсортировался? А если массив уже отсортирован — сколько проходов тратится зря?

Шаг 4. Сколько это стоит?

В списке из n элементов пузырёк делает примерно n × n сравнений — n на каждой из n дорожек. Рост взрывной:

Размер списка nСравнений (примерно)
10100
10010 000
10001 000 000
10 000100 000 000

Удвоили список — работа выросла в четыре раза. Программисты говорят «сложность n квадрат» и записывают O(n²). Встроенная сортировка умнее (около n × log n) — на 10 000 элементах это примерно 130 000 операций вместо 100 000 000. Разница — в сотни раз, и сейчас вы её померяете сами.

Интерактивный блок «сортировки-график» — в разработке.

Выберите размер списка и нажмите «Измерить»: интерактив реально запускает три сортировки на случайных данных и рисует время работы. Попробуйте 100, потом 500, потом 2000 — как растут столбики?

Шаг 5. Поиск: линейный и пополам

А как быстро найти число в отсортированном списке? Линейно — перебрать все. Но есть трюк умнее — половинное деление: смотрим в середину и сразу выкидываем половину списка. Знакомо? Это «Угадайка» из Главы 11!

Интерактивный блок «бинарный-поиск» — в разработке.

Загадайте число от 1 до 100 и нажмите «Машина угадывает»: машина задаст не больше 7 вопросов, потому что 100 ÷ 2 семь раз меньше единицы. Для миллиона чисел хватает 20 вопросов. Это и есть сила порядка: O(log n).

Пополам ищут только в ОТСОРТИРОВАННОМ списке. Сортировка стоит времени один раз — зато каждый поиск потом почти мгновенный. Так думает словарь в вашей голове.

Шаг 6. Операции со списком вживую

Команды из Главы 11 (вставить в начало, вырезать из массива…) — потрогайте каждую и посмотрите на код, который за ней стоит:

Интерактивный блок «список-визуал» — в разработке.

Задания к главе

Задание: Пузырёк с протоколом

Условие задачи:

Спросите числа через пробел (ЗОП) и отсортируйте их пузырьком — без отсортировать числа. После каждого полного прохода печатайте текущее состояние списка одной строкой через пробел. В конце список должен быть по возрастанию.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: По строке на каждый проход, затем ничего.

Ограничения: чисел не больше 30, каждое от −1000 до 1000. Двойной цикл обязан закончиться мгновенно.

Например:

ВводРезультат
5 2 9 32 5 3 9 2 3 5 9 2 3 5 9
1

💡 Разбейте строку и превратите элементы в числа. Проходов — с длина - 1; внутри прохода соседей сравниваете с[счетчик] и с[счетчик + 1]; обмен — через третью переменную. печать(с) печатает список через запятую — а нужна строка через пробел: печать(с объединить массив(" ")).
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
	с[счетчик] = преобразовать строку в число(с[счетчик])
конец
запустить цикл (с длина - 1) раза то
	запустить цикл (с длина - 1 - счетчик) раза то
		если с[счетчик] больше с[счетчик + 1] то
			пер запаска = с[счетчик]
			с[счетчик] = с[счетчик + 1]
			с[счетчик + 1] = запаска
		конец
	конец
	печать(с объединить массив(" "))
конец

Задание: Сколько сравнений у пузырька?

Условие задачи:

Спросите размер списка n (ЦЗОП) и напечатайте, сколько сравнений делает пузырёк, если на первом проходе n − 1 сравнений, на втором n − 2 и так далее до 1. Например, для n = 5: 4 + 3 + 2 + 1 = 10. Формула суммы: n × (n − 1) ÷ 2.

Формат ввода: Одна строка — n.

Формат вывода: Одна строка — количество сравнений.

Ограничения: 0 ≤ n ≤ 1000000. Считать по формуле, а не циклом — иначе миллион шагов.

Например:

ВводРезультат
510
10
33
1

💡 печать(н * (н - 1) / 2) — но проверка ждёт ЦЕЛОЕ: делите через целое снизу(н * (н - 1) / 2). Для н = 0 и 1 ответ 0.
пер н = ЦЗОП("Размер списка")
печать(целое снизу(н * (н - 1) / 2))

Задание: Бинарный угадайщик

Условие задачи:

Напишите программу, которая угадывает число делением пополам: первый ввод — загаданное число (от 1 до 100), дальше программа называет середину отрезка и печатает её, а следующие вводы — больше или меньше (ответ машины). Когда угадано — печатайте Угадал!. Границы отрезка сужайте: после ответа «больше» нижняя граница становится середина + 1, после «меньше» верхняя — середина − 1.

Формат ввода: Первая строка — загаданное число; дальше — ответы «больше»/«меньше».

Формат вывода: По строке на каждую попытку — названное число; в конце «Угадал!».

Ограничения: 1 ≤ загаданное ≤ 100; угадывается максимум за 7 попыток.

Например:

ВводРезультат
5050 Угадал!
1

💡 пер низ = 1, пер верх = 100. В цикле: пер середина = целое снизу((низ + верх) / 2), печать(середина). Если середина меньше загаданного — печать не нужна, просто читайте ответ: если ответ равно "больше" то низ = середина + 1 — иначе верх = середина - 1. Каждая ветка — свой «конец».
пер загаданное = ЦЗОП("Загадайте число")
пер низ = 1
пер верх = 100
пер середина = целое снизу((низ + верх) / 2)
печать(середина)
пока середина не равно загаданное то
	пер ответ = ЗОП("больше или меньше?")
	если ответ равно "больше" то
		низ = середина + 1
	конец
	иначе
		верх = середина - 1
	конец
	середина = целое снизу((низ + верх) / 2)
	печать(середина)
конец
печать("Угадал!")

Задание: Сортировка выбором (сложная)

Условие задачи:

Напишите сортировку выбором: на каждом шаге находите наименьший элемент в неотсортированной части и меняйте его местами с первым элементом этой части. Спросите числа через пробел и напечатайте список после каждого шага внешнего цикла (строкой через пробел) — даже если обмена не было. Последняя строка — отсортированный список.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: По строке на каждый шаг внешнего цикла.

Ограничения: чисел не больше 20, каждое от −1000 до 1000.

Например:

ВводРезультат
5 2 9 32 5 9 3 2 3 9 5 2 3 5 9 2 3 5 9
1

💡 Внешний цикл «запустить цикл с длина раза» — позиция счетчик. Внутри: пер наименьший = счетчик, потом «пока» перебирает хвост (пер ж = счетчик + 1; пока ж меньше с длина то …) и ищет наименьший. Обмен через третью переменную, после него печать(с объединить массив(" ")).
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
	с[счетчик] = преобразовать строку в число(с[счетчик])
конец
запустить цикл (с длина) раза то
	пер наименьший = счетчик
	пер ж = счетчик + 1
	пока ж меньше с длина то
		если с[ж] меньше с[наименьший] то
			наименьший = ж
		конец
		ж = ж + 1
	конец
	если наименьший не равно счетчик то
		пер запаска = с[счетчик]
		с[счетчик] = с[наименьший]
		с[наименьший] = запаска
	конец
	печать(с объединить массив(" "))
конец

Задание: Сортировка по убыванию (очень сложная)

Условие задачи:

Напишите пузырёк, который сортирует по убыванию — самое большое уплывает в конец, самое маленькое всплывает в начало. Спросите числа через пробел, отсортируйте по убыванию и напечатайте, сколько обменов вы сделали (одна строка), затем сам список.

Формат ввода: Одна строка — числа через пробел.

Формат вывода: Две строки: количество обменов и отсортированный (по убыванию) список.

Ограничения: чисел не больше 30, каждое от −1000 до 1000.

Например:

ВводРезультат
5 2 9 33 9 5 3 2
1

💡 Всё как в пузырьке из шага 2, но сравнение наоборот: если с[счетчик] меньше с[счетчик + 1] то — обмен. Переменная обменов увеличивается внутри «если».
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
	с[счетчик] = преобразовать строку в число(с[счетчик])
конец
пер обменов = 0
запустить цикл (с длина - 1) раза то
	запустить цикл (с длина - 1 - счетчик) раза то
		если с[счетчик] меньше с[счетчик + 1] то
			пер запаска = с[счетчик]
			с[счетчик] = с[счетчик + 1]
			с[счетчик + 1] = запаска
			обменов = обменов + 1
		конец
	конец
конец
печать(обменов)
печать(с объединить массив(" "))

Дальше — Глава 13: словари. Одна переменная, в которой у каждого значения есть своё имя.

Глава 13. Словари: значения с именами

Список — коробка с номерами: значение №0, №1, №2. Но часто удобнее обращаться к значениям по имени: у игрока есть «очки», «уровень», «имя». Для этого есть словарь — коллекция пар «ключ: значение».

Шаг 1. Создаём словарь и читаем его

Словарь пишется в фигурных скобках: ключ, двоеточие, значение. Доступ — через точку:

1

Значение можно изменить — и добавить новый ключ, просто присвоив ему значение:

1

Ключи могут быть и списками — так строят «карточки персонажей»:

1

Шаг 2. Ключи и значения как списки

Иногда нужно перебрать всё содержимое словаря. Три команды превращают словарь в список:

КомандаЧто вернёт для { имя: "Аня", очки: 10 }
конвертировать ключи обьекта в массив["имя", "очки"]
конвертировать значения обьекта в массив["Аня", 10]
конвертировать обьект в массив[["имя", "Аня"], ["очки", 10]]

У команд есть короткие имена: ККОМ (ключи), КЗОМ (значения), КОМ (и то и другое). Перебираем словарь целиком:

1

Обратите внимание: когда ключ «в переменной», к нему обращаются квадратными скобками — игрок[ключ], а не точкой.

Шаг 3. JSON: словарь как текст

Для сохранения и пересылки словарь превращают в текст командой конвертация в JASON, а обратно — конвертация из JASON. Такой формат называется JSON, и он одинаковый на всех языках программирования мира:

1

Это и есть способ сохранять прогресс: превратили словарь в текст, сохранили (об этом — Глава 19), потом собрали обратно.

Шаг 4. Копия словаря

Простое присваивание не копирует словарь, а даёт ему второе имя — изменения видны через оба:

1

Настоящую копию делает глубокое копирование — она копирует словарь со всем содержимым, включая вложенные списки:

1

Шаг 5. Удаляем ключ

удалить элемент вычёркивает ключ из словаря навсегда:

1

КомандаПримерЧто делает
доступ через точкуигрок.очкичитает/меняет значение
конвертировать ключи обьекта в массивККОМ(игрок)список ключей
конвертировать значения обьекта в массивКЗОМ(игрок)список значений
конвертация в JASONконвертация в JASON(игрок)словарь → текст
конвертация из JASONконвертация из JASON(текст)текст → словарь
глубокое копированиеглубокое копирование(с) с сохранением вложенийнастоящая копия
удалить элементудалить элемент(игрок.пароль)вычёркивает ключ

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.

Задание: Карточка игрока

Условие задачи:

Спросите имя (ЗОП) и очки (ЦЗОП). Соберите словарь игрок с ключами имя и очки, затем напечатайте: <имя> — <очки> очков — обращаясь к словарю через точку.

Формат ввода: Два ответа через « | »: имя и очки.

Формат вывода: Одна строка: <имя> — <очки> очков.

Например:

ВводРезультат
Аня 10Аня — 10 очков
Кот 0Кот — 0 очков
Пётр 999Пётр — 999 очков
1

💡 пер игрок = { имя: имя, очки: очки }, затем печать(игрок.имя + " — " + игрок.очки + " очков").
пер имя = ЗОП("Имя игрока")
пер очки = ЦЗОП("Сколько очков?")
пер игрок = { имя: имя, очки: очки }
печать(игрок.имя + " — " + игрок.очки + " очков")

Задание: Банк очков

Условие задачи:

Спросите начальные очки и прибавку (два ЦЗОП). Соберите словарь банк с ключом очки, прибавьте прибавку к банку.очки и напечатайте новое значение.

Формат ввода: Два числа через « | ».

Формат вывода: Одна строка — очки после прибавки.

Например:

ВводРезультат
10 515
0 00
100 -3070
1

💡 пер банк = { очки: старт }, затем банк.очки = банк.очки + добавка, печать(банк.очки).
пер старт = ЦЗОП("Начальные очки")
пер добавка = ЦЗОП("Сколько добавить?")
пер банк = { очки: старт }
банк.очки = банк.очки + добавка
печать(банк.очки)

Задание: Справочник столиц

Условие задачи:

В программе есть словарь: пер столицы = { Россия: "Москва", Франция: "Париж", Италия: "Рим", Япония: "Токио" }. Спросите страну (ЗОП). Если она есть в справочнике — напечатайте её столицу (столицы[страна]); иначе напечатайте Не знаю.

Формат ввода: Одна строка — страна.

Формат вывода: Столица или Не знаю.

Например:

ВводРезультат
РоссияМосква
ФранцияПариж
ГерманияНе знаю
1

💡 Ключа может не быть: если столицы[страна] равно нет значения то печать("Не знаю") конец иначе печать(столицы[страна]) конец.
пер столицы = { Россия: "Москва", Франция: "Париж", Италия: "Рим", Япония: "Токио" }
пер страна = ЗОП("Какая страна?")
если столицы[страна] равно нет значения то
	печать("Не знаю")
конец
иначе
	печать(столицы[страна])
конец

Задание: Анкета в JSON

Условие задачи:

Спросите имя (ЗОП) и любимое число (ЦЗОП). Соберите словарь анкета с ключами имя и число (число — настоящее), затем напечатайте словарь как JSON: конвертация в JASON(анкета). В выводе не должно быть пробелов — JSON компактный.

Формат ввода: Два ответа через « | »: имя и число.

Формат вывода: JSON-строка вида {"имя":"Аня","число":10}.

Например:

ВводРезультат
Аня 10{"имя":"Аня","число":10}
Боря 0{"имя":"Боря","число":0}
Я -5{"имя":"Я","число":-5}
1

💡 Печать одной командой: печать(конвертация в JASON(анкета)).
пер имя = ЗОП("Как тебя зовут?")
пер число = ЦЗОП("Любимое число")
пер анкета = { имя: имя, число: число }
печать(конвертация в JASON(анкета))

Задание: Двойник-обманщик

Условие задачи:

Спросите очки (ЦЗОП). Соберите словарь игрок с ключом очки, затем создайте двойника: пер двойник = игрок (без копирования!). Измените очки двойника на 999 и напечатайте игрок.очки — словари делят одни значения, поэтому напечатается 999 при любом вводе.

Формат ввода: Одно число.

Формат вывода: Всегда 999.

Например:

ВводРезультат
10999
0999
-5999
1

💡 Двойник — это второе имя того же словаря. Меняешь через двойника — меняется и у игрока.
пер очки = ЦЗОП("Сколько очков?")
пер игрок = { очки: очки }
пер двойник = игрок
двойник.очки = 999
печать(игрок.очки)

Задание: Чемпион по ключам

Условие задачи:

Спросите имя (ЗОП) и уровень (ЦЗОП). Соберите словарь герой с ключами имя и уровень, затем напечатайте список ключей через запятую: конвертировать ключи обьекта в массив + объединить массив(", ").

Формат ввода: Два ответа через « | »: имя и уровень.

Формат вывода: Одна строка: имя, уровень.

Например:

ВводРезультат
Аня 1имя, уровень
Боря 9имя, уровень
Я 99имя, уровень
1

💡 печать(конвертировать ключи обьекта в массив(герой) объединить массив(", ")) — ключи всегда одни и те же, как их ни вводи.
пер имя = ЗОП("Имя героя")
пер уровень = ЦЗОП("Уровень")
пер герой = { имя: имя, уровень: уровень }
печать(конвертировать ключи обьекта в массив(герой) объединить массив(", "))

Задание: Частотный словарь (сложная)

Условие задачи:

Спросите слово (ЗОП). Посчитайте, сколько раз встречается каждая буква (словарь: буква → количество), и напечатайте словарь как JSON (конвертация в JASON). Ключи идут в порядке первого появления буквы.

Формат ввода: Одна строка.

Формат вывода: JSON вида {"м":1,"и":1,"р":1}.

Ограничения: длина слова не больше 100 символов.

Например:

ВводРезультат
мир{"м":1,"и":1,"р":1}
банан{"б":1,"а":2,"н":2}
шалаш{"ш":2,"а":2,"л":1}
1

💡 Разбейте слово на буквы. В цикле: если счёт[б] равно нет значения — запишите 1, иначе прибавьте 1. Потом конвертация в JASON.
пер слово = ЗОП("Введите слово")
пер буквы = слово разбить строку("")
пер счёт = {}
запустить цикл б в массиве буквы то
	если счёт[б] равно нет значения то
		счёт[б] = 1
	конец
	иначе
		счёт[б] = счёт[б] + 1
	конец
конец
печать(конвертация в JASON(счёт))

Дальше — Глава 14: классы. Свои типы значений с собственными командами.

Глава 14. Классы: свои типы значений

Словарь собрал свойства в одну карточку. Но герою нужно не только хранить очки — он должен уметь действовать. Класс — это чертёж: описываем один раз, а потом создаём сколько угодно «экземпляров», каждый со своими данными и своими командами.

Шаг 1. Первый класс

Класс описывается командой класс, внутри — конструктор (что делать при создании) и методы (обычные команды-функции, принадлежащие классу). Создаётся экземпляр командой новый:

1

Разбор по строкам:

этот элемент означают «именно этого кота, не любого другого»;

Шаг 2. Сколько угодно экземпляров

Один чертёж — много котов, и у каждого своё имя и свои свойства:

1

У Барсика и Мурки отдельные сытости: каждый экземпляр хранит свои значения, но команды у них общие — описаны один раз в классе.

Шаг 3. Команды с параметрами

Методы принимают значения так же, как функции из Главы 7:

1

Так устроены игровые объекты: герой.урон(10), счёт.добавить(1), магазин.продать("хлеб").

Шаг 4. Наследование: расширить класс

Классы умеют наследовать друг друга: расширить класс — новый класс получает всё, что умел старый, и добавляет своё:

1

Кот и Собака оба умеют познакомься — эта команда описана один раз в Животном. Общее — в родителя, особенное — в наследнике:

1

Котёнок переопределил голос: команда с тем же именем в наследнике заменяет родительскую.

КомандаПримерЧто делает
класскласс Кот начало … конецчертёж
конструкторконструктор(имя) начало … конецкод при создании
этот элементэтот элемент очки = 10«моё» свойство
новыйновый Кот("Барсик")создать экземпляр
расширить класскласс Котёнок расширить класс Кот …наследование

Задания к главе

Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.

Задание: Знакомимся с классом

Условие задачи:

Напишите класс Кот: конструктор принимает имя и запоминает его (этот элемент имя), метод поздороваться печатает Мяу, я <имя>!. В программе спросите имя (ЗОП), создайте кота командой новый Кот(...) и вызовите поздороваться.

Формат ввода: Одно слово — имя кота.

Формат вывода: Одна строка: Мяу, я <имя>!

Например:

ВводРезультат
БарсикМяу, я Барсик!
МуркаМяу, я Мурка!
123Мяу, я 123!
1

💡 В конструкторе: этот элемент имя = имя. В методе: печать("Мяу, я " + этот элемент имя + "!").
класс Кот начало
	конструктор(имя) начало
		этот элемент имя = имя
	конец
	поздороваться() начало
		печать("Мяу, я " + этот элемент имя + "!")
	конец
конец
пер имя = ЗОП("Как зовут кота?")
пер барсик = новый Кот(имя)
барсик.поздороваться()

Задание: Счётчик с методами

Условие задачи:

Напишите класс Счётчик: конструктор принимает стартовое число и запоминает его; метод добавить(n) прибавляет n к счётчику; метод показать печатает Счётчик: <значение>. В программе спросите старт и две прибавки, создайте счётчик, дважды вызовите добавить и один раз показать.

Формат ввода: Три числа через « | »: старт, первая прибавка, вторая прибавка.

Формат вывода: Одна строка: Счётчик: <старт + прибавка 1 + прибавка 2>.

Например:

ВводРезультат
0 5 3Счётчик: 8
10 1 1Счётчик: 12
100 -10 5Счётчик: 95
1

💡 В классе: этот элемент число = старт, метод добавить меняет этот элемент число, метод показать печатает его.
класс Счётчик начало
	конструктор(старт) начало
		этот элемент число = старт
	конец
	добавить(n) начало
		этот элемент число = этот элемент число + n
	конец
	показать() начало
		печать("Счётчик: " + этот элемент число)
	конец
конец
пер старт = ЦЗОП("С какого числа начинаем?")
пер счёт = новый Счётчик(старт)
счёт.добавить(ЦЗОП("Первая прибавка"))
счёт.добавить(ЦЗОП("Вторая прибавка"))
счёт.показать()

Задание: Два кота

Условие задачи:

Спросите два имени (два ЗОП). Создайте двух котов (класс Кот с методом поздороваться, печатающим Мяу, я <имя>!) и заставьте каждого поздороваться — в порядке вопросов.

Формат ввода: Два ответа через « | »: имя первого, имя второго.

Формат вывода: Две строки приветствий — сначала первого кота, потом второго.

Например:

ВводРезультат
Барсик МуркаМяу, я Барсик! Мяу, я Мурка!
Мурка БарсикМяу, я Мурка! Мяу, я Барсик!
А БМяу, я А! Мяу, я Б!
1

💡 Две переменные — два экземпляра: кот1 = новый Кот(первый), кот2 = новый Кот(второй). Вызовы — в том же порядке.
класс Кот начало
	конструктор(имя) начало
		этот элемент имя = имя
	конец
	поздороваться() начало
		печать("Мяу, я " + этот элемент имя + "!")
	конец
конец
пер первый = ЗОП("Имя первого кота")
пер второй = ЗОП("Имя второго кота")
пер кот1 = новый Кот(первый)
пер кот2 = новый Кот(второй)
кот1.поздороваться()
кот2.поздороваться()

Задание: Наследник

Условие задачи:

Напишите класс Животное: конструктор запоминает имя, метод познакомься печатает Я — <имя>!. Напишите класс Кот, который расширяет Животное (расширить класс) и добавляет метод мяу, печатающий Мяу, я <имя>!. Спросите имя, создайте кота и вызовите оба метода: сначала познакомься, потом мяу.

Формат ввода: Одно слово — имя.

Формат вывода: Две строки: Я — <имя>! и Мяу, я <имя>!

Например:

ВводРезультат
БарсикЯ — Барсик! Мяу, я Барсик!
МуркаЯ — Мурка! Мяу, я Мурка!
123Я — 123! Мяу, я 123!
1

💡 класс Кот расширить класс Животное начало … конец — кот умеет всё, что животное, плюс своё мяу.
класс Животное начало
	конструктор(имя) начало
		этот элемент имя = имя
	конец
	познакомься() начало
		печать("Я — " + этот элемент имя + "!")
	конец
конец
класс Кот расширить класс Животное начало
	мяу() начало
		печать("Мяу, я " + этот элемент имя + "!")
	конец
конец
пер имя = ЗОП("Как зовут кота?")
пер барсик = новый Кот(имя)
барсик.познакомься()
барсик.мяу()

Задание: Банк с охраной (сложная)

Условие задачи:

Напишите класс Банк: конструктор принимает стартовый баланс; метод положить(n) прибавляет n; метод снять(n) вычитает n, но если денег не хватает (n больше баланса) — баланс не меняется. Спросите старт и три команды-числа: снять, положить, снять (три ЦЗОП). Выполните их по порядку и напечатайте итоговый баланс.

Формат ввода: Четыре числа через « | »: старт, снять, положить, снять.

Формат вывода: Одна строка — итоговый баланс.

Ограничения: все числа от -1000000 до 1000000, старт неотрицательный.

Например:

ВводРезультат
100 30 10 5030
10 20 5 015
0 0 0 00
1

💡 В методе снять: если n больше этот элемент деньги то — ничего не делать, иначе вычесть.
класс Банк начало
	конструктор(старт) начало
		этот элемент деньги = старт
	конец
	положить(n) начало
		этот элемент деньги = этот элемент деньги + n
	конец
	снять(n) начало
		если n меньшеравно этот элемент деньги то
			этот элемент деньги = этот элемент деньги - n
		конец
	конец
конец
пер старт = ЦЗОП("Стартовый баланс")
пер счёт = новый Банк(старт)
счёт.снять(ЦЗОП("Сколько снять?"))
счёт.положить(ЦЗОП("Сколько положить?"))
счёт.снять(ЦЗОП("Сколько снять ещё?"))
печать(счёт.деньги)

Дальше — Глава 15: холст. Рисуем настоящую графику — для этого шага понадобится компилятор ryap.exe из Главы 0.

Глава 15. Холст: рисуем графику

До сих пор программы отвечали текстом. Теперь — графика! Холст — это белый лист прямо в редакторе: запустите пример — и под кодом появится рисунок. Те же программы работают и в компиляторе ryap.exe.

Холст в учебнике — 400 на 320 пикселей. Точка (0, 0) — левый верхний угол: вправо растёт первая координата, вниз — вторая.

Шаг 1. Первый прямоугольник

Команда содержание холста достаёт кисть (записывает её в переменную холст). Команда нарисовать прямоугольник рисует прямоугольник: слева, сверху, ширина, высота:

1

Шаг 2. Цвета

цвет заливки задаёт цвет для всех следующих фигур. Есть готовые названия цветов:

1

А так рисуется круг — нарисовать круг(х, у, радиус): х и у — центр, радиус — расстояние от центра до края. Заливается текущим цветом:

1

Слово на РЯПЦвет
красный, оранжевый, желтыйтёплые
зеленый, лаймовый, светло-зеленыйзелёные
синий, темно-синий, водный, аквамариновыйхолодные
черный, белый, серый, серебрянныйнейтральные
розовый, фиолетовый, коричневый, золотой, оливковыйпрочие

Кисть запоминает цвет до следующего изменения: «цвет заливки — потом сколько угодно фигур этим цветом».

Шаг 3. Настраивающие и рисующие команды

Команды холста бывают двух видов. Настраивающие меняют кисть и аргументов не имеют: цвет заливки красный, ширина линии 3. Рисующие рисуют — у них в скобках аргументы через запятую, как у обычных команд: нарисовать прямоугольник(10, 10, 60, 60).

КомандаПримерСкобки
цвет заливкицвет заливки красныйне нужны
цвет линиицвет линии синийне нужны
ширина линииширина линии 3не нужны
нарисовать прямоугольникнарисовать прямоугольник(10, 10, 60, 60)нужны
нарисовать текстнарисовать текст("Мой дом", 130, 170)нужны
ширина холсташирина холставыражение-число
высота холставысота холставыражение-число

Шаг 4. Очистка холста

Рисунки накапливаются: каждая фигура ложится поверх предыдущих. очистить холст стирает всё до белого листа:

1

После очистки останется только второй прямоугольник. Очистка — главный инструмент анимации (об этом в следующей главе).

Шаг 5. Линии

Рисование линии — это маршрут: «поднять ручку» (рисовка линий), поставить точку (провести линию из точки), вести линию (провести линию в точку), «отрисовать» (завершить рисовку линий):

1

Из точки в точку можно вести сколько угодно линий — получится ломаная. Команда заполнить фигуры заливает замкнутый контур текущим цветом заливки. Команда провести линию из первой точки в последнюю замыкает контур — соединяет последнюю точку с первой.

Шаг 6. Текст на холсте

Текст тоже рисуется как фигура — командой нарисовать текст. Размер шрифта задаёт размер шрифта текста:

1

Шаг 7. Короткие имена

У четырёх главных команд холста есть сокращения для быстрого письма:

СокращениеПолное имя
НПнарисовать прямоугольник
ПЛИТпровести линию из точки
ПЛВТпровести линию в точку
ЗРЛзавершить рисовку линий
1

Шаг 8. Кисть: помни состояние

У кисти есть «память» — её можно сохранять и восстанавливать. Зачем? Чтобы повернуть или сдвинуть кисть, нарисовать, а потом вернуть всё как было — и не портить следующие фигуры:

1

Наклонённый прямоугольник нарисован из «сдвинутого» места, а зелёный — в обычных координатах: восстановить кисть вернул всё как было. Ещё кисть умеет прозрачность — фигуры просвечивают:

1

Правило хорошего тона: делаете сдвиг/поворот/прозрачность — оберните в сохранить кисть … восстановить кисть. Кисть-память — стек: можно сохранять несколько раз и восстанавливать в обратном порядке.

Шаг 9. Дом: собираем всё вместе

Домик из прямоугольника и крыши — теперь прямо здесь, жмите «Запустить»:

1

Проверить себя просто: пиксель (160, 150) должен быть жёлтым — это стена дома. Автопроверка в заданиях этой главы устроена так же: она «смотрит» в указанные точки холста.

Задания к главе

Задание: Светофор

Условие задачи:

Нарисуйте светофор: три квадрата 60×60 в ряд на одной высоте — <b>красный</b> от точки (20, 100), <b>желтый</b> от точки (100, 100), <b>зеленый</b> от точки (180, 100). Автопроверка посмотрит в центр каждого квадрата и в промежутки.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте — проверка по точкам.

Ограничения: холст учебника 400×320; не выходите за его границы.

Например:

ВводРезультат
—пиксель 50, 130 = красный пиксель 130, 130 = желтый пиксель 210, 130 = зеленый
1

💡 Три раза: цвет заливки …, нарисовать прямоугольник(x, 100, 60, 60). Центры квадратов — точки (50, 130), (130, 130), (210, 130).
содержание холста
цвет заливки красный
нарисовать прямоугольник(20, 100, 60, 60)
цвет заливки желтый
нарисовать прямоугольник(100, 100, 60, 60)
цвет заливки зеленый
нарисовать прямоугольник(180, 100, 60, 60)

Задание: Ступени

Условие задачи:

Нарисуйте лестницу из трёх ступеней: серые прямоугольники 60×40. Первая от точки (20, 240), каждая следующая — на 80 правее и на 60 выше: (100, 180) и (180, 120). Проверка смотрит в центры ступеней и в пустоты.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте — проверка по точкам.

Ограничения: холст учебника 400×320.

Например:

ВводРезультат
—пиксель 50, 260 = серый пиксель 130, 200 = серый пиксель 210, 140 = серый
1

💡 Три пары «цвет заливки серый + нарисовать прямоугольник(...)» с координатами (20, 240), (100, 180), (180, 120). Центры — (50, 260), (130, 200), (210, 140).
содержание холста
цвет заливки серый
нарисовать прямоугольник(20, 240, 60, 40)
нарисовать прямоугольник(100, 180, 60, 40)
нарисовать прямоугольник(180, 120, 60, 40)

Задание: Ракета на старте

Условие задачи:

Нарисуйте ракету на холсте — автопроверки у этой задачи нет, вы художник. Обязательное: корпус (прямоугольник), нос (треугольник из линий и заполнить фигуры), пламя внизу и надпись <b>«Поехали!»</b> командой нарисовать текст. Не меньше <b>5 фигур</b> и <b>3 цветов</b>.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте.

Ограничения: холст учебника 400×320.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Корпус — вертикальный прямоугольник по центру. Нос — две линии от верхних углов корпуса к точке над ним, потом заполнить фигуры. Пламя — маленький оранжевый прямоугольник под корпусом.
содержание холста
цвет заливки серый
нарисовать прямоугольник(180, 100, 40, 120)
цвет линии красный
ширина линии 3
рисовка линий
провести линию из точки(180, 100)
провести линию в точку(200, 60)
провести линию в точку(220, 100)
завершить рисовку линий
заполнить фигуры
цвет заливки оранжевый
нарисовать прямоугольник(190, 220, 20, 40)
цвет заливки белый
нарисовать прямоугольник(190, 130, 20, 20)
цвет заливки черный
размер шрифта текста "20px Arial"
нарисовать текст("Поехали!", 130, 290)

Задание: Деревня (очень сложная)

Условие задачи:

Напишите функцию дом(х, у, цвет) — она рисует домик: стена 60×40 цвета цвет от точки (х, у), крыша-треугольник красным и окно 12×12 белым по центру стены. Потом нарисуйте деревню: три дома в разных местах и дорогу-полосу внизу. Автопроверки нет — красота на вашей совести.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте.

Ограничения: холст учебника 400×320.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Внутри функции — те же команды, что в «Доме» шага 8, но все координаты считаются от х и у: стена (х, у, 60, 40), вершина крыши (х + 30, у − 30), окно (х + 24, у + 14, 12, 12). Потом три вызова дом(30, 180, "золотой") и другие.
содержание холста
функция дом принимает аргументы х, у, цвет начало функции
	цвет заливки цвет
	нарисовать прямоугольник(х, у, 60, 40)
	цвет линии красный
	ширина линии 3
	рисовка линий
	провести линию из точки(х - 10, у)
	провести линию в точку(х + 30, у - 30)
	провести линию в точку(х + 70, у)
	завершить рисовку линий
	заполнить фигуры
	цвет заливки белый
	нарисовать прямоугольник(х + 24, у + 14, 12, 12)
конец функции
дом(30, 180, "золотой")
дом(150, 160, "розовый")
дом(280, 190, "лаймовый")
цвет заливки серый
нарисовать прямоугольник(0, 290, 400, 30)

Задание: Пузырьки

Условие задачи:

Нарисуйте три пузырька-круга радиуса 30 на одной высоте (центры на линии у = 200): <b>синий</b> с центром (80, 200), <b>водный</b> — (200, 200), <b>фиолетовый</b> — (320, 200). Проверка заглянет в центры пузырьков и в промежутки между ними.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте — проверка по точкам.

Ограничения: холст учебника 400×320.

Например:

ВводРезультат
—пиксель 80, 200 = синий пиксель 200, 200 = водный пиксель 320, 200 = фиолетовый
1

💡 Три пары «цвет заливки … + нарисовать круг(х, 200, 30)». Цвета: синий, водный, фиолетовый.
содержание холста
цвет заливки синий
нарисовать круг(80, 200, 30)
цвет заливки водный
нарисовать круг(200, 200, 30)
цвет заливки фиолетовый
нарисовать круг(320, 200, 30)

Дальше — Глава 16: движение. Заставим фигуры летать: интервал, задержка и покадровая анимация.

Глава 16. Холст: движение и анимация

Мультик — это много картинок, сменяющихся быстро: каждый «кадр» картинка немного сдвигается, и глаз видит движение. Компьютер умеет повторять код по расписанию — этим и делают анимацию. Демо этой главы живут прямо в учебнике: жмите «Запустить» и смотрите.

Шаг 1. Повтор по расписанию: интервал

Команда интервал повторяет блок кода каждые N миллисекунд (1000 миллисекунд = секунда):

1

Читается так: «интервал ( безымянная функция ) начало … конец, повторять каждые 1000 мс». Каждый «Тик!» — новый кадр по будильнику. Будильник тикает, пока открыта страница, поэтому при перезапуске демо старый интервал сначала гасится.

Шаг 2. Кадры: очистить — сдвинуть — нарисовать

Анимация — это три шага в каждом кадре: стереть, изменить, нарисовать. Двигаем квадрат вправо:

1

Каждые 30 миллисекунд холст очищается, х растёт на 2 — и квадрат рисуется на новом месте. Квадрат уедет за край холста и исчезнет — границ он пока не знает.

Шаг 3. Отскок от стены

Меняя х, проверяем границы: долетел до правого края — двигайся назад. Для этого направление тоже храним в переменной и меняем его знак:

1

Квадрик летает туда-сюда. -скорость — «минус скорость»: когда скорость была 2, станет −2, и движение пойдёт в обратную сторону.

Шаг 4. Двумерное движение: мяч

Два изменения — по х и по у — дают диагональный полёт. Отскок по обеим стенам — вот уже и «мяч для пинг-понга»:

1

Шаг 5. Разовое отложенное действие: задержка

интервал повторяет бесконечно. А задержка выполняет блок один раз, через указанное время — например, через полторы секунды после запуска:

1

Читается: «задержка ( функция ) … конец, через 1500 мс». Так делают отсчёт «3, 2, 1, старт!» и переходы между экранами игры.

Шаг 6. Один кадр: анимировать холст

анимировать холст выполняет блок на следующем обновлении экрана браузера — один вызов рисует один самый плавный кадр. Соединим его с задержка: квадрат стоит полсекунды — и одним кадром прыгает вправо:

1

Чтобы анимация длилась, кадры создают по цепочке — а чаще всего кадры делает интервал, как в шагах выше.

Шаг 7. Поворот фигуры

Фигуры можно вращать. повернуть фигуру поворачивает кисть на угол в радианах (полный оборот ≈ 6.28) — все следующие фигуры лягут под углом. Оборот стрелки удобно делать через время:

1

Команда время из Главы 19 даёт миллисекунды — деля на 1000, получаем постоянно растущее число секунд, из которого получается плавный поворот.

Шаг 8. Правила хорошего мультика

на друга;

Задания к главе

Задание: Пинг-понг

Условие задачи:

Сделайте мяч 20×20, который летает по холсту и отскакивает от всех четырёх стен — как в шаге 4, но и по вертикали, и по горизонтали. Автопроверки у этой задачи нет: запустите и смотрите, пока мяч не побывает у каждой стены.

Формат ввода: Нет.

Формат вывода: Анимация на холсте (холст 400×320).

Ограничения: холст учебника 400×320; мяч не должен вылетать за край больше, чем на половину себя.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Два условия с отскоком по х (больше 380, меньше 0) и два по у (больше 300, меньше 0). Скорости — две переменные, например сх = 4 и су = 3.
содержание холста
пер х = 40
пер у = 40
пер сх = 4
пер су = 3
интервал(безимянная функция() начало
	очистить холст
	х = х + сх
	у = у + су
	если х больше 380 или х меньше 0 то
		сх = -сх
	конец
	если у больше 300 или у меньше 0 то
		су = -су
	конец
	цвет заливки красный
	нарисовать прямоугольник(х, у, 20, 20)
конец, 30)

Задание: Светофор-регулировщик

Условие задачи:

Нарисуйте светофор: тёмный столб 60×180 с тремя «лампами»-квадратами 40×40 — красной, желтой и зеленой. Сначала горит красная. Через <b>1 секунду</b> загорается желтая (красная гаснет), ещё через секунду — зеленая. Автопроверки нет — следите за переключением.

Формат ввода: Нет.

Формат вывода: Рисунок и две смены кадра на холсте (холст 400×320).

Ограничения: холст учебника 400×320.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Функция светофор(цвет, верх) рисует столб, три погашенные лампы ("DarkRed", "DarkKhaki", "DarkGreen") и яркую лампу цвета цвет на высоте верх (50, 110 или 170). Потом: светофор("red", 50) сразу, через 1000 мс — светофор("yellow", 110), ещё через 1000 — светофор("lime", 170).
содержание холста
функция светофор принимает аргументы цвет, верх начало функции
	очистить холст
	цвет заливки "DarkSlateGray"
	нарисовать прямоугольник(40, 40, 60, 180)
	цвет заливки "DarkRed"
	нарисовать прямоугольник(50, 50, 40, 40)
	цвет заливки "DarkKhaki"
	нарисовать прямоугольник(50, 110, 40, 40)
	цвет заливки "DarkGreen"
	нарисовать прямоугольник(50, 170, 40, 40)
	цвет заливки цвет
	нарисовать прямоугольник(50, верх, 40, 40)
конец функции
светофор("red", 50)
задержка(безимянная функция() начало
	светофор("yellow", 110)
конец, 1000)
задержка(безимянная функция() начало
	светофор("lime", 170)
конец, 2000)

Задание: Гусеница (сложная)

Условие задачи:

Сделайте гусеницу: пять сегментов 20×20, которые ползут вправо друг за другом. Голова движется сама, а каждый следующий сегмент отстаёт от неё ровно на 22 пикселя — живая цепочка. Интервал — 30 мс. Автопроверки нет: гусеница должна ползти и не разваливаться.

Формат ввода: Нет.

Формат вывода: Анимация на холсте (холст 400×320).

Ограничения: холст учебника 400×320.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 пер голова = 10 до интервала. В кадре: очистить холст, голова = голова + 2, потом запустить цикл 5 раза то — нарисовать прямоугольник(голова - счетчик * 22, 100, 20, 20) — конец. Счетчик идёт с нуля, так что при счетчик 0 рисуется сама голова.
содержание холста
пер голова = 10
интервал(безимянная функция() начало
	очистить холст
	голова = голова + 2
	запустить цикл 5 раза то
		если счетчик остаток от деления на 2 равно 0 то
			цвет заливки зеленый
		конец
		иначе
			цвет заливки темно-зеленый
		конец
		нарисовать прямоугольник(голова - счетчик * 22, 100, 20, 20)
	конец
конец, 30)

Задание: Круглый мяч (без проверки)

Условие задачи:

Переделайте «мяч для пинг-понга» (шаг 4) на круглый: радиус 15, красный, летает по холсту и отскакивает от всех четырёх стен. Автопроверки нет — запустите и следите за мячом.

Формат ввода: Нет.

Формат вывода: Анимация на холсте (холст 400×320).

Ограничения: холст учебника 400×320; учитывайте радиус — центр мяча не должен заходить за край.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Отскоки по х: если х больше 385 или х меньше 15 то сх = -сх; по у — аналогично с 305 и 15. Рисование: нарисовать круг(х, у, 15).
содержание холста
пер х = 60
пер у = 60
пер сх = 4
пер су = 3
интервал(безимянная функция() начало
	очистить холст
	х = х + сх
	у = у + су
	если х больше 385 или х меньше 15 то
		сх = -сх
	конец
	если у больше 305 или у меньше 15 то
		су = -су
	конец
	цвет заливки красный
	нарисовать круг(х, у, 15)
конец, 30)

Дальше — Глава 17: события. Программа будет реагировать на мышь и клавиатуру.

Глава 17. События: мышь и клавиатура

До сих пор программа жила своей жизнью: запустилась и работала по сценарию. Событие — это сигнал «снаружи»: пользователь щёлкнул мышью, нажал клавишу. Программа слушает события и реагирует на них — так работают все интерактивные приложения и игры. Демо этой главы живые: запустите, затем щёлкайте по холсту (он поймает фокус) или жмите клавиши — слушатель отзовётся.

Шаг 1. Клик мышью

при нажатии мышкой вешает «слушателя» на всю страницу. Каждый клик — выполняется блок:

1

позиция клика по x и позиция клика по y говорят, где именно щёлкнули. Нарисуем «трассу» за курсором на холсте:

1

Шаг 2. Рисуем по клику

Классика «там, где кликнул — там и точка»:

1

Внимание на минус пять: мы рисуем квадратик вокруг курсора, поэтому отступаем от его центра на половину размера.

Шаг 3. Клавиатура

при нажатии на кнопку слушает клавиатуру. название кнопки — символ или имя клавиши ("a", "5", "Enter", "ArrowLeft"), код кнопки — её числовой код:

1

Запустите и нажмите разные клавиши: буквы, цифры, стрелки, пробел, Enter. Стрелки называются "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown".

Шаг 4. Меняем фон страницы клавишей

Событие + свойство страницы — и клавиша перекрашивает весь фон. Этим демо работает только под компилятором ryap.exe — в учебнике фон страницы не менять (остальные демо главы — живые):

при нажатии на кнопку начало
	если название кнопки равно "r" то
		фон страницы красный
	конец
	если название кнопки равно "g" то
		фон страницы зеленый
	конец
	если название кнопки равно "b" то
		фон страницы синий
	конец
конец)

Шаг 5. Управляем фигурой стрелками

Собираем движение из прошлой главы и клавиатуру: стрелки двигают квадрат. Сначала переменные и слушатель, потом функция перерисовки:

1

Нажмите любую стрелку — квадрат шагнёт в её сторону. Это уже почти управление персонажем игры!

Шаг 6. Счётчик кликов

События отлично дружат с переменными-счётчиками — основой любой «статистики» в играх:

1

Шаг 7. Кнопки и элементы страницы

События бывают и на конкретных элементах. Элемент можно создать прямо в программе — создать html элемент("button"), задать ему текст и повесить своё событие: при нажатии на элемент + команда и конец:

1

html элемент с айди("...") находит элемент по имени, его html содержание меняет текст внутри него, а ДОКУМЕНТ-body.appendChild добавляет кнопку на страницу. Так делаются интерфейсы: элемент — деталь, событие — реакция на неё.

Задание: Красные точки

Условие задачи:

Напишите программу: при каждом клике по холсту рисуйте красный круг радиуса 8 в точке клика (команды позиция клика по x и позиция клика по y дадут координаты). Автопроверка пощёлкает по холсту за вас и заглянет в точки.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте — проверка по точкам.

Ограничения: холст учебника 400×320; клики приходят изнутри холста.

Например:

ВводРезультат
клик 200, 150пиксель 200, 150 = красный
1

💡 Всё рисование — внутри слушателя «при нажатии мышкой начало … конец)»: цвет заливки красный, нарисовать круг(позиция клика по x, позиция клика по y, 8).
содержание холста
при нажатии мышкой начало
	цвет заливки красный
	нарисовать круг(позиция клика по x, позиция клика по y, 8)
конец)

Задание: Клавишный диктант

Условие задачи:

Напишите программу: при нажатии любой клавиши печатайте строку вида Нажали: X — вместо X подставьте название клавиши. Автопроверка «нажмёт» клавиши за вас (команда при нажатии клавиши слушает клавиатуру, название клавиши даёт имя: "a", "5", "Enter", "ArrowLeft"...).

Формат ввода: Нет.

Формат вывода: По строке «Нажали: имя» на каждую клавишу.

Ограничения: в тестах клавиши: буквы, цифры, Enter, стрелки.

Например:

ВводРезультат
клавиша a клавиша 5 клавиша EnterНажали: a Нажали: 5 Нажали: Enter
1

💡 при нажатии клавиши начало ... печать("Нажали: " + название клавиши) ... конец) — тело слушателя выполняется на каждое нажатие.
при нажатии клавиши начало
	печать("Нажали: " + название клавиши)
конец)

Задание: Мишень (сложная)

Условие задачи:

Нарисуйте мишень — синий круг радиуса 50 с центром (200, 150). Потом слушайте клики: если клик попал в мишень (расстояние от центра до точки клика не больше 50) — печатайте Попал!, иначе — Мимо. Расстояние считайте по формуле √(dx² + dy²) — корень даёт ... в степени 0.5.

Формат ввода: Нет.

Формат вывода: Рисунок мишени и по строке на каждый клик.

Ограничения: холст учебника 400×320; центр мишени всегда (200, 150), радиус 50.

Например:

ВводРезультат
клик 200, 150 клик 380, 20 клик 200, 100Попал! Мимо Попал!
1

💡 В слушателе: пер dx = позиция клика по x - 200, пер dy = позиция клика по y - 150; если (dx * dx + dy * dy) в степени 0.5 меньшеравно 50 то печать("Попал!") — иначе печать("Мимо"). Каждая ветка — свой «конец».
содержание холста
цвет заливки синий
нарисовать круг(200, 150, 50)
при нажатии мышкой начало
	пер dx = позиция клика по x - 200
	пер dy = позиция клика по y - 150
	если (dx * dx + dy * dy) в степени 0.5 меньшеравно 50 то
		печать("Попал!")
	конец
	иначе
		печать("Мимо")
	конец
конец)

Дальше — Глава 18: игры. Собираем всё изученное в одну настоящую игру.

Глава 18. Игры: собираем всё вместе

Игровая программа — это конструктор из четырёх уже знакомых деталей: состояние (переменные), события (мышь и клавиши), цикл кадров (интервал) и условия (победа, поражение). В этой главе соберём простую игру целиком и набросаем идеи для своих. Все демо живые: играйте прямо в учебнике (для клавиш — щёлкните по холсту, чтобы он поймал фокус).

Шаг 1. Схема любой игры

Каждая игра держит в переменных текущее состояние и на каждом кадре пересчитывает его:

ДетальЧто этоКоманды
Состояниегде герой, сколько очковпер
Вводчто хочет игрокпри нажатии мышкой, при нажатии на кнопку
Кадрыкак мир меняется саминтервал, анимировать холст
Правилапобеда и поражениеесли, иначе

Шаг 2. Ловим квадрат: полная игра

Цель — успеть щёлкнуть по убегающему квадрату. Квадрат прыгает каждые полсекунды, игрок кликает; счёт растёт с каждой поимкой:

1

Разбор по деталям:

место (округлить(математика-случайное число * 300) — по ширине холста);

— четыре сравнения через и;

Два независимых интервала — обычное дело: один меняет мир, другой его рисует.

Шаг 3. Таймер на игру

Добавим обратный отсчёт: игра идёт 15 секунд, потом итог. Время хранится в переменной и уменьшается в кадре:

1

Один раз в секунду таймер тикает; когда дошёл до нуля — объявляем итог. Чтобы игра «закрылась» по-настоящему, внутри если время игры равно 0 то останавливают интервалы и больше не рисуют.

Шаг 4. Враг догоняет: расстояние

В играх часто нужно «кто ближе». Расстояние между двумя точками на плоскости считается теоремой Пифагора — через корень суммы квадратов. квадратный корень и в степени уже есть в нашем словаре:

1

Команда квадратный корень — со скобкой сразу после имени, выражение целиком внутри её скобок.

Шаг 5. Сложность: скорость растёт

Игры становятся интереснее, когда усложняются. Простейший приём — ускорять врага с каждой поимкой:

1

Другие приёмы усложнения: больше врагов, меньше время, реже бонусы, случайные препятствия (интервал + округлить(математика-случайное число * N)).

Шаг 6. Каркас платформера

Бегалка с прыжком — движение по х постоянное, по у действует «гравитация»:

1

Гравитация — это «скорость_у растёт каждый кадр»; пол — «если упал ниже линии, останови». Платформа — ещё одно условие: если у больше 200 и х больше 100 и х меньше 200 то — стоять на ней.

Шаг 7. Идеи для собственных игр

каждый кадр (см. Шаг 4);

очко за касание;

игрок ходит по низу;

поражение;

(округлить(математика-случайное число * 9) равно 0).

Для каждой игры порядок один: состояние → события → кадры → правила.

Задание: Угадайка за K попыток

Условие задачи:

Улучшите «Угадайку» из Главы 11: после верной догадки печатайте «Угадал за K попыток» — с номером попытки. Программа сначала спрашивает загаданное число (в тестах это первый ввод), потом догадки; на каждую промахнувшуюся печатается больше или меньше.

Формат ввода: Первая строка — загаданное число; дальше — догадки.

Формат вывода: Подсказки «больше»/«меньше» на промахи и финальная строка «Угадал за K попыток».

Ограничения: 1 ≤ числа ≤ 100; последняя догадка — верная.

Например:

ВводРезультат
50 25 75 50больше меньше Угадал за 3 попыток
7 7Угадал за 1 попыток
1

💡 пер попыток = 0 до цикла; увеличивайте его в начале каждой итерации «пока»; после цикла — печать("Угадал за " + попыток + " попыток"). Внутри цикла два «если» с подсказками и переспрос.
пер загаданное = ЦЗОП("Загадайте число")
пер попытка = ЦЗОП("Ваша догадка")
пер попыток = 0
пока попытка не равно загаданное то
	попыток = попыток + 1
	если попытка меньше загаданное то
		печать("больше")
	конец
	иначе
		печать("меньше")
	конец
	попытка = ЦЗОП("Ваша догадка")
конец
попыток = попыток + 1
печать("Угадал за " + попыток + " попыток")

Задание: Камень-ножницы-бумага

Условие задачи:

Напишите игру «Камень-ножницы-бумага»: первый вопрос — ход компьютера (в тестах он подаётся вводом: к, н или б), второй — ход игрока. Побеждает камень над ножницами, ножницы над бумагой, бумага над камнем. Напечатайте Победа!, Поражение или Ничья.

Формат ввода: Две строки: ход компьютера, затем ход игрока (одна буква: к, н или б).

Формат вывода: Одна строка: «Победа!», «Поражение» или «Ничья».

Ограничения: ходы только из букв к, н, б.

Например:

ВводРезультат
к кНичья
к нПоражение
к бПобеда!
1

💡 Ничья — ходы равны. Победа игрока: (к против н) или (н против б) или (б против к) — одно «если» со скобками и «или». Внимание: переменную не зовите «компьютер» — слово «ком» внутри неё сработает как команда! Иначе — поражение.
пер машина = ЗОП("Ход компьютера")
пер игрок = ЗОП("Ваш ход")
если машина равно игрок то
	печать("Ничья")
конец
иначе если (машина равно "к" и игрок равно "н") или (машина равно "н" и игрок равно "б") или (машина равно "б" и игрок равно "к") то
	печать("Поражение")
конец
иначе
	печать("Победа!")
конец

Задание: Ловилка с таймером (без проверки)

Условие задачи:

Соберите полную игру: зелёный квадрат 40×40 прыгает по холсту раз в полсекунды; клик по нему — +1 очко (и строка «Поймал!»); игра идёт 10 секунд, после чего печатается «Игра окончена! Очков: X» и всё останавливается. Автопроверки нет — сыграйте сами (и нажмите «Остановить», если игра мешает читать дальше).

Формат ввода: Нет.

Формат вывода: Строки «Поймал!» и финальный итог; рисунок на холсте.

Ограничения: холст учебника 400×320; таймер — интервал на 1000 мс, отсчёт от 10 до 0.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Три детали: интервал-прыжки (500 мс, случайные х и у), слушатель клика с проверкой «курсор внутри квадрата», интервал-таймер (1000 мс): уменьшайте секунд_осталось, при нуле — печать итога. Каждая ветка «если» — свой «конец».
содержание холста
пер х = 50
пер у = 50
пер очки = 0
пер секунд_осталось = 10
интервал(безимянная функция() начало
	х = округлить(математика-случайное число * 340) + 20
	у = округлить(математика-случайное число * 260) + 20
конец, 500)
при нажатии мышкой начало
	если позиция клика по x больше х и позиция клика по x меньше х + 40 и позиция клика по y больше у и позиция клика по y меньше у + 40 то
		очки = очки + 1
		печать("Поймал!")
	конец
конец)
интервал(безимянная функция() начало
	очистить холст
	цвет заливки зеленый
	нарисовать прямоугольник(х, у, 40, 40)
	цвет заливки черный
	размер шрифта текста "20px Arial"
	нарисовать текст("Очки: " + очки, 10, 25)
конец, 30)
интервал(безимянная функция() начало
	если секунд_осталось больше 0 то
		секунд_осталось = секунд_осталось - 1
	конец
	если секунд_осталось равно 0 то
		печать("Игра окончена! Очков: " + очки)
		секунд_осталось = -1
	конец
конец, 1000)

Дальше — Глава 19: сохранение и время. Игра запомнит ваш рекорд даже после закрытия.

Глава 19. Сохранение и время

Браузер умеет запоминать данные между запусками программы и знает текущее время. Это превращает игрушки в игры с рекордами, а программы — в ежедневники и таймеры.

Шаг 1. Локальное хранилище

Локальное хранилище — это небольшая «записная книжка» браузера, живущая даже после закрытия страницы. У каждой ячейки есть имя и значение:

1

Запустите демо, потом перезагрузите страницу и запустите снова — значение сохранилось! Команда локальное хранилище- открывает книжку, добавить ячейку кладёт значение по имени, прочитать ячейку достаёт.

В ячейке хранится текст: число 42 превратится в "42". Для вычислений его переводят обратно: преобразовать строку в число.

Шаг 2. Рекорд игры

Классическое применение — рекорд. Читаем старый рекорд (если его нет — считаем нулём), сравниваем с новым результатом:

1

Запустите демо с разными значениями результат — рекорд обновляется только когда результат больше, и живёт между запусками страницы.

Команда очистить ячейки стирает всё хранилище целиком — «новая игра»:

1

Шаг 3. Словарь в хранилище

Хранилище держит только текст, но словари спасают JSON-превращение из Главы 12: словарь → текст → хранилище → текст → словарь:

1

1

Так устроены настоящие сохранения игр: один ключ «сохранение» держит весь прогресс.

Шаг 4. Часы: сейчас и команды времени

Компьютер всегда знает время. Команда сейчас возвращает полный отметку даты, а отдельные команды дают части времени:

1

КомандаЧто даёт
сейчасполная отметка даты и времени
времямиллисекунды с начала эпохи — большое число
этот год, день месяца, день неделичасти даты
этот час, эта минута, эта секундачасти суток
дата по стандартудата в едином мировом формате

День недели — число: 0 — воскресенье, 1 — понедельник и так далее. Научим программу здороваться по времени суток:

1

Шаг 5. Таймер на командах времени

время — большое растущее число миллисекунд. Разница двух замеров — сколько прошло. Засечём, сколько секунд заняли три печати:

1

Внимание на скобки: целое снизу (...)) — внутренняя скобка считает разницу, внешняя закрывает команду.

Шаг 6. Электронные часы

Часы, которые «тикают» сами, делаются интервалом из Главы 16 (в учебнике интервал работает на холсте — но в консоли тоже можно печатать):

1

Такой интервал печатает время раз в секунду — настенные часы в консоли.

Задание: Дневник игрока

Условие задачи:

Напишите программу: спросите имя игрока (ЗОП), сохраните его в локальное хранилище под именем игрок (локальное хранилище- добавить ячейку("игрок", имя)), потом прочитайте обратно из хранилища и напечатайте «Игрок: X — записан в дневник» — где X получен именно из хранилища.

Формат ввода: Одна строка — имя игрока.

Формат вывода: Одна строка: «Игрок: <имя> — записан в дневник».

Ограничения: имя не длиннее 50 символов.

Например:

ВводРезультат
АняИгрок: Аня — записан в дневник
1

💡 Локальное хранилище хранит текст: сохранили — прочитали — напечатали. пер изХранилища = локальное хранилище- прочитать ячейку("игрок").
пер имя = ЗОП("Как зовут игрока?")
локальное хранилище- добавить ячейку("игрок", имя)
пер изХранилища = локальное хранилище- прочитать ячейку("игрок")
печать("Игрок: " + изХранилища + " — записан в дневник")

Задание: Возраст в днях

Условие задачи:

Напишите программу: спросите, сколько вам полных лет (ЦЗОП), и напечатайте, сколько это примерно дней — считая год за 365 дней.

Формат ввода: Одна строка — полных лет.

Формат вывода: Одна строка — количество дней.

Ограничения: 0 ≤ годы ≤ 150.

Например:

ВводРезультат
103650
1365
00
1

💡 печать(годы * 365) — и всё. Склейка для красоты: печать("Это примерно " + годы * 365 + " дней") — но проверка ждёт просто число.
пер годы = ЦЗОП("Сколько вам полных лет?")
печать(годы * 365)

Задание: Тик-так (без проверки)

Условие задачи:

Сделайте часы-метроном: раз в секунду печатайте по очереди тик и так (первая секунда — «тик», вторая — «так», третья — снова «тик»...). Печатайте и номер секунды: «тик 1», «так 2», «тик 3»... Автопроверки нет — интервал не остановить проверкой, останавливайте кнопкой «Остановить».

Формат ввода: Нет.

Формат вывода: Строки «тик N» / «так N» каждую секунду.

Ограничения: интервал на 1000 мс; чётность секунды — остаток от деления на 2.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 пер секунда = 0 до интервала; в кадре: секунда = секунда + 1; если секунда остаток от деления на 2 равно 0 то печать("так " + секунда) — иначе печать("тик " + секунда). Каждая ветка — свой «конец».
пер секунда = 0
интервал(безимянная функция() начало
	секунда = секунда + 1
	если секунда остаток от деления на 2 равно 0 то
		печать("так " + секунда)
	конец
	иначе
		печать("тик " + секунда)
	конец
конец, 1000)

Дальше — Глава 20: свои библиотеки. Упакуем полезные команды в переиспользуемый набор.

Глава 20. Свои библиотеки

Библиотека — это набор готовых команд, который кто-то уже написал и упаковал для повторного использования. Вместо того чтобы каждый раз заново придумывать «случайное число между 10 и 50», вы подключаете библиотеку и пользуетесь готовым.

Шаг 1. Подключение библиотеки

Библиотека подключается одной строкой — ПБ (сокращение от «подключить библиотеку») — и обычно ставится в начало программы:

1

Подключённые команды становятся «своими»: пишутся как обычные команды РЯП. Учебник знает все встроенные библиотеки и несколько собственных (из папки библиотеки проекта: приветствие, удвоение, счет), а компилятор ryap.exe разворачивает их так же.

Шаг 2. Библиотека расширенной математики

КомандаЧто делает
целое_случайное_число(макс, мин)целое число от мин до макс
кв_корень(число)квадратный корень (отрицательного — «i»)
куб_корень(число)кубический корень
корень(число, степень)корень любой степени
умножение(а, б)умножает числа и строки (строка × число = повтор)
1

Сравните целое_случайное_число(5, 1) с командой языка «целое случайное число до 5)»: библиотечная умеет задавать и нижнюю границу — например, кубик от 1 до 6 без прибавления единицы.

Шаг 3. Библиотека работы с холстом

Три команды, которыми мы пользовались вручную в главах 15–16, уже упакованы здесь:

КомандаЧто делает
покрасить_весь_холст_в(цвет)закрасить холст целиком
нарисовать_квадрат(у, х, ребро)квадрат с равными сторонами
размеры_холста(ширина, высота)задать размер холста
1

Особый случай: размеры_холста(стандарт, стандарт) — растянуть холст на всё окно (внутри библиотеки слово «стандарт» — магическое значение 6.666, о котором знать не нужно).

Шаг 4. Библиотека работы с текстом

КомандаЧто делает
записать_в_массив_текст(текст)разложить текст на список букв
1

То же самое умеет разбить строку ("") из Главы 9 — но библиотека читается как команда, а не как хитрость со скобками.

Шаг 5. Своя библиотека — это свои функции

Секрет библиотек прост: это обычные функции, написанные кем-то раньше. Вот ваша собственная мини-библиотека для игр — просто функции в начале программы:

1

Порядок в большой программе: сначала библиотека, потом игра — функции должны быть описаны до первого использования. Так вы делаете то же, что делают авторы настоящих библиотек: пишете полезное один раз и вставляете в любые новые программы.

Шаг 6. Полный список встроенных библиотек

Как подключитьНазваниеДает
ПБ расширенной математикиматематикаслучайные числа, корни, умножение строк
ПБ расширенной работы с холстомхолстпокраска, квадраты, размеры
ПБ расширенной работы с текстомтекстразбор текста на буквы
ПБ кода в одну строкуоднострочниксокращения для быстрых записей
ПБ приветприветодно окно «Привет, Мир!»

Сокращение ПБ раскрывается в «подключить библиотеку» — длинные имена библиотек пишутся после него в родительном падеже, как в таблице.

Задания к главе

Задание: Корень из библиотеки

Условие задачи:

Подключите библиотеку расширенной математики (ПБ расширенной математики), спросите у пользователя число (команда ЦЗОП) и напечатайте его квадратный корень командой кв_корень(н). Потом ради интереса попробуйте в редакторе куб_корень(8) — и посмотрите, что библиотека отвечает числам без точного корня.

Формат ввода: Одна строка — целое число.

Формат вывода: Одна строка — квадратный корень числа.

Ограничения: 0 ≤ н ≤ 1000000; в тестах числа с точными квадратными корнями.

Например:

ВводРезультат
819
648
00
1

💡 Первая строка программы — ПБ расширенной математики. Дальше пер н = ЦЗОП("Введите число") и печать(кв_корень(н)).
ПБ расширенной математики
пер н = ЦЗОП("Введите число")
печать(кв_корень(н))

Задание: Хохотушка

Условие задачи:

Подключите библиотеку расширенной математики. Спросите у пользователя <b>слог</b> (ЗОП) и <b>число</b> (ЦЗОП), затем напечатайте слог, повторённый ровно это количество раз, — командой умножение(слог, н): библиотечное умножение работает и со строками!

Формат ввода: Две строки: слог, затем число.

Формат вывода: Одна строка — слог, повторённый н раз.

Ограничения: 1 ≤ н ≤ 50; слог не длиннее 10 символов.

Например:

ВводРезультат
ха 3хахаха
ля 2ляля
о 5ооооо
1

💡 печать(умножение(слог, н)) — и всё. Библиотека сама повторяет строку.
ПБ расширенной математики
пер слог = ЗОП("Какой слог?")
пер н = ЦЗОП("Сколько раз?")
печать(умножение(слог, н))

Задание: Библиотека расстояний (сложная)

Условие задачи:

Напишите свою мини-библиотеку — функцию расстояние(х1, у1, х2, у2), которая возвращает расстояние между двумя точками по формуле √((х2−х1)² + (у2−у1)²). Корень считайте через степень: ... в степени 0.5. Потом спросите четыре числа (ЦЗОП: х1, у1, х2, у2) и напечатайте расстояние.

Формат ввода: Четыре строки: х1, у1, х2, у2 (целые числа).

Формат вывода: Одна строка — расстояние между точками.

Ограничения: координаты от −1000 до 1000; в тестах ответы с точными или короткими дробями.

Например:

ВводРезультат
0 0 3 45
1 1 4 55
0 0 0 00
1

💡 вернуть ((х2 - х1) * (х2 - х1) + (у2 - у1) * (у2 - у1)) в степени 0.5 — не забудьте пары скобок вокруг всей суммы.
функция расстояние принимает аргументы х1, у1, х2, у2 начало функции
	вернуть ((х2 - х1) * (х2 - х1) + (у2 - у1) * (у2 - у1)) в степени 0.5
конец функции
пер х1 = ЦЗОП("х1?")
пер у1 = ЦЗОП("у1?")
пер х2 = ЦЗОП("х2?")
пер у2 = ЦЗОП("у2?")
печать(расстояние(х1, у1, х2, у2))

Задание: Мини-библиотека художника (без проверки)

Условие задачи:

Оформите рисование в библиотеку: напишите в начале программы две функции — дом(х, у) (стена 60×40 золотым, красная крыша-треугольник, белое окно 12×12) и дерево(х, у) (ствол 10×30 коричневым и крона 40×40 зеленным над ним). Потом подключать ничего не надо — функции уже «ваша библиотека»: нарисуйте сцену из двух домов и двух деревьев. Автопроверки нет — сравните картинку с друзьями.

Формат ввода: Нет.

Формат вывода: Рисунок на холсте (холст 400×320).

Ограничения: холст учебника 400×320.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Скопируйте рисование домика из главы 14 внутрь функции, заменив числа на х и у. Дерево: ствол нарисовать прямоугольник(х + 15, у, 10, 30), крона — (х, у - 40, 40, 40).
содержание холста
функция дом принимает аргументы х, у начало функции
	цвет заливки золотой
	нарисовать прямоугольник(х, у, 60, 40)
	цвет линии красный
	ширина линии 3
	рисовка линий
	провести линию из точки(х - 10, у)
	провести линию в точку(х + 30, у - 30)
	провести линию в точку(х + 70, у)
	завершить рисовку линий
	заполнить фигуры
	цвет заливки белый
	нарисовать прямоугольник(х + 24, у + 14, 12, 12)
конец функции
функция дерево принимает аргументы х, у начало функции
	цвет заливки коричневый
	нарисовать прямоугольник(х + 15, у, 10, 30)
	цвет заливки зеленый
	нарисовать прямоугольник(х, у - 40, 40, 40)
конец функции
дом(20, 200)
дом(220, 220)
дерево(120, 240)
дерево(330, 250)
цвет заливки светло-зеленый
нарисовать прямоугольник(0, 270, 400, 50)

Дальше — Глава 21: финальный проект. Соберём из всего курса настоящую большую программу.

Глава 21. Финальный проект: платформер

Вы прошли весь язык: переменные и ввод, условия, циклы, функции, строки, списки, случайность, словари, классы, холст, события, сохранения. Финальный проект — игра-платформер: герой бегает, прыгает по платформам и собирает монету. По дороге вы соберёте и «Угадайку» — она уже ждёт в заданиях Главы 18.

Шаг 1. Из чего состоит платформер

Всё уже изучено — платформер это четыре знакомых детали:

ДетальЧто делаетКоманды
Геройкоординаты х, у, скоростьпер, круг
Гравитацияскорость вниз растёт каждый кадринтервал, если
Платформы«пол» на высоте: упёрся — стойесли, нарисовать прямоугольник
Управлениестрелки: бежать и прыгатьпри нажатии клавиши, при отпускании клавиши

Шаг 2. Живой платформер

Запустите демо, щёлкните по холсту (чтобы он поймал клавиши) и управляйте стрелками: ← → бег, ↑ прыжок. Цель — допрыгнуть до золотой монеты:

1

Шаг 3. Как это работает: гравитация

Главный трюк — скорость по вертикали. Каждый кадр она растёт на 0.5 (гравитация тянет вниз), а координата у меняется на эту скорость:

по ширине над платформой (и из Главы 3).

Флаг на_земле запрещает прыгать в воздухе — без него герой летал бы бесконечно. Флаги (переменные правда/ложь) — самый простой способ «запомнить состояние».

Шаг 4. Монета и победа

Монета — круг с фиксированными координатами. Каждый кадр проверяем «касание»: герой рядом с монетой, если разница координат мала. Команда модуль даёт расстояние без знака: модуль(х + 15 - 360) меньше 20. При касании флаг победа становится правдой, и кадр печатает поздравление вместо мира.

Шаг 5. Соберите свой платформер

Теперь ваша очередь — задача ниже. План большой программы тот же, что в «Угадайке» (Глава 18): возьмите демо за каркас и меняйте по одной детали за раз, запуская после каждой.

Задание: Свой платформер (финал)

Условие задачи:

Напишите свой платформер — автопроверки у финала нет, вы автор. Минимальные требования: герой (круг или прямоугольник), не меньше двух платформ и пол, прыжок стрелкой ↑ и бег ←→, не меньше двух золотых монет — соберите все и напечатайте «Уровень пройден!» и «Монет собрано: X». Бонус: запишите рекорд в локальное хранилище (время до старта минус время после — и локальное хранилище- добавить ячейку(...)).

Формат ввода: Управление — стрелки (сначала щёлкните по холсту).

Формат вывода: Игра на холсте; финальные строки в консоли.

Ограничения: холст учебника 400×320; интервал живёт до остановки — жмите «Остановить», когда наигрались.

1

Автопроверки нет: жмите «▶ Запустить» и сравните ответ (или рисунок) с ожиданием
💡 Начните с демо шага 2 и добавляйте по одной монете: пер монет = 0; при касании — монет = монет + 1 и спрячьте монету (сдвиньте за холст). «Все собраны» — это монет равно 2.
содержание холста
пер х = 30
пер у = 250
пер скорость_у = 0
пер скорость_х = 0
пер на_земле = правда
пер монет = 0
пер монета_х = 360
пер монета_у = 60
пер монета2_х = 160
пер монета2_у = 180
пер победа = ложь
при нажатии клавиши начало
	если название клавиши равно "ArrowRight" то
		скорость_х = 3
	конец
	если название клавиши равно "ArrowLeft" то
		скорость_х = -3
	конец
	если название клавиши равно "ArrowUp" и на_земле то
		скорость_у = -9
		на_земле = ложь
	конец
конец)
при отпускании клавиши начало
	скорость_х = 0
конец)
интервал(безимянная функция() начало
	если победа то
		очистить холст
		цвет заливки черный
		размер шрифта текста "24px Arial"
		нарисовать текст("Уровень пройден!", 100, 140)
		нарисовать текст("Монет собрано: " + монет, 110, 175)
	конец
	иначе
		скорость_у = скорость_у + 0.5
		у = у + скорость_у
		х = х + скорость_х
		если х меньше 0 то
			х = 0
		конец
		если х больше 370 то
			х = 370
		конец
		на_земле = ложь
		если у больше 280 то
			у = 280
			скорость_у = 0
			на_земле = правда
		конец
		если у больше 200 и у меньше 220 и х + 30 больше 120 и х меньше 200 то
			у = 200
			скорость_у = 0
			на_земле = правда
		конец
		если у больше 130 и у меньше 150 и х + 30 больше 250 и х меньше 330 то
			у = 130
			скорость_у = 0
			на_земле = правда
		конец
		очистить холст
		цвет заливки серый
		нарисовать прямоугольник(0, 300, 400, 20)
		нарисовать прямоугольник(120, 220, 80, 12)
		нарисовать прямоугольник(250, 150, 80, 12)
		цвет заливки золотой
		если монета_х больше -100 то
			нарисовать круг(монета_х, монета_у, 10)
		конец
		если монета2_х больше -100 то
			нарисовать круг(монета2_х, монета2_у, 10)
		конец
		цвет заливки индиго
		нарисовать круг(х + 15, у + 15, 15)
		если модуль(х + 15 - монета_х) меньше 20 и модуль(у + 15 - монета_у) меньше 20 то
			монет = монет + 1
			монета_х = -1000
		конец
		если модуль(х + 15 - монета2_х) меньше 20 и модуль(у + 15 - монета2_у) меньше 20 то
			монет = монет + 1
			монета2_х = -1000
		конец
		если монет равно 2 то
			победа = правда
			монета_х = -1000
		конец
	конец
конец, 30)

Шаг 6. Как проверять большую программу

Большие программы пишут по кусочкам, проверяя каждый:

  1. Записали функцию — сразу вызовите с простыми числами и посмотрите

ответ;

  1. Добавили цикл или интервал — запустите, посмотрите, что происходит;
  2. Добавили хранилище — перезапустите и убедитесь, что данные живы;
  3. Что-то сломалось — Глава 8: читаем номер строки и красную подсказку,

печатаем промежуточные значения.

Ошибки в большой программе — это нормально. Отличие опытного программиста не в «отсутствии ошибок», а в скорости их поиска.

Шаг 7. Что дальше

Вы прошли учебник. Дальше:

одной игры, пригодятся в следующей.

Программирование — это не запоминание команд, а навык превращать идею в маленькие проверяемые шаги. Команды вы теперь знаете. Впереди — только ваши проекты.

Интерактивный блок «финальный-проект-песочница» — в разработке.

Учебник РЯП2.7 · сгенерирован src/gen_uchebnik.py из src/keywords.csv и «главы учебника/*.txt»

Сообщение