Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ АЛГОРИТМИЗАЦИИ.doc
Скачиваний:
14
Добавлен:
16.08.2019
Размер:
1.8 Mб
Скачать

8.1. Область видимости идентификатора переменной

Область действия описания конкретного идентификатора и называется областью видимости.

Все переменные и другие объекты, описанные в подпрограмме, являются локальными и действуют только внутри этой программы. Никакой связи между ними и объектами вызывающей программы, имеющими такие же имена, нет.2

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

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

Например,

Program primer1;

Var

i: integer; {объявление глобальной переменной}

{объявление процедуры}

Procedure P; {заголовок процедуры}

Var

i: integer; {объявление локальной переменной}

Begin {начало тела процедуры}

Writeln (“Значением переменной i является цифра - ”, i);

End; {конец тела процедуры}

Begin {начало тела основной программы}

I := 1;

P; {вызов процедуры}

End. {конец тела процедуры}

В результате запуска программы Primer1 на экран монитора будет выведена строка:

Значением переменной i является цифра – 1

8.2. Подпрограммы - процедуры (procedure)

Процедура – это подпрограмма, которая решает некоторую частную задачу. Результатом работы процедуры является либо одно или более значений, либо ни одного. Например, процедура CLRSCR; ни чего не возвращает программе, которая её вызывает. А процедура READLN(a) возвращает основной программе значение переменной A, введённое пользователем с клавиатуры.

Процедура оформляется аналогично программе, то есть содержит заголовок, раздел описаний и операторов:

{заголовок процедуры}

PROCEDURE <имя_процедуры> (<список_формальных_параметров>);

{раздел описаний}

BEGIN

{раздел операторов}

END;

Здесь, <имя_процедуры> - имя процедуры удовлетворяет всем правилам идентификатора; формальные («ненастоящие») параметры – список переменных с указанием их типа.

Например (см. Задача 1).

Procedure Dlina (x1, x2, y1, y2 : real; var l : real);

Вызов процедуры:

<имя_процедуры> (<список_фактических_параметров>);

Здесь, фактические («настоящие») параметры – параметры вызывающей программы.

Например (см. Задача 1).

Dlina (q1, q2, k1, k2, d);

8.2.1. Формальные и фактические параметры

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

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

Список формальных параметров может отсутствовать. В том случае, если он есть, то в нём должны быть перечислены имена формальных параметров и их типы.

Формальные параметры могут включать в себя:

  1. Параметры-значения;

  2. Параметры-переменные;

  3. Параметры-константы;

  4. Параметры-массивы и параметры-строки;

  5. Нетипизированные параметры-переменные;

  6. Процедурные типы:

    1. Параметры-функции;

    2. Параметры-процедуры.

В свою очередь, формальные параметры делятся на входные и выходные параметры. К выходным параметрам относятся параметры-переменные, а остальные параметры следует отнести к входным параметрам подпрограмм.

Рассмотрим несколько формальных параметров.

Параметры-значения

Формат:

(q1, q2, .., qn: <тип>); или

(q1: <тип>; q2: <тип>; .. qn: <тип>);

где q1, q2, .., qn – имена параметров.

Например, (q1, q2 : real); (q1: integer; q2: real);

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

Для выделения выходных переменных перед ними ставится слово Var.

Формат:

(var t1, t2, .., tn: <тип>); или

(var t1: <тип>; var t2: <тип>; .. var tn: <тип>);

где t1, t2, tn – параметры-переменные.

Например, (var t1: real; var t2, t3: integer);

Параметры-константы

Формат:

(const t1, t2, .., tn: <тип>); или

(const t1: <тип>; const t2: <тип>; .. const tn: <тип>);

где t1, t2, tn – параметры-константы.

Например, (const t1: real; const t2, t3: integer);

Пример 8.1. Procedure MyProc(var a : Real; b : integer; const c: char);

Здесь, a – параметр-переменная, b – параметр-значение, c – параметр-константа.

Параметры-процедуры и параметры-функции. Это параметры, которые сами являются процедурами или функциями.

Между формальными и фактическими параметрами должны быть следующие соответствия:

  1. количество параметров;

  2. порядок следования входных и выходных параметров;

  3. тип данных.

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

Если параметр определён как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передаётся подпрограмме. Даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, всё равно подпрограмме будет передана лишь копия переменной (константы). Любые возможности изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра.

Если параметр определён как параметр-переменная, то при вызове подпрограммы передаётся сама переменная, а не её копия (фактически в этом случае подпрограмме передаётся адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.

В случае параметра-константы в подпрограмму также передаётся адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.

Пример 8.2.

const

a: integer = 5;

b: integer = 7;

{объявление процедуры}

procedure Inc2 (var c: integer; b: integer); {заголовок процедуры}

begin {начало тела подпрограммы}

c := c+c;

b := b+b;

writeln (‘удвоенные :’, c:5, b:5);

end; {конец тела подпрограммы}

begin {начало тела основной программы}

writeln (‘исходные :’, a:5, b:5);

inc2(a, b); {вызов тела подпрограммы}

writeln (‘результат :’, a:5, b:5);

end. {конец тела подпрограммы}

В результате прогона программы, на экран будет выведено:

Исходные : 5 7

Удвоенные : 10 14

Результат : 10 7

З адача 8.1. Определить расстояние между двумя точками.

Блок-схема алгоритма

Листинг процедуры DLINA

PROCEDURE DLINA (X1, X2, Y1, Y2 : REAL; VAR L : REAL);

BEGIN

L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));

E ND;

Блок-схема алгоритма основной программы

Листинг основной программы

PROGRAM TASK;

VAR Q1, Q2, K1, K2, D : REAL;

PROCEDURE DLINA(X1,X2,Y1,Y2 :REAL; VAR L : REAL);

BEGIN

L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));

END;

BEGIN

READLN (Q1, Q2, K1, K2);

DLINA (Q1, Q2, K1, K2, D);

WRITELN (D);

END.

Здесь,

Q1, Q2, K1, K2, D – глобальные переменные,

X1, X2, Y1, Y2, L – формальные параметры, где

X1, X2, Y1, Y2 – входные параметры-значения и

L – выходной параметр-переменная.

Задача 8.2. Определить в одномерном массиве минимальный элемент и его номер.

П римечание. Если в качестве параметров используются массивы, их необходимо объявлять в разделе типов.

Блок-схема алгоритма подпрограммы-процедуры MINVECTOR

Листинг подпрограммы-процедуры MINVECTOR

PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);

VAR

I: INTEGER;

BEGIN

MIN:= 1;

FOR I:=2 TO L DO

IF D[MIN] > D[I] THEN MIN:= I;

END;

Блок-схема алгоритма основной программы

Л истинг основной программы

PROGRAM TASK;

CONST N = 25;

TYPE VECTOR = ARRAY[1..N] OF REAL;

VAR I, M : INTEGER; A: VECTOR;

PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);

VAR I: INTEGER;

BEGIN

MIN:= 1;

FOR I:=2 TO L DO

IF D[MIN] > D[I] THEN MIN:= I;

END;

BEGIN

FOR I := 1 TO N DO READLM (A[I]);

MINVECTOR (A, N, M);

WRITELN (‘Минимальный элемент массива равен - ’, A[M]:3);

END.

Задача 8.3. Даны три массива А (20), В (30), С (25). Расположить элементы по возрастанию. Использовать процедуры для формирования массива, вывода первоначальных значений на экран и вывода упорядоченных элементов массива.

Блок-схема алгоритма подпрограммы InputVector

Листинг подпрограммы InputVector

PROCEDURE INPUTVECTOR (L: INTEGER; VAR D: VECTOR);

VAR I : INTEGER;

BEGIN

RANDOMIZE;

FOR I:=1 TO L DO D[I]:=RANDOM (101) - 50;

END;

Б лок-схема алгоритма подпрограммы OutputVector

Листинг подпрограммы OutputVector

PROCEDURE OUTPUTVECTOR (L: INTEGER; D: VECTOR);

VAR I : INTEGER;

BEGIN

FOR I:=1 TO L DO WRITELN (D[I]);

END;

Б лок-схема алгоритма подпрограммы SortVector (сортировка посредством выбора)

Листинг подпрограммы SortVector

PROCEDURE SORTVECTOR (L: INTEGER; VAR D: VECTOR);

VAR

I, J, T : INTEGER;

BEGIN

FOR I:=1 TO L-1 DO

FOR J:=I+1 TO L DO

IF D[J]>D[I] THEN

BEGIN

T:= D[I];

D[I]:= D[J];

D[J]:= T;

END;

END;

Б лок-схема алгоритма основной программы

Листинг основной программы

PROGRAM TASK;

USES CRT;

CONST N = 30;

TYPE

VECTOR = ARRAY[1..N] OF INTEGER;

VAR

A, B, C : VECTOR;

PROCEDURE SORTVECTOR

(L: INTEGER; VAR D: VECTOR);

VAR

I, J, T : INTEGER;

BEGIN

FOR I:=1 TO L-1 DO

FOR J:=I+1 TO L DO

IF D[J]>D[I] THEN

BEGIN

T:= D[I];

D[I]:= D[J];

D[J]:= T;

END;

END;

BEGIN

CLRSCR;

INPUTVECTOR(20, A);

INPUTVECTOR(30, B);

INPUTVECTOR(25, C);

WRITELN (‘Сформированный массив А: ’);

OUTPUTVECTOR(20, A);

WRITELN (‘Сформированный массив В: ’);

OUTPUTVECTOR(30, B);

WRITELN (‘Сформированный массив С: ’);

OUTPUTVECTOR(25, C);

WRITELN (‘Отсортированный массив А: ’);

SORTVECTOR(20, A);

WRITELN (‘Отсортированный массив В: ’);

SORTVECTOR(30, B);

WRITELN (‘Отсортированный массив С: ’);

SORTVECTOR(25, C);

READLN;

END.