Алгоритм - основа для программы

Что такое алгоритмы и с чем их едят?

Если бы все программисты в мире провели голосование на тему "какое слово в программировании самое главное?", то победу с большим отрывом одержал бы термин "алгоритм". Ведь по сути все программирование - это описание алгоритмов на языке, понятном компьютеру.

Алгоритм - конечная последовательность действий, приводящая к решению поставленной задачи.

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

Например, если мы идем в поход за покупками, то мы действуем по следующему алгоритму:

  1. придти в магазин;
  2. обойти все стелажи и положить в корзину предмет, если он есть в списке покупок;
  3. оплатить выбранные товары на кассе;
  4. вернуться домой.

Тогда причем тут программирование? Дело в том, что именно такие задачи, которые можно четко описать в виде последовательности действий, нам чаще всего и хочется автоматизировать, а значит написать программу (и/или собрать робота), которая будет решать такую задачу за нас.

Например, сотрудника кофейни, который всегда готовит кофе по фиксированному алгоритму, иногда заменяют на большой кофейный автомат, который выполняет этот алгоритм за бариста, пока он отдыхает.

Управление дорожным движением можно поручить системе сфетофоров, а решение квадратного уравнения (посчитайте дискриминант, затем, если он неотрицателен, вычислите корни по заданной формуле) - программируемому калькулятору.

Всегда, прежде чем создавать компьютерную программу, нам придется сформулировать, по какому алгоритму она будет работать. Нет алгоритма - нет программы.

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

Окей, мы поняли, что такое алгоритм. Теперь, предположим, что мы придумали какой-то алгоритм. Как объяснить его вашему другу (например, как настраивать проброс портов на роутере для сервера в майнкрафте) или бабушке (как отправить письмо по электронной почте)? А самое главное, как объяснить его компьютеру?

Для этого алгоритм нужно как-то записать. И сделать это можно по-разному.

Существует три основных способа записи алгоритма:

  • словами (используя естественный язык);
  • графически (например, используя блок-схему);
  • с помощью языка программирования.

Чаще всего в обычной жизни мы объясняем алгоритмы словами, но у этого есть свои минусы. Если вы когда-нибудь читали инструкции от настольных игр, то знаете, что их не всегда легко понять. Это происходит потому, что текст на естественном языке (т.е. том, который используют люди для общения между собой) - это далеко не самый лучший способ задания алгоритма: в нем легко запутаться, могут возникать неоднозначные команды, а совершенно разные вещи могут называться одинакого (это я про омонимы).

Это являние демонстрируется следующим анекдотом:

Жена отправляет мужа-программиста в магазин:

  • Купи батон хлеба, если будут яйца - возьми десяток.

Муж возвращается из магазина с десятью батонами.

  • Ты зачем столько хлеба купил?

  • Так ведь яйца были...

Такая неоднозначность, которая легко может возникнуть при описании алгоритма с помощью естественного языка, может запросто напутать компьютеру все карты.

У этой проблемы есть несколько решений, например, использование блок-схемы или формализованного языка (для компьютера - одного из существующих языков программирования).

Блок-схема и основные блоки в ней

Блок-схема - это способ записи алгоритма в графическом виде. Блок-схемы всегда начинаются с круглого блока "начало" и заканчиваются блоком "конец" (это важно, бесконечных алгоритмов не бывает!). Между ними в квадратных блоках одно за другим записываются действия, которые нужно выполнить.

Например, блок-схема плана на вечер может выглядеть так.

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

Эти операции называются выводом и вводом данных, для них в блок-схеме используются специальные блок - параллелограм и "пуля".

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

Переменная - именованная ячейка в памяти компьютера.

Представьте себе большой стеллаж (очень большой), на полках которого стоят маленькие коробки. На каждой коробке подписано ее имя. Стеллаж - это оперативная память компьютера, а коробка - это переменная.

Мы можем хранить в переменных произвольные значения, например, строки или числа.

Оператор присваивания

Если у нас есть переменная, нам нужно уметь сохранять в нее значения. Для этого во всех языках программирования существует операция, которая называется присваивание. Эта операция обычно обозначается знаком = (вместо математического равенства используется ==) .

Присвоить значение переменной - это тоже самое, что положить это значение в переменную.

Арифметические операции

В блок-схеме вам доступны все стандартные математические операции. Они перечислены ниже.

a = 10  # теперь в переменной a лежит число 10
b = 20  # а в переменной b лежит число 20

a = a + 5  # a теперь равно 15
a = a + b  # a равно 35
a = a - 20 # a равно 15
a = a * 2  # a равно 30
a = b / 2  # a равно 10.0
b = a % 4  # b равно 2, этот оператор возвращает остаток от деления
a = a // 3 # целочисленное деление, а рано 3 
b = b ** 3 # возведение в степень, b равно 8

Отличие строк и чисел

Предположим, что у нас есть переменная a. Как при выводе или присваивании отличить ее от буквы а? Чтобы не возникало путаницы, на блок-схемах (а затем и в программах) все строки и буквы пишутся в кавычках, а имена переменных без кавычек.

Условный оператор

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

В качестве условия в условном операторе может выступать любое арифметическое выражение или несколько выражений, объединенных операторами и и или.

В условии можно использовать следующие операции сравнения:

  • > - больше, например a > b;
  • < - меньше, например a < 45;
  • <= - меньше или равно, например a <= 45;
  • >= - больше или равно, например a >= b;
  • == - равно, например a == b - 5;
  • != - неравно, например a != 15.

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

Эта задача решается вот так:

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

Еще можно попробовать попросить пользователя ввести 4 числа и вывести сумму двух наименьших - это немного сложнее.