Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Семантика

Прямая подразумеваемая математическая семантика почти тривиальна.

Для нас привычно вход и выход процедуры.

Имена переменных входа называются входными, выхода – выходными.

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

X:=x+y;

Внутри процедуры могут использоваться вспомогательные объекты (локальные объекты). После установления типового соответствия между определениями процедур семантика обращения к процедуре ясна – это вычисление функции в заданной точке.

Это действительно так, если все результаты процедуры объявлены как var-переменные, все оставшиеся коды объявлены как параметры значения, если все остальные используемые в теле процедуры имена локальны.

Мы не обязаны это делать, что чаще всего мотивируется соображениями эффективности.

Пример. Процедура вычисления максимального среди первых элементов массива.

Type tIndex=1..100;

tVector=array [tIndex] of real;

procedure max;

a: tVector;

n: tIndex;

Var m:real;

Begin

M:=a[i];

For i:=2 to n do

If m>a[i] then m:=a[i];

End.

Исключение: файлы мы обязаны объявлять как параметры переменные, даже если по логике задачи это ход, то есть в теле процедуры файл не изменяется.

Как описывать «нестандартную» семантику обращения?

Max(b,10,x);

Понять семантику обращения (то, как оно работает), уметь написать вместо обращения (пользовательского имени) соответствующее ему значение.

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

 

Правила построения модифицированного тела:

1) Избавление от коллизии имён. При наличии коллизии заменить имена локальных переменных или других объектов с дублированными именами на новые, ещё не использованные в программе.

M:=a[i];

For i:=1 to n do

If m>a[i] then m:=a[i];

2) Параметры переменные заменяются на имена фактических параметров

3) Параметры значения вычисляются и копируются.

 

Пользовательские процедуры (продолжение)

Решение явно не эффективное, используется дополнительная память и тратится время на копирование, что особенно заметно в случае использования значений сложных типов (массив в динамической системе). Заметим, что понятие выражения над сложными типами скорее теоретическое, чем практическое. Возникает «соблазн» отойти от логики (т.е. чисто математического понятия процедуры как оператора), и в целях эффективности использовать особенности его (понятия) реализации. Так, в целях эффективности, можно объявить параметр сложного типа параметром переменной, даже если он по логике – вход. Второй вариант: вообще не включать это значение в список параметров (использовать как глобальное значение).

Procedure Max;

Var a: tVector; n: tIndex;

Var m: real;

max(b,10,x);

x:=b[1];

for I:=1 to n do

if x>b[I] then m:=b[I];

x:=a[1];

for I:=1 to n do

if x>a[I] then m:=b[I];

{max[10,x]}

Этот вариант еще более эффективен, хотя менее удобный – любое обращение вычислят максимум лишь одного массива А, причем неявно. Любое нестандартное использование процедур должно быть тщательно продуманно и обязательно документировано.

Пример (к чему приводят соблазны):

Задача. По заданному массиву А породить массив В, содержащий сначала все положительные, затем все неположительные элементы А.

(рисунок).

Procedure Sort(var a: tVector; var b: tVector);

Var i,k,l: tIndex;

Begin

K:=1; l:=na;

For I:=` to na do

If a[I]>0 then

L[k]:= a[I]

Else begin

B[l]:= a[I];

K:=k+1;

End;

End.

 

Будет ли корректным обращение sort(c,c)? Синтаксически да (c:tVector), семантически – нет. Значение в массиве С заменяются на новые раньше, чем должны быть использованы старые. Приведи пример.

Второй вариант: использование глобальных значений. Имеет ли оно математический смысл?

Глобальные значения можно понимать как мат. параметр, именованную константу.

Правило полной локализации: не использовать глобальных объектов (подразумевалось в предыдущей лекции).

Правило частичной локализации: при использовании глобальных объектов документировать и не изменять.

Изменение значений глобальных объектов в поле процедуры называется побочным эффектом.

 

Подпрограммы и функции

Одна из трактовок понятия функции – функция с несколькими входами (аргументами) и несколькими результатами (выходами). Когда число результатов равно 1 получаем понятие многоместной функции. В этом случае Паскаль позволяет вернуться к обычной функциональной нотации.

 

Описание функции

Function – пользовательское имя функции (список формальных параметров) (как в случае процедур).

Тип значений функций (имя типа) (в стандартном Паскале скалярный)

Блок.

Соответствующий составной оператор, тело функции, обязан в любом случае определять значения функции, что семантически выглядит как оператор присваивания имени функции (имя функции:= выражение того же типа).

Чистая ошибка – применение имени функции справа. Справа имя функции может появиться только в специальном случае. В Delphi то же самое может выглядеть так:

Result:= выражение, где result – стандартная переменная соответствующего типа.

Function max(var a: tVector; n: tIndex): tComponent;

Begin

M:=a[1];

For I:=2 to n do

If m<a[i] then m:=a[i]; max:=m;

End.

 

Обращение к функции

Синтаксис: имя функции: список фактических параметров.

Семантика: выражение соответствующего типа. Может использоваться выражение этого типа.

Формальная семантика: достаточно ограничения случаем

V:= обращение к функции, где V – переменная, подставляемая вместо имени функции.

В свою очередь, этот оператор очевидным образом трактуется как модифицированное тело функции.

 

<== предыдущая лекция | следующая лекция ==>
Решето Эратосфена | Сущность и задачи планирования
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 320; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.