Процедуры и функции пользователяВыше уже отмечалось, что при разработке программ сложной структуры продуктивным является использование принципов модульного и структурного программирования. Принцип модульного программирования заключается в том, что исходную задачу разбивают на более простые задачи. Решение исходной задачи на компьютере, таким образом, будет состоять в последовательном выполнении отдельных программ. Для того, чтобы обеспечить возможность последовательного выполнения программ с автоматической передачей данных из одной программы в другую, в языках высокого уровня разработаны специальные конструкции, которые называются подпрограммами или процедурами. Самостоятельная часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой (процедурой) или вспомогательным алгоритмом (КуМир). Различают процедуры - операторы и процедуры – функции. В последнем случае в теле описания процедуры ее имени присваивается некоторое значение. При вызове процедуры – функции имя функции (как любая переменная) возвращает некоторое значение и его можно использовать в тех же конструкциях языка, что и значение, возвращаемое обычной переменной. Если возвращаемое функцией значение не используется, как правило, допускается вызов процедуры – функции по правилам вызова процедуры – оператора. Использование процедуры состоит из двух шагов. Сначала в разделе описаний (в языке Pascal) или в какой-либо части программы описывается алгоритм подзадачи в виде процедуры, снабженной именем. (В языке КуМир любой алгоритм имеет имя и может быть использован в качестве вспомогательного.) Если в разделе описаний (в языке Pascal) или в какой либо части программы описана какая-либо процедура, то в разделе операторов (исполняемой части) или в другой процедуре можно вызывать эту процедуру по имени любое количество раз. Рассмотрим простейший пример. Пример 0‑1 (Pascal) Program pr1; procedure my; begin writeln(‘Иллюстрируем использование процедуры.’); end; begin writeln(‘Начало исполняемой части.’); my; my; end. Результатом работы данной программы будут три сообщения на экране монитора: Начало исполняемой части. Иллюстрируем использование процедуры. Иллюстрируем использование процедуры.
Пример 0‑2 (Pascal) Program pr2; function my: integer; begin my:=2; end; begin writeln(‘Начало исполняемой части.’); writeln(‘Иллюстрируем использование функции.’, ‘ my=’, my); end. Результатом работы данной программы будут следующие сообщения на экране монитора: Начало исполняемой части. Иллюстрируем использование функции. my=2
Первоначально подпрограммы использовались только тогда, когда в программе или в других программах необходимо было многократно решать одну и ту же подзадачу. Благодаря механизму процедур можно было один раз решить задачу, оформить ее в виде подпрограммы, а затем вызывать подпрограмму по имени в нужном месте основной программы или даже в других программах. С развитием программного обеспечения программисты столкнулись еще с одной проблемой. Современные программные продукты стали достигать столь больших объемов, что одному человеку в приемлемые сроки невозможно создать такую программу. Сегодня программные продукты создаются большими коллективами программистов. В этих условиях стало важно, чтобы отдельные группы программистом могли решать подзадачи одного проекта относительно независимо друг от друга. В первых компиляторах Basic, например, нельзя было использовать одно и то же имя переменной или константы в разных подпрограммах для разных целей. Для устранения трудностей, возникающих при параллельной работе разных программистов над одним проектом, современные языки программирования разрешают любой процедуре вводить для своих внутренних потребностей любые допустимые в языке типы и программные объекты, причем соблюдается принцип локализации. Суть этого принципа состоит в том, что имена, вводимые в употребление в какой-либо процедуре, имеют силу только в пределах данной процедуры. Такие переменные получили название локальных переменных процедуры. Значения этих переменных хранятся в памяти компьютера только в период вызова (выполнения) процедуры, причем, если в основной программе встречается переменная (глобальная) с тем же именем, что и у локальной переменной, то значение глобальной переменной сохраняется. Материал выше прочитан. Пример 0‑3 (Pascal) Program pr3; procedure my_variable; var a: integer; раздел описания процедуры begin a:=19; исполняемая часть writeln(‘Значение 2a =’, 2*a); процедуры раздел описания программы end; var a: integer; begin writeln(‘Начало исполняемой части.’); a:=5 writeln(‘a =’, a); исполняемая часть программы my_c_variable; writeln(‘a =’, a); end. Результатом работы данной программы будет сообщение и значение выражения на экране монитора: Начало исполняемой части. a = 5 Значение 2a =38 a=5
Модель памяти ЭВМ. Несмотря на то, что имена у переменных одинаковые, физическая память, хранящая значение локальной и глобальной величины разная
Пример 0‑4 (Pascal) Program Pr4; var a: integer procedure my_c_variable; begin a:=19 end; begin writeln(‘Начало исполняемой части.’); a:=5; writeln(‘a =’, a); my_c_variable; writeln(‘Новое значение a =’, a); end. Результатом работы данной программы будет сообщение и значение выражения на экране монитора: Начало исполняемой части. a = 5 Новое значение a =19 Здесь есть только глобальная величина a.
Автоматическая передача данных в процедуру осуществляется с помощью процедур с параметрами. При решении задач имеются данные двух видов: исходные данные, которые необходимо знать, чтобы решить задачу (аргументы), и результаты. Соответственно, параметры в процедурах могут быть: параметры-значения (параметр по значению), которые передаются в процедуру (аргументы) и параметры-переменные (параметр по ссылке), значения которых передаются в основную программу (результаты). Если параметр является и аргументом и результатом, то он описывается как параметр–переменная. Пример 0‑5 (Pascal) Program pr5; procedure my_c_variable (c: integer; var b, e: integer); var a: integer; begin a:=19; b:=c+27; e:=b+a; end; var a, b, c, e: integer; begin writeln(‘Начало исполняемой части.’) a:=5; b:=6; c:=7; my_c_variable (12, b, e); writeln(‘a =’, a, ‘b =’, b, ‘c = ’, c, ‘e = ’,e); end. Результатом работы данной программы будет сообщение и значения на экране монитора: Начало исполняемой части. a = 5 b = 39 c=7 e=58 В рассмотренном примере имена формальных параметров совпадают с именами фактических параметров.
|