Алгоритмизация и программирование. Учебное пособие для студентов направления подготовки 09.03.02 Информационные системы и технологии
.pdf
хожих задач, различающихся исходными данными.
Заметим, что правило, сформулированное для единичного случая, не является алгоритмом.
Пример. Таблица производных не является алгоритмом, а правило нахождения производной произведения функций – это алгоритм!
5. Эффективность – качество алгоритма, которое позволяет решить задачу за минимальное число шагов и с минимальными затратами других ресурсов (время, объём памяти компьютера).
К основным структурам алгоритма относят:
Оператор 1 |
• |
линейные; |
|
• |
разветвляющиеся; |
|
||
|
|
циклические. |
Оператор 2 |
• |
|
Линейные (последовательные) – описывают линей- |
|
ный вычислительный процесс, этапы которого выполняют- |
Оператор 3 |
|
|
ся однократно и последовательно друг за другом (рис. 1). |
|
Рис. 1 Линейный алгоритм
Разветвляющиеся (альтернативные) – описывают вычислительный процесс, реализация которого происходит по одному из нескольких возможных направлений (ветвей) решения задачи в зависимости от выполнения
логических условий (например, рис. 2).
Условием может быть утвер- |
|
– |
Условие |
+ |
|
|
|
выполняется? |
|
|
|
|
|
|
|
|
|
ждение, выраженное в любой форме: |
|
|
|
|
|
словесной или в виде формул. Резуль- |
|
|
|
|
|
Оператор 2 |
|
Оператор 1 |
|||
тат проверки условия – «истина» (вы- |
|
||||
|
|
|
|
|
|
полняется) или «ложь» (не выполняет- |
|
|
|
|
|
|
|
|
|
|
|
ся). |
|
|
|
|
|
|
|
Рис. 2 Разветвляющийся алгоритм |
|||
11
|
Циклические (повторяющиеся) – описывают |
|
|
вычислительный процесс, этапы которого (тело цик- |
|
Начальное зна- |
||
|
||
чение параметра |
ла) повторяются многократно (например, рис. 3). |
|
|
||
|
Однако заметим, что многократно – это всё |
|
|
|
|
Параметр цикла |
– |
равно конечное число раз! |
||||
|
Проверка условия |
|
|
Различают простые и сложные (вложенные) |
||||
|
|
|
|
|
|
|
||
+ |
|
|
|
|
циклы. В зависимости от местоположения условия – |
|||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
с предусловием и с постусловием. В зависимости от |
|
|
|
Операторы |
|
|
|
|||
|
|
(тело цикла) |
|
|
|
вида условия – циклы с параметром и итерационные |
||
|
|
|
|
|
||||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
циклы. |
|
Рис. 3 Циклический алгоритм |
||||||||
|
||||||||
Приведем примеры различных струтур алгоритмов:
•линейный – вычисление произведения чисел & и ' (рис. 4);
•разветвляющийся – выполнение одного из двух арифметических действий (сложение или произведение) чисел & и ' в зависимости от условия (рис. 5);
•циклический – вычисление факториала числа ( (рис. 6).
начало |
начало |
|
|
||||
|
|
|
|||||
Ввод A, B |
Ввод A, B |
|
|
||||
|
|
|
|||||
|
+ |
А>=B |
– |
||||
Х = А·В |
|||||||
|
|
|
|
|
|||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Х = А+В |
|
Х = А·В |
|||
|
|
|
|
|
|
||
Вывод Х |
|
|
|
|
|||
конец |
Вывод Х |
|
|
Рис. 4 Линейный алгоритм |
конец |
|
|
|
Рис. 5 Разветвленный алгоритм |
12
|
|
|
начало |
|
|
|
|
|
|
Ввод N |
|
|
|
|
|
|
|
|
|
|
|
|
|
K = 1, N! = 1 |
|
|
|
|
+ |
|
|
|
– |
|
|
|
K<=N |
|
|||
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N! = N!·K |
|
|
Вывод N! |
||
|
K = K+1 |
|
|
|
|
|
|
|
|
|
|
конец |
|
|
|
|
|
|
||
Рис. 6 Циклический алгоритм
§ 3. Этапы решения задачи.
Решение любой задачи и построение алгоритма её решения предусматривает выполнения нескольких этапов:
1)постановка задачи;
2)построение модели;
3)разработка алгоритма, проверка его корректности;
4)реализация алгоритма;
5)анализ алгоритма и его сложности;
6)отладка программы, устранение возможных ошибок;
7)получение результата.
Этапы постановки задачи и построения модели существенно влияют на остальной процесс решения. Сложные вопросы требуют творческого подхода в построении математической модели. При работе с типовыми задачами используют уже известные модели и ранее полученный опыт при решении подобных примеров.
Для проверки правильности алгоритма его прогоняют на ранних тестах. Однако, этого недостаточно для полного доказательства правильности. Необходимо убедиться в конечности алгоритма, при этом проверить все подходящие входные данные и получить все подходящие выходные.
Отметим, что правильность алгоритма ещё не гарантирует его эффективность!
13
Реализация алгоритма – это процесс корректного преобразования алгоритма в машинную программу. При этом создается целая система структур данных для представления модели. Написание правильной программы для компьютера на определённом языке программирования, соответствующей данному алгоритму, – один из важнейших и сложных этапов решения задачи.
Для анализа сложности алгоритма необходимо получить оценку или предел для объема памяти или времени работы. Полный анализ позволяет определить тонкие места в программах.
На этапе отладки программы происходит исправление синтаксических и логических ошибок. Экспериментально проверяется, всё ли выполняет программа из того, что она должна делать. Тестирование позволяет определить вычислительные ограничения программы.
Таким образом, решение задачи на ПК кратко можно представить условнообобщенной схемой (рис. 7).
Постановка |
Построение |
Алгоритм |
Программа |
ПК |
|
задачи |
модели |
||||
|
|
|
Рис. 7 Этапы решения задачи
14
Глава 2. ЯЗЫКИ ПРОГРАММИРОВАНИЯ
И ОСНОВНЫЕ ПОНЯТИЯ АЛГОРИТМИЧЕСКОГО ЯЗЫКА
§ 1. Алгоритм, язык программирования, программа.
Как мы выяснили ранее, процесс программирования начинается с составления алгоритма решения поставленной задачи. При этом ключевым в алгоритмизации является разбиение задачи на мелкие подзадачи. Для решения каждой подзадачи в алгоритме указывается последовательность элементарных шагов, выполнение которых приведет к заданной цели.
Существует несколько методов разработки алгоритмов:
разбиение данных – разделение структуры данных на части;
разложение задачи в последовательность подзадач;
рекурсия – сведение задачи к самой себе;
метод последовательных приближений – определенная последовательность приближений, которая приводит к решению;
решение обратной задачи;
метод полного перебора – проверка некоторого подмножества исходных данных на выполнение поставленного условия;
эвристические методы – правдоподобные правила и критерии, правильность которых строго не доказывается, но имеет положительные результаты при использовании;
динамическое программирование – процесс пошагового решения задачи, когда на каждом шаге выбирается одно значение из множества допустимых, оптими-
зирующее заданную цель.
Когда алгоритм составлен и пройдена проверка его корректности, переходим к следующему важному этапу решения задачи. Необходимо записать на одном из языков программирования текст программы, которая полностью и детально описывает алгоритм.
Напомним, что программа – это последовательность команд, которые помещаются в памяти вычислительной машины и выполняются процессором в определенном порядке.
Далее текст программы переводится в машинный код при помощи специального технического средства, которое называют транслятором. Чтобы проверить, правильно ли работает алгоритм и программа, проводится тестирование при определенных наборах исходных данных. Если после тестирования в программе выявлены ошибки, происходит процесс их устранения, называемый отладкой.
Для записи текста программы используют язык программирования – определенный
15
набор символов и правил, устанавливающих способы комбинации этих символов для записи программы (операторов).
Описание языка программирования состоит из задания синтаксиса и семантики. Синтаксис – это совокупность требований и правил, которые определяют написание
программного кода (расположение и сочетание команд, использование символов и т.д.). В каждом языке программирования синтаксис строго определён, так как компьютер является формальным исполнителем программы.
Кправилам синтаксиса языков программирования относят:
•виды скобок, которые используются при записи команд;
•необходимость использования пробелов и переносов строк;
•использование разного регистра при написании букв в словах;
•необходимость определения типа переменных;
•порядок использования и сочетание команд и др.
Семантика – это система правил однозначного толкования синтаксически правильных программ.
Обратите внимание, что синтаксис языка программирования определяет только правильность написания компьютерного кода, а семантика отвечает за смысловую правильность и значения команд или слов.
Для создания и реализации на компьютере программы применяют системы программирования – это комплекс специализированных программных и аппаратных средств, обеспечивающих автоматизацию, тестирование, отладку и сопровождение программ. Эта система включает в себя:
•язык программирования;
•библиотеку стандартных программ;
•текстовый редактор;
•компилятор;
•компоновщик;
•отладчик.
§2. Компиляторы и интерпретаторы.
Текст программы, который мы вводим на клавиатуре, называют исходным кодом или исходным модулем. Чтобы получить не просто набранный текст, а правильно работающую программу, созданную с помощью языка программирования, в дело вступает специальная программа-транслятор.
Транслятор получает на входе исходный код, а на выходе формирует объектную про-
16
грамму (на объектном языке программирования), в частном случае – машинный код. К трансляторам относятся системные программы-компиляторы и программы-интерпретаторы.
Компилятор переводит текст программы с одного языка на другой – с исходного на машинный. При компиляции происходит синтаксический контроль и выдается сообщение об ошибках.
Интерпретатор выполняет команды языка, указанные в тексте программы. В течение всего времени своей работы интерпретатор находится в оперативной памяти компьютера вместе с исходным текстом программы. Интерпретатор считывает первый оператор в тексте программы, транслирует его в машинный код, после чего команда выполняется. При отсутствии ошибок интерпретатор переходит к следующему оператору. Таким образом, набор символов в тексте интерпретатор превращает в работающую программу, выступая в роли вычислительной машины.
Отличие этих трансляторов в том, что в компиляторе трансляция отделена от выполнения программ, а в интерпретаторе – нет разделения этих двух процессов, они происходят одновременно, параллельно.
В результате обработки исходного кода компилятором получают объектный модуль, имеющий расширение *.obj. Даже при устранении всех ошибок откомпилированный текст – это ещё не окончательный вариант программы, он не готов к выполнению. Необходимо установить внутренние связи в программе, присоединить другие независимо транслируемые модули (например, модули стандартных библиотек).
Компоновщик (или редактор связей) создает исполняемый (загрузочный) модуль программы с расширением *.exe, редактируя связи нескольких объектных модулей. Этот программный модуль уже пригоден для выполнения.
При решении типовых задач используют библиотеку стандартных программ, которая включает в себя часто используемые подпрограммы, оформленные по единым правилам.
Автоматизацией и проверкой правильности программного кода занимается специальная программа – отладчик. Он облегчает процесс поиска ошибок, контролирует ход выполнения программы, организует пошаговый режим, позволяя прерывать работу в конкретных точках после выполнения каждой команды.
Реализация практически любого современного языка программирования представляет собой среду разработки, включающую:
1)компилятор (или интерпретатор);
2)отладчик;
3)встроенный текстовый редактор;
4)специальные средства для просмотра структуры программы;
17
5) библиотеку готовых модулей (например, создание пользовательского интерфейса: окна, кнопки и т.д.).
§ 3. Уровни языков программирования.
Для первых компьютеров, появившихся в 1940-1950-х гг., программирование велось в машинных кодах, а основным носителем информации были перфокарты (рис. 8) и перфоленты (рис. 9).
Рис. 8 Перфокарта
Рис. 9 Перфолента
Данные носители информации представляли собой карточки из тонкого картона (рис. 8) или бумажные ленты (рис. 9), в которых были отверстия на определенных позициях в несколько рядов. С развитием ЭВМ в конце XX века они были вытеснены более компактными и быстрыми магнитными и оптическими носителями информации.
Работая с первыми компьютерами, программисты должны были хорошо знать архитектуру вычислительной машины; при этом программы они составляли простые. Это было связано с ограниченностью возможностей компьютеров и сложностью разработки и отладки программ на машинном языке.
В зависимости от типов процессоров и набора команд выделяют низкий и высокий уровни языков программирования.
Язык программирования низкого уровня ориентирован на определенный тип компью-
18
тера и учитывает его особенности. Операторы такого языка близки к машинному коду. Языки низкого уровня называют машинно-ориентированными.
Первым этапом развития языков программирования является появление языка Assembler. Он кодирует каждую машинную команду символьным условным обозначением, называемым мнемоникой. Одна команда ассемблера может представлять собой не одну машинную команду, а целую последовательность. Каждой конкретной компьютерной архитектуре соответствует свой язык ассемблера. Такой язык применяют для написания небольших системных приложений и драйверов устройств.
Языки программирования высокого уровня больше понятны человеку, чем компьютеру. В таких языках особенности конкретных компьютерных архитектур не учитываются. Языки высокого уровня называют проблемно-ориентированными.
В1954 г. группой разработчиков был создан первый язык программирования высокого уровня – Fortran (от сокращения словосочетания Formula Translator). Он был задуман как язык для программирования математических и инженерно-технических расчетов.
Преимущества языков программирования высокого уровня были настолько очевидны, что разработчики создали и другие языки, более совершенные.
В1960 г. был создан язык программирования Cobol (от сокращения Common Business-Oriented Language). Он задумывался как язык для создания коммерческих предложений, эффективно работающий с большими массивами данных.
В1963 г. появился язык программирования Basic (аббревиатура выражения Beginners' All-Purpose Symbolic Instruction Code). Он являлся средством первоначального обучения программированию для многих поколений. Современный аналог данного языка – Microsoft-
Visual Basic.
В1960 г. был создан язык программирования Algol (сокращение от Algorithmic Language), который дал начало целому семейству языков.
Одним из ярких представителей алголоподобных языков является Pascal, созданный в 1970 г. и названный в честь Блеза Паскаля. Его главная особенность – это первый широко распространенный язык для структурного программирования.
В1972 г. возник язык программирования C. Назван он так, потому что стал третьей и удачной версией, а первые две назывались соответственно – A и B. Язык C создавался как язык для разработки операционной системы Unix. В 1986 г. появилась первая версия языка C++, которая была добавлением в язык C объектно-ориентированных черт. Язык C++ стал основой для разработки современных больших и сложных проектов.
В1995 г. был создан язык Java, названный по марке кофе, унаследовавший синтаксис языков C и C++.
19
В 1999-2000 гг. в корпорации Microsoft был создан язык C# как альтернатива Java. С его помощью разрабатываются многокомпонентные интернет-приложения.
Все перечисленные языки являются языками общего назначения ‒ они не ориентированы и не оптимизированы для использования каких-либо специфических структур данных. Существует большое количество языков, ориентированных на достаточно специфические применения. Среди известных сейчас можно выделить:
JavaScript – язык для описания сложного поведения веб-страниц;
Python – используется для реализации большинства существующих платформ.
§ 4. Состав и описание алгоритмического языка.
Алгоритмический язык – это формальный язык, используемый для записи и реализации алгоритмов. Верны следующие утверждения: любой процедурный язык является алгоритмическим, но не всякий алгоритмический язык пригоден для использования его в качестве языка программирования.
Алгоритмический язык состоит из символов, элементарных конструкций, выражений и операторов, которые имеют иерархическую структуру (рис. 10). Описание этих четырех компонентов и является описанием языка.
Символы |
Элементарные |
|
Выражения |
Операторы |
|
|
конструкции |
|
Рис. 10 Иерархия алгоритмического языка
При описании символов, с помощью которых пишут текст программы, перечисляют все допустимые символы языка, являющиеся основными неделимыми знаками. Алфавит языка состоит из букв, цифр и специальных символов.
Из основных символов составляют элементарные конструкции, называемые лексемами, – это минимальные единицы языка, имеющие самостоятельный смысл. Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются: число 215, имя Sergio, оператор if, арифметический знак «+» и т.д.
Из символов и лексем составляют выражения, которые определяют правило вычисления некоторых значений. Оператор, состоящий из выражений, задает описание действия, которое необходимо выполнить. Если действие сложное, то применяют несколько операторов, которые объединены в составной оператор (блок).
Все сведения о типах данных указываются в предложениях языка программирования, называемых описаниями (объявлениями). Это неисполняемые операторы.
20
