Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основные структуры алгоритмов: сравнительный анализ и примеры их использования ( Три ключевых структуры алгоритма )

Содержание:

ВВЕДЕНИЕ

Одним из основополагающих определений и понятий в информатике, алгоритмизации и программирования является понятие алгоритма.

Алгоритмом называют определенную последовательность команд, в результате исполнения которых человек или электронно-вычислительная машина (ЭВМ) имеет возможность решить поставленную перед ним задачу.

Цель данной работы – обзор основных структур алгоритмов, их сравнительный анализ и подробное изучение, включая примеры их использования. В данной курсовой работе будут рассматриваться три основные главы:

1. Три ключевых структуры алгоритма.

2. Сравнительный анализ трех основополагающих структур алгоритмов.

3. Некоторые примеры использования различных типов алгоритмов.

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

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

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

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

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

ГЛАВА I. ТРИ КЛЮЧЕВЫХ СТРУКТУРЫ АЛГОРИТМА

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

Для начала рассмотрим дискретность. Дискретность (от лат. discretus — разделённый, прерывистый. Дискретность — всеобщее свойство материи. Например, механические часы, передвигают минутную стрелку дискретно на 1/60 часть окружности) — алгоритм должен представлять процесс решения задачи как последовательное выполнение некоторых простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, то есть преобразование исходных данных в результат осуществляется во времени дискретно.[1]

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

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

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

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

К трем вышеперечисленным свойствам так же добавляется результативность. Результативность Завершение алгоритма определёнными результатами.[2] Так же результативность - означает, что выполнение алгоритма обязательно должно привести к решению поставленной задачи, либо к сообщению о том, что при заданных исходных величинах задачу решить невозможно. Алгоритмический процесс не может обрываться безрезультатно.

1.1 Линейный алгоритм

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


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


Не смотря на множество возможностей создания огромного количества самых сложных программ, большое количество языков программирования, различных требований к созданию компьютерных программ, алгоритмических структур всего несколько. Грамотно осознав и накопив опыт по работе с этим количеством алгоритмов, можно смело приступать к созданию компьютерной программы. Причем даже не столь важно, какой язык программирования использовать, синтаксис языка (его ключевые слова и правила оформления) всегда можно посмотреть в нужном справочнике, а вот общий алгоритм вашей собственной программы, принципы и пути взаимосвязей между алгоритмическими структурами в ней известны только вам, как автору, и никто вам здесь не помощник, ни справочники, ни база данных Интернета, только вы сами и ваши знания. Еще одно доказательство тому, что не существует программ с абсолютно одинаковым алгоритмом. Если сравнить между собой две одинаковые на первый взгляд программы, которые выполняют одни и те задачи, выполнены по одному и тому же заказу (техническому заданию - ТЗ), на входе получают одни и те же данные, а на выходе выдают одинаковые результаты, то все равно их внутренний алгоритм, внутреннее содержимое будет разное и зависеть оно будет только от индивидуальных особенностей автора-программиста[4]. Из чего можно сделать вывод, что создание программы для компьютера – это глубоко творческий процесс. Также как два художника срисовывая в природе одну и ту же лесную опушку, никогда не нарисуют одинаково.


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


1. Линейный алгоритм; 
2. Разветвленный алгоритм (ветвление); 
3. Алгоритмическая структура «Выбор»; 
4. Алгоритмическая структура «Цикл» (циклический алгоритм).


Язык Visual Basic не исключение, как член группы высокоуровневых языков программирования, в нем присутствуют все четыре вида алгоритмических структур. Рассмотрим подробнее самый простой вид алгоритма – линейный алгоритм.

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


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


Давайте вспомним примеры.

Пример с «Калькулятором» – программой, которая умела суммировать цифры и состояла лишь из поля ввода для переменной a, поля ввода для переменной b, кнопки «+», кнопки «=» и поля вывода результата. Или пример с выполнением домашнего задания, по информатике домашнее задание мы выполняли последовательно, у нас все для этого было: учебник по информатике, записи лекций с уроков, знания, вопросы домашнего задания и так далее.


