Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Организация вычислительных процедур.
Структура сложных программ.
В практике программирования часто встречаются случаи, когда по ходу выполнения программы приходится производить одни и те же вычисления, но при различных исходных данных. Чтобы исключить повторение одинаковых записей и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся вычисления в самостоятельную часть программы, которая может быть использована многократно по мере необходимости. Часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой.
Подпрограммы оформляются в виде замкнутых участков программы, имеющих четко обозначенные вход и выход. Самостоятельный характер подпрограмм позволяет поручать их составление различным пользователям. При этом осуществляется разделение работы по программированию, тем самым ускоряется ее завершение. Чтобы облегчить выполнение этой работы, имена переменных в основной программе и в подпрограммах сделаны независимыми друг от друга. Если, например, в основной программе фигурирует переменная с именем А, то переменная с таким же именем А, но используемая в подпрограмме, может иметь совершенно другое физическое значение, никак не связанное с физическим значением переменной А в основной программе.
Этим не исчерпываются положительные стороны применения подпрограмм. Можно, например, указать на экономию памяти, которая получается из-за того, что память для хранения переменных, используемых в подпрограммах, выделяется только на время работы подпрограммы. Она высвобождается, как только заканчивается выполнение подпрограммы.
Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование.
В языке ПАСКАЛЬ выделяют два вида подпрограмм : процедуру (PROCEDURE) и функцию (FUNCTION). Любая программа может содержать несколько процедур и функций. Обратимся к структуре программы в общем виде на языке ПАСКАЛЬ.
Пример структуры программы с двумя подпрограммами
PROGRAM PRIMER;
{ РАЗДЕЛ ОПИСАНИЙ ОСНОВНОЙ ПРОГРАММЫ }
LABEL - РАЗДЕЛ МЕТОК;
CONST - РАЗДЕЛ КОНСТАНТ;
TYPE - РАЗДЕЛ ТИПОВ;
VAR - РАЗДЕЛ ПЕРЕМЕННЫХ;
______________________________
I ПОДПРОГРАММА Р1 I
______________________________
______________________________
I ПОДПРОГРАММА Р2 I
______________________________
{РАЗДЕЛ ОПЕРАТОРОВ ОСНОВНОЙ ПРОГРАММЫ}
BEGIN
ОПЕРАТОРЫ;
ВЫЗОВ ПОДПРОГРАММЫ Р1;
ОПЕРАТОРЫ;
ВЫЗОВ ПОДПРОГРАММЫ Р1;
ОПЕРАТОРЫ;
ВЫЗОВ ПОДПРОГРАММЫ Р2;
ОПЕРАТОРЫ;
ВЫЗОВ ПОДПРОГРАММЫ Р1;
ОПЕРАТОРЫ;
END.
Выполнение программы начинается с операторов основной программы. При необходимости вызывается подпрограмма, и начинают выполняться ее операторы. Затем управление передается в основную программу, которая продолжает выполняться.
Любая программа в свою очередь также может содержать подпрограммы. Для простоты изложения ограничимся подпрограммами, которые не содержат внутри себя других подпрограмм, а вызов их осуществляется из основной программы.
Подпрограмма оформляется подобно основной программе, т. е. состоит из заголовков, раздела описаний и раздела операторов.
2. Процедуры, функции, определяемые пользователем.
Процедуры. Любая процедура может содержать несколько операторов и несколько результатов ее выполнения. Структура процедуры имеет следующий вид:
PROCEDURE ИМЯ ( ФОРМАЛЬНЫЕ ПАРАМЕТРЫ );
______________________________
I РАЗДЕЛ ОПИСАНИЙ I
______________________________
BEGIN
_______________________________
I РАЗДЕЛ ОПЕРАТОРОВ I
_______________________________
END;
В заголовке указывается служебное слово PROCEDURE, за которым следуют имя процедуры и формальные параметры, заключенные в круглые скобки.
Раздел описания процедуры подобен программе и состоит из разделов меток, констант, типов, переменных и, в свою очередь, процедур и функций. Раздел операторов заключается в операторные скобки BEGIN и END, причем после END в отличие от основной программы вместо точки ставится точка с запятой.
Процедура вызывается по ее имени:
имя (фактические параметры)
С помощью формальных и фактических параметров данные передаются из программы в процедуру и, наоборот, из процедуры в программу. Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования.
Если несколько формальных параметров имеют одинаковый тип, тогда их можно объединить в список, т. е. перечислить параметры через запятую, а затем указать тип.
Пусть имеется заголовок процедуры: PROCEDURE SUMMA ( A, B, C : INTEGER);
где А, В, С - формальные параметры.
Вызвать процедуру можно следующим образом:
SUMMA (5, M, 7);
где 5, М, 7 - фактические параметры. Каждый формальный параметр принимает значения соответствующего фактического параметра. Таким образом, в процедуре будем иметь следующие значения: А=5, В=М, С=7.
Среди параметров процедуры выделяют параметры-значения и параметры-переменные. Параметры-значения выполняют роль входных параметров процедуры. Они могут получать значения фактических параметров, но не могут передавать свои значения фактическим параметрам. Параметры-переменные выполняют роль как входных, так и выходных параметров процедуры. Они могут получать значения фактических параметров, изменять их в процедуре и возвращать новые значения фактическим параметрам. Для выделения параметров-переменных перед ними ставится слово VAR в формальных параметрах.
Пример процедуры:
PROCEDURE Ð1 ( A, B, C : REAL; VAR X, Y : REAL ) ;
VAR Z : REAL;
BEGIN
Z : = A + B + C;
X : = SQR (Z);
Y : = SQRT (Z)
END;
Эту процедуру можно вызвать таким образом: Р1(10,60, 30, X1, Y1 ) .
Формальные входные параметры А, В, С принимают значения соответствующих фактических параметров А=10, В=60, С=30. При этих значениях выполняется процедура. Результатом выполнения процедуры являются Х, Y, которые передают свои значения соответствующим фактическим параметрам X1, Y1.Таким образом, в основной программе будем иметь X1=10000, Y1=10.
Допускается одинаковое значение соответствующих формальных и фактических параметров. Например, вызов процедуры может иметь вид:
Р1 ( 10,60, 30, X, Y )
В качестве фактических параметров могут быть константы, переменные, выражения. Их тип должен соответствовать типу формального параметра. Например, вызов процедуры может быть таким:
A : = 10 ; C : = 30;
Р1 ( A, 60, C, X1, Y1 )
или
D : = 60 ; R : = 10;
Р1 ( 10, D, R + 20, Z, T )
В любом случае формальные параметры получат значения А=10,В=60, С=30.
В качестве фактического параметра, которым соответствуют параметры-переменные, могут быть переменные и массивы; формальные параметры представлены только именами (константы и выражения недопустимы).
Если в процедуру нужно передать в качестве параметра непросто одно значение, а массив, то фактическим параметром должно быть имя массива. При этом формальный параметр указывается после слова VAR вместе с типом массива. Само же описание массива делается в разделе TYPE основной программы. Пусть, например, в основной программе имеется следующее описание массива А:
CONST N = 10;
TYPE MAS = ARRAY [1...N] OF REAL;
VAR A : MAS;
Тогда формальные параметры процедуры PRIM могут иметь вид:
PROCEDURE PRIM (K : INTEGER; VAR X : MAS);
при следующих фактических параметрах:
PRIM (N, A);
Формальный параметр К принимает значение фактического параметра N, а формальный параметр Х - значения массива А.
В процедуре значения массива Х могут измениться, и новые значения получит массив А.
* Допускается использование процедур без параметров. В этом случае формальные и фактические параметры отсутствуют. В процедуре, как и в основной программе, может отсутствовать раздел описаний.
Пример. Оформим в виде процедуры «SUММА» вычисление суммы 1+2+3+...+N и произведения 1×2×3×...×N целых чисел.
Сумму и произведение можно вычислить, используя формулы арифметической и геометрической прогрессии. Однако мы намеренно воспользуемся циклом, чтобы лучше продемонстрировать назначение различных параметров.
П р о г р а м м а
----
I Оформление процедуры I
----
PROGRAM PT9 ;
VAR N : INTEGER;
SUM, PR : REAL;
{ПРОЦЕДУРА “СУММА”}
PROCEDURE SUММА ( К: INTEGER; VAR X, Y : REAL ) ;
VAR I : INTEGER;
BEGIN
X : = 0; Y : = 1;
FOR I : = 1 TO K DO
BEGIN
X : = X + I;
Y : = Y * I ;
END;
END;
{ОСНОВНАЯ ПРОГРАММА}
BEGIN
WRITE (‘ВВЕДИТЕ ЗНАЧЕНИЕ N : ’) ;
READ (N);
SUММА (N, SUM, PR);
WRITELN (‘SUM = ’, SUM : 5);
WRITE (‘PR = ’, PR : 5);
END.
==================================
= ВВЕДИТЕ ЗНАЧЕНИЕ N : 10 =
= SUM = 5.500000E + 01 =
= PR = 3.628800E + 06 =
==================================
Данная программа начинает выполняться с операторов основной программы. После ввода значения N происходит вызов процедуры “SUММА”. При этом формальный параметр К принимает значение фактического параметра N. Вычисление в процедуре значения суммы Х и произведения Y передаются в основную программу фактическим параметрам SUM и PR. Продолжает выполняться основная программа: значения SUM и PR выводятся на экран дисплея.
В разделе описания основной программы представлены переменные N, SUM, PR; в разделе описания процедуры - переменная I, которая используется только в процедуре.
Функции. Другой вид подпрограммы - функция - оформляется аналогично процедуре. Отличительная особенность функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передается в основную программу.
Функция оформляется в следующем виде:
FUNCTION ИМЯ (ФОРМАЛЬНЫЕ ПАРАМЕТРЫ) : ТИП ;
______________________________
I РАЗДЕЛ ОПИСАНИЙ I
______________________________
BEGIN
_______________________________
I РАЗДЕЛ ОПЕРАТОРОВ I
_______________________________
END;
Вызывается функция по ее имени с указанием фактических параметров.
Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.
Пример. Расчета десятичного логарифма организуем с использование пользовательской функции :
PROGRAM PRIMER;
VAR F, M, K,H:REAL;
{**** ФУНКЦИЯ РАСЧЕТА ДЕСЯТИЧНОГО ЛОГАРИФМА ****}
FUNCTION LG ( N : REAL ) : REAL;
BEGIN LG:=LN(N) / LN(10); END;
{* ОСНОВНАЯ ПРОГРАММА *****}
BEGIN
F:=10; M:=1000;
H:=LG(F) ; K:=LG(M) ;
WRITELN (‘H = ’, H : 5:0 , ‘ K = ’, K: 5:0);
END.
Пример. Пусть требуется найти разность факториалов F = m! - k! Напомним, что факториал n! представляет собой произведение n чисел натурального ряда: 1×2×3×...×n.
Вычисление факториала оформим в виде функции:
FUNCHION FACT ( N : INTEGER ) : INTEGER;
VAR P, 1 : INTEGER ;
BEGIN
P : = 1 ;
FOR I : = 2 TO N DO
P : = P * I ;
FACT : = P ;
END;
Здесь FACT - имя функции. Результат вычисления факториала обозначается ее именем. Тип функции - действительный. Формальным параметром является переменная целого типа N.
Вызывается функция по своему имени FACT с указанием фактических параметров M и К :
F = FACT (M) - FACT (K)
Область действия имен. Имена, объявленные в разделе описания основной программы, действует в разделе операторов основной программы и в любой подпрограмме (процедуре и функции). Эти имена называются глобальными. Имена объявленные в подпрограмме, действуют только в этой подпрограмме и в любой объявленной в ней процедуре и функции. Такие имена называются локальными. Они недоступны для операторов основной программы.
П р о г р а м м а
PROGRAM PRIMER;
VAR F, M, K : INTEGER;
{ ***** ФУНКЦИЯ “FACT” **}
FUNCTION FACT ( N : INTEGER) : INTEGER ;
VAR P, I : INTEGER;
BEGIN
P : = 1 ;
FOR I : = 2 TO N DO
P : = P * I ;
FACT : = P ;
END;
{ОСНОВНАЯ ПРОГРАММА}
BEGIN
WRITE (‘ВВЕДИТЕ ЗНАЧЕНИЯ M, K : ’) ;
READ (M, K) ;
F : = FACT (M) - FACR (K) ;
WRITELN (‘F = ’, F : 5);
END.
==================================
= ВВЕДИТЕ ЗНАЧЕНИЯ M, K : 7 4 =
= F = 5016 =
==================================
Так, в рассмотренной программе с функцией FACT переменные F, M, K в разделе описания основной программы являются глобальными. Переменные P, I в разделе описания функции и параметр N являются локальными: их действия ограничены рамками функции.


