Читайте также:
|
|
Подпрограмма может не только обращаться к другим подпрограммам, но и иметь внутри себя свои собственные, внутренние, вложенные подпрограммы. Все эти подпрограммы описываются внутри данной подпрограммы, являются локальными в ней и не видны снаружи. Необходимость этого вытекает из желательности развязки отдельных частей больших проектов. Так, руководитель проекта может разделить проект на пять больших подпрограмм и поручить каждую отдельному руководителю. Те в свою очередь делят свои куски между подчиненными программистами, каждому поручая подпрограмму помельче, которая тоже в свою очередь нуждается в разбивке. В результате, если не использовать вложенности, проект оказывается разбит на несколько сотен маленьких равноправных подпрограмм. Нет никакой гарантии, что среди них не встретятся одноименные, и если бы вложенных подпрограмм не было, Паскаль обнаружил бы среди них одноименные и выдал ошибку. При использовании же вложенности это не страшно, так как подпрограммы с одинаковыми именами упрятаны внутрь более крупных подпрограмм и друг друга не видят.
Каждая из пяти подпрограмм большого проекта может иметь большой объем и руководитель этой подпрограммы должен обладать всем набором средств Паскаля. Поэтому каждая подпрограмма может иметь и свои внутренние типы, метки, переменные, константы, процедуры и функции. Все эти объекты описываются внутри данной подпрограммы, являются локальными в ней и не видны снаружи.
По сути структура подпрограммы копирует структуру программы за исключением того, что в подпрограммах запрещено писать USES.
Приведу пример записи программы с вложенными подпрограммами:
PROGRAM Hard;
Uses...
Label...
Const...
Type...
Var...
Procedure a1;
Const...
Var...
Procedure a11;
Label...
Type...
Var...
begin
...
end;
Function f11
Var...
begin
...
end;
begin
...
end;
Function f2;
Procedure a21;
begin
...
end;
begin
...
end;
begin
...
end.
Здесь в программу Hard входят процедура a1 и функция f2. В процедуру a1 вложены процедура a11 и функция f11. В функцию f2 вложена процедура a21.
Из f2 видна a1, но не видны a11 и f11. Точно так же из a21 видны a1 и f2, но не видны a11 и f11. Это значит, что в теле процедуры a21может содержаться вызов a1и f2, но не может содержаться вызов a11и f11.
Выражения
Понятие «выражение» я уже употреблял раньше без особых пояснений. Выражение – это то, что мы привыкли видеть в правой части оператора присваивания и в других местах. Например:
a:= b+1 - здесь выражение - b+1
if c-6>f then … - здесь выражение - c-6>f
WriteLn (a+5) - здесь выражение - a+5
Прежде чем пояснить, что такое выражение вообще, приведу примеры наиболее распространенных типов выражений.
Арифметические выражения(то есть имеющие значением число):
· 0
· 2+5
· Sqrt(b+1) - Sqr(a[4,i]+r) + 1
· a[4,i] + vovka.ves
· ((w+b)/19)*(2/(w+1)+5)
Строковые выражения(то есть имеющие значением строку символов):
· ‘Весна’
· Copy(s,a,b)
· Copy(s,a,b)+ ‘Весна’
Логические выражения(то есть имеющие значением true или false):
· a>0
· (a+c)/(d+8)<=b+1
· c>’Ю’
· stroka=‘Весна’
· Copy(s,a,b)+ ‘Весна’ <> s1
· a in b
Вообще говоря, под выражением можно понимать произвольную имеющую смысл цепочку операндов, соединенных знаками операций (математических, логических и других) и круглыми скобками.
Под операндом будем понимать переменную простого типа, константу, элемент массива, поле записи, функцию и вообще любой объект, имеющий конкретное значение одного из простых типов.
Каждое выражение тоже обязано иметь конкретное значение одного из типов. Тип выражения определяется типами входящих в него операндов и операциями над этими операндами. Каким образом – об этом в следующем параграфе.
Дата добавления: 2015-11-14; просмотров: 40 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Индукция. Рекурсия. Стек | | | Совместимость типов |