КАТЕГОРИИ: Архитектура-(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; Просмотров: 321; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |