Зарегистрированная негосударственная некоммерческая организация свидетельство № 1052p

Статьи

Алгоритмическое мышление: шаг до программирования

12 мин чтения

Разбиение задачи на части, шаблоны и абстракция, условия и циклы, псевдокод и блок-схемы, простые задачи и ручная проверка — с примерами и упражнениями.

Многие начинают изучать программирование с установки какого-нибудь языка и останавливаются на первой же ошибке. На самом деле главный навык программиста — не написание кода, а умение превратить задачу в чёткие шаги, которые способен выполнить компьютер. Этот навык называется алгоритмическим мышлением. Он нужен раньше любого языка и остаётся с вами, даже если вы смените язык. В этой статье разберём, что такое алгоритм, как разбивать задачу на части (декомпозиция), находить шаблоны и пользоваться абстракцией, как писать пошаговые инструкции — на бытовых примерах: рецепт плова, утренний распорядок и очередь в магазине. Затем изучим условия и повторения, псевдокод и блок-схемы, разберём поиск наибольшего числа, поиск в списке и идею сортировки, потренируемся проверять алгоритм «вручную». В конце — частые ошибки, практические упражнения и контрольный список. Компьютер не обязателен: достаточно бумаги и ручки.

Что такое алгоритм и зачем он нужен

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

  1. Точность. Каждый шаг понимается одинаково. «Посолите по вкусу» — достаточно для человека, но не для компьютера.
  2. Порядок. Ясно, в какой последовательности выполняются шаги. Сначала кипятят воду, потом заваривают чай, а не наоборот.
  3. Конечность. Алгоритм когда-нибудь заканчивается. В шаге «помешивайте, пока не будет готово» должно быть понятно, что значит «готово», иначе процесс будет длиться бесконечно.
  4. Результат. В конце есть конкретный ответ или состояние: плов готов, наибольшее число найдено, список отсортирован.

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

Четыре основных приёма: декомпозиция, шаблоны, абстракция, алгоритм

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

Декомпозиция — разбить большую задачу на части

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

Поиск шаблонов

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

Абстракция — выделить главное

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

Алгоритм — выстроить шаги по порядку

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

Алгоритмы в повседневной жизни

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

Рецепт плова

Рецепт — готовый алгоритм. Попробуем записать его точнее (количества условные):

  1. Поставьте казан на огонь и раскалите масло.
  2. Положите мясо и обжаривайте, пока оно не подрумянится.
  3. Добавьте лук и жарьте до золотистого цвета.
  4. Добавьте морковь и жарьте, пока она не станет мягкой.
  5. Влейте воду, посолите, добавьте специи и немного поварите зирвак.
  6. Ровным слоем выложите промытый рис и проверьте, что вода чуть выше риса.
  7. Держите сильный огонь, пока вода не выкипит.
  8. Соберите рис горкой, накройте крышкой, убавьте огонь и дайте дойти.

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

Утренний распорядок

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

Очередь в магазине

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

Условия и повторения

Условие: если … иначе

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

ЕСЛИ идёт дождь
    взять зонт
ИНАЧЕ
    выйти без зонта

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

Повторение: цикл

Цикл — выполнение действия несколько раз. Есть два основных вида:

  • Цикл со счётчиком — заранее известно, сколько раз повторять: «для каждого гостя поставь тарелку» (число гостей известно).
  • Цикл с условием — продолжается, пока условие не выполнится: «жди, пока закипит чайник».
ДЛЯ КАЖДОГО гостя
    поставить тарелку
    положить ложку

ПОКА чайник не закипел
    ждать

Главный вопрос в цикле с условием: закончится ли он обязательно? Если условие никогда не меняется (например, чайник не поставили на огонь), цикл будет длиться бесконечно. В программах это частая причина «зависания».

Переменная — «коробка» для значения

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

Псевдокод и блок-схема

Есть два удобных способа записать алгоритм — и ни один из них ещё не язык программирования.

Псевдокод

Псевдокод — алгоритм, записанный обычным языком, но в строгой структуре. В нём используются ключевые слова ЕСЛИ, ИНАЧЕ, ПОКА, ДЛЯ КАЖДОГО и строки с отступом. Правила простые:

  • в каждой строке одно действие;
  • действия внутри условия или цикла пишутся с отступом;
  • вместо расплывчатых слов («немного», «по вкусу») — точное условие или число (пусть даже условное);
  • начало и конец хорошо видны.

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

Блок-схема

Блок-схема — это рисунок алгоритма. Основные фигуры:

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

Быстрее всего нарисовать блок-схему на бумаге. Если хотите сделать это на компьютере, воспользуйтесь бесплатным сервисом diagrams.net (draw.io) и фигурами из раздела Flowchart: фигуру перетаскиваете с левой панели, а стрелку тянете от края одной фигуры к другой. Цикл на блок-схеме виден по стрелке, которая возвращается назад — к верху ромба. Если из ромба есть стрелка назад, но нет выхода, значит, цикл бесконечный.

Простые задачи: наибольшее число, поиск, сортировка

Теперь применим изученное к классическим задачам. Числа условные.

Поиск наибольшего числа

Задача: учительница Нилуфар получила список баллов учеников за тест (например, 7, 12, 9, 15, 11) и хочет найти самый высокий. Человек найдёт его с одного взгляда, но что, если в списке пятьсот чисел? Алгоритм:

наибольшее = первое число списка
ДЛЯ КАЖДОГО числа в списке
    ЕСЛИ число > наибольшее
        наибольшее = число
показать наибольшее

Идея простая: принимаем первое число за «пока наибольшее» и по очереди сравниваем с ним остальные. Если попадается большее, запоминаем его. Почему начальное значение — первое число, а не 0? Потому что если в списке только отрицательные числа, 0 даст неверный ответ. Эта маленькая деталь — и есть алгоритмическое мышление.

Поиск

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

Если список отсортирован по алфавиту, есть способ быстрее — поиск делением пополам. Так мы ищем слово в словаре: открываем середину, понимаем, нужное слово раньше или позже, и отбрасываем половину. С каждым шагом область поиска сокращается вдвое. Но этот способ работает только в отсортированном списке — вот почему сортировка так важна.

Идея сортировки

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

  1. Найдите среди всех карандашей самый короткий и положите его слева.
  2. Из оставшихся снова найдите самый короткий и положите рядом.
  3. Повторяйте, пока карандаши не закончатся.

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

Проверка алгоритма «вручную»

Алгоритм написан — но правильный ли он? Самый надёжный способ — выполнить его самому вместо компьютера, шаг за шагом на бумаге. Это называется трассировкой с таблицей.

Проверим алгоритм поиска наибольшего числа на списке 7, 12, 9, 15, 11:

Шагчислочисло > наибольшее?наибольшее
Начало——7
17нет7
212да12
39нет12
415да15
511нет15

Ответ: 15. Верно. Теперь проверьте граничные случаи — ошибки прячутся именно там:

  • Список из одного элемента (например, только 5) — ответ должен быть 5.
  • Все числа одинаковые (4, 4, 4) — ответ 4.
  • Только отрицательные числа (−3, −8, −1) — ответ −1. Когда мы брали начальное значение 0, ошибка появлялась именно здесь.
  • Пустой список — что сделает алгоритм? Этот случай нужно рассмотреть отдельно: вывести сообщение «список пуст».

Ошибку в программе по-английски называют «bug», а её поиск и исправление — отладкой (debugging). Ручное выполнение — первый и самый простой способ отладки: его можно делать без компьютера и ещё до написания программы.

Частые ошибки

  • Неточный шаг. «Подожди сколько нужно», «добавь немного». Компьютер этого не поймёт. Формулируйте каждый шаг так, чтобы его можно было измерить.
  • Ошибка порядка. Забывают задать значение до его использования: «наибольшее» ещё не определено, а сравнение уже началось.
  • Бесконечный цикл. Внутри цикла нет действия, которое меняет условие. Для каждого цикла с условием спрашивайте: «что его остановит?»
  • Ошибка на единицу. Цикл выполняется на один раз больше или меньше: например, последний элемент списка остаётся непроверенным. Трассировка с таблицей быстро это покажет.
  • Забытые граничные случаи. Пустой список, один элемент, отрицательные числа, одинаковые значения.
  • Спешка с кодом. Если мысль не ясна, код тоже будет запутанным. Сначала псевдокод или блок-схема, потом код.
  • Попытка решить всё одним большим шагом. Не забывайте о декомпозиции: если трудно, значит, шаг всё ещё слишком большой.

Практические упражнения и контрольный список

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

  1. Заварить чай. Запишите заваривание чая как алгоритм минимум из 8 шагов. Пусть в нём будет хотя бы одно условие («если в чайнике нет воды») и один цикл с условием («жди, пока закипит»).
  2. Утренний распорядок. Запишите свой утренний распорядок и добавьте два условия, зависящих от погоды и дня недели.
  3. Наименьшее число. Измените алгоритм «наибольшего числа» так, чтобы он находил наименьшее. Проверьте его вручную на списке 6, 2, 9, 2, 5.
  4. Подсчёт. Напишите алгоритм, который считает, сколько учеников в списке баллов (условно: 7, 12, 9, 15, 11, 10) получили 10 и больше. Переменная-счётчик должна начинаться с 0.
  5. Поиск. Напишите алгоритм последовательного поиска, который определяет, есть ли в списке имён «Азиз». Учтите и случай, когда имя не найдено.
  6. Проверка на друге. Напишите инструкцию, как сложить бумажный самолётик, и дайте её другу. Пусть он делает только то, что написано. Где он ошибся — тот шаг и написан неточно.

Упражнения можно также собрать из блоков в бесплатной визуальной среде Scratch (scratch.mit.edu): блоки «if», «repeat», «repeat until» там точно соответствуют условиям и циклам, которые вы записали на бумаге.

Контрольный список

  • Задача разбита на небольшие понятные части.
  • Каждый шаг точный и понимается однозначно.
  • Шаги идут в правильном порядке, значения заданы до использования.
  • В каждом условии рассмотрены варианты «да» и «нет».
  • Каждый цикл обязательно заканчивается.
  • Алгоритм проверен вручную с таблицей.
  • Проверены граничные случаи: пустой список, один элемент, одинаковые значения.

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

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

Вернуться к статьям

Другие статьи

13 мин чтения

Знакомство с 1С: основы учётной программы

Что такое 1С:Предприятие, разница платформы и конфигурации, справочники, проведение документов, отчёты, резервная копия и упражнение для новичков.

Начните обучение сегодня

Набор в группы открыт. Оставьте заявку — наши специалисты свяжутся с вами и помогут выбрать подходящее направление.

Написать в Telegram