ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРИКЛАДНОЕ ПРОГРАММИРОВАНИЕ 3 семестр: 144 час.; лекции -22 час.; лабораторные – 40 час.; СР – 62 час.; экзамен 4 семестр: 108 час.; лекции – 16 час.; лабораторные – 32 час.; СР – 40 час.; экзамен Лекция 1. Основы алгоритмизации 1. Краткая историческая справка 2. Технология решения задач на компьютере 3. Алгоритм и его свойства 4. Способы задания алгоритмов 1. Краткая историческая справка Слово «алгоритм» происходит от имени хорезмского учёного Абу Абдуллах Мухаммеда ибн Муса аль-Хорезми. Около 825 года он написал сочинение, в котором впервые дал описание придуманной в Индии позиционной десятичной системы счисления. Аль-Хорезми сформулировал правила вычислений в новой системе и, вероятно, впервые использовал 0 для обозначения пропущенной позиции в записи числа (её индийское название арабы перевели как as-sifr или просто sifr, отсюда такие слова, как «цифра» и «шифр»). Приблизительно в это же время индийские цифры начали применять и другие арабские учёные. В первой половине XII века книга аль-Хорезми в латинском переводе проникла в Европу. Переводчик дал ей название Algoritmi de numero Indorum («Алгоритмы о счёте индийском»). Латинизированное имя среднеазиатского учёного было вынесено в заглавие книги, и сегодня считается, что слово «алгоритм» попало в европейские языки именно благодаря этому сочинению. Однако вопрос о его смысле длительное время вызывал ожесточённые споры. На протяжении многих веков происхождению слова давались самые разные объяснения. Одни выводили algorism из греческих algiros (больной) и arithmos (число). Из такого объяснения не очень ясно, почему числа именно «больные». Или же лингвистам больными казались люди, имеющие несчастье заниматься вычислениями? Своё объяснение предлагал и энциклопедический словарь Брокгауза и Ефрона. В нём алгоритм (в то время писали «алгорифм») производится «от арабского слова Аль-Горетм, то есть корень». Перевод сочинения аль-Хорезми стал первой ласточкой, и в течение нескольких следующих столетий появилось множество других трудов, посвящённых всё тому же вопросу — обучению искусству счёта с помощью цифр. Слово algorism (или algorismus), неизменно присутствовавшее в названиях математических сочинений, обрело значение способа выполнения арифметических действий посредством арабских цифр. Алгоритм – это искусство счета с помощью цифр. Именно в таком значении оно вошло во многие европейские языки. Но постепенно значение слова расширялось. Учёные начинали применять его не только к сугубо вычислительным, но и к другим математическим процедурам. Основы алгоритмизации и прикладное программирование Например, около 1360 г. французский философ Николай Орем (Nicolaus Oresme, 1323/25-1382) написал математический трактат Algorismus proportionum («Вычисление пропорций»), в котором впервые использовал степени с дробными показателями и фактически вплотную подошёл к идее логарифмов. В 1684 году Готфрид Лейбниц в сочинении Nova Methodvs pro maximis et minimis, itemque tangentibus… впервые использовал слово «алгоритм» (Algorithmo) в ещё более широком смысле: как систематический способ решения проблем дифференциального исчисления. Однако потребовалось ещё почти два столетия, чтобы все старинные значения слова вышли из употребления. Этот процесс можно проследить на примере проникновения слова «алгоритм» в русский язык. Историки датируют 1691 годом один из списков древнерусского учебника арифметики, известного как «Счётная мудрость». Это сочинение известно во многих вариантах (самые ранние из них почти на сто лет старше) и восходит к ещё более древним рукописям XVI в. По ним можно проследить, как знание арабских цифр и правил действий с ними постепенно распространялось на Руси. Полное название этого учебника — «Сия книга, глаголемая по-еллински и по-гречески арифметика, а по-немецки алгоризма, а по-русски цифирная счётная мудрость». Таким образом, слово «алгоритм» понималось первыми русскими математиками так же, как и в Западной Европе. Однако его не было ни в знаменитом словаре В.И. Даля, ни спустя сто лет в «Толковом словаре русского языка» под редакцией Д. Н. Ушакова (1935 г.). Зато слово «алгорифм» можно найти и в популярном дореволюционном Энциклопедическом словаре братьев Гранат, и в первом издании Большой советской энциклопедии (БСЭ), изданном в 1926 г. И там, и там оно трактуется одинаково: как правило, по которому выполняется то или иное из четырёх арифметических действий в десятичной системе счисления. Однако к началу XX века для математиков слово «алгоритм» уже означало любой арифметический или алгебраический процесс, выполняемый по строго определённым правилам, и это объяснение также даётся в следующих изданиях БСЭ. Алгоритмы становились предметом всё более пристального внимания учёных, и постепенно это понятие заняло одно из центральных мест в современной математике. Что же касается людей, от математики далёких, то к началу сороковых годов XX в. это слово они могли услышать разве что во время учёбы в школе, в сочетании «алгоритм Евклида». Несмотря на это, алгоритм всё ещё воспринимался как термин сугубо специальный, что подтверждается отсутствием соответствующих статей в менее объёмных изданиях. В частности, его нет даже в десятитомной Малой советской энциклопедии (1957 г.), не говоря уже об однотомных энциклопедических словарях. Но зато спустя десять лет, в третьем издании Большой советской энциклопедии (1969 г.) алгоритм уже характеризуется как одна из основных категорий математики, «не обладающих формальным определением в терминах более простых понятий, и абстрагируемых непосредственно из опыта». Как мы видим, отличие даже от трактовки первым изданием БСЭ разительное! За сорок лет алгоритм превратился в одно из ключевых 2 Основы алгоритмизации и прикладное программирование понятий математики, и признанием этого стало включение слова уже не в энциклопедии, а в словари. Например, оно присутствует в академическом «Словаре русского языка» (1981 г.) именно как термин из области математики. Одновременно с развитием понятия алгоритма постепенно про-исходила и его экспансия из чистой математики в другие сферы. Вообще можно сказать, что его сегодняшняя известность напрямую связана со степенью распространения компьютеров. Например, в третьем томе «Детской энциклопедии» (1959 г.) о вычислительных машинах говорится немало, но они ещё не стали чем-то привычным и воспринимаются скорее как некий атрибут светлого, но достаточно далёкого будущего. Соответственно и алгоритмы ни разу не упоминаются на её страницах. Но уже в начале 70-х гг. XX столетия, когда компьютеры перестали быть экзотической диковинкой, слово «алгоритм» стремительно входит в обиход. Это чутко фиксируют энциклопедические издания. В Энциклопедии кибернетики» (1974 г.) в статье «Алгоритм» он уже связывается с реализацией на вычислительных машинах, а в «Советской военной энциклопедии» (1976 г.) даже появляется отдельная статья «Алгоритм решения задачи на ЭВМ». Теперь компьютер стал неотъемлемым атрибутом нашей жизни, компьютерная лексика становится всё более привычной. Слово «алгоритм» уверенно шагнуло даже в разговорную речь, и сегодня мы нередко встречаем в газетах и слышим в выступлениях политиков выражения вроде «алгоритм поведения», «алгоритм успеха» или даже «алгоритм предательства». Академик Н. Н. Моисеев назвал свою книгу «Алгоритмы развития», а известный врач Н.М. Амосов — «Алгоритм здоровья» и «Алгоритмы разума». А это означает, что слово живёт, обогащаясь всё новыми значениями и смысловыми оттенками. 2. Технология решения задач на компьютере Решение задачи на ЭВМ представляет собой процесс получения искомой информации на основе обработки исходных данных с помощью программы. В законе РФ от 23 сентября 1992 г. № 3523-I с изменениями от 24.12.2002 г. № 177-ФЗ «О правовой охране программ для электронных вычислительных машин и баз данных» и в ст. 1261 ГК РФ от18.12.2006 № 230-ФЗ указывается: «Программой для ЭВМ является представленная в объективной форме совокупность данных и команд, предназначенных для функционирования ЭВМ и других компьютерных устройств в целях получения определенного результата, включая подготовительные материалы, полученные в ходе разработки программы для ЭВМ, и порождаемые ею аудиовизуальные отображения». Создание такой программы решения задачи на ЭВМ предполагает выполнение ряда последовательных этапов технологического процесса Основные этапы компьютерного решения задачи Первым этапом процесса подготовки решения задачи на ЭВМ является постановка задачи. 3 Основы алгоритмизации и прикладное программирование Постановка задачи включает формулирование условия задачи, определение конечных целей решения задачи, подробное описание содержания задачи. Описываются характер и сущность всех величин задачи (тип данных, их структуру, диапазон изменения величин задействованных в решении задачи, т.е. ограничения, налагаемые на данные предметной областью и т.д.), форма представления ожидаемых результатов решения задачи, определяются условия, при которых задача имеет решение. Важно, чтобы количество исходной информации было достаточным для получения решения задачи. Постановка задач должна включать описание контрольного примера, который должен демонстрировать алгоритм решения задачи штатным способом, а так же отражать весь спектр возможных вариантов исходных данных задачи. В контрольном примере должны быть перечислены все нештатные ситуации, которые могут возникнуть в процессе решения задачи, а так же должен быть описан алгоритма действий пользователя в каждой конкретной нештатной ситуации. Конечный пользователь разрабатываемой программы, хорошо знающий ее предметную область, может слабо представлять возможности использования ЭВМ для ее решения. В свою очередь предметная область пользователя может быть незнакома разработчику программы, реализующему алгоритм ее решения, хотя он хорошо представляет себе возможности ЭВМ, которые можно использовать при реализации разрабатываемого алгоритма. Под предметной областью понимаем часть реального мира, данные о котором используются при решении задачи. Это противоречие может стать причиной возникновения ошибок при реализации данного этапа решения задачи с использованием ЭВМ. По данным экспертов, на этот этап приходится более 50% общего числа ошибок, обнаруживаемых в процессе разработки программ решения задач вычислительного и инженерного характера. При исправлении подобного рода ошибок расходуется в среднем 80% всего времени разработчиков на поиск и устранение ошибок в программе. Таким образом, постановка задачи – важнейший этап, который должен обеспечить корректную и полную постановки задачи, так как от нее во многом зависят все последующие действия, а также однозначность ее понимания, как разработчиком программы, так и пользователем этой программы, в качестве которого обычно выступает постановщик задачи. В противном случае разрабатываемый программный продукт не будет соответствовать требованиям конечного потребителя. На этапе постановки задачи должно быть четко определено, что должна делать программа, в чем реальные проблемы, решению которых должна способствовать программа, что представляют собой исходные данные. Какими должны быть выходные данные, какими ресурсами располагает разработчик. Вторым этапом в технологии разработки программы является анализ и математическое описание (моделирование, формализация) задачи и выбор метода ее решения. В результате анализа задачи определяется объем исходных данных, устанавливается принадлежность задачи к одному из известных классов задач, выбирается математический аппарат ее решения. 4 Основы алгоритмизации и прикладное программирование Моделью называется представление основных элементов системы в виде совокупности физических или математических объектов. Математическая модель позволяет свести реальную задачу к ее математическому представлению. Для достижения этой цели условие задачи записывается в виде системы уравнений, либо в виде последовательности формул, необходимых для получения искомого результата. Математическая модель – приближенное описание реального объекта или явления. Степень адекватности модели реальному объекту проверяется экспериментально, в случае необходимости - модель уточняется. Математическая модель задачи должна обеспечивать однозначное ее понимание пользователем и разработчиком программы, которая выполняет решение этой задачи. Результатом второго этапа технологии разработки программы должна быть формализованная (в виде формул) постановка задачи. Третий этап процесса подготовки решения задачи на ЭВМ представляет собой алгоритмизацию ее решения, т.е. выбор метода решения задачи и разработку собственного или применение уже известного алгоритма реализации выбранного метода. В большинстве случаев математическую постановку задачи бывает трудно записать в виде машинного кода, поэтому возникает необходимость найти способ, т.е. алгоритм решения таких задач. Для некоторых классов задач, например, нахождение корней квадратного уравнения, существуют точные методы решения, которые можно представить в виде последовательности математических и логических действий. Для многих задач, например, вычисления интегралов, дифференциальных уравнений, системы уравнений и т.д. точное решение либо неизвестно, либо оно приводит к громоздким формулам. Приближенное решение такого рода задач с требуемой точностью можно найти применив специальные численные методы. Для тех задач, которые удается описать математически, необходимо выбрать и обосновать один из известных численных методов их решения, либо построить математическую модель их решения, а для нечисловых задач – принципиальную схему их решения (т.е. последовательность выполнения элементарных математических и логических операций). После того, как численный метод выбран, приступают к построению алгоритма решения задачи. Алгоритмизация – это процесс построение новых или преобразование уже известных алгоритмов к условиям конкретных технических заданий. Постановка задачи и ее алгоритмизация занимают в среднем 20 - 30% общего времени на разработку программных средств решения задачи. Для решения одной и той же задачи или уже существует множество различных алгоритмов, или существует возможность построения нескольких новых алгоритмов. Эти алгоритмы могут отличаться друг от друга уровнем сложности, объемами вычислительных работ, оригинальность решения, другими факторами, влияющими на эффективность выбранного способа решения задачи. 5 Основы алгоритмизации и прикладное программирование «Час, потраченный на выбор алгоритма, стоит пяти часов программирования» (Д. Ван-Тассел). Процесс алгоритмизации решения задачи в общем случае реализуется по следующей схеме: – разбиение процесса решения поставленной задачи на отдельные этапы (части, блоки) обычно с одним входом и одним выходом; – формализованное (в виде формул) описание шагов (действий), выполняемых на каждом из выделенных этапов; – проверка правильности реализации выбранного алгоритма на различных контрольных примерах решения для поставленной задачи. 3. Алгоритм и его свойства Что такое алгоритмы? Стоит ли тратить время на их изучение? Какова роль алгоритмов и как они соотносятся с другими компьютерными технологиями? Попытаемся дать ответы на поставленные вопросы. В математике для решения типовых задач мы используем определенные правил. Обычно любые инструкции и правила представляют собой последовательность действий, которую необходимо выполнить в определенном порядке. Для решения задачи надо знать: ─ что дано, ─ что следует получить и ─ какие действия, и ─ в каком порядке следует для этого выполнить. Алгоритм – это точное предписание исполнителю совершить указанную последовательность действий для получения решения задачи за конечное число шагов. Приведенное определение не является определением в математическом смысле слова, а, скорее, описание интуитивного понятия алгоритма, раскрывающее его сущность. Говоря неформально, алгоритм (algorithm) — это любая корректно определенная вычислительная процедура, на вход (input) которой подается некоторая величина или набор величин, и результатом выполнения которой является выходная (output) величина или набор значений. Таким образом, алгоритм представляет собой последовательность вычислительных шагов, преобразующих входные величины в выходные. Но для общего понимания сущности алгоритма такого толкования оказывается, как правило, достаточно. Понятие алгоритма является не только одним из главных понятий математики, но одним из главных понятий современной пауки. Более того, с наступлением эры информатики алгоритмы становятся одним из важнейших факторов цивилизации. Алгоритм также можно рассматривать как инструмент, предназначенный для решения корректно поставленной вычислительной задачи (computational problem). В постановке задачи в общих чертах задаются отношения между входом и выходом. 6 Основы алгоритмизации и прикладное программирование В алгоритме описывается конкретная вычислительная процедура, с помощью которой удается добиться выполнения указанных отношений. Например, может понадобиться выполнить сортировку последовательности чисел в неубывающем порядке. Эта задача часто возникает на практике и служит благодатной почвой для ознакомления на ее примере со многими стандартными методами разработки и анализа алгоритмов. Задача сортировки (sorting problem) формально определяется следующим образом. Вход: последовательность из n чисел ·a1, a2, . . . , an Выход: перестановка (изменение порядка) a1′, a2′, . . ., an′ входной последовательности таким образом, что для ее членов выполняется соотношение a1′ ≤ a2′ ≤ … ≤ an′. Например, если на вход подается последовательность ·31, 41, 59, 26, 41, 58, то вывод алгоритма сортировки должен быть таким: ·26, 31, 41, 41, 58, 59. Подобная входная последовательность называется экземпляром (instance) задачи сортировки. Вообще говоря, экземпляр задачи состоит из ввода (удовлетворяющего всем ограничениям, наложенным при постановке задачи), необходимого для решения задачи. В информатике сортировка является основополагающей операцией (во многих программах она используется в качестве промежуточного шага), в результате чего появилось большое количество хороших алгоритмов сортировки. Выбор наиболее подходящего алгоритма зависит от многих факторов, в том числе от количества сортируемых элементов, от их порядка во входной последовательности, от возможных ограничений, накладываемых на члены последовательности, а также от того, какое устройство используется для хранения последовательности: основная память, магнитные диски или накопители на магнитных лентах. Говорят, что алгоритм корректен (correct), если для каждого ввода результатом его работы является корректный вывод. Мы говорим, что корректный алгоритм решает данную вычислительную задачу. Если алгоритм некорректный, то для некоторых вводов он может вообще не завершить свою работу или выдать ответ, отличный от ожидаемого. Правда, некорректные алгоритмы иногда могут оказаться полезными, если в них есть возможность контролировать частоту возникновения ошибок. Тем не менее, обычно мы заинтересованы только в корректных алгоритмах. Какие задачи решаются с помощью алгоритмов? Вычислительные задачи, для которых разработаны алгоритмы, отнюдь не ограничиваются сортировкой. Практическое применение алгоритмов чрезвычайно широко, к примеру. Целью проекта по расшифровке генома человека является идентификация всех 100 000 генов, входящих в состав ДНК человека, определение последовательностей, образуемых 3 миллиардами базовых пар, из которых состоит ДНК, сортировка этой информации в базах данных и разработка инструментов для ее анализа. Для реализации всех перечисленных этапов нужны сложные алгоритмы. Это позволяет ученым достигать поставленных целей, эффективно 7 Основы алгоритмизации и прикладное программирование используя вычислительные ресурсы. При этом экономится время (как машинное, так и затрачиваемое сотрудниками) и деньги, а также повышается эффективность использования лабораторного оборудования. Internet позволяет пользователям в любой точке мира быстро получать доступ к информации и извлекать ее в больших объемах. Управление и манипуляция этими данными осуществляется с помощью хитроумных алгоритмов. В число задач, которые необходимо решить, входит определение оптимальных маршрутов, по которым перемещаются данные, и быстрый поиск страниц, на которых находится та или иная информация, с помощью специализированных поисковых машин. Электронная коммерция позволяет заключать сделки и предоставлять товары и услуги с помощью электронных технических средств. Для того чтобы она получила широкое распространение, важно иметь возможность защищать такую информацию, как номера кредитных карт, пароли и банковские счета. В число базовых технологий в этой области входят криптография с открытым ключом и цифровые подписи, основанные на численных алгоритмах и теории чисел. Пусть имеется уравнение ax ≡ b (mod n), где a, b и n — целые числа, и нужно найти все целые x по модулю n, удовлетворяющие этому уравнению. Оно может не иметь решения, может иметь одно или несколько решений. Можно попытаться применить метод, заключающийся в последовательной подстановке в уравнение чисел x = 0, 1, . . . , n−1, но существует более эффективный метод. Пусть имеется n принадлежащих плоскости точек, и нужно найти выпуклую оболочку этих точек. Выпуклой оболочкой точек называется минимальный выпуклый многоугольник, содержащий эти точки. Для решения этой задачи удобно воспользоваться такой наглядной картиной: если представить точки в виде вбитых в доску и торчащих из нее гвоздей, то выпуклую оболочку можно получить, намотав на них резинку таким образом, чтобы все гвозди вошли внутрь замкнутой линии, образуемой резинкой. Каждый гвоздь, вокруг которого обвивается резинка, становится вершиной выпуклой оболочки. В качестве набора вершин может выступать любое из 2n подмножеств множества точек. Однако недостаточно знать, какие точки являются вершинами выпуклой оболочки, нужно еще указать порядок их обхода. Таким образом, чтобы найти выпуклую оболочку, приходится перебрать множество вариантов. Приведенные выше случаи применения алгоритмов отнюдь не являются исчерпывающими, однако на их примере выявляются две общие характеристики, присущие многим интересным алгоритмам. 1. Есть множество вариантов-кандидатов, большинство из которых решениями не являются. Поиск среди них нужной комбинации является довольно трудоемким. 2. Задачи имеют практическое применение. Простейший пример среди перечисленных задач — определение кратчайшего пути, соединяющего два перекрестка. Любая компания, занимающаяся авто- или железнодорожными перевозками, финансово заинтересована в том, чтобы определить кратчайший маршрут. Это способствовало бы снижению затрат труда и расходов горючего. 8 Основы алгоритмизации и прикладное программирование Маршрутизатору Internet также нужно иметь возможность находить кратчайшие пути в сети, чтобы как можно быстрее доставлять сообщения Заметим, что существуют и алгоритмически неразрешимые задачи, для решения которых нет и не может существовать алгоритма. Но большинство задач в IT разрешимы алгоритмически, и алгоритмы активно используются в работе с ними. Примером алгоритма может служить алгоритм «Переправа». На левом берегу реки находятся два молодых человека со своими девушками. Всем нужно перебраться на правый берег, но в лодке только два места. Каждая девушка не хочет оставаться на берегу без своего молодого человека, если на этом же берегу находится другой молодой человек. Как всем переплыть на другой берег? Решение: Обозначим девушек и молодых людей Д1, Д2, М1, М2, переезд на правый берег →, переезд на левый берег ← . Можно записать алгоритм: 1. 2. 3. 4. 5. Д1, Д2 → Д1 ← М1, М2 → М1 ← Д1, М1 → Порядок действий считается алгоритмом в том случае, если он обладает определенными свойствами. К основным свойствам алгоритмов относятся следующие свойства: 1. Понятность для исполнителя, ─ исполнитель алгоритма должен понимать, как его выполнять. Иными словами, имея алгоритм и произвольный вариант исходных данных, исполнитель должен знать, как надо действовать для выполнения этого алгоритма. 2. Дискретность (прерывность, раздельность) - алгоритм должен представлять процесс решения задачи как последовательное выполнение простых (или ранее определенных) шагов (этапов). 3. Определенность (детерминированность)— каждое правило алгоритма должно быть четким, однозначным и не должно возникать разночтений и разногласий. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче. 4. Релевантность (или конечность, результативность) состоит в том, что за конечное число шагов алгоритм либо должен приводит к решению задачи, либо после конечного числа шагов останавливаться из-за невозможности получить решение с выдачей соответствующего сообщения, либо неограниченно продолжаться в течение времени, отведенного для исполнения алгоритма, с выдачей промежуточных результатов. 9 Основы алгоритмизации и прикладное программирование 5. Массовость означает, что алгоритм решения задачи разрабатывается в общем виде, т.е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из некоторой области, которая называется областью применимости алгоритма. Исполнитель алгоритма – это некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, способная выполнить действия, предписываемые алгоритмом. Им может быть: Человек; Группа людей; Дрессированное животное Робот; Программа; Компьютер. Важнейшим свойством любого исполнителя является то, что он может выполнять некоторые команды, например: Исполнитель человек – «включить ПК», «сравнить число с 0», «сложить числа»; «извлечь корень»; Исполнитель собака – «встать», «лечь», «искать», «фу»; Исполнитель компьютер – «загрузить файл», «скопировать файл», «перезагрузить систему», «завершить работу». Совокупность команд, которые может выполнить исполнитель, называется системой команд исполнителя (СКИ). В зависимости от задачи, для решения которой составляется алгоритм, указания алгоритма еще называют директивами, шагами, операторами, командами, поэтому интуитивное понятие алгоритма можно сформулировать и так: Под алгоритмом понимается последовательность упорядоченных, корректных указаний (команд, операторов, шагов, директив), которые должен выполнить исполнитель для достижения поставленной цели. Правила построения алгоритма Чтобы алгоритм выполнил свое предназначение, eго необходимо строить по определенным правилам. В этом смысле нужно говорить не о свойствах алгоритма, а о правилах построения алгоритма, или о требованиях, предъявляемых к алгоритму. Первое правило ─ при построении алгоритма, прежде всего, необходимо задать множество объектов, с которыми будет работать алгоритм. Формализованное (закодированное) представление этих объектов носит название данных. Алгоритм приступает к работе с некоторым набором данных, которые называются входными, и в результате своей работы выдает данные, которые называются входными. Таким образом, алгоритм преобразует входные данные в выходные. 10 Основы алгоритмизации и прикладное программирование Это правило позволяет сразу отделить алгоритмы от «методов» и «способов». Пока мы не имеем формализованных входных данных, мы не можем построить алгоритм. Второе правило ─ для работы алгоритма требуется память. В памяти размещаются входные данные, с которыми алгоритм начинает работать, промежуточные данные и выходные данные, которые являются результатом работы алгоритма. Память является дискретной, т.е. состоящей из отдельных ячеек. Поименованная ячейка памяти носит название переменной. В теории алгоритмов размеры памяти не ограничиваются, т. е. считается, что мы можем предоставить алгоритму любой необходимый для работы объем памяти. Третье правило ─ дискретность. Алгоритм строится из отдельных шагов (действий, операций, команд). Множество шагов, из которых составлен алгоритм, конечно. Четвертое правило ─ детерминированность. После каждого шага необходимо указывать, какой шаг выполняется следующим, либо давать команду остановки. Пятое правило ─ сходимость (результативность). Алгоритм должен завершать работу после конечного числа шагов. При этом необходимо указать, что считать результатом работы алгоритма. Итак, алгоритм ─ неопределяемое понятие теории алгоритмов. Алгоритм каждому определенному набору входных данных ставит в соответствие некоторый набор выходных данных, т. е. вычисляет (реализует) функцию. При рассмотрении конкретных вопросов в теории алгоритмов всегда имеется в виду какая-то конкретная модель алгоритма. Сложность алгоритма Алгоритмы, разработанные для решения одной и то же задачи, часто очень сильно различаются по сложности (эффективности). Эти различия могут быть намного значительнее, чем те, что вызваны применением неодинакового аппаратного и программного обеспечения. Понятие «сложность» — одно из ключевых в изучении алгоритмов. Оно означает не то, насколько трудно понять тот или иной метод, а ресурсы, затраченные на вычисление. Если сложность высокая, алгоритм будет выполняться медленнее и, возможно, тратить больше аппаратных ресурсов; такого желательно избегать. 4. Способы задания алгоритмов На практике наиболее распространены следующие способы задания алгоритмов: – словесная (запись на естественном языке); – формально-словесная; – графическая (изображения из графических символов); – псевдокоды (полуформализованные описания алгоритмов на условном алгоритмическом языке, включающие в себя как элементы языка 11 Основы алгоритмизации и прикладное программирование программирования, так и фразы естественного языка, общепринятые математические обозначения и др.); – программная (тексты на языках программирования). Словесный способ – отражает содержание выполняемых действий средствами естественного языка. К достоинствам этого способа описания следует отнести его общедоступность, а также возможность описывать алгоритм с любой степенью детализации. Однако словесное описание алгоритмов на любом естественном языке обладает некоторыми недостатками, а именно: возможность неоднозначного понимания предписаний и утверждений; громоздкость, связанная с избыточностью разговорных языков (наличие в предложениях слов, без которых можно обойтись); отсутствие наглядности логических связей между частями алгоритма. Пример. Записать алгоритм нахождения наибольшего общего делителя (НОД) двух натуральных чисел (алгоритм Евклида). Алгоритм может быть следующим: 1) Задать два числа. 2) Если числа равны, то взять любое из них в качестве ответа и остановиться, в противном случае продолжить выполнение алгоритма. 3) Определить большее из чисел. 4) Заменить большее из чисел разностью большего и меньшего из чисел. 5) Повторить алгоритм с шага 2. Описанный алгоритм применим к любым натуральным числам и должен приводить к решению поставленной задачи. Рассмотрим свойства этого алгоритма 1. Он дискретен, так как состоит из 6 отдельных указаний (шагов). 2. Все указания имеют однозначный смысл и не требуют от исполнителя решений, не предусмотренных алгоритмом, значит, он обладает свойством определенности. 3. Алгоритм понятен исполнителю, который умеет: сравнивать два числа; определять большее из двух чисел; находить разность двух чисел. Значит, алгоритм обладает свойством понятности. 4. Алгоритм позволяет найти НОД для любых двух натуральных чисел, значит, он обладает свойством массовости. 5. Для любой пары чисел алгоритм позволяет найти НОД за конечное число указаний (шагов), поэтому он результативен. 6. Алгоритм может выполнить исполнитель, умеющий выполнять команды, перечисленные в свойстве 3, но, который может и не знать, что такое НОД, значит, алгоритм обладает свойством формальности. Формально-словесный способ (словесно-формульный) – основан на записи содержания выполняемых действий с использованием изобразительных возможностей языка математики, дополненного с целью указания необходимых 12 Основы алгоритмизации и прикладное программирование пояснений средствами естественного языка. Данный способ, обладая всеми достоинствами словесного способа, вместе с тем более лаконичен, а значит, и более нагляден, имеет большую формализацию, однако также не является строго формальным. Пример. Необходимо найти значение следующего выражения: у = 2а – (х+6). Словесно-формульным способом алгоритм решения этой задачи может быть записан в следующем виде: 1. Ввести значения а и х. 2. Сложить х и 6. 3. Умножить a на 2. 4. Вычесть из 2а сумму (х+6). 5. Вывести у как результат вычисления выражения. Графический способ (блок-схемный) – представляет собой изображение логико-математической структуры алгоритма, при котором все этапы процесса обработки данных представляются с помощью определенного набора геометрических фигур (блоков), имеющих строго определенную конфигурацию в соответствии с характером выполняемых действий. Таким образом, блок-схема – это графическое изображение структуры алгоритма в виде геометрических фигур или блоков, связанными по управлению линиями (направлениями потока) со стрелками. В блоках записывается последовательность действий. Преимущества: – наглядность: каждая операция вычислительного процесса изображается отдельной геометрической фигурой; 13 Основы алгоритмизации и прикладное программирование – графическое изображение алгоритма наглядно показывает разветвления путей решения задачи в зависимости от различных условий, повторение отдельных этапов вычислительного процесса и другие детали. К сведению: Оформление программ должно соответствовать определенным требованиям. В настоящее время действует единая система программной документации (ЕСПД), которая устанавливает правила разработки, оформления программ и программной документации. В ЕСПД определены и правила оформления блок-схем алгоритмов (ГОСТ 10.002-80 ЕСПД, ГОСТ 10.003-80 ЕСПД). Рис. 1. Условно-графическое изображение основных элементов алгоритма Изображение блок-схем алгоритмов осуществляется по определенным правилам, которые должны повысить их наглядность и однозначность восприятия всеми пользователями и исполнителями. Следование этим правилам облегчит обнаружение логических ошибок в программах. В соответствии с этими правилами каждая блок-схема должна начинаться и заканчиваться соответствующими символами, обозначающими начало и окончание алгоритма. Все функциональные блоки в блок-схеме должны располагаться в последовательности сверху вниз и слева направо. Линии потока призваны объединить функциональные блоки между собой. Направление сверху вниз и слева направо – это нормальное направлением линий потока (т.е. естественный порядок следования этапов процесса решения задачи). В этом случае направление линий потока не указывают с помощью стрелок. Другие направления процесса решения задачи должны быть указаны с помощью стрелок. Необходимым условием корректности блок-схем алгоритмов является недопустимость более чем одного выхода из функциональных блоков, обозначающих обрабатывающие операции, и не менее двух выходов из функциональных блоков, обозначающих логические операции по проверке выполнения условий. Для обозначения направлений передачи управления алгоритмом от блоков логических операций над соответствующими линиями потока могут присутствовать слова ДА либо НЕТ Для отражения связей между удаленными друг от друга функциональными блоками соединяющие их линии потока можно разрывать. В этом случае в конце и начале обрыва линии потока изображаются специальные символы: – при отражении разрыва связей между функциональными блоками, расположенными на одной и той же странице внутри соединителей, отмечающих разрыв одной и той же линии потока, ставятся одинаковая буквенная, цифровая или буквенно-цифровая маркировка. Иллюстрация этой ситуации приведена на рис. 2: – при отражении разрыва связей между функциональными блоками, расположенными на разных страницах внутри соединителей, отмечающих разрыв 14 Основы алгоритмизации и прикладное программирование одной и той же линии потока, требуется указать маркировку блока соединителя (может быть цифра, буква или буквенно-цифровая последовательность), а также номер следующего за разрывом или предшествующего разрыву листа. Иллюстрация этой ситуации приведена на рис. 3 Рис. 2. Вид разрыва линий перехода на одном листе Рис. 3. Вид разрыва линий перехода на различных листах Псевдокод Псевдокод представляет собой систему обозначений и правил, предназначенную для единообразной записи алгоритмов. Псевдокод занимает промежуточное место между естественным и формальным языками. С одной стороны, он близок к обычному естественному языку, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, что приближает запись алгоритма к общепринятой математической записи. В псевдокоде не приняты строгие синтаксические правила для записи команд, присущие формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде обычно имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном языке. В частности, в псевдокоде, так же, как и в формальных языках, есть служебные слова, смысл которых определен раз и навсегда. Они выделяются в печатном тексте жирным шрифтом, а в рукописном тексте подчеркиваются. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций. Программный способ записи алгоритмов 15 Основы алгоритмизации и прикладное программирование При записи алгоритма в словесной форме, в виде блок-схемы или на псевдокоде допускается определенный произвол при изображении команд. Вместе с тем такая запись точна настолько, что позволяет человеку понять суть дела и исполнить алгоритм. Однако на практике в качестве исполнителей алгоритмов используются специальные автоматы – компьютеры. Поэтому алгоритм, предназначенный для исполнения на компьютере, должен быть записан на понятном ему языке. И здесь на первый план выдвигается необходимость точной записи команд, не оставляющей места для произвольного толкования их исполнителем. Следовательно, язык для записи алгоритмов должен быть формализован. Такой язык принято называть языком программирования, а запись алгоритма на этом языке – программой для компьютера. Программа, создаваемая человеком – программистом, представляет собой текст, состоящий из знаков, как правило букв, цифр и специальных знаков. Знаки в тексте программы часто объединены в последовательности - ключевые слова, слова объединены в предложения языка программирования – операторы. Каждый оператор, как правило, записывается в отдельную строку текста программы. Пример. #Пример программы на языке Python 3 t = int(input('введите температуру воздуха t=')) if t<0: print('одеть шубу') else: print('одеть куртку') Таким образом текстовое программирование представляет собой иерархическую последовательность знаков, слов, операторов, записываемых и читаемых последовательно, как обычный текст человеческой письменности. 16