Такая программа бы являлась самой простой, потому что построена она на самом простом алгоритме – линейном, других возможностей, кроме суммирования, она бы не имела. То есть процессор, после загрузки вел себя строго линейно – ожидал ввода первой цифры, потом второй, суммировал и выдавал какой-то результат[5]. Мы не предоставили возможности процессору повести себя как-то иначе. А что если бы наш «Калькулятор» умел бы не только суммировать, но и делить, например, a на b. Из правил арифметики мы знаем, что деление на 0 невозможно, но получилось бы так, что пользователь нашей программы в качестве делителя ввел ноль. Математическая операция невозможна, процессор бы вернул ошибку, а программа – неприятное сообщение. Как быть в этом случае? На это и существуют более «продвинутые» алгоритмические структуры, о которых мы поведем речь в следующих статьях. Может сложиться мнение, что линейный алгоритм неудобен и не стоит его использовать, владея знаниями по другим алгоритмам. Но это в корне неверный вывод – написать программу, не используя линейный алгоритм невозможно. Он составляет костяк программы, ее основу, в внутри него, там где это необходимо, производят вставки других алгоритмических структур.


Прежде чем, приступить к написанию программы, чтобы сделать алгоритм более наглядным и лучше отследить моменты дискретизации и детерминированности, часто используют блок-схемы.[6] Это графическое изображение, где в виде различных геометрических фигур описывают элементы будущей программы. Причем за определенными фигурами закреплены конкретные элементы, например, серию команд (линейный алгоритм) принято обозначать в виде прямоугольника, внутри которого описывается сама последовательность действий. Фигурой эллипса (прямоугольника с закругленными углами) обозначают начало и конец программы. Стрелками указывают направление действия программы. Существуют специальные ГОСТы, где перечислены все возможные фигуры, используемые для этих целей: ГОСТ 19.701-90, ГОСТ 19.002-80, ГОСТ 19.003-80. 
Попробуем изобразить «Калькулятор» из нашего прошлого примера в виде блок-схемы:

Упрощенная блок-схема линейного алгоритма


 

У нас получилась довольно простая блок-схема всего из трех геометрических фигур, где во внутрь прямоугольника мы образно поместили серию команд. Такая схема является приблизительной и не отражает сущности программы и ее составных частей, даже на уровне линейного алгоритма. Попробуем усложнить блок-схему этого же примера, используя более широкий диапазон фигур:[7]

Более сложная схема линейного алгоритма


Как мы видим из этого рисунка, для каждого действия существует определенная фигура: для ввода-вывода – параллелограмм, для сохранения данных в неавтономную (энергозависимую память) – прямоугольник с закругленными боками. Этот наш пример можно было бы усложнять, приводить к более профессиональному виду и далее, но на данном этапе работы, примем такой вариант, как наиболее правильный.[8]

Итак, подведем итоги:


1. Компьютерная программа – общий алгоритм для процессора, который состоит из отдельных блоков – алгоритмических структур; 
2. Алгоритмических структур известное количество, правильное и рациональное использование которых позволяет реализовать любые, самые сложные маневры при написании программы; 
3. Создание программы – творческий процесс. Это – продукт, созданный индивидуально каждым программистом, основываясь на его знаниях, умениях, навыках и опыте работы; 
4. Самое сложное в программировании – целенаправленное и осознанное использование алгоритмических структур; 
5. Линейный алгоритм самый простой и не позволяет реализовать элементы программы в зависимости от условий, однако на нем базируется остов всей программы. Это как цемент в строительстве стены – его не видно в готовом объекте, но без него стена ссыпалась бы в песок, камни и другие строительные составляющие; 
6. В целях визуального представления связки элементов программы используются графические блок-схемы. Прежде чем приступить к написанию кода программы, желательно составить такую схему – она поможет в дальнейшем не ошибиться и не запутаться.

1.2 Разветвляющийся алгоритм

Разветвляющийся алгоритм - алгоритм, содержащий хотя бы одно условие, в результате проверки которого ЭВМ обеспечивает переход на один из двух возможных шагов.[9]

В отличие от линейных алгоритмов, в которых команды выполняются последовательно одна за другой, в разветвляющиеся алгоритмы входит условие, в зависимости от выполнения или невыполнения которого выполняется та или иная последовательность команд (серий). В качестве условия в разветвляющемся алгоритме может быть использовано любое понятное исполнителю утверждение, которое может соблюдаться (быть истинно) или не соблюдаться (быть ложно). Такое утверждение может быть выражено как словами, так и формулой. Таким образом, команда ветвления состоит из условия и двух последовательностей команд. Команда ветвления, как и любая другая, может быть: • записана на естественном языке; • изображена в виде блок-схемы; • записана на алгоритмическом языке; • закодирована на языке программирования. Рассмотрим в качестве примера разветвляющийся алгоритм, изображенный в виде блок-схемы. Аргументами этого алгоритма являются две переменные А, В, а результатом — переменная X. Если условие А >= В истинно, то выполняется команда Х:=А*В, в противном случае выполняется команда Х:=А+В. В результате печатается то значение переменной X, которое она получает в результате выполнения одной из серий команд. Запишем теперь этот алгоритм на алгоритмическом языке и на языке программирования [10]Бейсик. 

