# Способы записи алгоритмов

Информатика · 8 класс · Исполнители и алгоритмы. Алгоритмические конструкции
Источник: https://razlozheno.ru/subject/informatika/8/6-sposoby-zapisi-algoritmov

Один алгоритм можно записать по-разному: словами, пронумерованными строками, блок-схемой или на языке программирования. Разбираем, чем эти способы отличаются, где какой удобен, какие фигуры и линии используются в блок-схемах, что такое алфавит, синтаксис и семантика языка программирования, и записываем алгоритмы Евклида и переливаний в каждой из форм.

## Чему научишься

- Различать четыре способа записи алгоритма (словесное описание, построчная запись, блок-схема, язык программирования) и объяснять сильные и слабые стороны каждого.
- Читать и составлять блок-схемы: знать назначение блоков начала/конца, данных, обработки, принятия решения и правило стрелок на линиях связи.
- Объяснять, что такое алфавит, синтаксис и семантика языка программирования, и записывать простой алгоритм на псевдокоде с служебными словами алг, нач, кон.

## С чего начать

Полный сосуд на 12 литров, два пустых — на 8 и на 5. Надо отлить ровно половину. Ты, скорее всего, решишь это за пару минут перебором — а как записать решение так, чтобы его без единой ошибки выполнил тот, кто головой не думает вовсе: робот-исполнитель? И почему одну и ту же последовательность действий информатика умеет записывать четырьмя разными способами?

## 1. Словами: описание и построчная запись

*Самый простой способ — и почему он самый опасный*

Способов записать алгоритм несколько. Основные: **словесные** (на естественных языках), **графические** и **на языках программирования**. Почему их так много? Потому что у алгоритма разные читатели: человеку удобно одно, компьютеру — совсем другое.

Теоретические исследования нашего соотечественника Андрея Андреевича Маркова (младшего) (1903—1979), выполненные в середине прошлого века, показали: в общем случае алгоритм состоит из предписаний двух видов.

*Рисунок: Портрет пожилого мужчины в пиджаке и галстуке*

**Два вида предписаний**

**Функциональные операторы** — предписания, направленные на непосредственное преобразование информации.

**Логические операторы** — предписания, определяющие дальнейшее направление действий.

Именно эти операторы положены в основу большинства способов записи алгоритмов.

**Как понять и запомнить: два вида операторов**

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

Зацепки: **ФУНКЦИОНАЛЬНЫЕ — выполняют функцию: непосредственно преобразуют информацию.** **ЛОГИЧЕСКИЕ — логика решает, куда направить дальнейшие действия.**

*Рисунок: Развилка дороги, где один путь ведёт прямо, а другой поворачивает в сторону*

**Словесное описание**

**Словесное описание** — запись алгоритма в виде набора предписаний на обычном разговорном языке.

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

**Как понять и запомнить: словесное описание**

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

Способ запомнить — правило самопроверки: **словесное = свободное: минимум правил, максимум слов; если один и тот же текст можно понять двумя способами — это словесное описание, и его пора переводить в построчную запись.**

**Пример: Пример 1. Словесное описание алгоритма Евклида (НОД двух чисел)**

1. «Чтобы найти НОД двух чисел, составьте таблицу из двух столбцов и назовите столбцы $X$ и $Y$. Запишите первое из заданных чисел в столбец $X$, а второе — в столбец $Y$.»
2. «Если данные числа не равны, замените большее из них на результат вычитания из большего числа меньшего.»
3. «Повторяйте такие замены до тех пор, пока числа не окажутся равными, после чего число из столбца $X$ считайте искомым результатом.»
4. Проверим на $12$ и $18$: $(12, 18) \to (12, 6) \to (6, 6)$, НОД $= 6$. Работает — но попробуй по этому тексту понять, что делать, если числа равны с самого начала: придётся перечитывать.

**Построчная запись**

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

Предписания могут содержать математические выражения и формулы. Такая запись позволяет избежать ряда неопределённостей и не требует дополнительных знаний — но требует от человека большого внимания.

**Как понять и запомнить: построчная запись**

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

Зацепка: **ПО СТРОЧКАМ: каждое предписание с новой строки, шаги пронумерованы и выполняются по возрастанию номеров.**

**Пример: Пример 2. Построчная запись алгоритма Евклида — и её исполнение для $X = 12$, $Y = 18$**

1. 1. Обозначить первое из заданных чисел $X$, второе обозначить $Y$. 2. Если $X = Y$, то перейти к п. 8. 3. Если $X > Y$, то перейти к п. 4, иначе перейти к п. 6. 4. Заменить $X$ на $X - Y$. 5. Перейти к п. 2. 6. Заменить $Y$ на $Y - X$. 7. Перейти к п. 2. 8. Считать $X$ искомым результатом.
2. Исполняем: $X = 12$, $Y = 18$. П. 2: не равны. П. 3: $12 > 18$? Нет — идём к п. 6: $Y = 18 - 12 = 6$. П. 7 → п. 2.
3. $X = 12$, $Y = 6$: не равны; $12 > 6$ — п. 4: $X = 12 - 6 = 6$. П. 5 → п. 2.
4. $X = 6$, $Y = 6$: равны — п. 8. Результат $6$. Каждый шаг однозначен: не надо думать, «что имелось в виду», надо только внимательно следить за номерами.

**Неправильно:** Построчная запись — это просто словесное описание, разбитое на абзацы.
**Правильно:** Три правила делают её другим способом: каждое предписание с новой строки, шаги пронумерованы, исполнение идёт по возрастанию номеров (если нет специальных указаний вроде «перейти к п. 8»). Именно нумерация и переходы убирают неоднозначность.

**Проверь себя:** В построчной записи Евклида для $X = 5$, $Y = 5$ какой пункт выполнится после п. 2?
**Ответ:** П. 8 — числа равны, результат $5$. В словесном описании этот случай пришлось бы додумывать.

### Проверь себя

**Какое определение соответствует понятию «функциональные операторы»?**
- Предписания, направленные на непосредственное преобразование информации. — верно
- Предписания, определяющие дальнейшее направление действий.
- Набор символов, используемых в языке программирования.
- Система правил, строго определяющая смысл конструкций языка.
> Согласно источнику, именно функциональные операторы отвечают за прямое изменение или обработку данных.

**В чем заключается основная особенность построчной записи алгоритма по сравнению со словесным описанием?**
- Запись алгоритма в виде произвольного набора предписаний на разговорном языке.
- Применение ограниченного набора служебных слов академика Ершова.
- Каждое предписание записывается с новой строки, а шаги нумеруются. — верно
- Использование исключительно геометрических фигур для обозначения действий.
> Источник указывает на нумерацию и строгое следование порядку номеров как на отличительные черты построчной записи.

**Какие формы записи конструкции «ветвление» предусмотрены программой обучения?**
- Простая и сложная формы.
- Словесная и графическая формы.
- Циклическая и линейная формы.
- Полная и неполная формы. — верно
> Ветвление может содержать действия для обоих исходов условия или только для одного (истинного).

## 2. Рисунком: блок-схемы

*Самый наглядный способ — пока помещается на лист*

Наилучшей наглядностью обладают графические способы записи, и самый распространённый из них — блок-схема. Вместо «перейти к п. 6» — просто линия, по которой скользит взгляд.

**Блок-схема**

**Блок-схема** — графическое изображение порядка выполнения алгоритма, где предписания изображаются геометрическими фигурами (блоками), а последовательность шагов — соединяющими их линиями связи.

Линии связи слева направо и сверху вниз — стандартные, их изображают **без стрелок**. Линии справа налево и снизу вверх изображаются **со стрелками**.

**Как понять и запомнить: блок-схема**

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

Зацепка: **БЛОК-схема: предписания помещены в геометрические блоки, а линии связывают порядок шагов.**

*Рисунок: Несколько геометрических фигур соединены линиями в последовательную схему сверху вниз и слева направо*

*Рисунок: Набор геометрических фигур блок-схемы с буквенными обозначениями а, б, в, г, д*

