лекция8_Алгоритмизация1.ppt
- Количество слайдов: 63
Алгоритмизация и программирование
7. 2. Понятие алгоритма Алгоритм – одно из фундаментальных понятий в математике и программировании. Само слово «алгоритм» (Algorithmi) происходит от имени арабского математика, астронома и географа, автора персидского учебника по математике Абу Абд Аллах Мухаммед ибн Мусса аль. Хорезми (уроженца Хорезма) (750 -850 гг. ), впервые описавшего правила выполнения четырёх арифметических действий.
Алгоритм - это заранее заданное и точное предписание возможному исполнителю последовательности действий над заданным объектом, приводящее к достижению указанной цели за конечное число шагов. Исполнителем может быть человек или устройство (в частности, процессор компьютера)
Свойства алгоритмов ►Дискретность (упорядоченность) - все действия исполнителя в алгоритме должны быть выстроены в четком, раз и навсегда определенном порядке через отдельные шаги. ►Понятность алгоритма - каждый шаг алгоритма обязательно представляет собой какое-либо допустимое действие исполнителя (т. е. алгоритм состоит только из предписаний, входящих в систему команд исполнителя). ►Детерминированность (определенность) каждое правило должно быть однозначным, т. е. на каждом шаге однозначно определен способ действий.
►Результативность - каждый шаг (и алгоритм в целом) после своего завершения дает однозначно определенный результат. ►Массовость - алгоритм должен быть как можно более универсальным, подходящим для решения разных типов задач. ►Эффективность - алгоритм должен быть выполнен не просто за конечное число операций, а за разумное конечное время.
На практике в качестве исполнителя алгоритмов чаще всего используют ЭВМ, поэтому язык для записи алгоритмов должен быть понятен компьютеру и значит формализован (более строго описан). Такой язык принято называть языком программирования, а запись алгоритма на этом языке - программой для компьютера.
При построении алгоритма для решения сложной задачи используют: 1) принципы декомпозиции (проектирование «сверху-вниз» ) и синтеза ( «снизу-вверх» ). Первое предполагает первоначальную разработку алгоритма в виде укрупненных блоков (разбиение задачи на подзадачи со связями между собой) и их постепенную детализацию (пошаговое разбиение алгоритма на все более мелкие части до уровня элементарных конструкций). Затем (после декомпозиции) проводится сборка блоков в единую программу (т. е. синтез). 2) принцип «от главного к второстепенному» , предполагающий составление алгоритма, начиная с главной конструкции. 3) и принцип структурирования, т. е. использования только типовых алгоритмических структур.
Проектирование алгоритмов и основные их типы Алгоритм можно представить различными способами: ►с помощью словесного описания; ►формульно-словесного; ►на алгоритмическом языке; ►с помощью графики и др. Графическое описание называется блок-схемой.
Блок-схема - это ориентированный граф, указывающий порядок исполнения команд алгоритма, где каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий, управлению повторением действий, окончанию обработки и т. д. ), соответствует геометрическая фигура, представленная в виде блока (последние соединяются линиями переходов, определяющими очередность выполнения действий).
Основные блоки блок-схемы
Основные типы алгоритмов 1. Линейный алгоритм (описывает последовательный порядок действий) Оператор1 Оператор2 Оператор3
Линейный алгоритм – описывает последовательный порядок действий, где каждая операция является самостоятельной, независимой от каких-либо условий (независимо от значений первичных и промежуточных данных). Отображение алгоритма блок-схемой представляет линейную последовательность блоков, которые располагаются сверху вниз в порядке их выполнения.
2. Разветвляющийся алгоритм ход решения задачи определяется в зависимости от условия (переход и ветвление) Если – то - иначе Если – то (обход)
Выбор направления продолжения вычислительного процесса осуществляется проверкой выполнения заданного условия (в зависимости от этого в каждом конкретном случае вычислительный процесс реализуется только по одной ветви, выполнение остальных условий исключается). Ветвящиеся процессы описываются оператором IF. Его структуру полной формы можно показать так: IF <условие> THEN <оператор1> ELSE <оператор2> - условный оператор; IF <условие> THEN <оператор1> - условный оператор обхода
3. Циклический алгоритм (описывает повторяющиеся действия) Начальное значение переменной цикла i Проверка условия да Блок операторов i = i+1 нет
Циклические процессы описываются оператором: FOR х = 1 ТО n STEP h <блок операторов> NEXT x таким Операторы цикла организуют повторное выполнение одних и тех же операторов несколько раз (при этом повторение происходит не в буквальном смысле, а каждый раз выполнение повторяемого участка программы происходит с использованием новых значений переменных).
Автоматическое управление циклом осуществляет переменная, называемая параметром цикла (управляющая переменная). Задаются первоначальное значение параметра цикла (например i = 1), конечное значение (например i =< 100), и увеличение параметра на каждом шаге повторения (например, i = i + 1). Существует две разновидности операторов цикла: оператор цикла с фиксированным числом повторений (детерминированный цикл) и операторы цикла с переменным числом повторений, зависящим от условий (итерационный цикл).
При выполнении первых (с известным числом повторений) задаются: начальное и конечное значения параметров цикла; закономерность изменения параметра цикла на каждом шаге его повторения; необходимое число повторений цикла. При выполнении вторых (когда количество повторений цикла предварительно неизвестно) выход из цикла происходит при достижении заданной точности вычислений (заданной величины) или числа, равного предварительно заданному (этот метод называется методом последовательных приближений). По структуре циклы делятся на простые и сложные. Простые циклы не содержат внутри себя других циклов. Сложные циклы при этом имеют один или несколько внутренних циклов и называются внешними. Циклы, которые включены (входят) во внешние циклы, называются внутренними.
Начало Постановка задачи, определение целей и результатов Выбор метода решения Определение информационного обеспечения Разработка алгоритма Запись алгоритма на языке программирования Ввод программы в ЭВМ Отладка программы Да Если есть ошибки Редактирование программы Нет Запуск и выполнение программы Анализ полученных результатов Конец
Какую задачу решает данный алгоритм?
Какие значения примут переменные a и b в результате выполнения алгоритма?
В результате работы алгоритма Y: =X + 3 X : = 2 * Y Y : = X + Y вывод Y переменная Y приняла значение 18. Укажите число, которое являлось значением переменной X до начала работы алгоритма
Языки программирования
Основные понятия и определения p p Языки программирования – это формальные языки специально созданные для общения человека с компьютером. Каждый язык программирования, равно как и «естественный» язык (русский, английский и т. д. ), имеет алфавит, словарный запас, грамматику и синтаксис, а также семантику. Алфавит – фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке. Синтаксис – система правил, определяющих допустимые конструкции языка программирования из букв алфавита. Семантика – система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
Языки программирования и их классификация Первые языки программирования возникли в первой половине XX столетия. Также как и первые ЭВМ они были довольно примитивны и ориентированы на численные расчеты. Программы, написанные на ранних языках программирования, представляли собой линейные последовательности элементарных операций с регистрами, в которых хранились данные.
Ранние языки программирования существенно зависели от среды вычислений и приблизительно соответствовали современным машинным кодам или языкам ассемблера. Такие языки принято называть языками низкого уровня (низкоуровневыми языками)
Языки программирования высокого уровня Императивный подход p p p На смену низкоуровневым языкам пришли языки программирования «высокого уровня» (высокоуровневые языки). Они позволяли повысить эффективность труда программистов за счет абстрагирования от конкретных деталей аппаратного обеспечения. Один оператор языка высокого уровня соответствовал последовательности из нескольких низкоуровневых команд. Программа – это набор директив, обращенных к компьютеру, такой подход к программированию получил название императивного. Еще одной особенностью языков высокого уровня была возможность повторного использования ранее написанных программных блоков, выполняющих те или иные действия, посредством их идентификации и последующего обращения к ним, например по имени. Такие блоки получили название функций или процедур.
p С появлением языков высокого уровня зависимость программ от аппаратного обеспечения существенно уменьшилась. Платой за это стало появление специализированных программ, преобразующих команды языков программирования в коды той или иной машины, или трансляторов, а также некоторая потеря в скорости вычислений, которая, компенсировалась существенным выигрышем в скорости разработки приложений и унификацией программного кода.
трансляторы Существует два вида трансляторов: p интерпретаторы (это транслятор, который производит пооператорную обработку и выполнение исходного кода программы), p компиляторы (преобразует всю программу в модуль на машинном языке, после чего программа записывается в память компьютера и лишь потом исполняется).
Трансляторы
Примеры языков высокого уровня Одним из таких примеров является язык Fortran, реализующий вычислительные алгоритмы. Другой пример – язык APL, трансформировавшийся в BPL и затем в C. Примеры других языков программирования: ALGOL, COBOL, Pascal, Basic. p
Декларативный подход в программировании p p В 60 -х годах возникает новый подход к программированию, который до сих пор успешно конкурирует с императивным, а именно, декларативный подход. Суть подхода состоит в том, что программа представляет собой не набор команд, а описание действий, которые необходимо осуществить. Этот подход существенно проще и прозрачнее формализуется математическими средствами, поэтому программы проще проверять на наличие ошибок (тестировать), а также на соответствие заданным требованиям (верифицировать). Высокая степень абстракции также является преимуществом данного подхода. Фактически, программист оперирует не набором инструкций, а абстрактными понятиями, которые могут быть достаточно обобщенными.
p p На начальном этапе развития декларативным языкам программирования было сложно конкурировать с императивными в силу объективных трудностей эффективной реализации трансляторов. Программы работали медленнее, однако они могли решать более абстрактные задачи с меньшими трудозатратами. Примеры декларативных языков программирования: SML, Haskell, Prolog, LISP.
Функциональный подход p p Одним из путей развития декларативного программирования стал функциональный подход. Отличительной особенностью данного подхода является то, что любая программа, написанная на таком языке, может интерпретироваться как функция с одним или несколькими аргументами. Такой подход дает возможность прозрачного моделирования текста программ математическими средствами. вход выход F(x)
Функциональный подход p p Сложные программы при таком подходе строятся посредством объединения функций. При этом текст программы представляет собой функцию, некоторые аргументы которой можно также рассматривать как функции. Типы отдельных функций, используемых в функциональных языках, также могут быть переменными. Таким образом обеспечивается возможность обработки разнородных данных (например, упорядочение элементов списка по возрастанию для целых чисел, отдельных символов и строк) или полиморфизм.
Функциональный подход p Важным преимуществом реализации языков функционального программирования является автоматизированное динамическое распределение памяти компьютера для хранения данных. При этом программист избавляется от обязанности контролировать данные, а при необходимости может запустить функцию "сборки мусора" – очистки памяти от тех данных, которые больше не потребуются программе (обычно этот процесс периодически инициируется компьютером).
Функциональный подход p LISP (ЛИСП) (обработка списков) – самый первый функциональный язык, разработан и реализован в 1959 г. группой авторов под руководством пионера в области искусственного интеллекта (ИИ) Джона Маккарти для исследования проблем ИИ.
Недостатки функциональных языков 1. 2. нелинейная структура программы относительно невысокая эффективность реализации. Второй недостаток успешно преодолен современными реализациями, в частности, рядом последних трансляторов языка SML, включая и компилятор для среды Microsoft. NET.
Логическое программирование В 70 -х годах возникла еще одна ветвь языков декларативного программирования, связанная с проектами в области искусственного интеллекта, а именно языки логического программирования. p p В логическом программировании программа представляет собой совокупность правил или логических высказываний. Языки логического программирования применимы: в системах логического вывода, в частности, для так называемых экспертных систем; для описания правил принятия решений, например, в системах, ориентированных на поддержку бизнеса.
Логическое программирование Достоинства: p достаточно высокий уровень машинной независимости, p возможность откатов – возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения (скажем, очередного хода при игре в шахматы), что избавляет от необходимости поиска решения путем полного перебора вариантов и увеличивает эффективность реализации. Недостатки: p специфичность класса решаемых задач. p сложность эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения. В качестве примеров языков логического программирования можно привести Prolog (название возникло от слов PROgramming in LOGic) и Mercury.
Объектно-ориентированное программирование p p Важным шагом на пути к совершенствованию языков программирования стало появление объектноориентированного подхода к программированию (ООП) и соответствующего класса языков. В рамках данного подхода программа представляет собой описание объектов, их свойств (или атрибутов), совокупностей (или классов), отношений между ними, способов их взаимодействия и операций над объектами (или методов).
Объектно-ориентированное программирование p p Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 г. ), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др. Большинство концепций ООП были развиты Аланом Кэйем и Дэном Ингаппсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.
Объектно-ориентированное программирование p p p В основе объектно-ориентированного программирования лежит идея объединения в одной структуре, называемой объектом, данных и программ, которые обрабатывают эти данные. Понятие объекта включает в себя параметры объекта (свойства) и программные средства для работы с ним (методы). По существу каждый объект представляет собой программный комплекс. Однотипные объекты объединяются в классы
Основные принципы объектноориентированного подхода Программа представляет собой набор объектов, имеющих свое состояние и поведение. Объекты взаимодействуют посредством сообщений. Естественным образом выстраивается иерархия объектов: программа в целом — это объект, для выполнения своих функций она обращается к входящим в неё объектам, которые, в свою очередь, выполняют запрошенное путём обращения к другим объектам программы. Устойчивость и управляемость системы обеспечивается за счёт чёткого разделения ответственности объектов (за каждое действие отвечает определённый объект), однозначного определения интерфейсов межобъектного взаимодействия и полной изолированности внутренней структуры объекта от внешней среды (инкапсуляции).
Программа (объект) Родительский класс объектов Объект 11 Объект 2 Объект 1 M Сообщение Объект N Дочерний класс объектов
Объектно-ориентированное программирование характеризуется следующими признаками: p абстракция, p инкапсуляция, p наследование, p полиморфизм.
Абстракция p Абстрагирование – это способ выделить набор значимых свойств (характеристик) объекта, исключая из рассмотрения незначимые.
Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя. При инкапсуляции объект заключается в непроницаемую оболочку, после чего внутреннее устройство и механизмы работы становятся недоступными для вызывающей программы. Объект отвечает за корректность реализации своих функциональных возможностей, а вызывающая объект программа – за корректность использования объекта.
Наследование p p p Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. С помощью механизма наследования одни классы объектов могут происходить от других. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или дочерним классом. Дочерний класс способен унаследовать от своего родительского класса все его методы и свойства. Потомок может унаследовать способности от нескольких родителей.
Полиморфизм p Полиморфизм – присвоении единого имени процедуре, которая передается по иерархии объектов, с выполнением этой процедуры способом, соответствующим каждому объекту в иерархии.
Объектно-ориентированное программирование В объектно-ориентированном программировании при работе с объектами используется определенная форма записи. Обращение к свойству объекта: ОБЪЕКТ. СВОЙСТВО Объекты характеризуются его свойствами. Изменять свойства объектов можно с помощью оператора присвоения. Обращение к методу объекта: ОБЪЕКТ. МЕТОД Метод служит для выполнения заданных действий над объектом.
Примеры Все объекты MS Office находятся на разных уровнях иерархии. На самом верхнем уровне иерархии находится приложение (Application). p Общие методы для всех приложений: Add – добавить, Protect - защита, Close - закрыть, Open - открыть, Save – сохранить. p Объектная модель Excel представляет собой иерархию объектов, подчиненных одному объекту Application, который соответствует приложению Excel. p
Объекты MS Excel p p Workbook – это имя объекта рабочей книги. Каждая рабочая книга состоит из листов (Work. Sheets). Они также являются самостоятельными объектами, их можно создавать (Add), удалять (Delete) и выделять (Select). Add, Delete и Select – методы объекта Work. Sheets. Для обращения к данным, хранящимся на листах рабочих книг, используются объекты Range (диапазон ячеек) и Cells (ячейка).
Преимущества объектноориентированного программирования p p p Концептуальная близость к предметной области произвольной структуры и назначения. Механизм наследования атрибутов и методов позволяет строить производные понятия на основе базовых и таким образом создавать модель сколь угодно сложной предметной области с заданными свойствами. Поддержка механизма обработки событий, которые изменяют атрибуты объектов и моделируют их взаимодействие в предметной области. Перемещаясь по иерархии классов от более общих понятий предметной области к более конкретным (или от более сложных – к более простым) и наоборот, программист получает возможность изменять степень абстрактности или конкретности взгляда на моделируемый им реальный мир. Использование ранее разработанных (возможно, другими коллективами программистов) библиотек объектов и методов позволяет значительно сэкономить трудозатраты при производстве программного обеспечения, в особенности типичного. Объекты, классы и методы могут быть полиморфными, что делает реализованное программное обеспечение более гибким и универсальным.
Недостатки ООП p Сложность адекватной (непротиворечивой и полной) формализации объектной теории порождает трудности тестирования и верификации созданного программного обеспечения. Наиболее известным примером объектноориентированного языка программирования является язык C++, развившийся из императивного языка С. Его прямым потомком и логическим продолжением является язык С#. Другие примеры объектно-ориентированных языков программирования: Visual Basic, Eiffel, Oberon.
Скриптовые (сценарные) языки программирования p p p Развитием событийно управляемой концепции объектноориентированного подхода стало появление в 90 -х годах целого класса языков программирования, которые получили название языков сценариев или скриптов. В рамках данного подхода программа представляет собой совокупность возможных сценариев обработки данных, выбор которых инициируется наступлением того или иного события (щелчок по кнопке мыши, попадание курсора в определенную позицию, изменение атрибутов того или иного объекта, переполнение буфера памяти и т. д. ). События могут инициироваться как операционной системой (в частности, Microsoft Windows), так и пользователем. Основные достоинства языков данного класса унаследованы от объектно-ориентированных языков программирования. Это интуитивная ясность описаний, близость к предметной области, высокая степень абстракции, хорошая переносимость.
Скриптовые (сценарные) языки программирования p p p Широкие возможности повторного использования кода также унаследованы сценарными языками от объектно-ориентированных предков. Существенным преимуществом языков сценариев является их совместимость с передовыми инструментальными средствами автоматизированного проектирования (CASEсредствами) и быстрой реализации программного обеспечения RAD-средствами. Одним из наиболее передовых инструментальных комплексов, предназначенных для быстрой разработки приложений, является Microsoft Visual Studio. NET.
Недостатки скриптовых языков p Естественно, что вместе с достоинствами объектно-ориентированного подхода языки сценариев унаследовали и ряд недостатков. Это сложность тестирования и верификации программ. Характерные примеры сценарных языков программирования: VBScript, Power. Script, Lotus. Script, Java. Script.
Языки параллельного программирования p p Еще один весьма важный класс языков программирования – языки поддержки параллельных вычислений. Программы, написанные на этих языках, представляют собой совокупность описаний процессов, которые могут выполняться как в действительности одновременно, так и в псевдопараллельном режиме. В последнем случае устройство, обрабатывающее процессы, функционирует в режиме разделения времени, выделяя время на обработку данных, поступающих от процессов, по мере необходимости (а также с учетом последовательности или приоритетности выполнения операций).
Достоинства языков параллельных вычислений p p Языки параллельных вычислений позволяют достичь заметного выигрыша при обработке больших массивов информации, поступающих от одновременно работающих пользователей, либо имеющих высокую интенсивность (как, например, видеоинформация или звуковые данные высокого качества). Другой весьма значимой областью применения языков параллельных вычислений являются системы реального времени, в которых пользователю необходимо получить ответ от системы непосредственно после запроса. Такого рода системы отвечают за жизнеобеспечение и принятие ответственных решений.
Недостатки языков параллельных вычислений p высокая стоимость разработки программного обеспечения, следовательно, создание относительно небольших программ широкого (например, бытового) применения зачастую нерентабельно. Примерами языков программирования с поддержкой параллельных вычислений могут служить Ada, Modula-2 и Oz.
Классификация языков программирования p p p Языки программирования также можно разделять на поколения: – языки первого поколения: машинно–ориентированные с ручным управлением памятью компьютеров первого поколения. – языки второго поколения: с мнемоническим (символьным) представлением команд, так называемые автокоды. – языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль. – языки четвертого поколения: усовершенствованные, разработанные для создания специальных прикладных программ, для управления базами данных. – языки программирования пятого поколения: языки декларативные, объектно–ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.
Классификация языков программирования p p Языки программирования также можно классифицировать на процедурные и непроцедурные. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий. Среди процедурных языков выделяют в свою очередь структурные и операционные языки. n В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т. д. n В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки: Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик. Непроцедурное (декларативное) программирование включает функциональные и логические языки.