1.3 Циклический алгоритм

Циклический алгоритм описывает вычислительный процесс, этапы которого повторяются многократно. Различают простые циклы, не содержащие внутри себя других циклов, и сложные(вложенные), содержащие несколько циклов. В зависимости от ограничения числа повторений и циклы, число повторений которых заранее неизвестно. [11]

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

Блок-схема цикла с параметром представлена на рис. 9.

Рисунок 9 – Блок-схема цикла с параметром

На рисунке приняты следующие сокращения:

ИП – имя ячейки памяти, в которую заносится значение параметра;

НЗ – начальное значение параметра;

КЗ – конечное значение параметра;

ШАГ – величина приращения параметра после каждого выполнения тела цикла.

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

Тело цикла представляет собой линейный вычислительный процесс и выполняется столько раз, сколько разных значений примет параметр в заданных пределах от НЗ до КЗ. Цикл с параметром относится к циклу с явно выраженным числом повторений (число повторений известно заранее). Для таких циклов характерным является то, что задаются:

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

цикл с предусловием и цикл с постусловием относятся к так называемым итерационным циклам. В таких циклических вычислительных процессах число повторений тела цикла заранее не известно. Выход из цикла осуществляется не после того, как цикл повторится заданное число раз, а при выполнении определенного условия, связанного с проверкой значения монотонно изменяющейся в теле цикла величины. Блок-схема цикла с предусловием представлена на рис. 10, а блок-схема цикла с постусловием – на рис. 11.

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

В цикле с постусловием тело цикла выполняется не менее одного раза. При этом действия, предусмотренные в теле цикла, выполняются до тех пор, пока не выполнится заданное условие.[13]

Рисунок 10 – цикл с предусловием

Рисунок 11 – цикл с постусловием

Рассмотренные блок-схемы циклов позволяют описать простые циклические вычислительные процессы. При решении сложных задач может возникнуть необходимость внутри одного цикла организовать дополнительно один или несколько других циклов. Такие циклы называются вложенными. При этом цикл, внутри которого создается другой цикл, называется внешним, а цикл, создаваемый внутри другого –внутренним. Правила организации как внешнего, так и внутреннего циклов те же, что и для простых циклов. Параметры внешнего и внутреннего циклов должны быть разными.[14]

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

Fortran (Фортран). Это первый компилируемый язык, созданный Джимом Бэкусом в 50-е годы. Программисты, разрабатывавшие программы исключительно на ассем­блере, выражали серьезное сомнение в возможности появления высокопроизво­дительного языка высокого уровня, поэтому основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого кода. Хотя в Фортране впервые был реализован ряд важнейших понятий программирования, удобство создания программ было принесено в жертву возможности получения эффективного машинного кода. Однако для этого языка было создано огромное количество библиотек, начиная от статистических комплексов и заканчивая пакетами управления спутниками, поэтому Фортран продолжает активно использоваться во многих организациях.[15]

А1gо1 (Алгол). Компилируемый язык, созданный в 1960 году. Он был призван заме­нить Фортран, но из-за более сложной структуры не получил широкого распростра­нения. В 1968 году была создана версия Алгол 68, по своим возможностям и сегодня опережающая многие языки программирования, однако из-за отсутствия доста­точно эффективных компьютеров для нее не удалось своевременно создать хорошие компиляторы. Язык Алгол сыграл большую роль в теории, но для практического программирования сейчас почти не используется.

Cobol (Кобол). Это компилируемый язык для применения в экономической области и решения бизнес-задач, разработанный в начале 60-х годов. Он отличается большой "многословностью" – его операторы иногда выглядят как обычные английские фразы. В Коболе были реализованы очень мощные средства работы с большими объемами данных, хранящимися на различных внешних носителях. На этом языке создано очень много приложений, которые активно эксплуатируются и сегодня. Достаточно сказать, что наибольшую зарплату в США получают программисты на Коболе.

Pascal (Паскаль). Язык Паскаль, созданный в конце 70-х годов основоположником множества идей современного программирования Никлаусом Виртом и названный в честь ученого Блеза Паскаля, во многом напоминает Алгол, но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его при создании крупных программных проектов. Изначально Паскаль был задуман как язык программирования для студентов. Он и сейчас является основным языком программирования, используемым в качестве учебного, во многих высших учебных заведениях. На базе языка Паскаль созданы несколько более мощных языков (Модула, Ада, Дельфи).[16]