**Условные обозначения блок-схем**

| Блок | Что внутри | Линии связи |
| --- | --- | --- |
| Начало / конец (а) | выполнение всегда начинается с блока начала и заканчивается переходом на блок конца | из начала выходит одна линия; в конец входит одна |
| Данные (б) | величины, которые вводятся (исходные данные) или выводятся (результаты) в этом месте | одна входит, одна выходит |
| Обработка данных (в) | действия, меняющие значение, форму или размещение информации | одна входит, одна выходит |
| Принятие решения (г) | проверяемое условие | одна входит, две выходят — у каждой подписан результат проверки |
| Комментарий (д) | пояснительные записи, делающие схему понятнее | — |

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

*Рисунок: Блок-схема алгоритма нахождения наибольшего общего делителя с текстовыми комментариями*

**Пример: Читаем блок-схему Евклида (рис. 2.3) для $X = 12$, $Y = 18$**

1. Блок начала → блок данных: вводим $X = 12$, $Y = 18$.
2. Ромб «$X = Y$?»: нет → идём по линии «нет» к ромбу «$X > Y$?»: нет → блок обработки «$Y = Y - X$», получаем $Y = 6$. Линия возвращается вверх к первой проверке — она со стрелкой, потому что идёт снизу вверх.
3. Второй круг: $12 = 6$? нет; $12 > 6$? да → «$X = X - Y$», $X = 6$. Снова вверх.
4. Третий круг: $6 = 6$? да → блок данных выводит $X = 6$ → блок конца. Тот же результат, что в построчной записи, но путь виден глазами.

**Неправильно:** Из ромба (блока принятия решения) выходит одна линия, как из всех остальных блоков.
**Правильно:** Две — по одной на каждый результат проверки условия, и около каждой подписано «да»/«нет». Одна выходящая линия — у блоков данных и обработки.

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

**Проверь себя:** Линия на блок-схеме идёт снизу вверх. Нужна ли ей стрелка?
**Ответ:** Да: стандартные направления — слева направо и сверху вниз, они без стрелок; справа налево и снизу вверх — со стрелками.

### Проверь себя

**Какое свойство алгоритма подразумевает его разбиение на последовательность отдельных законченных шагов?**
- Дискретность — верно
- Детерминированность
- Массовость
- Результативность
> Дискретность означает, что алгоритм состоит из отдельных команд, выполняемых поочередно.

**В чем заключается основное ограничение линейных алгоритмов (конструкции «следование»)?**
- Невозможность использования арифметических действий.
- Невозможность изменить порядок действий в зависимости от исходных данных. — верно
- Обязательное наличие циклов с заданным числом повторений.
- Ограничение на использование более чем трех последовательных команд.
> Линейные алгоритмы выполняются строго последовательно и не содержат условий для изменения маршрута.

**Какие типы циклов выделяются в рамках конструкции «повторение»?**
- С заданным числом повторений, с условием, с переменной цикла. — верно
- Полные, неполные и разветвленные.
- Словесные, графические и программные.
- Функциональные и логические.
> Эти три вида циклов прямо указаны в требованиях программы к теме «Способы записи алгоритмов».

## 3. Для компьютера: языки программирования и псевдокод

*Алфавит, синтаксис, семантика — и алгоритм переливаний*

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

**Язык программирования и его три характеристики**

**Язык программирования** — формальный язык, предназначенный для записи компьютерных программ (алгоритмов, исполнителем которых является компьютер).

Каждый язык характеризуется:

- **алфавитом** — набором используемых в языке символов;
- **синтаксисом** — системой правил, по которым из символов алфавита образуются правильные конструкции языка;
- **семантикой** — системой правил, строго определяющей смысл и способ употребления конструкций языка.

**Как понять и запомнить: алфавит, синтаксис, семантика**

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

Зацепки: **СИНТАКСИС — порядок символов: из алфавита складываются правильные конструкции.** **СЕМАНТИКА — это смысл: она строго определяет смысл и употребление конструкций.**

*Рисунок: Разрозненные геометрические элементы собираются в аккуратные правильные конструкции*

Языков программирования очень много. В 8–9 классах мы будем изучать Паскаль (Pascal), а желающие смогут попробовать силы на **школьном (учебном) алгоритмическом языке** — его также называют русским алгоритмическим языком или языком КуМир.

*Рисунок: Портрет мужчины в очках, пиджаке и галстуке*

**Школьный алгоритмический язык и псевдокод**

**Школьный алгоритмический язык** — учебный язык программирования, введённый академиком А. П. Ершовым в 1985 году для записи алгоритмов с использованием ограниченного набора служебных слов.

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

**Псевдокод** — способ записи алгоритмов, представляющий собой смесь естественного разговорного языка и школьного алгоритмического языка.

**Общий вид программы на школьном алгоритмическом языке**

**алг** <название алгоритма>

**нач**

<последовательность команд>

**кон**

Заголовок — что делаем; между **нач** и **кон** — команды по одной в строке.

**Как понять и запомнить: псевдокод**

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

Способ запомнить — по служебным словам: **алг — назвал, нач — начал, кон — закончил; между ними по одной команде в строке.**

**Пример: Пример 4. Алгоритм переливаний: из полного сосуда ёмкостью $12$ л отлить половину, пользуясь пустыми сосудами $8$ л и $5$ л**

1. алг переливания · нач · наполнить сосуд ёмкостью $8$ л из сосуда ёмкостью $12$ л · наполнить сосуд ёмкостью $5$ л из сосуда ёмкостью $8$ л · вылить всё из сосуда ёмкостью $5$ л в сосуд ёмкостью $12$ л · вылить всё из сосуда ёмкостью $8$ л в сосуд ёмкостью $5$ л · наполнить сосуд ёмкостью $8$ л из сосуда ёмкостью $12$ л · долить из сосуда ёмкостью $8$ л в сосуд ёмкостью $5$ л · вылить всё из сосуда ёмкостью $5$ л в сосуд ёмкостью $12$ л · кон
2. Проследим состояние (сосуды $12$ / $8$ / $5$): старт $12/0/0$ → наполнить $8$: $4/8/0$ → наполнить $5$ из $8$: $4/3/5$ → вылить $5$ в $12$: $9/3/0$.
3. → вылить $8$ в $5$: $9/0/3$ → наполнить $8$ из $12$: $1/8/3$ → долить из $8$ в $5$ (входит $2$ л): $1/6/5$ → вылить $5$ в $12$: $6/6/0$.
4. В $12$-литровом сосуде ровно $6$ л — половина. Семь команд, каждая однозначна: такой алгоритм выполнит и исполнитель Водолей в КуМире.

**Четыре способа записи одного алгоритма**

| Способ | Кому удобен | Плюс | Минус |
| --- | --- | --- | --- |
| Словесное описание | человеку, впервые узнающему идею | минимум ограничений | неоднозначность, объёмность |
| Построчная запись | человеку-исполнителю | нумерация убирает неопределённости | требует большого внимания |
| Блок-схема | человеку, которому нужно увидеть структуру | наилучшая наглядность | трудоёмко; большая схема теряет наглядность |
| Язык программирования / псевдокод | компьютеру (псевдокод — человеку) | строгость, единая форма записи | нужно знать алфавит, синтаксис и семантику |

**Неправильно:** Псевдокод — это и есть язык программирования, его можно сразу выполнить на компьютере.
**Правильно:** Псевдокод — смесь русского языка и школьного алгоритмического; он ориентирован на исполнителя-человека и помогает понять или изложить суть алгоритма. Чтобы выполнил компьютер, алгоритм нужно записать на настоящем языке программирования.

**Проверь себя:** Программа не запустилась: «в строке 3 пропущена точка с запятой». Какой уровень языка нарушен — алфавит, синтаксис или семантика?
**Ответ:** Синтаксис: конструкция собрана не по правилам. Смысл (семантика) даже не проверялся.

### Проверь себя

