Как составить алгоритм на компьютере
Не спешите скачивать, давайте проведем маленькую лекцию по этим же блок-схемах.
Блок-схема это графическое отображение решения задачи (важно запомнить).
И так, буду объяснять как программист программисту, по моему мнению блок-схемы можно использовать когда алгоритм не реально держать в голове (10-20 if else) вот тогда то и приходит такая мысль как записать это, в тот же блокнот, или на бумаге, что вполне приемлемо и ничего такого здесь нет. В нашем случае давайте использовать блок-схемы.
Обозначения
Такой овал обозначает обычно начало и конец, к примеру <?php и ?>.
Данный блок обозначает объявление переменных. Если у вас сильно типизированный язык программирования то этот блок обычно всегда есть в ваших программах, лично я использую слабо типизированные что позволяет мне объявить тип и название переменной сразу при присваивании её какому-то значению.
Собственно вывод результат на экран или продолжение следующего действия.
Ну, и наконец, наше условие ради чего мы здесь и собрались. Может принимать только true or false.
А теперь запускаем yEd
file -> new
По средине будет наша блок-схема, а вот справа отображены наши элементы которые нам будут нужны.
Перетаскивать элементы можно справа на белый лист, что бы провести стрелочку нужно: на элемент, который стоит по средине нажать и отвести мышку от него, при этом в поле edge types можно выбрать тип стрелочки. Вот так у меня получилось реализовать авторизацию пользователя на сайте в помощью блок-схемы:
Заняло у меня это 5 минут. Но за то теперь я точно знаю что и как мне нужно будет делать. А когда программа сложная то сделав блок-схему уже можешь сразу писать код и не заглядывая туда, т.к. только что сам написал эту программу, но визуально!
Вообщем блок-схемы это круто!
О песочнице
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
Алгоритмирование - наука о создании алгоритмов и процессов, важнейшая компонента структурного программирования. Без алгоритмов не обойдется составление бизнес-плана, разработка приложения для мобильного или компьютерной игры. Умение создавать алгоритмы позволяет делать многие вещи многократно, с минимумом усилий, в автоматическом режиме.
Впервые слово «алгоритм» употребил один из создателей современной алгебры, мудрец и астроном Аль-Хорезми еще в 224 году н.э. в своих фундаментальных трудах. В его понимании алгоритм - инструкция, позволяющая решить задачу. Аль-Хорезми был уважаемым ученым среди своих коллег, и составление таких инструкций стало в математической среде нормой.
Важнейшую практическую и прикладную роль составление алгоритмов приобрело с появлением компьютеров. Огромные машины на электронных лампах были созданы с целью вычисления сложных выражений и решения задач. Компьютер мыслить творчески не умеет, понимая лишь указания (команды) в двоичном коде. Алгоритм в программировании - последовательность команд, ведущая к достижению результата.
Для того чтобы составить алгоритм, сначала нужно определить цель. Затем можно сформулировать своими словами (и записать на бумаге, пусть даже расплывчато), как этой цели достичь.
Основные черты алгоритма - краткость изложения, шаговая поэтапность, понятность исполнителю. Хороший пример алгоритма - кулинарный рецепт. Превратите ваше расплывчатое описание достижения цели в инструкцию, разбитую на конкретные действия, приближающие достижение цели. Команды должны быть ясными, возможными, не вызывающими вопросов, измеримыми. Например: «Возьмите 2 яйца. Варите их 10 минут в кастрюле. Очистите от скорлупы».
Для перевода алгоритма в программный код нужно максимально упростить его. Затем можно переписать его в «псевдокоде» - в этом языке все действия выполняются в стиле программирования, но человеческими, а не программными словами. По завершении псевдокод переводится в код на известном вам языке программирования, а сама программа компилируется (выполняется вычислительной машиной).
Пуск-остановка (терминатор) – элемент, отображающий вход или выход из внешней среды. Чаще всего используется в начале и конце программы.
Процесс – символ, отображающий выполнение операции (одной или нескольких), которая приводит: а) к изменению формы, значения или размещения информации; б) к определению, по какому направлению потока нужно двигаться.
Решение – элемент, показывающий функцию или решение переключательного типа, которая имеет один вход и два (или более) альтернативных выхода. После вычисления условий, которые определены внутри этого символа, может быть выбран только один из выходов.
Предопределенный процесс – символ, отображающий выполнение процесса, определенного в другом месте схемы. Может состоять из одной или нескольких операций.
Данные (ввод-вывод) – элемент, показывающий преобразование данных в определенную форму, которая пригодна для обработки (ввод) или для описания итогов обработки (вывод).
Граница цикла - символ, состоящий из двух элементов. Операции, которые выполняются внутри цикла (его начало и конец), размещаются между этими элементами.
Соединитель – символ для отображения входа в часть схемы и входа из другой части этой же схемы. Применяется, когда необходимо оборвать линию, а затем начать составление блок-схемы в другом месте.
Комментарий – элемент, используемый для более объемного описания какого-либо шага, процесса или ряда процессов.
Как разработать алгоритм, решающий сложную задачу? Многие считают, что для этого нужно «испытать озарение», что процесс этот не вполне рационален и зависит от творческой силы или таланта.
На самом деле решение любой задачи сводится к сбору информации о наблюдаемом объекте. Причем этот принцип применим как для решения самых сложных научно-исследовательских задач, так и для решения прикладных задач. Работа изобретателя напоминает не столько работу волшебника, сколько путешествие первооткрывателя по неизведанной территории. Главное качество хорошего изобретателя – умение собирать информацию.
Если вы хотите решить сложную задачу, собирайте информацию в самых разных направлениях. Ответив на следующие 20 вопросов, вы легко выстроите план работы над задачей.
Вопрос №1. Кто?
Начиная решать определенную задачу, составьте максимально длинный список людей, имеющих непосредственное отношение к ее решению. Выясните:
— кто в первую очередь заинтересован в ее решении?
— кто уже занимался решением этой или смежной задачи?
— кто определяет, хорошо задача решена или плохо?
— с кем можно советоваться по ходу решения задачи?
— кто может проверить решение?
— кто является автором статей в этой области?
Вопрос №2. Для чего?
Спросите себя несколько раз: «Почему я хочу решить эту задачу? Для чего это нужно?» Часто оказывается, что решение задачи A необходимо для того, чтобы решить задачу B, но при этом задачу B можно решить и другим путем. В этом случае, начиная думать над исходной задачей А, мы лишь теряем время.
Вопрос №3. Как?
Какими методами я буду руководствоваться, решая данную задачу? Как будет структурирован процесс ее решения? Есть ли готовые методологии, которые можно использовать?
Вопрос №4. Что?
Какие объекты присутствуют или подразумеваются в данной задаче? Нарисуйте их на бумаге и обозначьте стрелками всевозможные отношения между ними, связанные с данной задачей. Есть ли неучтенные или лишние объекты?
В каждый объект должны приходить и из каждого объекта должны исходить примерно одинаковое количество стрелок. В противном случае, как правило, мы либо упускаем важные связи между объектами, либо придаем неоправданно большое значение некоторым связям.
Вопрос №5. Когда?
Посмотрите на задачу с точки зрения времени. Выясните:
— как быстро должны работать отдельные блоки алгоритма?
— какие внешние факторы, связанные со временем, могут повлиять на их работу?
— сколько времени есть у вас на разработку, программирование и тестирование алгоритма?
Вопрос №6. Где?
Посмотрите на задачу с точки географической точки зрения. Ответьте на вопросы:
— где, в каких странах, городах, районах будет использоваться ваше решение?
— на каких компьютерных платформах оно будет работать?
— какие еще вопросы, связанные с месторасположением и географией, имеют отношение к данной задаче?
Вопрос №7. Что было?
Какие решения данной задачи существовали год, два, десять, сто лет назад? Ни одна задача не возникает на пустом месте – скорее всего, люди уже справлялись с этой проблемой в прошлом. Интересно и полезно бывает узнать, как именно это происходило.
Вопрос №8. Что есть?
Какие решения этой задачи существуют и используются сегодня? Выясните это и добейтесь четкого понимания альтернативных решений, доступных уже сейчас.
Вопрос №9. Что будет?
Как будут решать эту же задачу люди через три, пять, десять, сто лет? Определите этот тренд хотя бы приблизительно, подумайте над этой темой, пофантазируйте.
Прекрасно, если алгоритм, над которым вы сейчас работаете, будет частью долговременного тренда, а не устареет морально через год после реализации.
Вопрос №10. Частью чего является?
Частью какой более масштабной задачи (или системы) является данная задача? А частью чего является эта более масштабная система?
Вопрос №11. Из чего состоит?
Какие более мелкие подзадачи являются частью исходной задачи? На какие части можно разбить исходную задачу? А на какие еще более мелкие части можно разбить подзадачи?
Вопрос №12. На что похоже?
На что похожа данная задача? В данном случае ассоциации могут быть сколь угодно длинными и метафоричными, и это даже хорошо. Прекрасно, если вы найдете сходное явление в совершенно другой области человеческой деятельности.
Это очень мощный вопрос. Именно на аналогиях между совершенно неожиданными областями знания находятся самые красивые и гармоничные решения.
Вопрос №13. Что вижу?
Визуализируйте задачу, ее решение и все его компоненты. Нарисуйте их. Побудьте ребенком (или дизайнером), найдите наиболее подходящие цвета (даже для виртуальных, абстрактных объектов). Прочувствуйте визуальную гармонию этой задачи или найдите «некрасивые», проблематичные места, если такие есть.
Вопрос №14. Что слышу?
Это очень сложный и полезный вопрос, поскольку та мощнейшая часть мозга, которая отвечает за обработку звуковой информации, у большинства современных людей слаборазвита. При этом я знаю гениальных ученых и инженеров, которые именно «слышат» решение той или иной задачи.
Итак, постарайтесь «услышать» взаимодействие всех элементов задачи (для этого удобным бывает закрыть глаза), услышать характерные звучания ее элементов. Услышьте разговоры и тембры голосов людей, применяющих решение вашей задачи на практике.
Вопрос №15. Что чувствую?
Этот вопрос также может показаться необычным, хотя и не в такой степени, как предыдущий. Ощутите тактильные, температурные, вкусовые, дыхательные ассоциации, вызываемые данной задачей. Некоторые решения могут показаться «крепкими», в то же время как другие «холодными» или даже «горькими».
Подключите часть вашего мозга, отвечающую за ощущения, к анализу задачи. Конечно, это нестандартный путь анализа научной информации, но он также бывает полезным.
Вопрос №16. Каким может быть идеальное решение?
Пофантазируйте, как можно решить эту задачу в идеале; придумайте что-то совершенно невероятное — чем невероятнее, тем лучше. На этом принципе построен метод «мозгового штурма», когда предлагаются любые, даже самые неожиданные решения.
Представьте себе, что у вас нет границ, а условия работы самые благоприятные. Что бы вы могли сделать в этой ситуации?
Как можно было бы сделать решение этой задачи совершенно великолепным?
Вопрос №17. Почему все закончится неудачей?
Побудьте брюзгой и пессимистом-критиком. Найдите все причины, из-за которых у вас не получится решить эту задачу; а также все организационные проблемы, которые приведут к провалу этого проекта. Тщательно их запишите — чем больше, тем лучше.
Когда вы выйдете из состояния критики, записанное станет бесценной информацией о тех опасностях, которые поджидают вас на пути решения задачи, и от которых следует уклониться.
Вопрос №18. В чем польза для меня?
Какие выгоды лично вы извлечете из решения данной задачи? Чему научитесь? Сколько заработаете? Какие важные связи и контакты приобретете? Как улучшите свою репутацию?
Вопрос №19. В чем польза для других?
Какую именно пользу от решения этой задачи получит заказчик, клиент, тот человек, который будет пользоваться результатами вашего труда? Имеет ли решение вашей задачи большое значение для него?
Вопрос №20. В чем польза для общества?
Как повлияет решение вашей задачи на все общество, в котором мы живем? Будет ли она общественно-значимой? Чем и как она поможет всему человечеству в целом?
Уверен, что ответив на все эти вопросы, вы узнаете намного больше о той задаче, которая перед вами стоит. Причем, почти наверняка, вы увидите эту задачу с самых неожиданных сторон — и ваша фантазия сама подскажет вам необычные, надежные, красивые и гармоничные способы ее решения.
Конечно, ответы на эти вопросы не всегда приводят к получению окончательного решения. Существует много других способов, методов, которые помогают найти элегантное решение сложной задачи.
И все же я уверен, что вы ощутимо улучшите свою скорость и качество решения алгоритмических задач, если используете эти 20 опорных вопросов в своей научно-исследовательской и инженерной деятельности.
Читайте также: