ЧАСТЬ 3

ИНФОРМАТИКА

Электронное учебно-методическое пособие

 

 
 

 

С появлением компьютеров 3-го поколения устаревшая технология программирования оказалась основным фактором, сдерживающим развитие компьютерных (информационных) технологий, что подтолкнуло ведущие фирмы (такие как IBM) приступить к разработке новых методологий программирования.

В начале 1970-х гг. появились структурные алгоритмы и соответствующее им программирование (языки Алгол, Бейсик, Паскаль, Фортран).

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

Следование - это структура, в которой действия могут быть выполнены (следовать) друг за другом (рис. 1.5).


Рис. 1.5. Структура «следование»

На рис. 1.5 прямоугольники представляют как одну команду (оператор), так и множество (серию) команд, необходимых для обработки данных.


Ветвление – это структура, обеспечивающая выбор между двумя альтернативами. Выполняется проверка, а затем выбирается один из путей (рис. 1.6). Эта структура называется «ЕСЛИ – ТО – ИНАЧЕ» или условным алгоритмом. Каждый из путей (ТО или ИНАЧЕ) ведёт к общей точке слияния, так что выполнение программы продолжается независимо от того, какой путь был выбран.

 


Рис. 1.6. Структура «полное ветвление»


Если для одного из результатов проверки ничего предпринимать не надо, то можно применять только один обрабатывающий блок (рис. 1.7).

 


Рис. 1.7. Структура «укороченное ветвление»


Цикл (или повторение) предусматривает повторное выполнение некоторого алгоритма (набора команд программы). Циклы позволяют записать длинные последовательности операций с помощью небольшого числа повторяющихся команд. Существуют две разновидности циклических алгоритмов: условные (их два) и со счётчиком (или с параметром).

В каждом из них имеется:

  • элемент, который управляет работой цикла (называемый управляющий элемент цикла);

  • условное выражение, задающее условие выхода из цикла (или наоборот, условие продолжения цикла);

  • шаг цикла, задающий итерацию цикла.

Разновидности цикла изображены на рис. 1.8, 1.9.

Перед началом выполнения цикла следует инициализировать (запустить) управляющий элемент цикла с некоторым начальным значением.

Цикл начинается с проверки логического выражения. Если оно истинно, то выполняется серия команд а, модифицируется (изменяется) шаг цикла и затем все повторяется снова, пока логическое выражение сохраняет значение «истина». Как только оно становится ложным, выполнение операций а прекращается и управление передаётся по программе дальше.

Отличие в этих циклах состоит в местонахождении логических выражений – в циклических алгоритмах типа «Пока» тело цикла выполняется только после проверки условия, и если оно ложное, то команды, находящиеся в теле цикла, могут ни разу не выполниться. В алгоритмах типа «До» тело цикла, независимо от условия, каким бы оно ни было, выполнится хотя бы один раз.

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

Операторы циклической части а должны изменять переменную (или переменные), влияющие на значение логического выражения, иначе программа «зациклится» – будет выполняться бесконечно.

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

На рис. 1.10, 1.11 приведены простейшие примеры структурной реализации линейного, условного и циклических алгоритмов.

Одно из важнейших условий в программировании – это умение образовывать из базовых структур их суперпозиции в соответствии с условиями конкретной задачи.

Допустим, надо ввести в память компьютера 100 чисел и найти сумму только тех из них, которые положительны. Задачу эту можно решить двумя способами – с помощью массива и простой числовой последовательностью (рис. 1.12).

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

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

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

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

Ясно, что ввод – операция циклическая, а внутри этого цикла находится условный алгоритм укороченного типа, в котором проверяется знак числа и производится суммирование чисел.

На (рис. 1.12) изображена схема алгоритма решения этой задачи, в которой условный алгоритм вложен в циклический алгоритм.

Структурный подход характеризуется модульностью, т. е. последовательностью логически связанных операций, оформленных как отдельная часть программы. Модульное программирование даёт возможность:

  • создавать программы несколькими программистами;

  • упрощать проектирование и последующую модификацию программы;

  • упрощать отладку программы (поиск и устранение в ней ошибок);

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

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

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

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

В настоящее время, наряду со структурным проектированием программ, имеется объектное (объектно-ориентированное), декларативное (функциональное, логическое) и процедурно-ориентированное.

Если в основе языков структурного программирования лежат понятия «команда» и «данные», то в объектном программировании основное понятие – «объекты».

Объекты могут связываться друг с другом и перенимать свойства друг у друга (т. е. наследовать). Объекты «оживают» только при наличии в программе процедур (подпрограмм), которые связаны откликами с этими объектами. Таким образом, особенно важным компонентом в объектном программировании является реакция объектов на событие (нажатие на клавишу, на кнопку мыши и т. д.).

Составление алгоритмов решения задач мало чем отличается от основного подхода – структурного, но описание алгоритмов подпрограмм необходимо выполнять в отдельной схеме алгоритма. Наиболее популярные языки объектно-ориентированного программирования созданы на основе языков Basic, Pascal и C – это соответственно Visual Basic, Delphi и C++ Builder.

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

Алгоритмы таких задач порождаются автоматически той системой, которую поддерживает декларативно-ориентированный язык программирования. При логическом варианте (язык Prolog) задача описывается совокупностью факторов и правил, при функциональном – в виде функциональных отношений между фактами (язык Lisp).

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

 

 


© Сибирская государственная геодезическая академия (СГГА), 2011