Файл: Основные правила работы с функциями: примеры и ограничения использования функций в различных языках программирования.pdf
Добавлен: 25.04.2023
Просмотров: 183
Скачиваний: 1
СОДЕРЖАНИЕ
ГЛАВА 1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
1.1. Языки программирования низкого и высокого уровня
1.2. Обзор некоторых языков программирования высокого уровня
ГЛАВА 2. РАБОТА С ФУНКЦИЯМИ В TURBO PASCAL И DELPHI
2.1. Использование функций в Turbo Pascal и Delphi
2.2. Использование функций в Turbo Pascal
Основной стержень, на котором держится модульное программирование, - аппарат подпрограмм. Внутри модулей действия реализуют соответствующие подпрограммы. Вызывающая программа содержит фактически только вызовы необходимых подпрограмм. Программные средства поддержки этой технологии наиболее полно впервые были реализованы в языке программирования Фортран и затем в большинстве последующих языков.
Для того, чтобы пользоваться средствами, предоставляемыми модулем, нам нужна некая дополнительная информация по этому модулю. Во- первых, мы должны знать, какими подпрограммами какие действия выполняются. Во- вторых, нам нужно знать, какую информацию нужно передать этим подпрограммам для решения задачи, и как ее нужно передать. Таким образом, важный момент при использовании модульного программирования - в обеспечении взаимодействия между модулями, или как говорят, определении интерфейса. Описание интерфейса, как правило, приводится в специальном заголовочном файле. [15]
Передачу информации между подпрограммами модулей осуществляют посредством списков параметров при вызове соответствующей подпрограммы. Иногда допустимо использовать глобальные переменные, но их использование должно быть обосновано. [1, с. 4-6]
При создании сложных программных систем важная задача - в правильной организации процесса проектирования системы. Один из самых распространенных методов решения этой задачи - технология проектирования «сверху вниз», напрямую связанная с технологией модульного программирования. Проектирование и реализация программной системы - это следствие постановки некой задачи, которую нужно решить. При этом, формулируя задачу, мы имеем дело с понятиями реального мира, а не с абстрактными понятиями. К примеру, при рисовании мы имеем дело с понятиями «картинка», «инструмент рисования» и т.д.
Над объектами, представляющими понятие, возможно совершение различных действий, либо ими самими могут выполняться какие-то операции. К примеру, полученную картинку можно сохранять для дальнейшего пользования, открывать ее для просмотра, вставлять в документ, редактировать ее, вставляя и удаляя геометрические фигуры и пр. [17]
Во многих случаях понятие может быть определено с использованием ряда других, более простых понятий. В нашем примере «картинка» может быть определена как совокупность различных геометрических фигур - точек, линий, окружностей. В данном случае понятие «геометрическая фигура» является понятием более низкого уровня, используемым для определения понятия «картинки». В свою очередь понятие геометрической фигуры может быть также детализировано, используя перечисленные выше понятия.
Объект вместе с операциями, связанными с ним, - это некий исполнитель с определенной системой предписаний (действий). Выполнение любой программы - это проведение каких-либо действий над какими-либо объектами, то есть использование исполнителей. [15]
При использовании исполнителя интересны его внешние свойства, а именно, его предписания, что получается в результате их выполнения и пр. Описание этих свойств - это внешнее описание исполнителя, позволяющее им пользоваться, но ничего не говорящее о его внутреннем устройстве, о его реализации. Но для использования исполнителя необходимо иметь его реализацию, причем может быть на базе других исполнителей. [18]
Таким образом, при реализации исполнитель рассматривается с внутренней точки зрения. Нас интересует его структура и как им выполняются те или иные действия. При этом реализацию каждого из исполнителей можно рассматривать как отдельную подзадачу в рамках исходной задачи. При проектировании программной системы разработчик имеет в распоряжении несколько реализованных ранее исполнителей, или поддерживаемых самой системой программирования. Такие исполнители называются базовыми. К примеру, базовыми исполнителями могут быть библиотека файлового ввода-вывода, математическая библиотека, понятие массива с определенными над ним операциями, либо некий исполнитель, реализованный пользователем ранее. [15]
Удобно решение исходной задачи разбиением ее на подзадачи, используя промежуточные исполнители. Технологией программирования «сверху вниз» предлагается такое разбиение от исполнителя A (сверху) к базовым исполнителям E1 , E2 ,.., Ek (вниз). Согласно указанному подходу сначала происходит выделение и реализация общей идеи алгоритма, и только потом его детализация. При этом каждый раз, при очередном шаге вниз, формулируются уточнения. Схема этого процесса представлена на рис. 1:
А
В1
Е2
С1
С2
Е3
Е4
Е5
Е1
Рисунок 1 – Результат проведения декомпозиции [1, с. 15]
Таким образом, модульная структура программы имеет вид графа (в данном случае - древовидную структуру). Узлы этого дерева являются программными модулями, а направленными стрелками показывается статическая подчиненность модулей, т.е. каждой дугой показывается, что в тексте модуля, из которого она исходит, есть ссылка на модуль, в который она входит. [17]
Процесс разбиения задачи на ряд подзадач называется декомпозицией.
Конечная программа состоит из нескольких слоев и представляет собой иерархию исполнителей. При этом все или некоторые из них могут быть уже реализованы раньше, а, значит, достаточно их подключить к основной программе. Остальные же исполнители необходимо реализовать, возможно привлекая других исполнителей.
При декомпозиции задачи, нужно руководствоваться скорее тем, что надо сделать, чем тем, на какой базе. То есть, используя технологию проектирования «сверху-вниз», реализовывается некий исполнитель в удобном, естественном виде без жесткой привязки к уже существующим исполнителям. [1, с. 12-16]
Определим общие принципы модульного программирования: [17]
- Работа программного модуля не должна быть зависима: от входных данных; от программного модуля, которому предназначены его выходные данные; от предыдущих вызовов программного модуля;
- Желательный размер программного модуля - одна-две страницы исходного листинга (50-100 строк исходного кода);
- У модуля должна быть только одна входная и одна выходная точка;
- Установление взаимосвязей между модулями по иерархической структуре;
- У каждого модуля должен быть комментарий, объясняющий его назначение, назначение переменных, передаваемых в модуль и из него, модулей, его вызывающих, и модулей, вызываемых из него;
- При создании модуля возможно использование только стандартных управляющих конструкций: выбора, цикла, блока (последовательности операторов); [18]
- Оператором безусловного перехода лучше вообще не пользоваться или применять в исключительных случаях только для перехода на выходную точку модуля;
- В тексте модуля необходимо использование комментариев, особенно в сложных местах алгоритма;
- Идентификаторы переменных и модулей должны быть смысловыми, т.е. отражающими смысл переменных и модулей;
- В одной строке должно быть записано не больше одного оператора. Если оператор записывается больше, чем на одной строке, то все последующие операторы записываются с отступами;
- Желательна вложенность не более, чем трех уровней.
- Напомним, что все эти меры повышают качество разрабатываемого программного обеспечения. [18]
Для более простого понимания и записи программ, стараются сделать их более компактными, что достигается двумя способами:
1) используя циклы;
2) применяя процедуры и функции.
Процедуры и функции — это законченные программные модули, выполняемые в программе многократно. [15]
Достоинства модульного программирования в:
1) упрощении процесса написания и отладки программ;
2) сокращении объема программ.
Недостаток — в некотором увеличении затрат времени и памяти на оформление модулей и обращение к ним. [17]
Вывод: Языки программирования делятся на языки низкого уровня и языки высокого уровня ЯВУ. Среди ЯВУ рассмотрены языки Паскаль и Дельфи. Поскольку функции наряду с процедурами являются стержнем модульного программирования, рассмотрены основные принципы модульного программирования.
Модульным программированием называют организацию программы в виде совокупности небольших независимых блоков, модулей, структура и поведение которых подчинены определенным правилам. При создании сложных программных систем важная задача - в правильной организации процесса проектирования системы. Один из самых распространенных методов решения этой задачи - технология проектирования «сверху вниз», напрямую связанная с технологией модульного программирования.
ГЛАВА 2. РАБОТА С ФУНКЦИЯМИ В TURBO PASCAL И DELPHI
2.1. Использование функций в Turbo Pascal и Delphi
Процедуры и функции являются относительно самостоятельными фрагментами программ, оформленными особым образом и имеющими имя. Упоминанием этого имени в тексте программы вызываются процедуры (функции). Отличие функции от процедуры в том, что результат выполнения операторов, образующих тело функции, всегда является некоторым единственным значением или указателем, поэтому обращением к функции можно пользоваться в соответствующих выражениях наряду с переменными и константами. Назовем процедуру или функцию общим именем «подпрограмма». [6, с. 150]
Подпрограмма является отдельной функционально независимой частью программы. Структура любой подпрограммы такая же, как и структура всей программы. Подпрограммами решаются три важные задачи:
- избавление от необходимости многократного повторения в тексте программы аналогичных фрагментов;
- улучшение структуры программы, облегчающее ее понимание;
- повышение устойчивости к ошибкам программирования и непредвиденным последствиям при модификациях программы.
Подпрограммы - это инструмент, с помощью которого любую программу можно разбить на несколько независимых друг от друга частей. Такое разбиение вызвано двумя причинами. [7]
Во-первых, для экономии памяти: каждая подпрограмма существует в программе в единственном экземпляре, а обращаться к ней можно несколько раз из разных точек программы. Вызов подпрограммы активизирует последовательность образующих ее операторов, а передаваемыми подпрограмме параметрами нужным образом модифицируется реализуемый в ней алгоритм. [8]
Вторая причина - в применении методики нисходящего проектирования программ. В этом случае алгоритм представляет собой последовательность относительно крупных подпрограмм, реализующих самостоятельные смысловые части алгоритма. Подпрограммы в свою очередь могут быть разбиты на менее крупные подпрограммы нижнего уровня и пр. Последовательное структурирование программы продолжается до такой простоты реализуемых подпрограмм алгоритмов, чтобы их можно было легко программировать. [8]
Любое имя в программе должно быть обязательно описано перед его использованием в операторах программы. То же касается и подпрограмм: каждая своя процедура и функция должна быть описана программистом в разделе описаний. [11]
Описание подпрограммы - это указание ее заголовка и тела. Заголовок содержит объявление имени подпрограммы и формальные параметры при их наличии. В функции, кроме того, указывается тип возвращаемого ею результата. За заголовком идет тело подпрограммы, подобно программе, состоящее из раздела описаний и раздела выполняемых операторов. Раздел описаний подпрограммы может содержать описания подпрограмм низшего уровня, те - описания других подпрограмм и т.п.
Вот какая иерархия описаний получится для программы, структура которой дана на рис. 2 (для простоты будем считать, что все подпрограммы - процедуры без параметров): [6, с. 152]
Рисунок 2 – Пример структуры программы [6, с. 152]
Program ...;
Procedure A;
Procedure Al;
begin
end {Al};
Procedure A2 ;
begin
end {A2};
begin {A}
end {A};
Procedure В ;
Procedure B1;
begin
• • •
end {B1}; [6, с. 153]
Procedure B2;
Procedure B21;
и т.д. [6, с. 153]
Все имена, описанные внутри подпрограммы, локализованы в ней, т.е. они как бы «невидимы» за пределами подпрограммы. Таким образом, для операторов, использующих обращение к подпрограмме, она является «черным ящиком», в котором реализуется определенный алгоритм. Все детали этой реализации скрыты от глаз пользователя подпрограммы и потому недоступны ему.