РЯП скрипт — учебник
Это интерактивный учебник: примеры запускаются прямо на странице — приложение и компилятор не нужны, перевод происходит здесь же.
Глава 0. Знакомство и установка
РЯП скрипт — язык программирования, в котором команды пишутся
по-русски. Программа на РЯП — обычный текстовый файл с расширением
.ряпс. Специальная программа — компилятор
ryap.exe — превращает её в веб-страницу, которую открывает любой браузер:
получаются программы с окнами, кнопками и даже игры с картинками.
Работать можно двумя способами:
- в этом учебнике — всё запускается прямо на странице, устанавливать ничего не нужно;
- по-настоящему — как у программистов: файл
.ряпсв редакторе Sublime Text, одна клавиша — и программа открывается в браузере. Об этом — ниже.
Установка: приложение РЯПС2.7
- Распакуйте архив
РЯПС2.7-установка.zipв любую папку. - Запустите
Установить.bat. Он сам скопирует приложение, добавит командуryap.exe, подключит Sublime Text, создаст ярлыки и свяжет файлы.ряпси.ряп. Права администратора не нужны. - Установите редактор Sublime Text: зайдите на сайт sublimetext.com, нажмите Download, запустите скачанный установщик (дальше — Далее, Далее, Готово).
- Откройте файл примера (папка
примеры) двойным щелчком — он откроется в Sublime с подсветкой. Нажмите Ctrl+B — программа скомпилируется и откроется в браузере. Ctrl+Shift+B — выбрать вариант «РЯПС» (получить файл .js).
Проверка установки: нажмите Win+R, введите cmd, Enter, в чёрном окне наберите ryap.exe -h — должна появиться справка по командам. Если появилась — всё работает.
Задания и проверки
В конце каждой главы — задания. В каждом задании: условие, форматы ввода и вывода, таблица «Например» с открытыми тестами и редактор кода.
Кнопка «Проверить» прогоняет вашу программу на открытых тестах (в таблице видно: Ввод → Ожидалось → Получил) и на скрытых тестах — по ним видно только ✓ или ✗, а вверху считается процент правильных решений. Скрытые тесты проверяют то, чего нет в примерах: другие числа, другие имена. Задание выполнено, когда процент равен 100%.
Полезно знать:
- строки во время проверки подставляются в вашу программу автоматически — ничего вводить не нужно;
- решения заданий сохраняются сами (открыли учебник снова — решения на месте);
- отменить/вернуть правки: Ctrl+Z и Ctrl+Shift+Z или кнопки ↶ ↷ над редактором.
Если что-то не работает
- «ryap.exe не является внутренней или внешней командой» — вы вводите команду в окне, открытом ДО установки. Закройте окно и откройте новое, либо запустите Установить.bat ещё раз.
- «Windows защитил ваш компьютер» при запуске установщика — нажмите «Подробнее» → «Выполнить в любом случае». Приложение работает локально, без интернета.
- «Не найден src/keywords.csv» — файлы приложения повреждены или перенесены. Запустите Установить.bat из распакованного архива заново.
- Браузер не открылся сам — найдите файл
.htmlрядом с вашей программой и откройте его двойным щелчком. - Антивирус ругается на ryap.exe — добавьте папку РЯПС2.7 в исключения антивируса: компилятор не выходит в интернет.
- Ошибки в самой программе — красная панель в браузере и предупреждения компилятора подскажут, что не так. Этому посвящена Глава 6.
Дальше — Глава 1: ваша первая программа. В учебнике она запускается прямо здесь, а после установки те же примеры будут работать и в Sublime.
Глава 1. Первая программа
Компьютер понимает сотни языков, но почти все они на английском. РЯП — язык программирования, где команды пишутся по-русски. Программа — это просто строки-команды, которые компьютер выполняет одна за другой.
Этот учебник живой: каждый пример можно запустить прямо здесь — кнопкой «Запустить» под редактором. Результат появится в чёрной панели ниже.
Шаг 1. Команда «окно»
Самая простая команда — окно: она показывает на экране
окно с вашим текстом. Текст пишется в кавычках, после команды — скобки:
Попробуйте изменить текст в кавычках и запустить снова — в окне появится ваше сообщение. Текст в кавычках называется строкой.
Шаг 2. Команда «печать»
Окно каждый раз закрывать неудобно. Вторая команда — печать:
она пишет текст не в окно, а в консоль — чёрную панель под редактором:
Каждая команда печатает свою строку. Порядок команд = порядок строк: компьютер выполняет программу сверху вниз.
Шаг 3. Переменные: программа запоминает
Программа может запомнить значение и дать ему имя — это называется
переменной. А команда ЗОП задаёт пользователю вопрос
и запоминает его ответ:
Что здесь произошло:
ЗОП("Как тебя зовут?")— задали вопрос, ответ записался в переменнуюимя;- знак
+склеивает строки в одну длинную; окнопоказало приветствие вместе с ответом.
При запуске браузер покажет стандартное окно ввода — ответ напечатает человек на клавиатуре.
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Программа запустится прямо здесь, и проверки отметят результат. Застряли — откройте подсказку, потом решение.
Задание: Окно с приветствием
Условие задачи:
Напишите программу, которая показывает окно с текстом Привет, мир! (именно так, с запятой и восклицательным знаком).Формат ввода: Нет.
Формат вывода: Одно окно с текстом «Привет, мир!».
Например:
| Ввод | Результат |
|---|---|
| — | Привет, мир! |
окно("Привет, мир!")Задание: Две строки в консоль
Условие задачи:
Выведите в консоль ровно две строки — сначала Меня зовут РЯП, затем Я умею программировать.Формат ввода: Нет.
Формат вывода: Две строки в консоли, в указанном порядке.
Например:
| Ввод | Результат |
|---|---|
| — | Меня зовут РЯП Я умею программировать |
печать("Меня зовут РЯП")
печать("Я умею программировать")Задание: Знакомство
Условие задачи:
Напишите программу: спросите у пользователя «Как тебя зовут?», запомните ответ в переменную и покажите окно вида Привет, <имя>! (например: Привет, Аня!).Формат ввода: Одна строка — имя (например: Аня).
Формат вывода: Одно окно: Привет, <имя>! — с именем из ввода.
Например:
| Ввод | Результат |
|---|---|
| Аня | Привет, Аня! |
пер имя = ЗОП("Как тебя зовут?")
окно("Привет, " + имя + "!")Задание: Переменная и умножение
Условие задачи:
Создайте переменную ответ со значением 6 * 7 (именно умножением!) и выведите её в консоль.Формат ввода: Нет.
Формат вывода: Одна строка в консоли: 42
Например:
| Ввод | Результат |
|---|---|
| — | 42 |
пер ответ = 6 * 7 печать(ответ)
Дальше — Глава 2: числа и арифметика. Справка по всем словам — в СПРАВКА.html.
Глава 2. Числа и арифметика
Компьютер изначально был создан как очень быстрый калькулятор. Числа
пишутся без кавычек — кавычки только для текста. Сравните:
печать("2+2") напечатает 2+2, а
печать(2+2) напечатает 4.
Шаг 1. Числа с клавиатуры и четыре действия
Считать число с клавиатуры помогает команда ЦЗОП
(цифровое значение от пользователя): пер возраст = ЦЗОП("Сколько тебе лет?")
запомнит ответ как число, с которым можно считать. Четыре действия:
Работают +, -,
* (умножение), / (деление).
Скобки, как в математике, меняют порядок:
Шаг 2. Остаток от деления
В школе вы делили с остатком: 17 конфет на 5 друзей — каждому по 3, и
2 остаётся. За это отвечает команда
остаток от деления на:
Если остаток равен 0 — число делится нацело. Так проверяют чётность, кратность и «каждый третий шаг».
Шаг 3. Округление
Деление даёт дроби: 7 / 2 = 3.5. Команды округления:
округлить— по правилам математики (3.5 → 4, 3.2 → 3);целое снизу— всегда вниз (3.9 → 3);целое сверху— всегда вверх (3.1 → 4).
Внимание: считывается всё выражение в скобках — пишите целое снизу(7 / 2), чтобы округлить именно результат деления.
Шаг 4. Переменная-счётчик
Часто нужно увеличить значение: взять старое, прибавить один,
записать обратно. Компьютер выполняет х = х + 1 именно так:
Этот приём — основа счёта в играх: очки, жизни, уровни растут именно так.
Задания к главе
Задание: Секунды
Условие задачи:
Напишите программу: спросите у пользователя, сколько часов, минут и секунд он хочет засечь (три вопроса командой ЦЗОП), и выведите в консоль, сколько всего это секунд.Формат ввода: Три строки: часы, минуты, секунды (целые числа).
Формат вывода: Одна строка в консоли — общее количество секунд.
Например:
| Ввод | Результат |
|---|---|
| 2 3 4 | 7384 |
| 1 0 0 | 3600 |
| 10 10 10 | 36610 |
пер часы = ЦЗОП("Сколько часов?")
пер минуты = ЦЗОП("Сколько минут?")
пер секунды = ЦЗОП("Сколько секунд?")
печать(часы * 60 * 60 + минуты * 60 + секунды)Задание: Покупка
Условие задачи:
Напишите программу: спросите цену ручки и сколько ручек купили, затем цену тетради и сколько тетрадей. Выведите в консоль итоговую стоимость всей покупки.Формат ввода: Четыре строки: цена ручки, количество ручек, цена тетради, количество тетрадей (целые числа).
Формат вывода: Одна строка в консоли — итоговая стоимость.
Например:
| Ввод | Результат |
|---|---|
| 25 3 40 2 | 155 |
| 10 5 20 3 | 110 |
| 30 1 15 4 | 90 |
пер цена_ручки = ЦЗОП("Цена ручки?")
пер ручки = ЦЗОП("Сколько ручек?")
пер цена_тетради = ЦЗОП("Цена тетради?")
пер тетради = ЦЗОП("Сколько тетрадей?")
печать(цена_ручки * ручки + цена_тетради * тетради)Задание: Делим конфеты
Условие задачи:
Напишите программу: спросите, сколько конфет и сколько друзей. Выведите в консоль, сколько конфет останется, когда поделите их поровну между всеми друзьями. Обязательно используйте команду «остаток от деления на».Формат ввода: Две строки: количество конфет, количество друзей (целые числа).
Формат вывода: Одна строка в консоли — остаток.
Например:
| Ввод | Результат |
|---|---|
| 17 5 | 2 |
| 20 6 | 2 |
| 10 2 | 0 |
пер конфеты = ЦЗОП("Сколько конфет?")
пер друзья = ЦЗОП("Сколько друзей?")
печать(конфеты остаток от деления на друзья)Задание: Часы и минуты (сложная)
Условие задачи:
Напишите программу: спросите, сколько минут длилась работа пользователя. Выведите строку вида X ч Y мин, где X — целые часы (используйте «целое снизу»), а Y — оставшиеся минуты (используйте «остаток от деления на»).Формат ввода: Одна строка — всего минут (целое число).
Формат вывода: Одна строка в консоли вида «X ч Y мин».
Например:
| Ввод | Результат |
|---|---|
| 500 | 8 ч 20 мин |
| 90 | 1 ч 30 мин |
| 1440 | 24 ч 0 мин |
пер всего = ЦЗОП("Сколько минут?")
пер часы = целое снизу(всего / 60)
пер минуты = всего остаток от деления на 60
печать(часы + " ч " + минуты + " мин")Дальше — Глава 3: условия «если — иначе», где программа начинает принимать решения.
Глава 3. Условия: если — иначе
До сих пор команды выполнялись одна за другой, сверху вниз. Условия позволяют программе принимать решения: выполнить одни команды, если условие верно, и другие — если нет.
Шаг 1. Если — то — конец — иначе
Команда если проверяет условие. Если оно верно,
выполняются команды до слова конец; слово
иначе — это «в противном случае»:
Как читать: «если число больше 100, то — „Много!“, иначе — „Немного“». Каждая ветка заканчивается своим словом конец — и ветка перед иначе не исключение.
Шаг 2. Сравнения
| РЯП | Смысл | JavaScript |
|---|---|---|
| равно | совпадает | == |
| не равно | не совпадает | != |
| больше / меньше | строго больше / меньше | >, < |
| большеравно / меньшеравно | не меньше / не больше | >=, <= |
| и / или | оба верны / хотя бы одно | &&, || |
| не | наоборот | ! |
| правда / ложь | истина / ложь | true / false |
Сравнивать можно и числа, и строки: если имя равно "Аня" то …
Шаг 3. Иначе если: выбор из нескольких
Когда вариантов больше двух, помогает цепочка иначе если.
Проверки идут сверху вниз: выполняется первая подошедшая ветка, остальные
пропускаются. У каждой ветки свой конец — так цепочка читается легче:
Шаг 4. И, или, не
Условия объединяются: и — верны оба,
или — хотя бы одно, не — наоборот:
Условие может быть сколь угодно длинным — главное, чтобы решение работало для любого числа из «Ограничений» задания, а не только для чисел из примеров. Скрытые тесты это проверяют.
Задания к главе
Задание: Знак числа
Условие задачи:
Напишите программу: спросите число. Если оно больше нуля — выведите слово плюс; если оно равно нулю — выведите ноль; если оно меньше нуля — выведите минус.Формат ввода: Одна строка — целое число.
Формат вывода: Одна строка: «плюс», «ноль» или «минус».
Ограничения: во всех тестах −1000000000 ≤ число ≤ 1000000000.
Например:
| Ввод | Результат |
|---|---|
| 5 | плюс |
| 0 | ноль |
| -7 | минус |
пер число = ЦЗОП("Введите число")
если число больше 0 то
печать("плюс")
конец
иначе если число меньше 0 то
печать("минус")
конец
иначе
печать("ноль")
конецЗадание: Чётное или нечётное
Условие задачи:
Напишите программу: спросите число. Если оно делится на 2 без остатка — выведите чётное, иначе — выведите нечётное. Команда «остаток от деления на» подскажет.Формат ввода: Одна строка — целое число.
Формат вывода: Одна строка: «чётное» или «нечётное».
Ограничения: во всех тестах −1000000000 ≤ число ≤ 1000000000.
Например:
| Ввод | Результат |
|---|---|
| 4 | чётное |
| 7 | нечётное |
пер число = ЦЗОП("Введите число")
если число остаток от деления на 2 равно 0 то
печать("чётное")
конец
иначе
печать("нечётное")
конецЗадание: Високосный год
Условие задачи:
Год называется високосным, если он делится на 4, но не делится на 100, или если он делится на 400. Напишите программу: спросите год и выведите да, если год високосный, и нет — иначе. Понадобятся «и», «или» и «остаток от деления на».Формат ввода: Одна строка — год (целое число).
Формат вывода: Одна строка: «да» или «нет».
Ограничения: во всех тестах 1 ≤ год ≤ 9999.
Например:
| Ввод | Результат |
|---|---|
| 2024 | да |
| 1900 | нет |
пер год = ЦЗОП("Введите год")
если (год остаток от деления на 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 лет |
пер возраст = ЦЗОП("Сколько лет?")
пер последняя = возраст остаток от деления на 10
если возраст большеравно 11 и возраст меньшеравно 14 то
печать("Вам " + возраст + " лет")
конец
иначе если последняя равно 1 то
печать("Вам " + возраст + " год")
конец
иначе если последняя большеравно 2 и последняя меньшеравно 4 то
печать("Вам " + возраст + " года")
конец
иначе
печать("Вам " + возраст + " лет")
конецЗадание: Треугольник (олимпиадная)
Условие задачи:
Спросите три отрезка и ответьте, можно ли из них сложить треугольник: он существует, если каждый отрезок меньше суммы двух других. Напечатайте да или нет.Формат ввода: Три строки: длины отрезков a, b, c.
Формат вывода: Одна строка: «да» или «нет».
Ограничения: во всех тестах 1 ≤ отрезки ≤ 1000000.
Например:
| Ввод | Результат |
|---|---|
| 3 4 5 | да |
| 1 2 3 | нет |
| 10 10 10 | да |
пер а = ЦЗОП("Первый отрезок")
пер б = ЦЗОП("Второй отрезок")
пер в = ЦЗОП("Третий отрезок")
если а меньше б + в и б меньше а + в и в меньше а + б то
печать("да")
конец
иначе
печать("нет")
конецЗадание: Три по возрастанию (олимпиадная)
Условие задачи:
Спросите три числа и напечатайте их по возрастанию, через пробел. Перестановку удобно сделать через третью переменную: если а больше б то — поменять их местами (пер т = а, а = б, б = т).Формат ввода: Три строки: числа a, b, c.
Формат вывода: Одна строка: три числа по возрастанию через пробел.
Ограничения: во всех тестах −1000 ≤ числа ≤ 1000.
Например:
| Ввод | Результат |
|---|---|
| 3 1 2 | 1 2 3 |
| 5 5 5 | 5 5 5 |
| -1 0 -3 | -3 -1 0 |
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
пер в = ЦЗОП("Третье число")
если а больше б то
пер т = а
а = б
б = т
конец
если б больше в то
пер т = б
б = в
в = т
конец
если а больше б то
пер т = а
а = б
б = т
конец
печать(а + " " + б + " " + в)Дальше — Глава 4: циклы. Компьютер сможет повторять команды за вас — хоть миллион раз.
Глава 4. Циклы: повторяем команды
Печатать одно и то же сто раз руками — мучение. Циклы говорят компьютеру: «повтори эти команды столько-то раз» или «повторяй, пока условие верно».
Шаг 1. Цикл со счётчиком
запустить цикл 5 раза то … конец повторяет команды
5 раз. Внутри цикла доступна переменная счетчик —
она идёт по значениям 0, 1, 2, 3, 4:
Слова-метки: раза, раз,
разов — выбирайте какое нравится.
Шаг 2. Счётчиком может быть выражение
Вместо числа можно написать любое выражение — цикл посчитает сам:
Часто счётчик нужен с единицы, а он идёт с нуля — тогда помогает
(счетчик + 1).
Шаг 3. Накопление: копим ответ
Главный приём главы: переменная-накопитель. Перед циклом в неё кладут ноль, а в цикле прибавляют:
Так считают суммы, очки в играх, итоги чека.
Шаг 4. Цикл «пока» и выход из цикла
Второй вид цикла — пока: команды повторяются,
пока условие верно. Важно менять внутри переменную условия, иначе цикл
будет вечным. Команда выход из цикла прерывает его
досрочно:
Прежде чем запустить «пока»-цикл, спросите себя: что изменится внутри, чтобы условие однажды стало неверным? Скрытые тесты заданий проверяют, что программа заканчивается и не виснет.
Задания к главе
Задание: Повторялка с нумерацией
Условие задачи:
Напишите программу: спросите слово (команда ЗОП) и число повторений (команда ЦЗОП). Выведите это слово в консоль N раз — каждое на новой строке, и пронумеруйте: каждая строка начинается с номера, скобки и пробела, например 1) Привет. Номера идут с 1 — а счётчик цикла, напомним, с нуля.Формат ввода: Две строки: слово, затем число повторений N.
Формат вывода: N строк вида «<номер>) <слово>».
Ограничения: 0 ≤ N ≤ 1000. Программа должна закончиться мгновенно.
Например:
| Ввод | Результат |
|---|---|
| Привет 3 | 1) Привет 2) Привет 3) Привет |
| А 1 | 1) А |
| РЯП 0 |
пер слово = ЗОП("Какое слово?")
пер н = ЦЗОП("Сколько раз?")
запустить цикл н раза то
печать((счетчик + 1) + ") " + слово)
конецЗадание: Таблица умножения
Условие задачи:
Напишите программу: спросите число N и выведите 9 строк таблицы умножения на него — для i от 1 до 9 строку вида N x i = ответ (пробелы вокруг «x» и вокруг «=»). Внутри цикла счётчик идёт с нуля — пригодится выражение (счетчик + 1).Формат ввода: Одна строка — целое число N.
Формат вывода: Девять строк вида «N x i = ответ».
Ограничения: −100 ≤ N ≤ 100.
Например:
| Ввод | Результат |
|---|---|
| 3 | 3 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 |
| 0 | 0 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 |
| 5 | 5 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 |
пер н = ЦЗОП("Введите число")
запустить цикл 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 5 | 14 |
| 3 3 | 3 |
| -3 2 | -3 |
пер а = ЦЗОП("От какого числа?")
пер б = ЦЗОП("До какого числа?")
пер сумма = 0
запустить цикл (б - а + 1) раза то
сумма = сумма + а + счетчик
конец
печать(сумма)Задание: Степень двойки (сложная)
Условие задачи:
Напишите программу: спросите число N и выведите первую степень двойки, которая строго больше N. Степени двойки: 1, 2, 4, 8, 16, 32… Например, для N = 100 ответ 128. Используйте цикл «пока»: увеличивайте переменную вдвое, пока она не превысит N.Формат ввода: Одна строка — целое число N.
Формат вывода: Одна строка — найденная степень двойки.
Ограничения: 0 ≤ N ≤ 1000000. Цикл «пока» справится мгновенно — но следите, чтобы его условие когда-нибудь стало неверным, иначе программа зависнет навсегда.
Например:
| Ввод | Результат |
|---|---|
| 100 | 128 |
| 1 | 2 |
| 0 | 1 |
пер н = ЦЗОП("Введите число")
пер п = 1
пока п меньшеравно н то
п = п * 2
конец
печать(п)Задание: Простое число (олимпиадная)
Условие задачи:
Простое число делится только на 1 и на себя: 2, 3, 5, 7, 11… Напишите программу: спросите число N и напечатайте да, если оно простое, и нет — иначе. Проверяйте делители от 2 до N − 1: если хоть один делит без остатка — число не простое.Формат ввода: Одна строка — целое число N.
Формат вывода: Одна строка: «да» или «нет».
Ограничения: 0 ≤ N ≤ 10000. Цикл на 10000 шагов обязан закончиться мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 7 | да |
| 4 | нет |
| 2 | да |
пер н = ЦЗОП("Введите число")
пер простое = "да"
если н меньше 2 то
простое = "нет"
конец
пер д = 2
пока д меньше н то
если н остаток от деления на д равно 0 то
простое = "нет"
конец
д = д + 1
конец
печать(простое)Дальше — Глава 5: типы значений. Строки и числа — разные вещи, и JavaScript умеет превращать одно в другое.
Глава 5. Типы значений: строки и числа
У каждого значения есть тип: строка или число. Внешне похожи, но ведут себя по-разному — и это главный источник неожиданностей для программиста.
Шаг 1. Строка или число?
Запись в кавычках — строка (просто текст), без кавычек — число (с ним можно считать). Одинаковые цифры — разное поведение:
"2" + "2" — склейка: «22». 2 + 2 —
сложение: 4. Помните: ЗОП приносит строку,
ЦЗОП — число.
Шаг 2. Плюс хитрый, минус честный
Если в сложении участвует хотя бы одна строка — плюс склеивает. А вот минус, умножение и деление превращают строку в число и считают честно:
Это и есть жонглирование типами: JavaScript сам превращает значения, когда ему нужно. Удобно — но легко ошибиться.
Шаг 3. Превращения: из строки в число
Превратить строку в число помогает команда
преобразовать строку в число (после неё ставьте
пробел или скобку). Узнать тип значения — тип данных:
Шаг 4. Цифры числа: мост к олимпиадным задачам
Самая простая задача о цифрах решается без строк: последняя цифра
числа — это н остаток от деления на 10; отрезать
последнюю цифру — целое снизу(н / 10):
Эта пара приёмов в цикле «пока» умеет разбирать число на цифры — на ней построены классические олимпиадные задачи: сумма цифр, перевёртыш, палиндром. Они ждут вас в заданиях.
Задания к главе
Задание: Удвоение (жонглирование типами)
Условие задачи:
Напишите программу: спросите число командой ЗОП — ответ придёт как строка. Выведите это число, увеличенное в два раза (уже как настоящее число).Формат ввода: Одна строка — целое число (придёт строкой).
Формат вывода: Одна строка — число, умноженное на 2.
Ограничения: −1000000 ≤ N ≤ 1000000.
Например:
| Ввод | Результат |
|---|---|
| 5 | 10 |
| 12 | 24 |
| 0 | 0 |
пер н = ЗОП("Введите число")
печать(преобразовать строку в число н * 2)Задание: Склейка или сложение?
Условие задачи:
Напишите программу: спросите два числа (командой ЦЗОП). Выведите в консоль две строки: сначала эти числа, записанные подряд без пробела, а под ними — их настоящую сумму.Формат ввода: Две строки: числа N и M.
Формат вывода: Две строки: склейка «NM», затем сумма N + M.
Ограничения: −1000000 ≤ N и M ≤ 1000000.
Например:
| Ввод | Результат |
|---|---|
| 12 34 | 1234 46 |
| 5 7 | 57 12 |
| 0 0 | 00 0 |
пер н = ЦЗОП("Первое число")
пер м = ЦЗОП("Второе число")
печать("" + н + м)
печать(н + м)Задание: Сумма цифр числа (олимпиадная)
Условие задачи:
Напишите программу: спросите число N и выведите сумму его цифр. Например, для 123 это 1+2+3 = 6. Последняя цифра — этон остаток от деления на 10, отрезать её — целое снизу(н / 10). Цикл «пока н больше 0».Формат ввода: Одна строка — целое число N.
Формат вывода: Одна строка — сумма цифр.
Ограничения: 1 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 123 | 6 |
| 5 | 5 |
| 10 | 1 |
пер н = ЦЗОП("Введите число")
пер сумма = 0
пока н больше 0 то
сумма = сумма + н остаток от деления на 10
н = целое снизу(н / 10)
конец
печать(сумма)Задание: Первая и последняя цифра
Условие задачи:
Напишите программу: спросите число N и выведите две строки: его первую цифру, затем последнюю. Первую получайте, отрезая последнюю цифру, пока не останется одна (целое снизу), последняя — это остаток от деления на 10.Формат ввода: Одна строка — целое число N.
Формат вывода: Две строки: первая цифра, затем последняя.
Ограничения: 1 ≤ N ≤ 999999999.
Например:
| Ввод | Результат |
|---|---|
| 1234 | 1 4 |
| 5 | 5 5 |
| 10 | 1 0 |
пер н = ЦЗОП("Введите число")
пер первая = н
пока первая больше 9 то
первая = целое снизу(первая / 10)
конец
печать(первая)
печать(н остаток от деления на 10)Задание: Перевёртыш (олимпиадная)
Условие задачи:
Напишите программу: спросите число N и выведите число из тех же цифр, но в обратном порядке. Например, 123 → 321, а 1200 → 21 (нули в начале пропадают). Собирайте ответ:р = р * 10 + н остаток от деления на 10, затем отрезайте последнюю цифру.Формат ввода: Одна строка — целое число N.
Формат вывода: Одна строка — перевёрнутое число.
Ограничения: 1 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 123 | 321 |
| 1200 | 21 |
| 5 | 5 |
пер н = ЦЗОП("Введите число")
пер р = 0
пока н больше 0 то
р = р * 10 + н остаток от деления на 10
н = целое снизу(н / 10)
конец
печать(р)Задание: Палиндром (очень сложная)
Условие задачи:
Число-палиндром читается одинаково в обе стороны: 121, 55, 7, 12321. Напишите программу: спросите число N и выведите да, если это палиндром, и нет — иначе. Переверните число (как в задаче «Перевёртыш») и сравните с исходным.Формат ввода: Одна строка — целое число N.
Формат вывода: Одна строка: «да» или «нет».
Ограничения: 0 ≤ N ≤ 999999999. В цикле не больше 10 шагов — мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 121 | да |
| 123 | нет |
| 7 | да |
пер н = ЦЗОП("Введите число")
пер р = 0
пер копия = н
пока копия больше 0 то
р = р * 10 + копия остаток от деления на 10
копия = целое снизу(копия / 10)
конец
если р равно н то
печать("да")
конец
иначе
печать("нет")
конецДальше — Глава 6: проверка ввода. Программа научится замечать пустой ответ и защищаться от ошибок.
Глава 6. Проверка ввода: пустой ответ и мусор
Программы пишут для людей, а люди ошибаются: оставляют поле пустым или вводят слово там, где ждут число. Хорошая программа это замечает и подсказывает, а не молчит и не ломается. Учимся проверять ответ.
Шаг 1. Пустой ответ и длина строки
Если нажать «ОК», ничего не написав, ЗОП вернёт пустую строку —
в ней нет ни одного символа. Сколько символов в строке, считает команда
длина:
Теперь защитим приветствие: пустой ответ встречаем отдельной фразой
Запустите демо ещё раз и сотрите ответ в открывшемся окне — сработает первая ветка. Так и проверяют ввод: сначала «если ответ плохой», потом «иначе — работаем дальше».
Шаг 2. «Не число»: мусор в ЦЗОП
ЦЗОП превращает ответ в число. Но из слова «привет» числа не получится —
получится особое значение «не число». У него странное свойство: оно
не равно даже самому себе. Поэтому проверка н не равно н верна только
тогда, когда пользователь ввёл мусор:
Запустите демо и введите сначала 5, потом привет — увидите обе ветки.
А пустой ответ ЦЗОП превращает в 0 — ещё одна причина проверять, что ввёл человек.
Шаг 3. Готовая проверка: проверка числа
То же самое умеет готовая команда проверка числа. Записывается как
обычная команда — со скобками, которые пишете вы: проверка числа(н).
Верна для настоящего числа, неверна для мусора:
Все проверки главы — в одной таблице:
| Что проверяем | Как записать | Верно, когда |
|---|---|---|
| Пустой ответ ЗОП | имя длина равно 0 | строка пустая |
| Мусор в ЦЗОП | н не равно н | в н — «не число» |
| То же командой | проверка числа(н) | в н — настоящее число |
Шаг 4. Спрашиваем до правильного ответа
Цикл пока плюс проверка — и вопрос повторяется сам, пока ответ не станет
нормальным. Внутри цикла обязательно переспросите — иначе цикл станет
вечным:
Такая связка «спросил — проверил — переспросил» и есть проверка ввода. Она превращает программу из хрупкой в вежливую: человек может ошибаться сколько угодно — программа терпеливо ждёт правильный ответ.
Задания к главе
Задание: Привет, незнакомец!
Условие задачи:
Напишите программу: спросите имя (команда ЗОП). Если имя пустое (его длина 0) — выведите Привет, незнакомец!, иначе — Привет, <имя>! (например: Привет, Аня!).Формат ввода: Одна строка — имя (может быть пустой).
Формат вывода: Одна строка: приветствие.
Ограничения: имя не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| — | Привет, незнакомец! |
| Аня | Привет, Аня! |
| Пётр | Привет, Пётр! |
пер имя = ЗОП("Как тебя зовут?")
если имя длина равно 0 то
печать("Привет, незнакомец!")
конец
иначе
печать("Привет, " + имя + "!")
конецЗадание: Число или мусор
Условие задачи:
Напишите программу: спросите число (команда ЦЗОП). Если пользователь ввёл не число — выведите не число, иначе — число. Подсказка: значение «не число» не равно самому себе.Формат ввода: Одна строка — ответ пользователя.
Формат вывода: Одна строка: «число» или «не число».
Ограничения: ответ не длиннее 20 символов.
Например:
| Ввод | Результат |
|---|---|
| 5 | число |
| привет | не число |
| 2.5 | число |
пер н = ЦЗОП("Введите число")
если н не равно н то
печать("не число")
конец
иначе
печать("число")
конецЗадание: Добейся имени
Условие задачи:
Напишите программу: спрашивайте имя (команда ЗОП), пока пользователь не введёт непустое. Затем выведите Привет, <имя>!Формат ввода: Строки: сколько-то пустых ответов, затем имя.
Формат вывода: Одна строка: Привет, <имя>!
Ограничения: пустых ответов подряд не больше 10; итоговое имя не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| Аня | Привет, Аня! |
| Борис | Привет, Борис! |
| Оля | Привет, Оля! |
пер имя = ЗОП("Как тебя зовут?")
пока имя длина равно 0 то
имя = ЗОП("Пусто! Как тебя зовут?")
конец
печать("Привет, " + имя + "!")Задание: Только число
Условие задачи:
Напишите программу: спрашивайте число (команда ЦЗОП), пока пользователь не введёт настоящее число. Затем выведите Принято: N — с введённым числом.Формат ввода: Строки: сколько-то нечисловых ответов, затем число.
Формат вывода: Одна строка: Принято: <число>.
Ограничения: неверных ответов подряд не больше 10; итоговое число от −1000000 до 1000000.
Например:
| Ввод | Результат |
|---|---|
| мусор хлам 42 | Принято: 42 |
| 5 | Принято: 5 |
| abc -3 | Принято: -3 |
пер н = ЦЗОП("Введите число")
пока н не равно н то
н = ЦЗОП("Это не число! Попробуйте ещё раз")
конец
печать("Принято: " + н)Задание: Возраст от 0 до 150 (сложная)
Условие задачи:
Напишите программу: спрашивайте возраст (команда ЦЗОП), пока ответ — не число, или меньше 0, или больше 150. Затем выведите Возраст принят: N.Формат ввода: Строки: сколько-то неподходящих ответов, затем возраст от 0 до 150.
Формат вывода: Одна строка: Возраст принят: <число>.
Ограничения: неверных ответов подряд не больше 10.
Например:
| Ввод | Результат |
|---|---|
| abc -5 200 14 | Возраст принят: 14 |
| 30 | Возраст принят: 30 |
| хлам 0 | Возраст принят: 0 |
пер возраст = ЦЗОП("Сколько вам лет?")
пока возраст не равно возраст или возраст меньше 0 или возраст больше 150 то
возраст = ЦЗОП("Так не бывает! Сколько вам лет?")
конец
печать("Возраст принят: " + возраст)Задание: Сумма до слова «стоп» (олимпиадная)
Условие задачи:
Пользователь вводит числа строкой (команда ЗОП) — по одному за раз. Складывайте их, а когда вместо числа придёт слово стоп — выведите сумму и закончите. Слово «стоп» в сумму не входит.Формат ввода: Строки: числа по одному, последняя строка — стоп.
Формат вывода: Одна строка — сумма введённых чисел.
Ограничения: чисел не больше 100, каждое от −1000000 до 1000000. Последний ответ — всегда стоп.
Например:
| Ввод | Результат |
|---|---|
| 5 7 стоп | 12 |
| стоп | 0 |
| 10 -3 стоп | 7 |
пер сумма = 0
пер слово = ЗОП("Введите число или стоп")
пока слово не равно "стоп" то
сумма = сумма + преобразовать строку в число слово
слово = ЗОП("Ещё число или стоп")
конец
печать(сумма)Дальше — Глава 7: случайность. Компьютер придумает случайное число — и мы построим игру «Угадай число».
Глава 7. Функции: свои команды
До сих пор вы пользовались чужими командами: печать, ЦЗОП, длина.
Функция — это команда, которую вы придумываете сами: один раз пишете,
что она делает, а дальше вызываете по имени из любого места программы.
Шаг 1. Своя команда
Объявление функции: слово функция, имя, принимает аргументы, имя
аргумента, начало функции, команды, конец функции. После объявления
её вызывают как обычную команду — по имени со скобками:
имя здесь — аргумент: при каждом вызове в него подставляется то, что
написано в скобках. Имя функции придумывайте как имя переменной —
без пробелов.
Шаг 2. Несколько аргументов и «вернуть»
Аргументов может быть несколько — они перечисляются через запятую.
Чаще всего функция не просто печатает, а вычисляет и отдаёт результат
командой вернуть:
После вернуть функция заканчивает работу: что бы ни шло дальше
внутри неё, до этого уже не дойдёт. А сам вызов сумма(10, 5) — как
будто на его место встало готовое число 15.
Вызывать функцию можно и до её объявления — переводчик сам разберётся.
Шаг 3. Стрелочные функции
Короткую функцию из одного выражения удобно записывать «стрелкой»:
аргументы в скобках, потом стрелочная функция, потом выражение —
его значение функция и вернёт:
Для функции с длинным телом есть «безымянная» запись: пер ф = безимянная функция н начало функции … конец функции. Тот же смысл, но тело — любые команды.
Шаг 4. Функция вызывает себя
Функции разрешено вызывать сами себя — это называется рекурсией.
Классика: факториал. Факт: н! = 1 × 2 × … × н. Рекурсивно: «факториал н —
это н, умноженный на факториал (н−1)», а «факториал 1 — это 1»:
Без стоп-условия («меньше или равно 1») вызовы никогда бы не закончились — как цикл без изменения переменной.
| РЯП | JavaScript |
|---|---|
функция ф принимает аргументы а, б начало функции | function ф(а, б){ |
конец функции | } |
вернуть х | return х |
(н) стрелочная функция н * 2 | (н) => н * 2 |
Задания к главе
Задание: Приветствие по имени
Условие задачи:
Напишите функциюприветствует, которая принимает имя и печатает Привет, <имя>!. Потом в программе спросите имя (команда ЗОП) и вызовите функцию с ним.Формат ввода: Одна строка — имя.
Формат вывода: Одна строка: Привет, <имя>! — напечатанная функцией.
Ограничения: имя не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| Аня | Привет, Аня! |
| Марина | Привет, Марина! |
| Я | Привет, Я! |
функция приветствует принимает аргументы имя начало функции
печать("Привет, " + имя + "!")
конец функции
пер имя = ЗОП("Как тебя зовут?")
приветствует(имя)Задание: Площадь прямоугольника
Условие задачи:
Напишите функциюплощадь, которая принимает два числа и возвращает их произведение. Потом спросите ширину и высоту (ЦЗОП) и напечатайте площадь — вызовом функции прямо внутри печать.Формат ввода: Две строки: ширина, высота (целые числа).
Формат вывода: Одна строка — площадь.
Ограничения: 0 ≤ ширина и высота ≤ 1000.
Например:
| Ввод | Результат |
|---|---|
| 3 4 | 12 |
| 5 5 | 25 |
| 0 7 | 0 |
функция площадь принимает аргументы а, б начало функции
вернуть а * б
конец функции
пер а = ЦЗОП("Ширина?")
пер б = ЦЗОП("Высота?")
печать(площадь(а, б))Задание: Максимум из двух
Условие задачи:
Напишите функциюсамое_большое, которая принимает два числа и возвращает большее из них (если равны — любое из них). Потом спросите два числа (ЦЗОП) и напечатайте максимум. Внимание: имя максимум в языке занято — оно означает готовую команду наибольшего из списка.Формат ввода: Две строки: числа а и б.
Формат вывода: Одна строка — большее из чисел.
Ограничения: во всех тестах −1000000 ≤ числа ≤ 1000000.
Например:
| Ввод | Результат |
|---|---|
| 3 7 | 7 |
| -5 -2 | -2 |
| 5 5 | 5 |
функция самое_большое принимает аргументы а, б начало функции
если а больше б то
вернуть а
конец
вернуть б
конец функции
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
печать(самое_большое(а, б))Задание: Надёжный пароль
Условие задачи:
Пароль считается надёжным, если в нём не меньше 8 символов. Напишите функциюнадёжный, которая принимает пароль и возвращает да (если длина не меньше 8) или нет. Потом спросите пароль (ЗОП) и напечатайте ответ функции.Формат ввода: Одна строка — пароль.
Формат вывода: Одна строка: «да» или «нет».
Ограничения: пароль не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| 12345678 | да |
| пароль | нет |
| 123456789012345 | да |
функция надёжный принимает аргументы пароль начало функции
если пароль длина большеравно 8 то
вернуть "да"
конец
вернуть "нет"
конец функции
пер пароль = ЗОП("Придумайте пароль")
печать(надёжный(пароль))Задание: Степень числа
Условие задачи:
Напишите функциюстепень, которая принимает основание и показатель и возвращает основание в степени показателя — циклом, без готовых команд возведения. Потом спросите оба числа (ЦЗОП) и напечатайте результат.Формат ввода: Две строки: основание, показатель (целые числа).
Формат вывода: Одна строка — основание в степени показателя.
Ограничения: −1000 ≤ основание ≤ 1000, 0 ≤ показатель ≤ 30. В тестах результат помещается в обычное число.
Например:
| Ввод | Результат |
|---|---|
| 2 10 | 1024 |
| 5 0 | 1 |
| 3 4 | 81 |
функция степень принимает аргументы основание, показатель начало функции
пер результат = 1
запустить цикл показатель раза то
результат = результат * основание
конец
вернуть результат
конец функции
пер основание = ЦЗОП("Основание?")
пер показатель = ЦЗОП("Показатель?")
печать(степень(основание, показатель))Задание: Факториал (рекурсия, олимпиадная)
Условие задачи:
Факториал числа н — произведение всех чисел от 1 до н: 5! = 1×2×3×4×5 = 120. Факториал 0 равен 1. Напишите рекурсивную функциюфакториал: если н меньше или равно 1 — вернуть 1, иначе — вернуть н, умноженный на факториал (н−1). Потом спросите н (ЦЗОП) и напечатайте факториал.Формат ввода: Одна строка — целое число н.
Формат вывода: Одна строка — н! (факториал).
Ограничения: 0 ≤ н ≤ 12. В цикле вызовов не больше 12 — мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 5 | 120 |
| 0 | 1 |
| 1 | 1 |
функция факториал принимает аргументы н начало функции
если н меньшеравно 1 то
вернуть 1
конец
вернуть н * факториал(н - 1)
конец функции
пер н = ЦЗОП("Введите число")
печать(факториал(н))Задание: НОД — алгоритм Евклида (олимпиадная)
Условие задачи:
НОД (наибольший общий делитель) двух чисел находят алгоритмом Евклида: пока числа различны, большее заменяй на разность большего и меньшего. Когда числа совпадут — это и есть НОД. Например, НОД(12, 18): 12→18 - 12 = 6, 12 и 6 → 12 - 6 = 6 → НОД = 6. Спросите два числа и напечатайте их НОД.Формат ввода: Две строки: числа a и b.
Формат вывода: Одна строка — НОД.
Ограничения: 1 ≤ числа ≤ 1000000; количество шагов алгоритма невелико — программа обязана закончиться мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 12 18 | 6 |
| 7 5 | 1 |
| 10 10 | 10 |
пер а = ЦЗОП("Первое число")
пер б = ЦЗОП("Второе число")
пока а не равно б то
если а больше б то
а = а - б
конец
иначе
б = б - а
конец
конец
печать(а)Задание: Фибоначчи (рекурсия, олимпиадная)
Условие задачи:
Числа Фибоначчи: 1, 1, 2, 3, 5, 8, 13… — каждое следующее равно сумме двух предыдущих: ф(1) = ф(2) = 1, ф(н) = ф(н−1) + ф(н−2). Напишите рекурсивную функциюфибоначчи(н) и напечатайте ф(н) для введённого н.Формат ввода: Одна строка — номер числа н.
Формат вывода: Одна строка — н-е число Фибоначчи.
Ограничения: 1 ≤ н ≤ 20; рекурсивных вызовов немного — мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 1 | 1 |
| 5 | 5 |
| 10 | 55 |
функция фибоначчи принимает аргументы н начало функции
если н меньшеравно 2 то
вернуть 1
конец
вернуть фибоначчи(н - 1) + фибоначчи(н - 2)
конец функции
пер н = ЦЗОП("Номер числа Фибоначчи")
печать(фибоначчи(н))Дальше — Глава 8: ошибки. Учимся читать сообщения переводчика и исправлять типичные промахи новичка.
Глава 8. Ошибки: программа объясняет, что не так
Ошибки — не враги, а подсказки. Даже опытные программисты видят ошибки по десять раз на дню: компьютер просто сообщает, где именно он не понял вашу мысль. Научимся читать его сообщения и ловить ошибку «в руки».
Шаг 1. Сообщение об ошибке
Вот программа с ошибкой — запустите и посмотрите, что напишет компьютер:
В чёрной панели появилось сообщение У вас ошибка…, а строка, где случилась беда, подсветилась красным. Разберём сообщение по частям:
несозданная— имя, которое компьютер не смог найти;не определена/объявлена— причина: переменную не создавали командойпер;около строки 2 вашей программы— где искать.
Часть после ошибки («около строки 2») — самый ценный кусок. Идите на эту строку и смотрите внимательно.
Шаг 2. Словарь частых ошибок
Компьютер пишет по-английски, но переводчик переводит главное:
| Видите в сообщении | Это значит |
|---|---|
| неуместный символ | опечатка или знак не на своём месте |
| не определена/объявлена | переменная не создана через пер |
| не является функцией | вызвали не команду, а что-то другое |
| в синтаксисе: | сломана структура: скобка, кавычка, конец |
| неожиданный конец ввода | не хватает конец или закрывающей скобки |
| ПРЕДУПРЕЖДЕНИЕ: не хватает закрывающих ) | проверьте скобки у команд |
Вот как выглядит ошибка структуры — не хватает конец:
Компьютер ещё до запуска предупредил о нехватке скобок и указал строку — не поленитесь прочитать предупреждение до сообщения об ошибке.
Шаг 3. Ловим ошибку: попробовать выполнить
Иногда ошибка — это нормальная ситуация: пользователь ввёл чушь, файла
нет, ответ пришёл пустой. Для таких случаев есть страховка — попробовать
выполнить. Компьютер пытается выполнить код, а если случается ошибка —
не падает, а переходит в блок уловить ошибку:
Смотрите: строка с ошибкой выполнилась, программа напечатала сообщение о ней — и продолжила работу. Без страховки всё, что ниже, было бы потеряно.
Шаг 4. Вне зависимости от ошибок
Иногда нужно, чтобы что-то выполнилось в любом случае — напечатался
итог, закрылся файл, закончился таймер. Для этого есть блок вне
зависимости от ошибок:
Порядок всегда такой: попробовать выполнить → уловить ошибку →
вне зависимости от ошибок. Каждый блок — со своим начало и конец.
Страховка — не способ спрятать ошибку от себя. Поймав ошибку, печатайте её: печать("Проблема: " + ошибка) — иначе вы никогда не узнаете, что сломалось.
Шаг 5. Как искать ошибку самому
Когда сообщение непонятно, работает простой приём:
- Прочитайте номер строки — идите туда.
- Проверьте кавычки и скобки на этой строке.
- Проверьте, что все переменные созданы через
пер. - Не помогло — напечатайте промежуточные значения: печать("проверка: " + число) перед подозрительной строкой.
- Всё равно не помогло — закомментируйте половину кода однострочным
комментарием и проверьте, ушла ли ошибка. Так вы половините программу, пока не найдёте точное место.
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.
Задание: Программа не падает
Условие задачи:
Напишите программу: напечатайте Старт, затем в блокепопробовать выполнить напечатайте несуществующую переменную (например печать(несозданная)), поймайте ошибку блоком уловить ошибку и напечатайте Поймали, а после блока напечатайте Финиш. Ошибка не должна прервать программу.Формат ввода: Нет.
Формат вывода: Три строки: Старт, Поймали, Финиш — в этом порядке.
Например:
| Ввод | Результат |
|---|---|
| — | Старт Поймали Финиш |
| — | Старт Поймали Финиш |
| — | Старт Поймали Финиш |
печать("Старт")
попробовать выполнить начало
печать(несозданная)
конец
уловить ошибку(ошибка) начало
печать("Поймали")
конец
печать("Финиш")Задание: Прыгаем с парашютом
Условие задачи:
Спросите слово (ЗОП). В блокепопробовать выполнить напечатайте Прыгаем!, а если слово равно ломаем — напечатайте несуществующую переменную (сломаем программу специально). Блок уловить ошибку печатает Не упали!. Последней строкой напечатайте Приземлились — при любом вводе.Формат ввода: Одно слово (может быть «ломаем»).
Формат вывода: Прыгаем!; при «ломаем» ещё и Не упали!; последняя строка — Приземлились.
Например:
| Ввод | Результат |
|---|---|
| ломаем | Прыгаем! Не упали! Приземлились |
| мир | Прыгаем! Приземлились |
| — | Прыгаем! Приземлились |
пер слово = ЗОП("Что делаем?")
попробовать выполнить начало
печать("Прыгаем!")
если слово равно "ломаем" то
печать(сломанная)
конец
конец
уловить ошибку(ошибка) начало
печать("Не упали!")
конец
печать("Приземлились")Задание: Финал в любом случае
Условие задачи:
Спросите слово. Если оно равно ошибка — в блокепопробовать выполнить напечатайте несуществующую переменную (программа «сломается»), поймайте ошибку и напечатайте Починили. Блок вне зависимости от ошибок печатает Конец программы — при любом вводе.Формат ввода: Одно слово.
Формат вывода: при «ошибка»: Починили и Конец программы; при любом другом — только Конец программы.
Например:
| Ввод | Результат |
|---|---|
| ошибка | Починили Конец программы |
| норма | Конец программы |
| — | Конец программы |
пер слово = ЗОП("Введите слово")
попробовать выполнить начало
если слово равно "ошибка" то
печать(несозданная)
конец
конец
уловить ошибку(ошибка) начало
печать("Починили")
конец
вне зависимости от ошибок начало
печать("Конец программы")
конецЗадание: Числа или мимо
Условие задачи:
Спросите значение (ЦЗОП). Если это не число — напечатайте Это не число! и спросите ещё раз. Когда введут настоящее число — напечатайте Принято: <число>.Формат ввода: Один или несколько ответов через « | »: попытки ввода, последняя — число.
Формат вывода: Для каждого мусора строка Это не число!, в конце Принято: <число>.
Ограничения: последний ответ — число от -1000000 до 1000000.
Например:
| Ввод | Результат |
|---|---|
| abc 5 | Это не число! Принято: 5 |
| 5 | Принято: 5 |
| x y 7 | Это не число! Это не число! Принято: 7 |
пер н = ЦЗОП("Введите число")
пока проверка числа(н) не равно правда то
печать("Это не число!")
н = ЦЗОП("Попробуйте ещё раз")
конец
печать("Принято: " + н)Шаг 5. Своя ошибка: бросить ошибку
Иногда нарушение замечаете вы — например, возраст получился 999.
Программа может объявить ошибку сама командой бросить ошибку:
Запустите с числом 999 — сообщение увидит пользователь, и выполнение прекратится. Свои ошибки лучше «Unable to read property»: они говорят человеческим языком, что именно не так.
Дальше — Глава 9: строки. Слово можно измерить, перекрасить, разрезать и склеить.
Глава 9. Строки: измеряем, перекрашиваем, режем
Строка — это не просто «текст для печати». Это значение, с которым можно работать: измерить, поменять регистр, повторить, разрезать на кусочки и склеить обратно. Всё это нужно для игр с текстом, чатов и паролей.
Шаг 1. Длина и регистр
Команда длина считает символы (мы уже проверяли ею пустой ответ).
Команды в верхний регистр и в нижний регистр перекрашивают буквы:
Обратите внимание: длина, в верхний регистр и в нижний регистр —
команды без скобок: они приклеиваются к переменной через пробел.
Таких «свойств» у строк несколько, они читаются как вопросы: «слово —
длина?», «слово — в верхний регистр?»
Шаг 2. Повтор строки
Команда повторить строку делает из короткой строки длинную. Скобка
открывается сразу после имени команды, в ней — число повторений:
Это идеальный способ рисовать разделители в консольных программах:
Шаг 3. Разрезаем строку: разбить строку
Команда разбить строку режет строку на список кусочков. В скобках —
разделитель: что считать «ножом»:
Если разрезать пустым разделителем (""), строка развалится на
отдельные буквы — получится список символов:
Кусочки после разреза — это список. Со списками мы подробно познакомимся в Главе 10.
Шаг 4. Замена и склейка обратно
Команда заменить меняет кусок строки на другой: в первых скобках —
что найти, во вторых — чем заменить:
Сама строка не меняется — команда возвращает новую строку. И по умолчанию заменяется только первое совпадение.
Обратная операция — склеить список кусочков в строку — называется
объединить массив; в скобках пишут, чем соединять кусочки:
Шаг 5. Символ по номеру
У каждого символа в строке есть номер — и он начинается с нуля! Первый символ — номер 0, второй — 1 и так далее. Символ берут квадратными скобками:
Последний символ — номер «длина минус один», потому что нумерация с нуля:
| Команда | Пример | Что делает |
|---|---|---|
длина | слово длина | количество символов |
в верхний регистр | слово в верхний регистр | ПРИВЕТ |
в нижний регистр | слово в нижний регистр | привет |
повторить строку | "-" повторить строку(10) | ---------- |
разбить строку | текст разбить строку(" ") | список кусочков |
объединить массив | список объединить массив("-") | строка из кусочков |
заменить | текст заменить("а", "б") | новая строка с заменой |
Шаг 8. Инструменты строк: срез, проверка концов, дополнение
У строк много готовых инструментов. Самый нужный — срез: вырезать часть строки по номерам символов (первый — 0):
Про проверку концов: начинается с и кончается на отвечают
правдой/ложью — удобно для файлов и команд:
А заполнить слева дописывает символы до нужной длины — так делают
часы «09:05» вместо «9:5»:
Ещё есть переписать целиком("а", "б") — заменить ВСЕ вхождения (обычный заменить меняет только первое), и включает("…") — проверить, входит ли кусок в строку.
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.
Задание: Печатная машинка
Условие задачи:
Спросите слово (ЗОП). Напечатайте его ЗАГЛАВНЫМИ БУКВАМИ (в верхний регистр), а на второй строке — количество букв (длина).Формат ввода: Одна строка.
Формат вывода: Две строки: слово заглавными и количество символов.
Ограничения: строка не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| Аня | АНЯ 3 |
| мир | МИР 3 |
| Я | Я 1 |
пер слово = ЗОП("Введите слово")
печать(слово в верхний регистр)
печать(слово длина)Задание: Заголовок с полосой
Условие задачи:
Спросите заголовок. Напечатайте одной строкой: заголовок, пробел и полосу из 10 дефисов — полосу делает командаповторить строку: заголовок + " " + "-" повторить строку(10).Формат ввода: Одна строка.
Формат вывода: Одна строка: <заголовок> ---------- (ровно 10 дефисов).
Например:
| Ввод | Результат |
|---|---|
| Аня | Аня ---------- |
| ДОМ | ДОМ ---------- |
| Мой день | Мой день ---------- |
пер заголовок = ЗОП("Введите заголовок")
печать(заголовок + " " + "-" повторить строку(10))Задание: Крайние буквы
Условие задачи:
Спросите слово. Напечатайте его первую букву (номер 0), а на второй строке — последнюю (номер — длина минус один).Формат ввода: Одна строка.
Формат вывода: Две строки: первая и последняя буква.
Ограничения: слово не пустое и не длиннее 50 символов.
Например:
| Ввод | Результат |
|---|---|
| Дом | Д м |
| привет | п т |
| 123 | 1 3 |
пер слово = ЗОП("Введите слово")
печать(слово[0])
печать(слово[слово длина - 1])Задание: Разбор приговора
Условие задачи:
Спросите фразу из слов через пробел. Напечатайте количество слов, а потом каждое слово на своей строке. Фразу на слова режетразбить строку(" "), а перебирает цикл «запустить цикл <имя> в массиве <список> то».Формат ввода: Одна строка — слова через пробел.
Формат вывода: Первая строка — количество, дальше — слова, каждое на своей строке.
Например:
| Ввод | Результат |
|---|---|
| мама мыла раму | 3 мама мыла раму |
| привет | 1 привет |
| а б в г | 4 а б в г |
пер фраза = ЗОП("Введите фразу")
пер слова = фраза разбить строку(" ")
печать(слова количество элементов в массиве)
запустить цикл слово в массиве слова то
печать(слово)
конецЗадание: Шёпот через дефисы
Условие задачи:
Спросите слово. Напечатайте его строчными буквами, соединив символы через дефис: переведите в нижний регистр, разбейте на буквы и склейте списки командойобъединить массив("-"). Например Мир → м-и-р.Формат ввода: Одна строка.
Формат вывода: Одна строка: символы через дефис.
Ограничения: строка не длиннее 50 символов.
Например:
| Ввод | Результат |
|---|---|
| Мир | м-и-р |
| АНЯ | а-н-я |
| Привет | п-р-и-в-е-т |
пер слово = ЗОП("Введите слово")
пер буквы = слово в нижний регистр разбить строку("")
печать(буквы объединить массив("-"))Задание: Заменяем первое
Условие задачи:
Спросите фразу. Замените в ней первый пробел на подчёркивание командойзаменить: фраза заменить(" ", "_") — и напечатайте результат. Если пробелов нет — напечатайте фразу без изменений.Формат ввода: Одна строка.
Формат вывода: Одна строка: первый пробел заменён на _.
Например:
| Ввод | Результат |
|---|---|
| мама мыла раму | мама_мыла раму |
| привет | привет |
| а б | а_б |
пер фраза = ЗОП("Введите фразу")
печать(фраза заменить(" ", "_"))Задание: Палиндр с пробелами (сложная)
Условие задачи:
Спросите фразу (ЗОП). Проверьте, читается ли она одинаково в обе стороны, если убрать пробелы и не различать большие и маленькие буквы (А роза упала на лапу Азора — палиндром). Напечатайте да или нет.Формат ввода: Одна строка.
Формат вывода: да или нет.
Ограничения: длина фразы не больше 200 символов.
Например:
| Ввод | Результат |
|---|---|
| А роза упала на лапу Азора | да |
| привет | нет |
| шалаш | да |
пер фраза = ЗОП("Введите фразу")
пер слова = фраза разбить строку(" ")
пер сплошь = слова объединить массив("")
пер малый = сплошь в нижний регистр
пер буквы = малый разбить строку("")
буквы перевернуть массив
пер задом = буквы объединить массив("")
если задом равно малый то
печать("да")
конец
иначе
печать("нет")
конецЗадание: Часы с нулями (сложная)
Условие задачи:
Спросите часы и минуты (ЦЗОП) и напечатайте время в формате ЧЧ:ММ — часы и минуты всегда двумя цифрами, с нулём слева (5 и 7 минут → 05:07). Используйтезаполнить слева(2, "0").Формат ввода: Две строки: часы (0–23), минуты (0–59).
Формат вывода: Одна строка: ЧЧ:ММ.
Ограничения: 0 ≤ часы ≤ 23, 0 ≤ минуты ≤ 59.
Например:
| Ввод | Результат |
|---|---|
| 5 7 | 05:07 |
| 0 0 | 00:00 |
пер ч = ЦЗОП("Сколько часов?")
пер м = ЦЗОП("Сколько минут?")
печать(ч заполнить слева(2, "0") + ":" + м заполнить слева(2, "0"))Задание: Валидатор файла (сложная)
Условие задачи:
Спросите имя файла (ЗОП). Файл «правильный», если он начинается с "рис" и кончается на ".ряп". Напечатайте подходит или не подходит.Формат ввода: Одна строка — имя файла.
Формат вывода: Одна строка: «подходит» или «не подходит».
Ограничения: имя не длиннее 60 символов.
Например:
| Ввод | Результат |
|---|---|
| рисунок.ряп | подходит |
пер имя = ЗОП("Имя файла?")
если имя начинается с("рис") и имя кончается на(".ряп") то
печать("подходит")
конец
иначе
печать("не подходит")
конецДальше — Глава 10: списки. Одна переменная, в которой живёт целая коллекция значений.
Глава 10. Списки: много значений в одной переменной
До сих пор переменная хранила одно значение. Список хранит сколько угодно: список покупок, корзину в игре, десятки рекордов. Это та самая «коробка с отделениями», о которой мы говорили в главе о циклах — и с ней мы уже работали, разрезая строки.
Шаг 1. Создаём список
Список пишется в квадратных скобках, значения через запятую:
Команда количество элементов в массиве отвечает на вопрос «сколько
тут лежит?». Обратиться к одному значению можно по номеру — как со
строками, нумерация с нуля:
Шаг 2. Кладём и вынимаем
добавить элемент в массив кладёт значение в конец списка, удалить
последний элемент в массиве вынимает его обратно:
Так делают любые «накопители»: очередь в игре, история ходов, дневник измерений. Классика — накопление в цикле:
Шаг 3. Перебираем список
Цикл умеет перебирать список сам: запустить цикл <имя> в массиве
<список> то — на каждом витке <имя> получает очередное значение:
Перебор + условие = поиск нужного элемента:
Шаг 4. Ищем в списке
Две команды поиска. есть ли элемент в массиве отвечает да/нет
(правда или ложь), поиск в массиве говорит номер элемента — или
минус один, если элемента нет:
Поиск вернул 2 — у «сливы» номер 2, потому что нумерация с нуля. Минус один — универсальный ответ «такого здесь нет».
Шаг 5. Наводим порядок: сортировка и переворот
отсортировать элементы в массиве расставляет значения по порядку,
перевернуть массив меняет порядок на обратный:
Из «по возрастанию» получаем «по убыванию»: сортируем и переворачиваем:
Внимание: сортировка сравнивает значения «как в словаре», то есть как текст. Для однозначных чисел (1–9) это совпадает с обычным порядком, а вот 90 окажется «больше» 500 — потому что «9» по словарю позже «5». Сортировку чисел «по-настоящему» делают своей функцией — этому учат курсы посложнее.
Шаг 6. Для любопытных: фильтр
Список можно «просеять» одной командой — отфильтровать массив. Внутри
пишут правило, и остаются только значения, для которых оно верно:
Здесь внутри скобок спрятана крошечная функция-проверка (о функциях —
Глава 7). Пока можете просто запомнить шаблон: список отфильтровать
массив(безимянная функция(х) начало вернуть <условие> конец).
| Команда | Пример | Что делает |
|---|---|---|
количество элементов в массиве | с количество элементов в массиве | сколько лежит |
добавить элемент в массив | с добавить элемент в массив(5) | кладёт в конец |
удалить последний элемент в массиве | с удалить последний элемент в массиве | вынимает из конца |
есть ли элемент в массиве | с есть ли элемент в массиве(5) | правда/ложь |
поиск в массиве | с поиск в массиве(5) | номер или -1 |
отсортировать элементы в массиве | с = с отсортировать элементы в массиве() | по порядку |
перевернуть массив | с перевернуть массив | задом наперёд |
Шаг 6. Потрогайте список руками
Каждая кнопка — настоящая команда из главы. Нажимайте и смотрите, что происходит со списком и с какими номерами:
Интерактивный блок «список-визуал» — в разработке.
Номера в квадратных скобках — индексы. Первый элемент всегда [0] — это не ошибка, а договорённость всего программирования.
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте
подсказку, потом решение. Числа приходят строками: для арифметики
превращайте их командой преобразовать строку в число.
Задание: Сумма чисел
Условие задачи:
Спросите числа через пробел (ЗОП). Разрежьте строку на список (разбить строку(" ")), переберите циклом и напечатайте сумму. Каждый элемент списка — строка, для сложения превратите его в число: преобразовать строку в число(х).Формат ввода: Одна строка — числа через пробел.
Формат вывода: Одна строка — сумма чисел.
Ограничения: чисел не больше 100, каждое от -1000 до 1000.
Например:
| Ввод | Результат |
|---|---|
| 1 2 3 | 6 |
| 10 20 30 | 60 |
| 5 | 5 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер сумма = 0
запустить цикл х в массиве числа то
сумма = сумма + преобразовать строку в число(х)
конец
печать(сумма)Задание: Самое большое
Условие задачи:
Спросите числа через пробел. Напечатайте наибольшее из них: превратите элементы в числа и переберите список, сравнивая с лучшим найденным. За стартовое лучшее возьмите первое число.Формат ввода: Одна строка — числа через пробел.
Формат вывода: Одна строка — наибольшее число.
Ограничения: чисел не больше 100, каждое от -1000000 до 1000000.
Например:
| Ввод | Результат |
|---|---|
| 3 9 2 | 9 |
| 10 5 | 10 |
| -5 -2 -9 | -2 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер самое = преобразовать строку в число(числа[0])
запустить цикл х в массиве числа то
если преобразовать строку в число(х) больше самое то
самое = преобразовать строку в число(х)
конец
конец
печать(самое)Задание: Чётные на свет
Условие задачи:
Спросите числа через пробел. Напечатайте каждое чётное число на своей строке (помогаетостаток от деления на 2). Чётных нет — не печатайте ничего.Формат ввода: Одна строка — числа через пробел.
Формат вывода: Чётные числа, каждое на своей строке, в исходном порядке.
Ограничения: чисел не больше 100, каждое от -1000 до 1000.
Например:
| Ввод | Результат |
|---|---|
| 1 2 3 4 | 2 4 |
| 5 7 | |
| 0 | 0 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
запустить цикл х в массиве числа то
если преобразовать строку в число(х) остаток от деления на 2 равно 0 то
печать(х)
конец
конецЗадание: Перевёртыш
Условие задачи:
Спросите слово. Напечатайте его наоборот: разбейте на буквы (разбить строку("")), переверните список (перевернуть массив) и склейте обратно (объединить массив("")). Например привет → тевирп.Формат ввода: Одна строка.
Формат вывода: Одна строка — слово задом наперёд.
Ограничения: слово не длиннее 100 символов.
Например:
| Ввод | Результат |
|---|---|
| привет | тевирп |
| Аня | янА |
| 123 | 321 |
пер слово = ЗОП("Введите слово")
пер буквы = слово разбить строку("")
буквы перевернуть массив
печать(буквы объединить массив(""))Задание: Есть или нет
Условие задачи:
В программе есть список: пер фрукты = ["яблоко", "груша", "слива", "ананас"]. Спросите слово. Если оно есть в списке — напечатайте Есть! Номер: <номер> (командапоиск в массиве). Если нет — напечатайте Нет такого. Помните: нумерация с нуля.Формат ввода: Одно слово.
Формат вывода: Есть! Номер: <номер> или Нет такого.
Например:
| Ввод | Результат |
|---|---|
| груша | Есть! Номер: 1 |
| ананас | Есть! Номер: 3 |
| банан | Нет такого |
пер фрукты = ["яблоко", "груша", "слива", "ананас"]
пер слово = ЗОП("Какой фрукт?")
пер номер = фрукты поиск в массиве(слово)
если номер равно -1 то
печать("Нет такого")
конец
иначе
печать("Есть! Номер: " + номер)
конецЗадание: Задом наперёд
Условие задачи:
Спросите числа через пробел. Напечатайте их в обратном порядке через пробел: разбейте строку на список, переверните список и склейте обратнообъединить массив(" "). Например 1 2 3 → 3 2 1.Формат ввода: Одна строка — числа через пробел.
Формат вывода: Одна строка — те же числа в обратном порядке.
Например:
| Ввод | Результат |
|---|---|
| 1 2 3 | 3 2 1 |
| 10 20 | 20 10 |
| 5 | 5 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
числа перевернуть массив
печать(числа объединить массив(" "))Задание: Затопленный остров (очень сложная)
Условие задачи:
Набором целых чисел задан профиль высот одномерного острова в одномерном океане. После дождя во всех низинах острова скопилась вода — сколько влезло. Нарисуйте остров: # — почва, ~ — вода, пробел — воздух. На входе два значения: длина острова и высоты через пробел. Уровни рисуйте сверху вниз, от самой высокой вершины до единицы. Строки вывода — без лишних пробелов по краям.Формат ввода: Два ответа через « | »: длина острова и высоты через пробел.
Формат вывода: Остров, нарисованный символами (несколько строк).
Ограничения: длина не больше 100, каждая высота от 0 до 100.
Например:
| Ввод | Результат |
|---|---|
| 3 1 2 1 | # ### |
| 3 2 1 2 | #~# ### |
| 3 1 1 1 | ### |
пер н = ЦЗОП("Длина острова")
пер текст = ЗОП("Высоты через пробел")
пер высоты = текст разбить строку(" ")
пер слева = []
пер справа = []
запустить цикл н раза то
слева добавить элемент в массив(0)
справа добавить элемент в массив(0)
конец
пер текущий = 0
пер столб = 0
пока столб меньше н то
если преобразовать строку в число(высоты[столб]) больше текущий то
текущий = преобразовать строку в число(высоты[столб])
конец
слева[столб] = текущий
столб = столб + 1
конец
текущий = 0
столб = н - 1
пока столб большеравно 0 то
если преобразовать строку в число(высоты[столб]) больше текущий то
текущий = преобразовать строку в число(высоты[столб])
конец
справа[столб] = текущий
столб = столб - 1
конец
пер верх = слева[н - 1]
пер уровень = верх
пока уровень большеравно 1 то
пер полоса = ""
пер край = 0
столб = 0
пока столб меньше н то
если преобразовать строку в число(высоты[столб]) большеравно уровень то
полоса = полоса + "#"
край = столб
конец
иначе
если справа[столб] большеравно уровень то
если слева[столб] большеравно уровень то
полоса = полоса + "~"
край = столб
конец
иначе
полоса = полоса + " "
конец
конец
иначе
полоса = полоса + " "
конец
конец
столб = столб + 1
конец
печать((полоса.slice(0, край + 1)) удалить пробелы)
уровень = уровень - 1
конецЗадание: Сортировка выбором (сложная)
Условие задачи:
Спросите числа через пробел. Напечатайте их по возрастанию через пробел. Командаотсортировать элементы в массиве сравнивает «как в словаре» и числа испортит — сделайте сортировку сами: среди оставшихся ищите наименьшее и меняйте его местами с текущим.Формат ввода: Одна строка — числа через пробел.
Формат вывода: Одна строка — числа по возрастанию через пробел.
Ограничения: чисел не больше 100, каждое от -1000000 до 1000000.
Например:
| Ввод | Результат |
|---|---|
| 3 1 2 | 1 2 3 |
| 10 5 8 | 5 8 10 |
| 9 8 7 6 | 6 7 8 9 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер н = числа количество элементов в массиве
пер м = 0
пока м меньше н то
пер мин_место = м
пер мин_значение = преобразовать строку в число(числа[м])
пер к = м + 1
пока к меньше н то
если преобразовать строку в число(числа[к]) меньше мин_значение то
мин_значение = преобразовать строку в число(числа[к])
мин_место = к
конец
к = к + 1
конец
пер запас = числа[м]
числа[м] = числа[мин_место]
числа[мин_место] = запас
м = м + 1
конец
печать(числа объединить массив(" "))Задание: Второй максимум (олимпиадная)
Условие задачи:
Спросите числа через пробел (ЗОП) и напечатайте второй по величине — тот, который был бы вторым, если расставить все числа по убыванию (одинаковые считаются разными позициями: для 5 5 3 ответ 5). Для списка пригодитсяразбить строку(" ") и перебор циклом.Формат ввода: Одна строка — числа через пробел (не меньше двух).
Формат вывода: Одна строка — второй по величине элемент.
Ограничения: чисел от 2 до 100, каждое от −1000000 до 1000000.
Например:
| Ввод | Результат |
|---|---|
| 5 3 9 1 | 5 |
| 10 20 | 10 |
| 7 7 7 | 7 |
пер текст = ЗОП("Введите числа через пробел")
пер числа = текст разбить строку(" ")
пер самый = -1000000000
пер второй = -1000000000
запустить цикл х в массиве числа то
если преобразовать строку в число(х) больше самый то
второй = самый
самый = преобразовать строку в число(х)
конец
иначе если преобразовать строку в число(х) больше второй то
второй = преобразовать строку в число(х)
конец
конец
печать(второй)Дальше — Глава 11: случайность. Компьютер научится бросать кубик за вас.
Глава 11. Случайность: компьютер бросает кубик
Программы становятся интересными, когда их нельзя предсказать до конца.
Связка команд математика-случайное число и округлить — это кубик
в руках компьютера: каждый запуск даёт новое значение.
Шаг 1. Случайное число
математика-случайное число даёт дробь от 0 до 1, а округлить —
округляет до целого. Вместе они умеют бросать кубик любого размера:
Каждая строка получает своё случайное число от 0 до 6 — запустите демо несколько раз. А чтобы получить кубик со значениями от 1 до 6, добавляем единицу:
Запомните пару: «случайное число * 5) + 1» — это кубик 1–6. Умножение на 5 даёт 0–5, прибавка единицы сдвигает на 1–6.
Шаг 2. Дробное случайное число
Для тонкой настройки берут дробное значение без округления — например, чтобы «с вероятностью 30%» произошло событие (дробь меньше 0.3 — примерно треть всех случаев):
Шаг 3. Случайный выбор из списка
Случайное число + список = случайный выбор. Номер элемента берём случайный — от 0 до «количество минус один»:
Так делаются предсказания, случайные реплики соперника в играх и генераторы имён:
Шаг 4. Угадайка
Соберём всё вместе: случайный секрет, цикл-попытки, подсказки «больше —
меньше». Команда выход из цикла завершает цикл досрочно, как только
вы угадали:
Обратите внимание: секрет задаётся один раз до цикла, а внутри цикла
каждый раз задаётся новый вопрос. Если убрать строку попытка = попытка
+ 1, цикл станет вечным — но защита от вечных циклов остановит его
и подскажет, где ошибка.
Шаг 5. Мастер случайности: подбрасываем монетку
Классика задач со случайностью — половина диапазона: 0 — «орёл», 1 — «решка»:
Запустите второй пример несколько раз: около 500, но никогда не точно — в этом и есть случайность.
Задания к главе
Задание: Угадайка
Условие задачи:
Напишите игру «Угадайка». Программа сначала запрашивает загаданное число (ЦЗОП) — в тестах оно подаётся первым вводом, а в жизни его можно сделать случайным (округлить(математика-случайное число * 99) + 1). Затем запрашивайте догадки: если догадка меньше загаданное — печатайте больше, если больше — меньше, а когда угадано — печатайте Угадал! и заканчивайте.Формат ввода: Первая строка — загаданное число; дальше — догадки по одной.
Формат вывода: По строке на каждую догадку («больше»/«меньше») и «Угадал!» в конце.
Ограничения: 1 ≤ числа ≤ 100; загаданное всегда угадывается (последняя догадка — верная).
Например:
| Ввод | Результат |
|---|---|
| 50 25 75 50 | больше меньше Угадал! |
| 7 7 | Угадал! |
| 50 100 1 50 | меньше больше Угадал! |
пер загаданное = ЦЗОП("Загадайте число")
пер попытка = ЦЗОП("Ваша догадка")
пока попытка не равно загаданное то
если попытка меньше загаданное то
печать("больше")
конец
иначе
печать("меньше")
конец
попытка = ЦЗОП("Ваша догадка")
конец
печать("Угадал!")Задание: Статистика монетки
Условие задачи:
Напишите программу: спросите сколько бросков (ЦЗОП), затем задайте N вопросов — каждый ответ это о (орёл) или р (решка). Посчитайте и напечатайте две строки: «Орлов: X» и «Решек: Y».Формат ввода: Первая строка — N; дальше N строк — «о» или «р».
Формат вывода: Две строки: «Орлов: X» и «Решек: Y».
Ограничения: 0 ≤ N ≤ 1000. Цикл на 1000 шагов обязан закончиться мгновенно.
Например:
| Ввод | Результат |
|---|---|
| 5 о р о о р | Орлов: 3 Решек: 2 |
| 2 р р | Орлов: 0 Решек: 2 |
| 0 | Орлов: 0 Решек: 0 |
пер н = ЦЗОП("Сколько бросков?")
пер орлов = 0
пер решек = 0
запустить цикл н раза то
пер ответ = ЗОП("о или р?")
если ответ равно "о" то
орлов = орлов + 1
конец
иначе
решек = решек + 1
конец
конец
печать("Орлов: " + орлов)
печать("Решек: " + решек)Задание: Кубик до шестёрки (без проверки)
Условие задачи:
Напишите игру: бросайте кубик (округлить(математика-случайное число * 5) + 1) снова и снова, печатая каждый бросок, пока не выпадет 6. Когда выпадет — напечатайте «Понадобилось K бросков». Автопроверки нет — случайность нельзя предсказать, просто запустите пару раз и посмотрите.Формат ввода: Нет.
Формат вывода: Строки с бросками и итоговая строка.
Ограничения: программа обязана заканчиваться: шестёрка выпадает почти наверняка за несколько бросков.
пер бросков = 1
пер кость = округлить(математика-случайное число * 5) + 1
пока кость не равно 6 то
печать("Выпало: " + кость)
бросков = бросков + 1
кость = округлить(математика-случайное число * 5) + 1
конец
печать("Выпало: " + кость)
печать("Понадобилось " + бросков + " бросков")Дальше — Глава 12: сортировки. Компьютер раскладывает всё по порядку — и мы узнаем, сколько это стоит.
Глава 12. Сортировки: порядок из хаоса
Расставить числа по возрастанию кажется простой задачей — пока не спросишь себя: как именно компьютер это делает? В этой главе вы напишете сортировку своими руками, узнаете, почему одни способы медленные, а другие быстрые, и сам увидите разницу на настоящих замерах.
Шаг 1. Готовая сортировка и её ловушка
В языке уже есть команда отсортировать элементы в массиве:
Со словами всё отлично. А теперь секрет:
1, 10, 100, 9 — потому что по умолчанию массив сортируется
как строки: «100» начинается с «1», а «9» — позже. Для чисел есть
специальная команда отсортировать числа — она сравнивает числа как
числа:
с отсортировать числа меняет сам список. Если оригинал нужен нетронутым — с отсортировать копию чисел вернёт новый отсортированный список.
Шаг 2. Пузырёк: сортировка своими руками
Как бы вы отсортировали карты в руке? Пузырёк делает так: пробегает по списку, сравнивает соседей и меняет их местами, если они не по порядку. Самое большое число «всплывает» в конец за один проход:
Обмен двух ячеек — через третью переменную (запаска): просто
«с[а] = с[б] и с[б] = с[а]» нельзя — второе присваивание затрёт первое
значение. Это приём, который нужен везде.
Шаг 3. Посмотрите на пузырёк вживую
Интерактивный блок «сортировка-визуал» — в разработке.
Нажимайте «Шаг» и следите за подсвеченной парой: сколько проходов нужно, чтобы массив почти отсортировался? А если массив уже отсортирован — сколько проходов тратится зря?
Шаг 4. Сколько это стоит?
В списке из n элементов пузырёк делает примерно n × n сравнений — n на каждой из n дорожек. Рост взрывной:
| Размер списка n | Сравнений (примерно) |
|---|---|
| 10 | 100 |
| 100 | 10 000 |
| 1000 | 1 000 000 |
| 10 000 | 100 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 3 | 2 5 3 9 2 3 5 9 2 3 5 9 |
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
с[счетчик] = преобразовать строку в число(с[счетчик])
конец
запустить цикл (с длина - 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. Считать по формуле, а не циклом — иначе миллион шагов.
Например:
| Ввод | Результат |
|---|---|
| 5 | 10 |
| 1 | 0 |
| 3 | 3 |
пер н = ЦЗОП("Размер списка")
печать(целое снизу(н * (н - 1) / 2))Задание: Бинарный угадайщик
Условие задачи:
Напишите программу, которая угадывает число делением пополам: первый ввод — загаданное число (от 1 до 100), дальше программа называет середину отрезка и печатает её, а следующие вводы — больше или меньше (ответ машины). Когда угадано — печатайте Угадал!. Границы отрезка сужайте: после ответа «больше» нижняя граница становится середина + 1, после «меньше» верхняя — середина − 1.Формат ввода: Первая строка — загаданное число; дальше — ответы «больше»/«меньше».
Формат вывода: По строке на каждую попытку — названное число; в конце «Угадал!».
Ограничения: 1 ≤ загаданное ≤ 100; угадывается максимум за 7 попыток.
Например:
| Ввод | Результат |
|---|---|
| 50 | 50 Угадал! |
пер загаданное = ЦЗОП("Загадайте число")
пер низ = 1
пер верх = 100
пер середина = целое снизу((низ + верх) / 2)
печать(середина)
пока середина не равно загаданное то
пер ответ = ЗОП("больше или меньше?")
если ответ равно "больше" то
низ = середина + 1
конец
иначе
верх = середина - 1
конец
середина = целое снизу((низ + верх) / 2)
печать(середина)
конец
печать("Угадал!")Задание: Сортировка выбором (сложная)
Условие задачи:
Напишите сортировку выбором: на каждом шаге находите наименьший элемент в неотсортированной части и меняйте его местами с первым элементом этой части. Спросите числа через пробел и напечатайте список после каждого шага внешнего цикла (строкой через пробел) — даже если обмена не было. Последняя строка — отсортированный список.Формат ввода: Одна строка — числа через пробел.
Формат вывода: По строке на каждый шаг внешнего цикла.
Ограничения: чисел не больше 20, каждое от −1000 до 1000.
Например:
| Ввод | Результат |
|---|---|
| 5 2 9 3 | 2 5 9 3 2 3 9 5 2 3 5 9 2 3 5 9 |
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
с[счетчик] = преобразовать строку в число(с[счетчик])
конец
запустить цикл (с длина) раза то
пер наименьший = счетчик
пер ж = счетчик + 1
пока ж меньше с длина то
если с[ж] меньше с[наименьший] то
наименьший = ж
конец
ж = ж + 1
конец
если наименьший не равно счетчик то
пер запаска = с[счетчик]
с[счетчик] = с[наименьший]
с[наименьший] = запаска
конец
печать(с объединить массив(" "))
конецЗадание: Сортировка по убыванию (очень сложная)
Условие задачи:
Напишите пузырёк, который сортирует по убыванию — самое большое уплывает в конец, самое маленькое всплывает в начало. Спросите числа через пробел, отсортируйте по убыванию и напечатайте, сколько обменов вы сделали (одна строка), затем сам список.Формат ввода: Одна строка — числа через пробел.
Формат вывода: Две строки: количество обменов и отсортированный (по убыванию) список.
Ограничения: чисел не больше 30, каждое от −1000 до 1000.
Например:
| Ввод | Результат |
|---|---|
| 5 2 9 3 | 3 9 5 3 2 |
пер текст = ЗОП("Введите числа через пробел")
пер с = текст разбить строку(" ")
запустить цикл (с длина) раза то
с[счетчик] = преобразовать строку в число(с[счетчик])
конец
пер обменов = 0
запустить цикл (с длина - 1) раза то
запустить цикл (с длина - 1 - счетчик) раза то
если с[счетчик] меньше с[счетчик + 1] то
пер запаска = с[счетчик]
с[счетчик] = с[счетчик + 1]
с[счетчик + 1] = запаска
обменов = обменов + 1
конец
конец
конец
печать(обменов)
печать(с объединить массив(" "))Дальше — Глава 13: словари. Одна переменная, в которой у каждого значения есть своё имя.
Глава 13. Словари: значения с именами
Список — коробка с номерами: значение №0, №1, №2. Но часто удобнее обращаться к значениям по имени: у игрока есть «очки», «уровень», «имя». Для этого есть словарь — коллекция пар «ключ: значение».
Шаг 1. Создаём словарь и читаем его
Словарь пишется в фигурных скобках: ключ, двоеточие, значение. Доступ — через точку:
Значение можно изменить — и добавить новый ключ, просто присвоив ему значение:
Ключи могут быть и списками — так строят «карточки персонажей»:
Шаг 2. Ключи и значения как списки
Иногда нужно перебрать всё содержимое словаря. Три команды превращают словарь в список:
| Команда | Что вернёт для { имя: "Аня", очки: 10 } |
|---|---|
конвертировать ключи обьекта в массив | ["имя", "очки"] |
конвертировать значения обьекта в массив | ["Аня", 10] |
конвертировать обьект в массив | [["имя", "Аня"], ["очки", 10]] |
У команд есть короткие имена: ККОМ (ключи), КЗОМ (значения), КОМ
(и то и другое). Перебираем словарь целиком:
Обратите внимание: когда ключ «в переменной», к нему обращаются
квадратными скобками — игрок[ключ], а не точкой.
Шаг 3. JSON: словарь как текст
Для сохранения и пересылки словарь превращают в текст командой
конвертация в JASON, а обратно — конвертация из JASON. Такой формат
называется JSON, и он одинаковый на всех языках программирования мира:
Это и есть способ сохранять прогресс: превратили словарь в текст, сохранили (об этом — Глава 19), потом собрали обратно.
Шаг 4. Копия словаря
Простое присваивание не копирует словарь, а даёт ему второе имя — изменения видны через оба:
Настоящую копию делает глубокое копирование — она копирует словарь
со всем содержимым, включая вложенные списки:
Шаг 5. Удаляем ключ
удалить элемент вычёркивает ключ из словаря навсегда:
| Команда | Пример | Что делает |
|---|---|---|
| доступ через точку | игрок.очки | читает/меняет значение |
конвертировать ключи обьекта в массив | ККОМ(игрок) | список ключей |
конвертировать значения обьекта в массив | КЗОМ(игрок) | список значений |
конвертация в JASON | конвертация в JASON(игрок) | словарь → текст |
конвертация из JASON | конвертация из JASON(текст) | текст → словарь |
глубокое копирование | глубокое копирование(с) с сохранением вложений | настоящая копия |
удалить элемент | удалить элемент(игрок.пароль) | вычёркивает ключ |
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.
Задание: Карточка игрока
Условие задачи:
Спросите имя (ЗОП) и очки (ЦЗОП). Соберите словарьигрок с ключами имя и очки, затем напечатайте: <имя> — <очки> очков — обращаясь к словарю через точку.Формат ввода: Два ответа через « | »: имя и очки.
Формат вывода: Одна строка: <имя> — <очки> очков.
Например:
| Ввод | Результат |
|---|---|
| Аня 10 | Аня — 10 очков |
| Кот 0 | Кот — 0 очков |
| Пётр 999 | Пётр — 999 очков |
пер имя = ЗОП("Имя игрока")
пер очки = ЦЗОП("Сколько очков?")
пер игрок = { имя: имя, очки: очки }
печать(игрок.имя + " — " + игрок.очки + " очков")Задание: Банк очков
Условие задачи:
Спросите начальные очки и прибавку (два ЦЗОП). Соберите словарьбанк с ключом очки, прибавьте прибавку к банку.очки и напечатайте новое значение.Формат ввода: Два числа через « | ».
Формат вывода: Одна строка — очки после прибавки.
Например:
| Ввод | Результат |
|---|---|
| 10 5 | 15 |
| 0 0 | 0 |
| 100 -30 | 70 |
пер старт = ЦЗОП("Начальные очки")
пер добавка = ЦЗОП("Сколько добавить?")
пер банк = { очки: старт }
банк.очки = банк.очки + добавка
печать(банк.очки)Задание: Справочник столиц
Условие задачи:
В программе есть словарь: пер столицы = { Россия: "Москва", Франция: "Париж", Италия: "Рим", Япония: "Токио" }. Спросите страну (ЗОП). Если она есть в справочнике — напечатайте её столицу (столицы[страна]); иначе напечатайте Не знаю.Формат ввода: Одна строка — страна.
Формат вывода: Столица или Не знаю.
Например:
| Ввод | Результат |
|---|---|
| Россия | Москва |
| Франция | Париж |
| Германия | Не знаю |
пер столицы = { Россия: "Москва", Франция: "Париж", Италия: "Рим", Япония: "Токио" }
пер страна = ЗОП("Какая страна?")
если столицы[страна] равно нет значения то
печать("Не знаю")
конец
иначе
печать(столицы[страна])
конецЗадание: Анкета в JSON
Условие задачи:
Спросите имя (ЗОП) и любимое число (ЦЗОП). Соберите словарьанкета с ключами имя и число (число — настоящее), затем напечатайте словарь как JSON: конвертация в JASON(анкета). В выводе не должно быть пробелов — JSON компактный.Формат ввода: Два ответа через « | »: имя и число.
Формат вывода: JSON-строка вида {"имя":"Аня","число":10}.
Например:
| Ввод | Результат |
|---|---|
| Аня 10 | {"имя":"Аня","число":10} |
| Боря 0 | {"имя":"Боря","число":0} |
| Я -5 | {"имя":"Я","число":-5} |
пер имя = ЗОП("Как тебя зовут?")
пер число = ЦЗОП("Любимое число")
пер анкета = { имя: имя, число: число }
печать(конвертация в JASON(анкета))Задание: Двойник-обманщик
Условие задачи:
Спросите очки (ЦЗОП). Соберите словарьигрок с ключом очки, затем создайте двойника: пер двойник = игрок (без копирования!). Измените очки двойника на 999 и напечатайте игрок.очки — словари делят одни значения, поэтому напечатается 999 при любом вводе.Формат ввода: Одно число.
Формат вывода: Всегда 999.
Например:
| Ввод | Результат |
|---|---|
| 10 | 999 |
| 0 | 999 |
| -5 | 999 |
пер очки = ЦЗОП("Сколько очков?")
пер игрок = { очки: очки }
пер двойник = игрок
двойник.очки = 999
печать(игрок.очки)Задание: Чемпион по ключам
Условие задачи:
Спросите имя (ЗОП) и уровень (ЦЗОП). Соберите словарьгерой с ключами имя и уровень, затем напечатайте список ключей через запятую: конвертировать ключи обьекта в массив + объединить массив(", ").Формат ввода: Два ответа через « | »: имя и уровень.
Формат вывода: Одна строка: имя, уровень.
Например:
| Ввод | Результат |
|---|---|
| Аня 1 | имя, уровень |
| Боря 9 | имя, уровень |
| Я 99 | имя, уровень |
пер имя = ЗОП("Имя героя")
пер уровень = ЦЗОП("Уровень")
пер герой = { имя: имя, уровень: уровень }
печать(конвертировать ключи обьекта в массив(герой) объединить массив(", "))Задание: Частотный словарь (сложная)
Условие задачи:
Спросите слово (ЗОП). Посчитайте, сколько раз встречается каждая буква (словарь: буква → количество), и напечатайте словарь как JSON (конвертация в JASON). Ключи идут в порядке первого появления буквы.Формат ввода: Одна строка.
Формат вывода: JSON вида {"м":1,"и":1,"р":1}.
Ограничения: длина слова не больше 100 символов.
Например:
| Ввод | Результат |
|---|---|
| мир | {"м":1,"и":1,"р":1} |
| банан | {"б":1,"а":2,"н":2} |
| шалаш | {"ш":2,"а":2,"л":1} |
пер слово = ЗОП("Введите слово")
пер буквы = слово разбить строку("")
пер счёт = {}
запустить цикл б в массиве буквы то
если счёт[б] равно нет значения то
счёт[б] = 1
конец
иначе
счёт[б] = счёт[б] + 1
конец
конец
печать(конвертация в JASON(счёт))Дальше — Глава 14: классы. Свои типы значений с собственными командами.
Глава 14. Классы: свои типы значений
Словарь собрал свойства в одну карточку. Но герою нужно не только хранить очки — он должен уметь действовать. Класс — это чертёж: описываем один раз, а потом создаём сколько угодно «экземпляров», каждый со своими данными и своими командами.
Шаг 1. Первый класс
Класс описывается командой класс, внутри — конструктор (что делать
при создании) и методы (обычные команды-функции, принадлежащие классу).
Создаётся экземпляр командой новый:
Разбор по строкам:
класс Кот начало— объявляем чертёж с именем Кот;конструктор(имя)— выполняется при каждомновый Кот(...);этот элемент имя = имя— «моё имя = то, что передали». Слова
этот элемент означают «именно этого кота, не любого другого»;
мяу() начало … конец— команда, которую умеет каждый кот;барсик.мяу()— просим конкретного кота мяукнуть.
Шаг 2. Сколько угодно экземпляров
Один чертёж — много котов, и у каждого своё имя и свои свойства:
У Барсика и Мурки отдельные сытости: каждый экземпляр хранит свои значения, но команды у них общие — описаны один раз в классе.
Шаг 3. Команды с параметрами
Методы принимают значения так же, как функции из Главы 7:
Так устроены игровые объекты: герой.урон(10), счёт.добавить(1),
магазин.продать("хлеб").
Шаг 4. Наследование: расширить класс
Классы умеют наследовать друг друга: расширить класс — новый класс
получает всё, что умел старый, и добавляет своё:
Кот и Собака оба умеют познакомься — эта команда описана один раз
в Животном. Общее — в родителя, особенное — в наследнике:
Котёнок переопределил голос: команда с тем же именем в наследнике заменяет родительскую.
| Команда | Пример | Что делает |
|---|---|---|
класс | класс Кот начало … конец | чертёж |
конструктор | конструктор(имя) начало … конец | код при создании |
этот элемент | этот элемент очки = 10 | «моё» свойство |
новый | новый Кот("Барсик") | создать экземпляр |
расширить класс | класс Котёнок расширить класс Кот … | наследование |
Задания к главе
Напишите решение в редакторе и нажмите «Проверить». Застряли — откройте подсказку, потом решение.
Задание: Знакомимся с классом
Условие задачи:
Напишите классКот: конструктор принимает имя и запоминает его (этот элемент имя), метод поздороваться печатает Мяу, я <имя>!. В программе спросите имя (ЗОП), создайте кота командой новый Кот(...) и вызовите поздороваться.Формат ввода: Одно слово — имя кота.
Формат вывода: Одна строка: Мяу, я <имя>!
Например:
| Ввод | Результат |
|---|---|
| Барсик | Мяу, я Барсик! |
| Мурка | Мяу, я Мурка! |
| 123 | Мяу, я 123! |
класс Кот начало
конструктор(имя) начало
этот элемент имя = имя
конец
поздороваться() начало
печать("Мяу, я " + этот элемент имя + "!")
конец
конец
пер имя = ЗОП("Как зовут кота?")
пер барсик = новый Кот(имя)
барсик.поздороваться()Задание: Счётчик с методами
Условие задачи:
Напишите классСчётчик: конструктор принимает стартовое число и запоминает его; метод добавить(n) прибавляет n к счётчику; метод показать печатает Счётчик: <значение>. В программе спросите старт и две прибавки, создайте счётчик, дважды вызовите добавить и один раз показать.Формат ввода: Три числа через « | »: старт, первая прибавка, вторая прибавка.
Формат вывода: Одна строка: Счётчик: <старт + прибавка 1 + прибавка 2>.
Например:
| Ввод | Результат |
|---|---|
| 0 5 3 | Счётчик: 8 |
| 10 1 1 | Счётчик: 12 |
| 100 -10 5 | Счётчик: 95 |
класс Счётчик начало
конструктор(старт) начало
этот элемент число = старт
конец
добавить(n) начало
этот элемент число = этот элемент число + n
конец
показать() начало
печать("Счётчик: " + этот элемент число)
конец
конец
пер старт = ЦЗОП("С какого числа начинаем?")
пер счёт = новый Счётчик(старт)
счёт.добавить(ЦЗОП("Первая прибавка"))
счёт.добавить(ЦЗОП("Вторая прибавка"))
счёт.показать()Задание: Два кота
Условие задачи:
Спросите два имени (два ЗОП). Создайте двух котов (классКот с методом поздороваться, печатающим Мяу, я <имя>!) и заставьте каждого поздороваться — в порядке вопросов.Формат ввода: Два ответа через « | »: имя первого, имя второго.
Формат вывода: Две строки приветствий — сначала первого кота, потом второго.
Например:
| Ввод | Результат |
|---|---|
| Барсик Мурка | Мяу, я Барсик! Мяу, я Мурка! |
| Мурка Барсик | Мяу, я Мурка! Мяу, я Барсик! |
| А Б | Мяу, я А! Мяу, я Б! |
класс Кот начало
конструктор(имя) начало
этот элемент имя = имя
конец
поздороваться() начало
печать("Мяу, я " + этот элемент имя + "!")
конец
конец
пер первый = ЗОП("Имя первого кота")
пер второй = ЗОП("Имя второго кота")
пер кот1 = новый Кот(первый)
пер кот2 = новый Кот(второй)
кот1.поздороваться()
кот2.поздороваться()Задание: Наследник
Условие задачи:
Напишите классЖивотное: конструктор запоминает имя, метод познакомься печатает Я — <имя>!. Напишите класс Кот, который расширяет Животное (расширить класс) и добавляет метод мяу, печатающий Мяу, я <имя>!. Спросите имя, создайте кота и вызовите оба метода: сначала познакомься, потом мяу.Формат ввода: Одно слово — имя.
Формат вывода: Две строки: Я — <имя>! и Мяу, я <имя>!
Например:
| Ввод | Результат |
|---|---|
| Барсик | Я — Барсик! Мяу, я Барсик! |
| Мурка | Я — Мурка! Мяу, я Мурка! |
| 123 | Я — 123! Мяу, я 123! |
класс Животное начало
конструктор(имя) начало
этот элемент имя = имя
конец
познакомься() начало
печать("Я — " + этот элемент имя + "!")
конец
конец
класс Кот расширить класс Животное начало
мяу() начало
печать("Мяу, я " + этот элемент имя + "!")
конец
конец
пер имя = ЗОП("Как зовут кота?")
пер барсик = новый Кот(имя)
барсик.познакомься()
барсик.мяу()Задание: Банк с охраной (сложная)
Условие задачи:
Напишите классБанк: конструктор принимает стартовый баланс; метод положить(n) прибавляет n; метод снять(n) вычитает n, но если денег не хватает (n больше баланса) — баланс не меняется. Спросите старт и три команды-числа: снять, положить, снять (три ЦЗОП). Выполните их по порядку и напечатайте итоговый баланс.Формат ввода: Четыре числа через « | »: старт, снять, положить, снять.
Формат вывода: Одна строка — итоговый баланс.
Ограничения: все числа от -1000000 до 1000000, старт неотрицательный.
Например:
| Ввод | Результат |
|---|---|
| 100 30 10 50 | 30 |
| 10 20 5 0 | 15 |
| 0 0 0 0 | 0 |
класс Банк начало
конструктор(старт) начало
этот элемент деньги = старт
конец
положить(n) начало
этот элемент деньги = этот элемент деньги + n
конец
снять(n) начало
если n меньшеравно этот элемент деньги то
этот элемент деньги = этот элемент деньги - n
конец
конец
конец
пер старт = ЦЗОП("Стартовый баланс")
пер счёт = новый Банк(старт)
счёт.снять(ЦЗОП("Сколько снять?"))
счёт.положить(ЦЗОП("Сколько положить?"))
счёт.снять(ЦЗОП("Сколько снять ещё?"))
печать(счёт.деньги)Дальше — Глава 15: холст. Рисуем настоящую графику — для этого шага понадобится компилятор ryap.exe из Главы 0.
Глава 15. Холст: рисуем графику
До сих пор программы отвечали текстом. Теперь — графика! Холст — это
белый лист прямо в редакторе: запустите пример — и под кодом появится
рисунок. Те же программы работают и в компиляторе ryap.exe.
Холст в учебнике — 400 на 320 пикселей. Точка (0, 0) — левый верхний угол: вправо растёт первая координата, вниз — вторая.
Шаг 1. Первый прямоугольник
Команда содержание холста достаёт кисть (записывает её в переменную
холст). Команда нарисовать прямоугольник рисует прямоугольник:
слева, сверху, ширина, высота:
Шаг 2. Цвета
цвет заливки задаёт цвет для всех следующих фигур. Есть готовые
названия цветов:
А так рисуется круг — нарисовать круг(х, у, радиус): х и у — центр,
радиус — расстояние от центра до края. Заливается текущим цветом:
| Слово на РЯП | Цвет |
|---|---|
красный, оранжевый, желтый | тёплые |
зеленый, лаймовый, светло-зеленый | зелёные |
синий, темно-синий, водный, аквамариновый | холодные |
черный, белый, серый, серебрянный | нейтральные |
розовый, фиолетовый, коричневый, золотой, оливковый | прочие |
Кисть запоминает цвет до следующего изменения: «цвет заливки — потом сколько угодно фигур этим цветом».
Шаг 3. Настраивающие и рисующие команды
Команды холста бывают двух видов. Настраивающие меняют кисть и
аргументов не имеют: цвет заливки красный, ширина линии 3.
Рисующие рисуют — у них в скобках аргументы через запятую, как у
обычных команд: нарисовать прямоугольник(10, 10, 60, 60).
| Команда | Пример | Скобки |
|---|---|---|
цвет заливки | цвет заливки красный | не нужны |
цвет линии | цвет линии синий | не нужны |
ширина линии | ширина линии 3 | не нужны |
нарисовать прямоугольник | нарисовать прямоугольник(10, 10, 60, 60) | нужны |
нарисовать текст | нарисовать текст("Мой дом", 130, 170) | нужны |
ширина холста | ширина холста | выражение-число |
высота холста | высота холста | выражение-число |
Шаг 4. Очистка холста
Рисунки накапливаются: каждая фигура ложится поверх предыдущих.
очистить холст стирает всё до белого листа:
После очистки останется только второй прямоугольник. Очистка — главный инструмент анимации (об этом в следующей главе).
Шаг 5. Линии
Рисование линии — это маршрут: «поднять ручку» (рисовка линий),
поставить точку (провести линию из точки), вести линию (провести
линию в точку), «отрисовать» (завершить рисовку линий):
Из точки в точку можно вести сколько угодно линий — получится ломаная.
Команда заполнить фигуры заливает замкнутый контур текущим цветом
заливки. Команда провести линию из первой точки в последнюю замыкает
контур — соединяет последнюю точку с первой.
Шаг 6. Текст на холсте
Текст тоже рисуется как фигура — командой нарисовать текст. Размер
шрифта задаёт размер шрифта текста:
Шаг 7. Короткие имена
У четырёх главных команд холста есть сокращения для быстрого письма:
| Сокращение | Полное имя |
|---|---|
НП | нарисовать прямоугольник |
ПЛИТ | провести линию из точки |
ПЛВТ | провести линию в точку |
ЗРЛ | завершить рисовку линий |
Шаг 8. Кисть: помни состояние
У кисти есть «память» — её можно сохранять и восстанавливать. Зачем? Чтобы повернуть или сдвинуть кисть, нарисовать, а потом вернуть всё как было — и не портить следующие фигуры:
Наклонённый прямоугольник нарисован из «сдвинутого» места, а зелёный —
в обычных координатах: восстановить кисть вернул всё как было.
Ещё кисть умеет прозрачность — фигуры просвечивают:
Правило хорошего тона: делаете сдвиг/поворот/прозрачность — оберните в сохранить кисть … восстановить кисть. Кисть-память — стек: можно сохранять несколько раз и восстанавливать в обратном порядке.
Шаг 9. Дом: собираем всё вместе
Домик из прямоугольника и крыши — теперь прямо здесь, жмите «Запустить»:
Проверить себя просто: пиксель (160, 150) должен быть жёлтым — это стена дома. Автопроверка в заданиях этой главы устроена так же: она «смотрит» в указанные точки холста.
Задания к главе
Задание: Светофор
Условие задачи:
Нарисуйте светофор: три квадрата 60×60 в ряд на одной высоте — <b>красный</b> от точки (20, 100), <b>желтый</b> от точки (100, 100), <b>зеленый</b> от точки (180, 100). Автопроверка посмотрит в центр каждого квадрата и в промежутки.Формат ввода: Нет.
Формат вывода: Рисунок на холсте — проверка по точкам.
Ограничения: холст учебника 400×320; не выходите за его границы.
Например:
| Ввод | Результат |
|---|---|
| — | пиксель 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 = серый |
содержание холста цвет заливки серый нарисовать прямоугольник(20, 240, 60, 40) нарисовать прямоугольник(100, 180, 60, 40) нарисовать прямоугольник(180, 120, 60, 40)
Задание: Ракета на старте
Условие задачи:
Нарисуйте ракету на холсте — автопроверки у этой задачи нет, вы художник. Обязательное: корпус (прямоугольник), нос (треугольник из линий изаполнить фигуры), пламя внизу и надпись <b>«Поехали!»</b> командой нарисовать текст. Не меньше <b>5 фигур</b> и <b>3 цветов</b>.Формат ввода: Нет.
Формат вывода: Рисунок на холсте.
Ограничения: холст учебника 400×320.
содержание холста
цвет заливки серый
нарисовать прямоугольник(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.
содержание холста функция дом принимает аргументы х, у, цвет начало функции цвет заливки цвет нарисовать прямоугольник(х, у, 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 = фиолетовый |
содержание холста цвет заливки синий нарисовать круг(80, 200, 30) цвет заливки водный нарисовать круг(200, 200, 30) цвет заливки фиолетовый нарисовать круг(320, 200, 30)
Дальше — Глава 16: движение. Заставим фигуры летать: интервал, задержка и покадровая анимация.
Глава 16. Холст: движение и анимация
Мультик — это много картинок, сменяющихся быстро: каждый «кадр» картинка немного сдвигается, и глаз видит движение. Компьютер умеет повторять код по расписанию — этим и делают анимацию. Демо этой главы живут прямо в учебнике: жмите «Запустить» и смотрите.
Шаг 1. Повтор по расписанию: интервал
Команда интервал повторяет блок кода каждые N миллисекунд (1000
миллисекунд = секунда):
Читается так: «интервал ( безымянная функция ) начало … конец, повторять каждые 1000 мс». Каждый «Тик!» — новый кадр по будильнику. Будильник тикает, пока открыта страница, поэтому при перезапуске демо старый интервал сначала гасится.
Шаг 2. Кадры: очистить — сдвинуть — нарисовать
Анимация — это три шага в каждом кадре: стереть, изменить, нарисовать. Двигаем квадрат вправо:
Каждые 30 миллисекунд холст очищается, х растёт на 2 — и квадрат
рисуется на новом месте. Квадрат уедет за край холста и исчезнет —
границ он пока не знает.
Шаг 3. Отскок от стены
Меняя х, проверяем границы: долетел до правого края — двигайся назад.
Для этого направление тоже храним в переменной и меняем его знак:
Квадрик летает туда-сюда. -скорость — «минус скорость»: когда скорость
была 2, станет −2, и движение пойдёт в обратную сторону.
Шаг 4. Двумерное движение: мяч
Два изменения — по х и по у — дают диагональный полёт. Отскок по
обеим стенам — вот уже и «мяч для пинг-понга»:
Шаг 5. Разовое отложенное действие: задержка
интервал повторяет бесконечно. А задержка выполняет блок один раз,
через указанное время — например, через полторы секунды после запуска:
Читается: «задержка ( функция ) … конец, через 1500 мс». Так делают отсчёт «3, 2, 1, старт!» и переходы между экранами игры.
Шаг 6. Один кадр: анимировать холст
анимировать холст выполняет блок на следующем обновлении экрана
браузера — один вызов рисует один самый плавный кадр. Соединим его с
задержка: квадрат стоит полсекунды — и одним кадром прыгает вправо:
Чтобы анимация длилась, кадры создают по цепочке — а чаще всего кадры
делает интервал, как в шагах выше.
Шаг 7. Поворот фигуры
Фигуры можно вращать. повернуть фигуру поворачивает кисть на угол
в радианах (полный оборот ≈ 6.28) — все следующие фигуры лягут под
углом. Оборот стрелки удобно делать через время:
Команда время из Главы 19 даёт миллисекунды — деля на 1000, получаем постоянно растущее число секунд, из которого получается плавный поворот.
Шаг 8. Правила хорошего мультика
- Сначала очистить холст, потом рисовать — иначе кадры намажутся друг
на друга;
- все изменяемые величины (
х,у,скорость) — в переменных до цикла; - скорость меняйте внутри кадра, а не создавайте заново;
- интервал 30 мс даёт плавное движение без перегрузки компьютера.
Задания к главе
Задание: Пинг-понг
Условие задачи:
Сделайте мяч 20×20, который летает по холсту и отскакивает от всех четырёх стен — как в шаге 4, но и по вертикали, и по горизонтали. Автопроверки у этой задачи нет: запустите и смотрите, пока мяч не побывает у каждой стены.Формат ввода: Нет.
Формат вывода: Анимация на холсте (холст 400×320).
Ограничения: холст учебника 400×320; мяч не должен вылетать за край больше, чем на половину себя.
содержание холста пер х = 40 пер у = 40 пер сх = 4 пер су = 3 интервал(безимянная функция() начало очистить холст х = х + сх у = у + су если х больше 380 или х меньше 0 то сх = -сх конец если у больше 300 или у меньше 0 то су = -су конец цвет заливки красный нарисовать прямоугольник(х, у, 20, 20) конец, 30)
Задание: Светофор-регулировщик
Условие задачи:
Нарисуйте светофор: тёмный столб 60×180 с тремя «лампами»-квадратами 40×40 — красной, желтой и зеленой. Сначала горит красная. Через <b>1 секунду</b> загорается желтая (красная гаснет), ещё через секунду — зеленая. Автопроверки нет — следите за переключением.Формат ввода: Нет.
Формат вывода: Рисунок и две смены кадра на холсте (холст 400×320).
Ограничения: холст учебника 400×320.
содержание холста
функция светофор принимает аргументы цвет, верх начало функции
очистить холст
цвет заливки "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.
содержание холста пер голова = 10 интервал(безимянная функция() начало очистить холст голова = голова + 2 запустить цикл 5 раза то если счетчик остаток от деления на 2 равно 0 то цвет заливки зеленый конец иначе цвет заливки темно-зеленый конец нарисовать прямоугольник(голова - счетчик * 22, 100, 20, 20) конец конец, 30)
Задание: Круглый мяч (без проверки)
Условие задачи:
Переделайте «мяч для пинг-понга» (шаг 4) на круглый: радиус 15, красный, летает по холсту и отскакивает от всех четырёх стен. Автопроверки нет — запустите и следите за мячом.Формат ввода: Нет.
Формат вывода: Анимация на холсте (холст 400×320).
Ограничения: холст учебника 400×320; учитывайте радиус — центр мяча не должен заходить за край.
содержание холста пер х = 60 пер у = 60 пер сх = 4 пер су = 3 интервал(безимянная функция() начало очистить холст х = х + сх у = у + су если х больше 385 или х меньше 15 то сх = -сх конец если у больше 305 или у меньше 15 то су = -су конец цвет заливки красный нарисовать круг(х, у, 15) конец, 30)
Дальше — Глава 17: события. Программа будет реагировать на мышь и клавиатуру.
Глава 17. События: мышь и клавиатура
До сих пор программа жила своей жизнью: запустилась и работала по сценарию. Событие — это сигнал «снаружи»: пользователь щёлкнул мышью, нажал клавишу. Программа слушает события и реагирует на них — так работают все интерактивные приложения и игры. Демо этой главы живые: запустите, затем щёлкайте по холсту (он поймает фокус) или жмите клавиши — слушатель отзовётся.
Шаг 1. Клик мышью
при нажатии мышкой вешает «слушателя» на всю страницу. Каждый клик —
выполняется блок:
позиция клика по x и позиция клика по y говорят, где именно щёлкнули.
Нарисуем «трассу» за курсором на холсте:
Шаг 2. Рисуем по клику
Классика «там, где кликнул — там и точка»:
Внимание на минус пять: мы рисуем квадратик вокруг курсора, поэтому отступаем от его центра на половину размера.
Шаг 3. Клавиатура
при нажатии на кнопку слушает клавиатуру. название кнопки — символ
или имя клавиши ("a", "5", "Enter", "ArrowLeft"), код кнопки — её
числовой код:
Запустите и нажмите разные клавиши: буквы, цифры, стрелки, пробел, Enter. Стрелки называются "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown".
Шаг 4. Меняем фон страницы клавишей
Событие + свойство страницы — и клавиша перекрашивает весь фон. Этим
демо работает только под компилятором ryap.exe — в учебнике фон
страницы не менять (остальные демо главы — живые):
при нажатии на кнопку начало если название кнопки равно "r" то фон страницы красный конец если название кнопки равно "g" то фон страницы зеленый конец если название кнопки равно "b" то фон страницы синий конец конец)
Шаг 5. Управляем фигурой стрелками
Собираем движение из прошлой главы и клавиатуру: стрелки двигают квадрат. Сначала переменные и слушатель, потом функция перерисовки:
Нажмите любую стрелку — квадрат шагнёт в её сторону. Это уже почти управление персонажем игры!
Шаг 6. Счётчик кликов
События отлично дружат с переменными-счётчиками — основой любой «статистики» в играх:
Шаг 7. Кнопки и элементы страницы
События бывают и на конкретных элементах. Элемент можно создать прямо
в программе — создать html элемент("button"), задать ему текст и
повесить своё событие: при нажатии на элемент + команда и конец:
html элемент с айди("...") находит элемент по имени, его html
содержание меняет текст внутри него, а ДОКУМЕНТ-body.appendChild
добавляет кнопку на страницу. Так делаются интерфейсы: элемент — деталь,
событие — реакция на неё.
Задание: Красные точки
Условие задачи:
Напишите программу: при каждом клике по холсту рисуйте красный круг радиуса 8 в точке клика (командыпозиция клика по x и позиция клика по y дадут координаты). Автопроверка пощёлкает по холсту за вас и заглянет в точки.Формат ввода: Нет.
Формат вывода: Рисунок на холсте — проверка по точкам.
Ограничения: холст учебника 400×320; клики приходят изнутри холста.
Например:
| Ввод | Результат |
|---|---|
| клик 200, 150 | пиксель 200, 150 = красный |
содержание холста при нажатии мышкой начало цвет заливки красный нарисовать круг(позиция клика по x, позиция клика по y, 8) конец)
Задание: Клавишный диктант
Условие задачи:
Напишите программу: при нажатии любой клавиши печатайте строку вида Нажали: X — вместо X подставьтеназвание клавиши. Автопроверка «нажмёт» клавиши за вас (команда при нажатии клавиши слушает клавиатуру, название клавиши даёт имя: "a", "5", "Enter", "ArrowLeft"...).Формат ввода: Нет.
Формат вывода: По строке «Нажали: имя» на каждую клавишу.
Ограничения: в тестах клавиши: буквы, цифры, Enter, стрелки.
Например:
| Ввод | Результат |
|---|---|
| клавиша a клавиша 5 клавиша Enter | Нажали: a Нажали: 5 Нажали: Enter |
при нажатии клавиши начало
печать("Нажали: " + название клавиши)
конец)Задание: Мишень (сложная)
Условие задачи:
Нарисуйте мишень — синий круг радиуса 50 с центром (200, 150). Потом слушайте клики: если клик попал в мишень (расстояние от центра до точки клика не больше 50) — печатайте Попал!, иначе — Мимо. Расстояние считайте по формуле √(dx² + dy²) — корень даёт... в степени 0.5.Формат ввода: Нет.
Формат вывода: Рисунок мишени и по строке на каждый клик.
Ограничения: холст учебника 400×320; центр мишени всегда (200, 150), радиус 50.
Например:
| Ввод | Результат |
|---|---|
| клик 200, 150 клик 380, 20 клик 200, 100 | Попал! Мимо Попал! |
содержание холста
цвет заливки синий
нарисовать круг(200, 150, 50)
при нажатии мышкой начало
пер dx = позиция клика по x - 200
пер dy = позиция клика по y - 150
если (dx * dx + dy * dy) в степени 0.5 меньшеравно 50 то
печать("Попал!")
конец
иначе
печать("Мимо")
конец
конец)Дальше — Глава 18: игры. Собираем всё изученное в одну настоящую игру.
Глава 18. Игры: собираем всё вместе
Игровая программа — это конструктор из четырёх уже знакомых деталей: состояние (переменные), события (мышь и клавиши), цикл кадров (интервал) и условия (победа, поражение). В этой главе соберём простую игру целиком и набросаем идеи для своих. Все демо живые: играйте прямо в учебнике (для клавиш — щёлкните по холсту, чтобы он поймал фокус).
Шаг 1. Схема любой игры
Каждая игра держит в переменных текущее состояние и на каждом кадре пересчитывает его:
| Деталь | Что это | Команды |
|---|---|---|
| Состояние | где герой, сколько очков | пер |
| Ввод | что хочет игрок | при нажатии мышкой, при нажатии на кнопку |
| Кадры | как мир меняется сам | интервал, анимировать холст |
| Правила | победа и поражение | если, иначе |
Шаг 2. Ловим квадрат: полная игра
Цель — успеть щёлкнуть по убегающему квадрату. Квадрат прыгает каждые полсекунды, игрок кликает; счёт растёт с каждой поимкой:
Разбор по деталям:
- состояние:
х,у— где квадрат,очки— счёт; - прыжки: первый интервал раз в 500 мс ставит квадрат в случайное
место (округлить(математика-случайное число * 300) — по ширине холста);
- ввод: слушатель клика проверяет условие «курсор внутри квадрата»
— четыре сравнения через и;
- кадры: второй интервал рисует сцену: квадрат и надпись с очками.
Два независимых интервала — обычное дело: один меняет мир, другой его рисует.
Шаг 3. Таймер на игру
Добавим обратный отсчёт: игра идёт 15 секунд, потом итог. Время хранится в переменной и уменьшается в кадре:
Один раз в секунду таймер тикает; когда дошёл до нуля — объявляем итог.
Чтобы игра «закрылась» по-настоящему, внутри если время игры равно 0 то
останавливают интервалы и больше не рисуют.
Шаг 4. Враг догоняет: расстояние
В играх часто нужно «кто ближе». Расстояние между двумя точками на
плоскости считается теоремой Пифагора — через корень суммы квадратов.
квадратный корень и в степени уже есть в нашем словаре:
Команда квадратный корень — со скобкой сразу после имени, выражение целиком внутри её скобок.
Шаг 5. Сложность: скорость растёт
Игры становятся интереснее, когда усложняются. Простейший приём — ускорять врага с каждой поимкой:
Другие приёмы усложнения: больше врагов, меньше время, реже бонусы,
случайные препятствия (интервал + округлить(математика-случайное число * N)).
Шаг 6. Каркас платформера
Бегалка с прыжком — движение по х постоянное, по у действует
«гравитация»:
Гравитация — это «скорость_у растёт каждый кадр»; пол — «если упал ниже
линии, останови». Платформа — ещё одно условие: если у больше 200 и х
больше 100 и х меньше 200 то — стоять на ней.
Шаг 7. Идеи для собственных игр
- Догонялки: враг движется к герою — уменьшайте разницу координат
каждый кадр (см. Шаг 4);
- Собиратель: разбросайте «монеты» (
целое случайное число), +
очко за касание;
- Уклонист: падают сверху препятствия (их
урастёт в кадре),
игрок ходит по низу;
- Пинг-понг: мяч отскакивает от стен и от ракетки, промах —
поражение;
- Минное поле: сетка из контейнеров, под некоторыми мины
(округлить(математика-случайное число * 9) равно 0).
Для каждой игры порядок один: состояние → события → кадры → правила.
Задание: Угадайка за K попыток
Условие задачи:
Улучшите «Угадайку» из Главы 11: после верной догадки печатайте «Угадал за K попыток» — с номером попытки. Программа сначала спрашивает загаданное число (в тестах это первый ввод), потом догадки; на каждую промахнувшуюся печатается больше или меньше.Формат ввода: Первая строка — загаданное число; дальше — догадки.
Формат вывода: Подсказки «больше»/«меньше» на промахи и финальная строка «Угадал за K попыток».
Ограничения: 1 ≤ числа ≤ 100; последняя догадка — верная.
Например:
| Ввод | Результат |
|---|---|
| 50 25 75 50 | больше меньше Угадал за 3 попыток |
| 7 7 | Угадал за 1 попыток |
пер загаданное = ЦЗОП("Загадайте число")
пер попытка = ЦЗОП("Ваша догадка")
пер попыток = 0
пока попытка не равно загаданное то
попыток = попыток + 1
если попытка меньше загаданное то
печать("больше")
конец
иначе
печать("меньше")
конец
попытка = ЦЗОП("Ваша догадка")
конец
попыток = попыток + 1
печать("Угадал за " + попыток + " попыток")Задание: Камень-ножницы-бумага
Условие задачи:
Напишите игру «Камень-ножницы-бумага»: первый вопрос — ход компьютера (в тестах он подаётся вводом:к, н или б), второй — ход игрока. Побеждает камень над ножницами, ножницы над бумагой, бумага над камнем. Напечатайте Победа!, Поражение или Ничья.Формат ввода: Две строки: ход компьютера, затем ход игрока (одна буква: к, н или б).
Формат вывода: Одна строка: «Победа!», «Поражение» или «Ничья».
Ограничения: ходы только из букв к, н, б.
Например:
| Ввод | Результат |
|---|---|
| к к | Ничья |
| к н | Поражение |
| к б | Победа! |
пер машина = ЗОП("Ход компьютера")
пер игрок = ЗОП("Ваш ход")
если машина равно игрок то
печать("Ничья")
конец
иначе если (машина равно "к" и игрок равно "н") или (машина равно "н" и игрок равно "б") или (машина равно "б" и игрок равно "к") то
печать("Поражение")
конец
иначе
печать("Победа!")
конецЗадание: Ловилка с таймером (без проверки)
Условие задачи:
Соберите полную игру: зелёный квадрат 40×40 прыгает по холсту раз в полсекунды; клик по нему — +1 очко (и строка «Поймал!»); игра идёт 10 секунд, после чего печатается «Игра окончена! Очков: X» и всё останавливается. Автопроверки нет — сыграйте сами (и нажмите «Остановить», если игра мешает читать дальше).Формат ввода: Нет.
Формат вывода: Строки «Поймал!» и финальный итог; рисунок на холсте.
Ограничения: холст учебника 400×320; таймер — интервал на 1000 мс, отсчёт от 10 до 0.
содержание холста
пер х = 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. Локальное хранилище
Локальное хранилище — это небольшая «записная книжка» браузера, живущая даже после закрытия страницы. У каждой ячейки есть имя и значение:
Запустите демо, потом перезагрузите страницу и запустите снова —
значение сохранилось! Команда локальное хранилище- открывает книжку,
добавить ячейку кладёт значение по имени, прочитать ячейку достаёт.
В ячейке хранится текст: число 42 превратится в "42". Для вычислений его переводят обратно: преобразовать строку в число.
Шаг 2. Рекорд игры
Классическое применение — рекорд. Читаем старый рекорд (если его нет — считаем нулём), сравниваем с новым результатом:
Запустите демо с разными значениями результат — рекорд обновляется
только когда результат больше, и живёт между запусками страницы.
Команда очистить ячейки стирает всё хранилище целиком — «новая игра»:
Шаг 3. Словарь в хранилище
Хранилище держит только текст, но словари спасают JSON-превращение из Главы 12: словарь → текст → хранилище → текст → словарь:
Так устроены настоящие сохранения игр: один ключ «сохранение» держит весь прогресс.
Шаг 4. Часы: сейчас и команды времени
Компьютер всегда знает время. Команда сейчас возвращает полный
отметку даты, а отдельные команды дают части времени:
| Команда | Что даёт |
|---|---|
сейчас | полная отметка даты и времени |
время | миллисекунды с начала эпохи — большое число |
этот год, день месяца, день недели | части даты |
этот час, эта минута, эта секунда | части суток |
дата по стандарту | дата в едином мировом формате |
День недели — число: 0 — воскресенье, 1 — понедельник и так далее. Научим программу здороваться по времени суток:
Шаг 5. Таймер на командах времени
время — большое растущее число миллисекунд. Разница двух замеров —
сколько прошло. Засечём, сколько секунд заняли три печати:
Внимание на скобки: целое снизу (...)) — внутренняя скобка считает разницу, внешняя закрывает команду.
Шаг 6. Электронные часы
Часы, которые «тикают» сами, делаются интервалом из Главы 16 (в учебнике интервал работает на холсте — но в консоли тоже можно печатать):
Такой интервал печатает время раз в секунду — настенные часы в консоли.
Задание: Дневник игрока
Условие задачи:
Напишите программу: спросите имя игрока (ЗОП), сохраните его в локальное хранилище под именемигрок (локальное хранилище- добавить ячейку("игрок", имя)), потом прочитайте обратно из хранилища и напечатайте «Игрок: X — записан в дневник» — где X получен именно из хранилища.Формат ввода: Одна строка — имя игрока.
Формат вывода: Одна строка: «Игрок: <имя> — записан в дневник».
Ограничения: имя не длиннее 50 символов.
Например:
| Ввод | Результат |
|---|---|
| Аня | Игрок: Аня — записан в дневник |
пер имя = ЗОП("Как зовут игрока?")
локальное хранилище- добавить ячейку("игрок", имя)
пер изХранилища = локальное хранилище- прочитать ячейку("игрок")
печать("Игрок: " + изХранилища + " — записан в дневник")Задание: Возраст в днях
Условие задачи:
Напишите программу: спросите, сколько вам полных лет (ЦЗОП), и напечатайте, сколько это примерно дней — считая год за 365 дней.Формат ввода: Одна строка — полных лет.
Формат вывода: Одна строка — количество дней.
Ограничения: 0 ≤ годы ≤ 150.
Например:
| Ввод | Результат |
|---|---|
| 10 | 3650 |
| 1 | 365 |
| 0 | 0 |
пер годы = ЦЗОП("Сколько вам полных лет?")
печать(годы * 365)Задание: Тик-так (без проверки)
Условие задачи:
Сделайте часы-метроном: раз в секунду печатайте по очереди тик и так (первая секунда — «тик», вторая — «так», третья — снова «тик»...). Печатайте и номер секунды: «тик 1», «так 2», «тик 3»... Автопроверки нет — интервал не остановить проверкой, останавливайте кнопкой «Остановить».Формат ввода: Нет.
Формат вывода: Строки «тик N» / «так N» каждую секунду.
Ограничения: интервал на 1000 мс; чётность секунды — остаток от деления на 2.
пер секунда = 0
интервал(безимянная функция() начало
секунда = секунда + 1
если секунда остаток от деления на 2 равно 0 то
печать("так " + секунда)
конец
иначе
печать("тик " + секунда)
конец
конец, 1000)Дальше — Глава 20: свои библиотеки. Упакуем полезные команды в переиспользуемый набор.
Глава 20. Свои библиотеки
Библиотека — это набор готовых команд, который кто-то уже написал и упаковал для повторного использования. Вместо того чтобы каждый раз заново придумывать «случайное число между 10 и 50», вы подключаете библиотеку и пользуетесь готовым.
Шаг 1. Подключение библиотеки
Библиотека подключается одной строкой — ПБ (сокращение от «подключить
библиотеку») — и обычно ставится в начало программы:
Подключённые команды становятся «своими»: пишутся как обычные команды
РЯП. Учебник знает все встроенные библиотеки и несколько собственных
(из папки библиотеки проекта: приветствие, удвоение, счет),
а компилятор ryap.exe разворачивает их так же.
Шаг 2. Библиотека расширенной математики
| Команда | Что делает |
|---|---|
целое_случайное_число(макс, мин) | целое число от мин до макс |
кв_корень(число) | квадратный корень (отрицательного — «i») |
куб_корень(число) | кубический корень |
корень(число, степень) | корень любой степени |
умножение(а, б) | умножает числа и строки (строка × число = повтор) |
Сравните целое_случайное_число(5, 1) с командой языка «целое случайное
число до 5)»: библиотечная умеет задавать и нижнюю границу — например,
кубик от 1 до 6 без прибавления единицы.
Шаг 3. Библиотека работы с холстом
Три команды, которыми мы пользовались вручную в главах 15–16, уже упакованы здесь:
| Команда | Что делает |
|---|---|
покрасить_весь_холст_в(цвет) | закрасить холст целиком |
нарисовать_квадрат(у, х, ребро) | квадрат с равными сторонами |
размеры_холста(ширина, высота) | задать размер холста |
Особый случай: размеры_холста(стандарт, стандарт) — растянуть холст
на всё окно (внутри библиотеки слово «стандарт» — магическое значение
6.666, о котором знать не нужно).
Шаг 4. Библиотека работы с текстом
| Команда | Что делает |
|---|---|
записать_в_массив_текст(текст) | разложить текст на список букв |
То же самое умеет разбить строку ("") из Главы 9 — но библиотека
читается как команда, а не как хитрость со скобками.
Шаг 5. Своя библиотека — это свои функции
Секрет библиотек прост: это обычные функции, написанные кем-то раньше. Вот ваша собственная мини-библиотека для игр — просто функции в начале программы:
Порядок в большой программе: сначала библиотека, потом игра — функции должны быть описаны до первого использования. Так вы делаете то же, что делают авторы настоящих библиотек: пишете полезное один раз и вставляете в любые новые программы.
Шаг 6. Полный список встроенных библиотек
| Как подключить | Название | Дает |
|---|---|---|
ПБ расширенной математики | математика | случайные числа, корни, умножение строк |
ПБ расширенной работы с холстом | холст | покраска, квадраты, размеры |
ПБ расширенной работы с текстом | текст | разбор текста на буквы |
ПБ кода в одну строку | однострочник | сокращения для быстрых записей |
ПБ привет | привет | одно окно «Привет, Мир!» |
Сокращение ПБ раскрывается в «подключить библиотеку» — длинные имена
библиотек пишутся после него в родительном падеже, как в таблице.
Задания к главе
Задание: Корень из библиотеки
Условие задачи:
Подключите библиотеку расширенной математики (ПБ расширенной математики), спросите у пользователя число (команда ЦЗОП) и напечатайте его квадратный корень командой кв_корень(н). Потом ради интереса попробуйте в редакторе куб_корень(8) — и посмотрите, что библиотека отвечает числам без точного корня.Формат ввода: Одна строка — целое число.
Формат вывода: Одна строка — квадратный корень числа.
Ограничения: 0 ≤ н ≤ 1000000; в тестах числа с точными квадратными корнями.
Например:
| Ввод | Результат |
|---|---|
| 81 | 9 |
| 64 | 8 |
| 0 | 0 |
ПБ расширенной математики
пер н = ЦЗОП("Введите число")
печать(кв_корень(н))Задание: Хохотушка
Условие задачи:
Подключите библиотеку расширенной математики. Спросите у пользователя <b>слог</b> (ЗОП) и <b>число</b> (ЦЗОП), затем напечатайте слог, повторённый ровно это количество раз, — командойумножение(слог, н): библиотечное умножение работает и со строками!Формат ввода: Две строки: слог, затем число.
Формат вывода: Одна строка — слог, повторённый н раз.
Ограничения: 1 ≤ н ≤ 50; слог не длиннее 10 символов.
Например:
| Ввод | Результат |
|---|---|
| ха 3 | хахаха |
| ля 2 | ляля |
| о 5 | ооооо |
ПБ расширенной математики
пер слог = ЗОП("Какой слог?")
пер н = ЦЗОП("Сколько раз?")
печать(умножение(слог, н))Задание: Библиотека расстояний (сложная)
Условие задачи:
Напишите свою мини-библиотеку — функциюрасстояние(х1, у1, х2, у2), которая возвращает расстояние между двумя точками по формуле √((х2−х1)² + (у2−у1)²). Корень считайте через степень: ... в степени 0.5. Потом спросите четыре числа (ЦЗОП: х1, у1, х2, у2) и напечатайте расстояние.Формат ввода: Четыре строки: х1, у1, х2, у2 (целые числа).
Формат вывода: Одна строка — расстояние между точками.
Ограничения: координаты от −1000 до 1000; в тестах ответы с точными или короткими дробями.
Например:
| Ввод | Результат |
|---|---|
| 0 0 3 4 | 5 |
| 1 1 4 5 | 5 |
| 0 0 0 0 | 0 |
функция расстояние принимает аргументы х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.
содержание холста функция дом принимает аргументы х, у начало функции цвет заливки золотой нарисовать прямоугольник(х, у, 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. Живой платформер
Запустите демо, щёлкните по холсту (чтобы он поймал клавиши) и управляйте стрелками: ← → бег, ↑ прыжок. Цель — допрыгнуть до золотой монеты:
Шаг 3. Как это работает: гравитация
Главный трюк — скорость по вертикали. Каждый кадр она растёт на 0.5 (гравитация тянет вниз), а координата у меняется на эту скорость:
- упал на платформу или пол — скорость_у обнуляется,
на_земле = правда; - прыжок — это разовый «толчок вверх»:
скорость_у = -9(минус — вверх); - «стой на платформе» — три условия сразу: высота подходящая и герой
по ширине над платформой (и из Главы 3).
Флаг на_земле запрещает прыгать в воздухе — без него герой летал бы бесконечно. Флаги (переменные правда/ложь) — самый простой способ «запомнить состояние».
Шаг 4. Монета и победа
Монета — круг с фиксированными координатами. Каждый кадр проверяем
«касание»: герой рядом с монетой, если разница координат мала. Команда
модуль даёт расстояние без знака: модуль(х + 15 - 360) меньше 20.
При касании флаг победа становится правдой, и кадр печатает
поздравление вместо мира.
Шаг 5. Соберите свой платформер
Теперь ваша очередь — задача ниже. План большой программы тот же, что в «Угадайке» (Глава 18): возьмите демо за каркас и меняйте по одной детали за раз, запуская после каждой.
Задание: Свой платформер (финал)
Условие задачи:
Напишите свой платформер — автопроверки у финала нет, вы автор. Минимальные требования: герой (круг или прямоугольник), не меньше двух платформ и пол, прыжок стрелкой ↑ и бег ←→, не меньше двух золотых монет — соберите все и напечатайте «Уровень пройден!» и «Монет собрано: X». Бонус: запишите рекорд в локальное хранилище (время до старта минус время после — и локальное хранилище- добавить ячейку(...)).Формат ввода: Управление — стрелки (сначала щёлкните по холсту).
Формат вывода: Игра на холсте; финальные строки в консоли.
Ограничения: холст учебника 400×320; интервал живёт до остановки — жмите «Остановить», когда наигрались.
содержание холста
пер х = 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. Как проверять большую программу
Большие программы пишут по кусочкам, проверяя каждый:
- Записали функцию — сразу вызовите с простыми числами и посмотрите
ответ;
- Добавили цикл или интервал — запустите, посмотрите, что происходит;
- Добавили хранилище — перезапустите и убедитесь, что данные живы;
- Что-то сломалось — Глава 8: читаем номер строки и красную подсказку,
печатаем промежуточные значения.
Ошибки в большой программе — это нормально. Отличие опытного программиста не в «отсутствии ошибок», а в скорости их поиска.
Шаг 7. Что дальше
Вы прошли учебник. Дальше:
- Справка (СПРАВКА.html) — весь словарь языка в одной таблице;
- примеры папка проекта — готовые программы для чтения и переделки;
- своя игра из списка Главы 18 — и ещё одна, и ещё одна;
- и заглядывайте в главу «Библиотеки»: свои функции, написанные для
одной игры, пригодятся в следующей.
Программирование — это не запоминание команд, а навык превращать идею в маленькие проверяемые шаги. Команды вы теперь знаете. Впереди — только ваши проекты.
Интерактивный блок «финальный-проект-песочница» — в разработке.
Учебник РЯП2.7 · сгенерирован src/gen_uchebnik.py из src/keywords.csv и «главы учебника/*.txt»