BASIC (Бейсик). Для этого языка имеются и компиляторы, и интерпретаторы, а по популярности он занимает первое место в мире. Бейсик был создан в 1964 г. Томасом Куртом и Джоном Кемени как язык для начинающих программистов, облегчающий написание простых программ. В настоящее время разработано несколько различных версий языка Бейсик, таких как GWBASIC, QBASIC, Pro-BASIC, Turbo-BASIC, Visual-BASIC и др.

С (Си). Данный язык был создан в лаборатории Ве11 и первоначально не рассматри­вался как массовый. Он планировался для замены ассемблера, чтобы иметь возмож­ность создавать столь же эффективные и компактные программы, и в то же время не зависеть от конкретного типа процессора.

Си во многом похож на Паскаль и имеет дополнительные средства для прямой работы с памятью (указатели). На этом языке в 70-е годы написано множество при­кладных и системных программ и ряд известных операционных систем (например, Unix). В настоящее время Си широко используется при создании системного программного обеспечения.

PL/1 (ПЛ/1). В середине 60-х годов компания 1ВМ решила взять все лучшее из языков Фортран, Кобол и Алгол и воплотить в одном языке программирования. В результате в 1964 году на свет появился новый компилируемый язык программирования, который получил название Programming Language One. В этом языке было реализовано множество уникальных решений, полезность которых удается оценить только спустя 33 года, в эпоху крупных про­граммных систем. По своим возможностям ПЛ/1 значительно мощнее многих других языков (Си, Паскаля). Например, в ПЛ/1 присутствует уникальная возможность указания точности вычислений – ее нет даже у Си++ и Явы. В настоящее время язык ПЛ/1 почти не используется.

Ada (Ада). Назван по имени леди Огасты Ады Лавлейс, дочери английского поэта Байрона и его отдаленной родственницы Анабеллы Милбэнк. В 1979 году сотни экспертов Министерства обороны США отобрали из 17 вариантов именно этот язык, разработанный небольшой группой под руководством Жана Ихбиа. Он удовле­творил на то время все требования Пентагона, а к сегодняшнему дню в его развитие вложены десятки миллиардов долларов. Структура самого языка похожа на Паскаль. В нем имеются средства строгого разграничения доступа к различным уровням спецификаций, доведена до предела мощность управляющих конструкций.[17]

Принципиально другое направление в программировании связано с методологиями непроцедурного программирования. Для этих целей используются непроцедурные языки программирования, которые можно разделить на объектные и декларативные. Объектно-ориентированный язык создает окружение в виде множества независимых объектов. Каждый объект ведет себя подобно отдельному компьютеру, их можно использовать для решения задач как "черные ящики", не вникая во внутренние механизмы их функционирования. Объектно-ориентированный подход к проектированию программных продуктов основан на:

– выделении классов объектов;

– установлении характерных свойств объектов и методов их обработки;

– создании иерархии классов, наследовании свойств объектов и методов их обработки.

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

Из языков объектного программирования, популярных среди профессионалов, следует назвать прежде всего:

С++ (Си++). Си++ - это объектно-ориентированное расширение языка Си, создан­ное Бьярном Страуструпом в 1980 году. Множество новых мощных возможностей, позволивших резко повысить производительность работы программистов, наложилось на унаследованную от языка Си определенную низкоуровневость, в результате чего создание сложных и надежных программ потребовало от разработчиков высокого уровня профессиональной подготовки;[18]

Java (Джава). Этот язык был создан компанией Sun в начале 90-х годов на основе Си++. Он призван упростить разработку приложений на основе Си++ путем исключения из него всех низкоуровневых возможностей. Но главная особенность этого языка – компиляция не в машинный код, а в платформно-независимый байт-код (каждая команда занимает один байт). Этот байт-код может выполняться с помощью интерпретатора – виртуальной Java-машины, версии которой созданы сегодня для любых платформ. Благодаря наличию мно­жества Java-машин программы на Джава можно переносить не только на уровне исход­ных текстов, но и на уровне двоичного байт-кода, поэтому по популярности язык Джава сегодня занимает второе место в мире после Бейсика. Язык Джава чрезвычайно эффективен для создания интерактивных Web-страниц;[19]

Smalltalk (Смолток). Работа над этим языком началась в 1970 году в исследова­тельской лаборатории корпорации XEROX, а закончились спустя 10 лет, вопло­тившись в окончательном варианте интерпретатора SMALLTALK-80. Данный язык оригинален тем, что его синтаксис очень компактен и базируется исключительно на понятии объекта. В этом языке не существует операторов или данных. Все, что входит в Смолток, является объектами, а сами объекты общаются друг с другом исключи­тельно с помощью сообщений (например, появление выражения I+1 вызывает посыл­ку объекту I сообщения "+", то есть "прибавить", с параметром 1, который считается не числом-константой, а тоже объектом). Больше никаких управляющих структур, за исключением "оператора" ветвления (на самом деле функции, принадлежащей стандартному объекту), в языке нет, хотя их можно очень просто смоделировать. Сегодня версия VisualAge for Smalltalk активно развивается компанией IВМ;

LISP (Лисп). Интерпретируемый язык программирования, созданный в 1960 году Джоном Маккарти. Ориентирован на структуру данных в форме списка и позволяет организовывать эффективную обработку больших объемов текстовой информации;

Delphi (Дельфи) – язык объектно-ориентированного "визуального" программирования. Явился развитием языка Паскаль. При использовании декларативного языка программирования программист указывает исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат. При этом процедуру его получения (то есть алгоритм) программист не строит. В этих языках отсутствует понятие "оператор".[20]

Prolog (Пролог). Создан в начале 70-х годов. Программа на этом языке, в основу которого положена математическая модель теории исчисления пре­дикатов, строится из последовательности фактов и правил, а затем формулируется утверждение, которое Пролог будет пытаться доказать с помощью введенных правил. Человек только описывает структуру задачи, а внутренний "мотор" Пролога сам ищет решение с помощью методов поиска и сопоставления.

ГЛАВА II. СРАВНИТЕЛЬНЫЙ АНАЛИЗ ТРЕХ ОСНОВОПОЛАГАЮЩИХ СТРУКТУР АЛГОРИТМОВ

Выделяют три основные структуры алгоритмов:

1. Линейная.

2. Разветвляющаяся (альтернатива «если–то–иначе» или «если–то»).

3. Циклическая (повторение).

Линейная структура – является основной. Она означает, что действия выполняются друг за другом. Прямоугольник, показанный на рисунке, может представлять как одну единственную команду, так и множество операторов, необходимых для выполнения сложной обработки данных, где F1 и F2 – некоторые команды для соответствующего исполнителя. Команды записываются с помощью операции присваивания. Присваивание переменной какого-либо значения или присваивание одной переменной значения другой переменной является наиболее часто выполняемым действием в программе, написанной на любом языке программирования. В языке программирования присваивание является операцией и обозначается как «:=». Это означает, что при выполнении этой операции происходит не только присваивание значения определенной переменной, но и возвращается некоторое значение.

Разветвляющийся алгоритм – это алгоритм, в котором то или иное действие выполняется после анализа условия. Процесс анализа условия и выбора одной из ветвей на блок-схеме показывают с помощью логического блока. [21] Логический блок имеет один вход и два выхода (ветвь «да» и ветвь «нет»). В блок-схемах разветвляющихся алгоритмов всегда есть логический блок. Может оказаться, что для одного из результатов проверки условия ничего предпринимать не надо. В этом случае можно применять только один обрабатывающий блок. Эта структура называется также ЕСЛИ –ТО – ИНАЧЕ. Каждый из путей (ТО или ИНАЧЕ) ведет к общей точке слияния, так что выполнение программы продолжается независимо от того, какой путь был выбран. Для начала нужно понять, что для решения большинства задач, как правило, существует много различных алгоритмов, которые могут отличаться друг от друга по быстродействию, требуемой внутренней и/или внешней памяти, сложности программирования и ряду других критериев. При этом, как правило, не существует алгоритма, который был бы предпочтительнее при любых исходных данных и по всем критериям оценки. Какой из них выбрать для решения конкретной задачи? Этот вопрос очень важен для любого профессионального программиста. Именно поэтому необходимо уже на ранних этапах обучения студентов «программистских» направлений подготовки уделять как можно больше времени вопросам выбора эффективного алгоритма решения задачи. Начинающий программист должен четко понимать, что один из основных этапов решения любой задачи – анализ и выбор алгоритма ее решения. Традиционный способ сравнения эффективности алгоритмов состоит в сопоставлении их порядков сложности.

Человек, автоматическое устройство, компьютер – это разные исполнители алгоритмов. Для того чтобы компьютер мог выполнить алгоритм, его надо написать на понятном компьютеру языке. Компьютер понимает машинный язык. Например, равенство х = у на машинном языке имеет вид: 111101110011110111110101.[22]

