Коллега-стажёр спрашивает: как объяснить компьютеру, что нужно найти наибольшее из трёх чисел?

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

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

Допустим, коллега-стажёр спрашивает: «Как объяснить компьютеру, что нужно найти наибольшее из трёх чисел?» Вы отвечаете:

Ну, берём первое число. Если второе больше — берём второе. Потом сравниваем с третьим. Если третье больше — берём третье. Вот и всё.

Вроде бы понятно? А теперь представьте, что это описание читает другой человек — и у него сразу возникают вопросы. «Берём» — куда берём? В переменную? Выводим на экран? Запоминаем в голове? «Сравниваем с третьим» — с чем именно сравниваем третье число? С первым или с тем, которое «взяли» на предыдущем шаге? А если первое и второе одинаковые — что тогда?

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

Между этими крайностями существует золотая середина — псевдокод. А если хочется увидеть алгоритм целиком, как карту, — помогут блок-схемы. Об этих двух инструментах и поговорим. Псевдокод — это способ записать алгоритм так, чтобы он выглядел почти как программа, но без привязки к конкретному языку. Никаких точек с запятой, фигурных скобок или компиляции — только чистая логика.

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

ЕСЛИ / IF — проверка условия. ИНАЧЕ / ELSE — альтернативная ветка. ДЛЯ КАЖДОГО / FOR EACH — цикл по элементам. ПОКА / WHILE — цикл с условием. ВЫВЕСТИ / PRINT — вывод результата. Отступы показывают вложенность — какие строки относятся к какому блоку.

Посмотрим на примере. Допустим, у нас есть массив температур за неделю, и нужно найти самую высокую. Вот псевдокод:

максимум = первый элемент массива

ДЛЯ КАЖДОГО элемента В массиве:
    ЕСЛИ элемент > максимум:
        максимум = элемент

ВЫВЕСТИ максимум

Здесь нет ни int, ни Console.WriteLine, ни фигурных скобок — но логика кристально ясна. Мы берём первый элемент как кандидата на максимум, проходим по всем остальным, и если находим что-то больше — обновляем кандидата. К концу цикла в переменной максимум гарантированно окажется наибольшее значение.

А теперь переведём этот же алгоритм в C#. Представьте, что это температуры по дням недели:

int[] temperatures = { 18, 25, 12, 30, 22, 27, 19 };
int maxTemp = temperatures[0];

for (int i = 1; i < temperatures.Length; i++)
{
    if (temperatures[i] > maxTemp)
    {
        maxTemp = temperatures[i];
    }
}

Console.WriteLine($"Максимальная температура за неделю: {maxTemp}°");

Видите, как псевдокод один-в-один превратился в код? Каждая строка нашла свой аналог: «ДЛЯ КАЖДОГО» стало циклом for, «ЕСЛИ» — конструкцией if, «ВЫВЕСТИ» — вызовом Console.WriteLine. Перевод получился почти механическим — и в этом главная сила псевдокода. Вы один раз продумываете логику, а потом просто «одеваете» её в синтаксис нужного языка.

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

max = array[0]

FOR i = 1 TO array.length - 1:
    IF array[i] > max:
        max = array[i]

PRINT max

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

Вот ещё один пример посерьёзнее. Интернет-магазин начисляет скидку: если сумма заказа больше 5000 рублей — скидка 10%, если больше 10000 — скидка 20%. Сначала набросаем псевдокод:

ВВЕСТИ сумму заказа

ЕСЛИ сумма > 10000:
    скидка = 20%
ИНАЧЕ ЕСЛИ сумма > 5000:
    скидка = 10%
ИНАЧЕ:
    скидка = 0%

итого = сумма - (сумма * скидка / 100)
ВЫВЕСТИ итого

Обратите внимание на порядок проверок: сначала проверяем 10000, потом 5000. Это важно! Если поменять местами — заказ на 15000 рублей получит только 10% скидки, потому что условие сумма > 5000 сработает первым и программа не дойдёт до проверки на 10000. Псевдокод помогает поймать такие ловушки до того, как вы потратите время на написание и отладку кода.