**Что в языке программирования понимается под термином «семантика»?**
- Система правил, определяющая смысл и способ употребления конструкций языка. — верно
- Полный набор символов, которые допустимы для использования в языке.
- Смесь естественного разговорного языка и школьного алгоритмического языка.
- Система правил образования правильных конструкций из символов алфавита.
> Семантика отвечает за содержательную сторону языка — что именно означает та или иная команда.

**Какое из утверждений о псевдокоде является верным согласно изученным материалам?**
- Это язык, введенный в 1985 году исключительно для записи программ на ЭВМ.
- Это графическое изображение алгоритма с помощью линий связи.
- Это смесь естественного разговорного языка и школьного алгоритмического языка. — верно
- Это формальный язык, исполнителем которого всегда является компьютер.
> Псевдокод занимает промежуточное положение между формальным языком и обычной речью.

**Что определяет «синтаксис» языка программирования?**
- Порядок выполнения программы компьютером.
- Правила построения правильных конструкций из символов алфавита. — верно
- Набор всех допустимых букв, цифр и знаков языка.
- Смысловое содержание каждой отдельной команды.
> Синтаксис — это формальные правила «правописания» и структуры кода в языке.

## Ключевые термины

- **Словесное описание** — Запись алгоритма в виде набора предписаний на обычном разговорном языке.
- **Построчная запись** — Запись алгоритма на естественном языке, при которой каждое предписание записывается с новой строки, шаги нумеруются, а исполнение происходит в порядке возрастания номеров шагов.
- **Блок-схема** — Графическое изображение порядка выполнения алгоритма: предписания — геометрические фигуры (блоки), последовательность шагов — соединяющие их линии связи.
- **Язык программирования** — Формальный язык для записи компьютерных программ; характеризуется алфавитом, синтаксисом и семантикой.
- **Псевдокод** — Способ записи алгоритмов — смесь естественного разговорного языка и школьного алгоритмического языка.

## Итог

- Основные способы записи алгоритмов: словесные (словесное описание и построчная запись), графические (блок-схема) и языки программирования; у каждого — свои плюсы и минусы.
- Алгоритм состоит из функциональных операторов (преобразуют информацию) и логических (определяют направление действий) — А. А. Марков.
- Построчная запись: каждое предписание с новой строки, шаги нумеруются, исполнение по возрастанию номеров.
- Блок-схема: начало/конец, данные, обработка (одна входящая и одна выходящая линия), принятие решения (две выходящие); линии вниз и вправо без стрелок, вверх и влево — со стрелками.
- Язык программирования = алфавит + синтаксис + семантика; школьный алгоритмический язык (А. П. Ершов, 1985) со служебными словами алг, нач, кон; псевдокод — смесь русского и алгоритмического языка.

## Шпаргалка

**Способы записи:** словесное описание (просто, но неоднозначно) → построчная запись (строки пронумерованы, исполнение по номерам) → блок-схема (наглядно, но громоздко) → язык программирования / псевдокод (строго, для компьютера).

**Операторы (Марков):** функциональные — преобразуют информацию; логические — направляют.

**Блок-схема:** начало/конец; данные (ввод/вывод); обработка (действие); принятие решения (ромб, условие, 2 выхода); комментарий. Линии вниз/вправо — без стрелок, вверх/влево — со стрелками.

**Язык программирования:** алфавит (символы) + синтаксис (правила построения) + семантика (смысл).

**Школьный алгоритмический язык** (Ершов, 1985): служебные слова **алг**, **нач**, **кон**. **Псевдокод** — смесь русского и алгоритмического языка.

**Переливания** $12/8/5$: $12/0/0 \to 4/8/0 \to 4/3/5 \to 9/3/0 \to 9/0/3 \to 1/8/3 \to 1/6/5 \to 6/6/0$.

## Любопытное

- Идея делить все команды алгоритма на «действия» и «развилки» принадлежит советскому математику А. А. Маркову (младшему): его исследования середины XX века показали, что двух видов предписаний хватает для любого алгоритма.
- Школьный алгоритмический язык — с русскими словами алг, нач, кон — придумал академик А. П. Ершов в 1985 году; он же добился, чтобы информатика появилась в школах нашей страны.