Этот метод применим как к временной, так и пространственной сложности. Порядок сложности алгоритма выражает его эффективность обычно через количество обрабатываемых данных. Однако такой подход к оценке эффективности алгоритмов имеет ряд недостатков. Одним из основных недостатков O-функций является их чрезмерная грубость. Если алгоритм А выполняет некоторую задачу за 0,001×N секунд, в то время как для ее же решения с помощью алгоритма В требуется 1000×N секунд, то алгоритм А в миллион раз быстрее, чем алгоритм В. Тем не менее А и В имеют одну и ту же временную сложность O(N). Следовательно, очень часто необходим более детальный анализ алгоритмов, претендующих на решение одной и той же задачи. В статье рассматривается методика сравнительного анализа различных алгоритмов на примере алгоритмов последовательного поиска. Выбор данной группы алгоритмов основан на том, что последовательный поиск очень часто применяется и в повседневной жизни, он интуитивно понятен и на первый взгляд тривиален. Казалось бы, что можно улучшить в простом последовательном переборе? Но начнем все-таки с того, что знание алгоритмов последовательного поиска профессиональному программисту крайне необходимо. Представьте себе, что необходимо найти книгу в книжном шкафу, расположение книг в котором неизвестно. Так как книгу найти все-таки нужно, то в этом случае очевидный подход – простой последовательный перебор всех находящихся в шкафу книг. Если повезет, вы затра тите только одно сравнение, в худшем случае – N сравнений, где N – количество книг в шкафу. Среднее число сравнений, т. е. если поиск книг будет повторяться многократно, равен N/2. Таким образом, если мы ничего не знаем об организации исходных данных (например, исходные данные могут быть упорядочены), то, скорее всего, без использования последовательного поиска не обойтись. Сформулируем алгоритм более точно. Пусть имеется массив записей с ключами K1, K2, ..., Kn. Необходимо найти запись с заданным ключом K. Тогда традиционный алгоритм последовательного поиска будет включать следующие шаги (алгоритм А).[23]

Алгоритмы, предназначенные для решения широкого круга практических задач, связаны с преобразованием информации. При этом под информацией понимают вполне конкретные величины - числовые, текстовые, графические и т.д. Алгоритмы можно представлять как некоторые жесткие структуры, состоящие из отдельных базовых элементов. Естественно, что при таком подходе к алгоритмам изучение основных принципов их конструирования должно начинаться с изучения базовых элементов алгоритмов. Для их описания будем использовать язык блок-схем. Любой алгоритм может быть реализован в виде комбинации трех базовых алгоритмических конструкций: линейной, ветвления, циклической.

Линейным называется алгоритм, в котором все этапы решения задачи

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

«следование».

Ветвлением называется такая алгоритмическая структура, в которой, в зависимости от истинности условия, выбирается только одно из возможных направлений выполнения алгоритма. Цикл предусматривает многократное повторение действий.[24]

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

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

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

ГЛАВА III. НЕКОТОРЫЕ ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ РАЗЛИЧНЫХ ТИПОВ АЛГОРИТМОВ

Итак, первым делом мы рассмотрим несколько примеров линейного алгоритма из повседневной жизни. Рассмотрим пример алгоритма на естественном языке:

1. Ввести в компьютер числовые значения переменных а, b и с.

2. Вычислить дискриминант по формуле d = b² - 4ас.

3. Если d < 0, то напечатать сообщение «Корней нет» и перейти к п.4. Иначе вычислить 𝑥1 = −𝑏+√D 2𝑎 , 𝑥2 = −𝑏−√D 2𝑎 и напечатать значения x1 и x2.

4. Прекратить вычисления.[25] Или же например рецепт приготовления любого блюда является линейным, например, приготовления бутерброда с маслом, с сыром, салата из моркови, чеснока и майонеза, просто алгоритм открывания замка. Или же пример линейного алгоритма, основанного на литературном произведении:

"Сказка о царе Салтане": алгоритм превращения лебедя в

царевну:

Тут она, взмахнув крылами,

Полетела над волнами

И на берег с высоты

Опустилась в кусты,

Встрепенулась, отряхнулась

И царевной обернулась.

Разветвляющийся алгоритм описывает вычислительный процесс, реализация которого происходит по одному из нескольких заранее предусмотренных направлений. Направления, по которым может следовать вычислительной процесс, называются ветвями. Выбор конкретной ветви вычисления зависит от результатов проверки выполнения некоторого логического условия. Результатами проверки являются: «Истина» (да), если условие выполняется, и «ложь» (нет), при невыполнении условия.[26]

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

