И так, я чуть было не совершил такую же ошибку которую делают все авторы курсов, будь то видео или текстовых статей. Все они приступают к разбору кода, сразу и с места, поехали. Да, порой, это, кажется, хорошо, но потом начинают всплывать подводные камни, если вы до этого не сталкивались с программированием всерьез. Давайте будем одними из немногих кто исправит эту ситуацию.
Мы с вами уже говорили, что код является не единственным способом представления программы. Я бы даже сказал, что это не всегда лучший. Имея богатый опыт в чтении чужого говнокода, который появился после нескольких лет помощи своим одногруппникам и вовсе почти всем подряд кто обращался, мне дается это не так сложно, как остальным, но приятного в этом все равно мало. Дело в том, что у каждого свой стиль, и парой читать чужой код оказывается невыносимо, особенно если видишь кучу неудачных костылей и велосипедов, которым там не место. А также, мы с вами уже говорили, что программа, одна и та же не зависит от языка, язык это лишь способ ее реализации.
Кто внимательно читал прошлые статьи уже понял, что сегодня мы подробно поговорим об алгоритмах.
Освежим наши знания:
Алгоритм - это последовательность действий направленная на достижение конкретного результата.
Я считаю это, пожалуй, самым точным и одновременно коротким определением алгоритма, без лишних слов и "усложнений".
Мотивирующая предыстория
В 3-4 классах начальной школы, у меня был предмет информатики, когда я узнал об этом и думал, что получу доступ к ПК, радости не было придела, но я еще никогда так не ошибался. К ПК нас конечно же не пустили, но чем заниматься на информатики без ПК? Вы не поверите, но самым настоящим программированием. Мы создавали те самые алгоритмы, по которым пишутся программные коды. Конечно, наши задачи были простыми и понятными. Необходимо было написать программу для робота, который должен достать колбасу из холодильника, но повторюсь это был 3-4 класс. Сейчас мне больно, когда я слышу, что кто-то учит/учил в 10-11 классах, на уроках информатики, как работать с Microsoft Word/Excel/Power Point. Стоит запомнить, что это инструмент секретарей, крутые ребята вроде нас, в идеале должны работать с другими инструментами, но об этом как-нибудь в другой раз. Самое обидное тут то, что это является обязательным минимумом, который должен быть получен на уроках информатики, не зависимо от того есть у тебя умственная отсталость или нет. (Прости)
Я считаю это крайней степени неприемлемо. Моя практика показала, что и в 8-10 лет можно составлять алгоритмы, решающие конкретные задачи, не говоря уже о 18-цати летних подростках в выпускных классах.
Что такое алгоритм мы вспомнили, но как его представлять? В отчетах алгоритм записывается по пунктам, он обязан иметь начало и конец, но они не должны нумероваться, а каждый пункт (которые уже должны нумероваться) описывает какое-то действие.
Начало
1. Встать
2. Пойти на кухню
3. Открыть дверцу холодильника
4. Взять колбасу
5. Закрыть дверцу холодильника
Конец
Примерно так выглядел один из многих алгоритмов из моего детства. Ничего сложного, правда? По-хорошему, перед написанием алгоритма нужно установить задачу, которую он будет решать и определить входные данные, если они имеются. С задачей думаю все ясно, это поможет нам понять для чего этот алгоритм. Но зачем определять данные? Дело в том, что в программировании существуют разные типы данных, которые в абстрактном представлении, в алгоритме могут ничем не указывать на их специфику. Это может быть важно, а может и нет. (Но чаще да, чем нет) Допустим в алгоритме выше, у нас была колбаса, но не сказано какая именно. Давайте изменим условие.
Задача: Написать алгоритм для робота, который достанет молочную колбасу из холодильника на кухне. Известно, что робот находится в зале, сидит. В холодильнике может быть колбаса, докторская, молочная, ливерная.
Мы получили серьёзное осложнение, вызванное тем, что теперь надо достать конкретную колбасу. Можно было бы подумать, что алгоритм изменится лишь в 4 пункте. Припиской достать молочную колбасу. В какой-то степени ход ваших мыслей верен, но вы продолжаете думать как человек, опуская некоторые не мало важные факторы. Например, когда человек берет красный шарик, среди разноцветных, он, казалось бы, просто берет красный шарик. А теперь давайте взглянем на ситуацию глазами дальтоника. Ситуация изменилась, не правда ли? Теперь нам нужно определить какой из них красный. На самом деле, человек делает это не произвольно, определяет цвет. С типом колбасы, все примерно так же, чтобы ускорить работы мы можем пользоваться второстепенными факторами, упаковка, цвет самой колбасы, наши знания о том где она лежала, в каком состоянии была (открыта или нет). Наш робот так не умет, и мы должны научить его хотя бы базовым принципам. Предположим, что из инструментария, который в нем заложен, есть навыки чтения, а на колбасе написано, какая она. Давайте перепишем алгоритм, согласно тому что мы только что усвоили.
Начало
- Встать
- Пойти на кухню
- Открыть дверцу холодильника
- Взять колбасу
- Прочесть название на этикетке
- Если колбаса НЕ молочная перейти к пункту 4
- Закрыть дверцу холодильника
Конец
Внезапно, вы воспользовались новым серьезным инструментом, называемым ветвлением.
Форма организации действий, при которой в зависимости от выполнения или невыполнения некоторого условия совершается либо одна, либо другая последовательность действий, называется ветвлением.
И другой не маловажный "инструмент” - цикл.
Цикл - это набор команд, выполняющийся два и более раз, в зависимости от условия.
Ветвление есть часть любого цикла, потому что мы либо повторяем его, либо нет. Давайте что бы убедиться, я покажу, где начинается цикл. Его начало находится в пункте 4, а конец в пункте 5. Именно пятый пункт является последней операцией именно цикла, 6 является условием цикла, и находится вне его тела. Это условие и обеспечивает ветвление. Что касается самого алгоритма, то он будет крутиться от пункта 4 до пункта 6 до тех пор, пока не будет взята нужная колбаса, после робот закроет дверцу.
А теперь давайте добавим интерактивности нашему роботу, сделаем из него доставщика колбасы. Допустим мы сидим на диване, в зале, и нам захотелось колбаски. Но наш робот умеет лишь брать ее, но он не несет ее обратно, это поправимо. Куда хуже тот факт, что он может принести лишь один вид колбасы, а если мы не хотим молочную? Появилось желание добавит ему возможность выбора? Значит вы на правильном пути. Но как нам это сделать? Как бы то ни было, этот процесс будет передачей информации от нас, роботу. А значит, это так называемый ввод. Нам известно, что наш робот умеет читать. Давайте воспользуемся этим. Мы будем писать ему на бумаге, какую колбасу принести, а он будет читать и уходить за ней. Стоит помнить, что мы пишем программу для робота, и все операции будут от его лица. Поэтому показывать бумажку с названием колбасы будем мы, а читать, будет он. Прежде чем мы будем писать алгоритм, стоит понять, что в этот раз ему нужно помнить какую колбасу, попросили взять, при этом значение ее будет меняться. (Каюсь, вам сложно потому, что я не рассказал о переменных и константах)
Переменная, это некоторое хранилище, которое может сохранять в себе значение и менять его. Константа же, всегда имеет одинаковое значение. Это прям как в математике/физике, есть переменные x,y,z , а есть константы e, pi, g
Помните я говорил про определение входных данных, буквально немного выше? Время пришло.
Входные данные:
Kolbasa - переменная хранящая тип колбасы.
Начало
- Встать
- Прочесть название нужной колбасы на бумажке
- Сохранить его в kolbasa
- Пойти на кухню
- Открыть дверцу холодильника
- Взять колбасу
- Прочесть название на этикетке
- Если тип колбасы НЕ совпадает с kolbasa, перейти к пункту 6
- Закрыть дверцу холодильника
- Пойти в зал
- Отдать колбасу
Конец
Новые пункты были помечены жирным
Как вы уже могли заметить, алгоритм, очень точно определяет последовательность действий, необходимых для достижения цели. Хотя в нашем случае, многое опускается, например перестановка ног при ходьбе, или манипуляция руками при открытии дверцы. И многое другое. Мы позволили себе это, потому что робот сам брал на себя реализацию этих действий, нам достаточно было сказать ему, иди туда и он шел, открыть это, и он открывал. Это вполне нормальная ситуация, когда некоторые действия уже реализованы в фреймворке или платформе с которой мы работаем, мы обязательно вернемся к этому, когда начнем писать программы на языке С++.
Думаю, на сегодня достаточно, особо внимательные читатели, наверное, уже заметили, что это лишь один из двух способов описания программы, о которых я говорил. О втором, а именно блок схемах мы поговорим в следующей статье, а на сегодня думаю достаточно, помещать их сюда усложнит восприятие слишком большим потоком новой информации. Подводя итог, можно сказать, что сегодня мы узнали, как выглядят алгоритмы, поняли, что с их помощью можно “представлять программы”. Узнали о циклах и ветвлениях. К этому всему мы обязательно вернемся и поговорим в новом разделе, алгоритмизации.