А вот C#-версия:

Console.Write("Сумма заказа: ");
decimal orderTotal = decimal.Parse(Console.ReadLine());

int discountPercent;

if (orderTotal > 10000)
    discountPercent = 20;
else if (orderTotal > 5000)
    discountPercent = 10;
else
    discountPercent = 0;

decimal finalPrice = orderTotal - (orderTotal * discountPercent / 100);
Console.WriteLine($"Итого со скидкой {discountPercent}%: {finalPrice} руб.");

Тип decimal здесь выбран неслучайно — он предназначен для денежных вычислений. Тип double может давать ошибки округления: попробуйте как-нибудь вычислить 0.1 + 0.2 в double — результат вас удивит (спойлер: это не 0.3).

Псевдокод — отличный инструмент, но у него есть ограничение: когда в алгоритме много ветвлений, текст превращается в лапшу из вложенных «ЕСЛИ» и «ИНАЧЕ». Представьте пять уровней вложенности — даже с отступами в этом легко потеряться. В таких случаях помогают блок-схемы — визуальное представление алгоритма, где вы буквально видите, как течёт поток выполнения.

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

Овал — начало или конец алгоритма. Каждая блок-схема начинается и заканчивается овалом. Внутри обычно пишут «Начало» и «Конец» (или «Start» и «End»).

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

Ромб — условие. Внутри ромба записывается вопрос с ответом «да» или «нет». Из ромба всегда выходят ровно две стрелки — одна для «да», другая для «нет».

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

Построим блок-схему для простого, но классического алгоритма: определить, чётное число или нечётное.

Начало Ввести число n n % 2 == 0 ? Да Нет Чётное Нечётное Конец

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

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

Переведём блок-схему в C#:

Console.Write("Введите число: ");
int number = int.Parse(Console.ReadLine());

if (number % 2 == 0)
{
    Console.WriteLine($"{number} — чётное");
}
else
{
    Console.WriteLine($"{number} — нечётное");
}

Каждый элемент блок-схемы нашёл своё место в коде. Прямоугольник «Ввести число» стал строками с Console.ReadLine и int.Parse. Ромб с условием n % 2 == 0 превратился в конструкцию if. Два прямоугольника вывода — ветки if и else. Овалы «Начало» и «Конец» — это начало и конец метода, их отдельно писать не нужно. Окей, с базовыми вещами разобрались. Но у вас наверняка возник вопрос: а когда что использовать — псевдокод или блок-схемы?

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

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

// 1. Получить сумму заказа от пользователя

// 2. Определить процент скидки:
//    - больше 10000 → 20%
//    - больше 5000 → 10%
//    - иначе → 0%

// 3. Посчитать итоговую сумму

// 4. Вывести результат

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

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

В учебниках и документации вы встретите формальные стандарты блок-схем (ГОСТ, ISO 5807) — с параллелограммами для ввода-вывода, прямоугольниками со срезанным углом для подпрограмм и другими специальными фигурами. Знать об их существовании полезно, но в повседневной работе разработчики рисуют схемы неформально: на маркерной доске, в Miro, Lucidchart или даже на салфетке в кафе. Четырёх базовых фигур — овал, прямоугольник, ромб и стрелка — хватает для подавляющего большинства задач.

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

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

Блок-схема (flowchart) — графическое представление алгоритма с помощью геометрических фигур и стрелок. Четыре основных элемента: овал (начало/конец), прямоугольник (действие), ромб (условие с двумя выходами), стрелка (направление выполнения).

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

Перевод из псевдокода или блок-схемы в C# — почти механический: каждая конструкция (ЕСЛИ, ДЛЯ КАЖДОГО, ВЫВЕСТИ) имеет прямой аналог в языке (if, for/foreach, Console.WriteLine).

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

Все три способа помогают продумать логику до написания кода и сэкономить время на отладке.

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.