Рис. 8. Богатырь на распутье.

На камне написано:

«Направо пойдёшь – коня потеряешь, себя спасёшь; налево пойдёшь – себя потеряешь, коня спасёшь; прямо пойдёшь – и себя и коня потеряешь».

Попробуем составить алгоритм действий, который составил автор надписи на камне для путников?

  1. Если мы пойдём направо, то потеряем коня. Если же мы не пойдём направо, то у нас остаётся два варианта (мы считаем, что назад возвращаться путник не будет): пойти прямо и налево.
  2. В случае, если мы пойдём налево, то потеряем себя, а коня спасём.
  3. Если же мы пойдём прямо, то потеряем и себя, и коня.

Блок-схема этого алгоритма выглядит так:

Рис. 9. Блок-схема.[27]

Далее идут примеры разветвляющегося алгоритма.

Из повседневной жизни любого человека:

Посмотрел в окно. 
Идет дождь – Не идти гулять, остаться дома. 
Не идет дождь - Пойти гулять.

Из литературного произведения:

Подъехал богатырь к камню с надписью:
Налево пойдешь - сам пропадешь
Направо пойдешь - коня потеряешь
Прямо пойдешь - и сам пропадешь, и коня потеряешь

Последний пример разветвляющегося алгоритма из геометрии:

Имеются две прямые линии.
Прямые имеют общую точку - прямые пересекаются
Прямые не имеют ни одной общей точки - прямые не пересекаются.

И заключительным будут примеры циклического алгоритма.

Примером циклического алгоритма может являться любое замкнутое действие или процесс.

Рассмотрим пример на составление циклического алгоритма. Мы уже несколько раз обсуждали перевод чисел из десятичной системы в двоичную. Теперь пришло время чётко сформулировать этот алгоритм.

Напомним, что его принцип состоит в делении числа на 2 и записей остатков, получающихся при делении.

Составить алгоритм перевода чисел из десятичной системы в двоичную.

Решение:

То есть, алгоритм будет выглядеть так:

  1. Если число равно 0 или 1, то это и будет его двоичное представление.
  2. Если число больше 1, то мы делим его на 2.
  3. Полученный остаток от деления записываем в последний разряд двоичного представления числа.
  4. Если полученное частное равно 1, то его дописываем в первый разряд двоичного представления числа и прекращаем вычисления.
  5. Если же полученное частное больше 1, то мы заменяем исходное число на него и возвращаемся в пункт 2).[28]

Блок-схема этого алгоритма выглядит следующим образом:[29]

В сутках 23 часа 56 минут 4 секунды, и они повторяются каждый раз;
Испарение воды: вода-нагрев-испарение-охлаждение-осадки;
Стрелки часов бегут по кругу 24\7 , пока не сядет батарейка.

После каждого из алгоритмов прикреплена наглядная схема их действия.

ЗАКЛЮЧЕНИЕ

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

Цель этой работы была такой – подробный разбор основных структур алгоритмов, их сравнительный анализ и подробное изучение, учитывая примеры их использования. В данной курсовой работе были рассмотрены три основные главы, такие как:

1. Три ключевых структуры алгоритма.

2. Сравнительный анализ трех основополагающих структур алгоритмов.

3. Некоторые примеры использования различных типов алгоритмов.

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

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

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

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

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

Список литературы

  1. Алгазин С.Д., Кондратьев В.В. Программирование на Visual Fortran. / 2008. - 377 с.
  2. Бьерне Страуструп. Программирование. Принципы и практика использования C++ / 2011. - 1223 стр.
  3. Белов П.М. Основы алгоритмизации в информационных системах / Учебн. Пособие.- Спб.: СЗТУ, 2003. – 85с.
  4. Богомолов Ю.А, А.И. Маликов, Б.А. Старостин. Казань: Изд-во Казанского
  5. национального исследовательского технического ун-та - КАИ, 2013, 153 с.
  6. Долинер.Л.И. Основы программирования в среде PascalABC. / 2014. - 129 с.
  7. Джехани.Н. Язык Ада. / 1988. – 552 с.
  8. Екатерина Костакова, эксперт Контур.Школы. / 2017 г.
  9. Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос.ун-та, 2011.
  10. - 56 с.
  11. Казанцева.С.Я, Дубининой.Н.М. Информатика и математика. / 2010 г.
  12. Кадырова Г.Р. Основы алгоритмизации и программирования. 2014. – 95 с.
  13. Кэти Сьерра, Берт Бэйтс. Изучаем Java / 2003. - 208 с.
  14. Макаров В.Л. Программирование и основы алгоритмизации / учебн.пособие.-Спб., СЗТУ, 2003, - 110с.
  15. Осипов.Д. Delphi XE2 / 2012. – 912 с.
  16. Потопахин В.В. Искусство алгоритмизации / 2011. – 300 с.
  17. Роберт К. Мартин. Чистый код. Создание, анализ и рефакторинг. / 2010 г. – 464 с.
  18. Стивен С. Скиена. Алгоритмы. Руководство по разработке. / 2017 г. – 720 с.
  19. Шауцукова Л.З. Информатика 10-11. — М.:Просвещение. / 2000 г.
  1. Шауцукова Л.З. Информатика 10-11. — М.:Просвещение. / 2000 г.

  2. Шауцукова Л.З. Информатика 10-11. — М.:Просвещение. / 2000 г.

  3. С.Я. Казанцева, Н.М. Дубининой. Информатика и математика. / 2010 г.

  4. Екатерина Костакова, эксперт Контур.Школы. / 2017 г.

  5. Роберт К. Мартин. Чистый код. Создание, анализ и рефакторинг. / 2010 г. – 464 с.

  6. Стивен С. Скиена. Алгоритмы. Руководство по разработке. / 2017 г. – 720 с.

  7. Стивен С. Скиена. Алгоритмы. Руководство по разработке. / 2017 г. – 720 с.

  8. Стивен С. Скиена. Алгоритмы. Руководство по разработке. / 2017 г. – 720 с.

  9. Основы алгоритмизации и программирования: учебное пособие / Г.

    Р. Кадырова. – Ульяновск: УлГТУ, 2014. – 301 с.

  10. Основы алгоритмизации и программирования : учебное пособие / Г.

    Р. Кадырова. – Ульяновск : УлГТУ, 2014 г. – 301 с.

  11. Макаров В.Л. Программирование и основы алгоритмизации.: учебн.

    пособие. -Спб., СЗТУ, 2003, - 110с.

  12. Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос.ун-та, 2011.

    - 56 с.

  13. Программирование и основы алгоритмизации: Для инженерных

    специальностей технических университетов и вузов. /А.Г. Аузяк, Ю.А.

    Богомолов, А.И. Маликов, Б.А. Старостин. Казань: Изд-во Казанского

    национального исследовательского технического ун-та - КАИ, 2013, 153 с.

  14. Программирование и основы алгоритмизации: Для инженерных

    специальностей технических университетов и вузов. /А.Г. Аузяк, Ю.А.

    Богомолов, А.И. Маликов, Б.А. Старостин. Казань: Изд-во Казанского

    национального исследовательского технического ун-та - КАИ, 2013. - 153 с.

  15. Алгазин С.Д., Кондратьев В.В. Программирование на Visual Fortran. / 2008. - 377 с.

  16. Долинер.Л.И. Основы программирования в среде PascalABC. / 2014. - 129 с.

  17. Джехани.Н. Язык Ада. / 1988. – 552 с.

  18. Бьерне Страуструп Программирование. Принципы и практика использования C++ / 2011. - 1223 стр.

  19. Кэти Сьерра, Берт Бэйтс. Изучаем Java / 2003. - 208 с.

  20. Осипов.Д. Delphi XE2 / 2012. – 912 с.

  21. Основы алгоритмизации и программирования: учеб. пособие / Т.А.

    Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос.ун-та, 2011. –

    56 с.

  22. Основы алгоритмизации и программирования: учеб. пособие / Т.А.

    Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос.ун-та, 2011. –

    56 с.

  23. Макаров В.Л. Программирование и основы алгоритмизации / учебн.

    пособие.-Спб., СЗТУ, 2003, - 110с.

  24. Белов П.М. Основы алгоритмизации в информационных системах /

    Учебн. Пособие.- Спб.: СЗТУ, 2003. – 85с.

  25. Основы алгоритмизации и программирования : учебное пособие / Г.

    Р. Кадырова. – Ульяновск : УлГТУ, 2014. – 95 с.

  26. Макаров В.Л. Программирование и основы алгоритмизации / Учебн.

    пособие.-Спб., СЗТУ, 2003. - 110с.

  27. Потопахин В.В. Искусство алгоритмизации / 2011. – 300 с.

  28. Потопахин В.В. Искусство алгоритмизации / 2011. – 300 с.

  29. Потопахин В.В. Искусство алгоритмизации / 2011. – 300 с.