Чтение онлайн

на главную - закладки

Жанры

Maple 9.5/10 в математике, физике и образовании

Дьяконов Владимир Павлович

Шрифт:

10.3.7. Объявления переменных глобальными с помощью слова global

Говорят, что запретный плод сладок! Что бы ни говорили о нежелательности работы с глобальными переменными, бывает, что их применение желательно или даже необходимо. Чтобы сделать переменные внутри процедуры глобальными, достаточно объявить их с помощью ключевого слова global, после которого перечисляются идентификаторы переменных.

Следующий пример поясняет применение оператора global в процедуре (файл р5):

> а:=1;b:=1;

а := 1
b := 1

> fg:=proc(х,
у)

> global a,b;

> а:=х^2:b:=у^2:

> RETURN(sqrt(a+b));

> end;

fg := proc(x, y) global a, b; a:= х^2; b:= у^2; RETURN (sqrt (a+b)) end proc

> fg(3, 4);

5

> [a,b];

[9, 16]

В примере переменным а и b вначале присвоены значения 1. Поскольку они в процедуре объявлены глобальными, то внутри процедуры они принимают новые значения х2 и у2. В результате при выходе из процедуры они имеют уже новые значения. Это и есть побочный эффект при исполнении данной процедуры. Если пользователь не знает (или не помнит), что та или иная процедура имеет побочный эффект, то он рискует получить самые неожиданные (и неверные) результаты своих вычислений.

Следует отметить, что нельзя делать глобальными переменные, указанные в списке параметров процедуры, поскольку они уже фактически объявлены локальными. Такая попытка приведет к появлению сообщения об ошибке следующего вида «Error, argument and global `х` have the same name». При этом соответствующие переменные останутся локальными

10.3.8. Функция вывода сообщений об ошибках ERROR

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

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

ERROR(expr_1, expr_2, ...)

где exp_1, … — ряд выражений (возможно, пустой). Наиболее часто ERROR выводит просто строковое сообщение об ошибке, например ERROR(`string`). Полное сообщение об ошибке имеет вид.

Error, (in name) string, ...

Приведем пример процедуры, в которой предусмотрен вывод сообщения об ошибке при задании переменной х < 0 (файл р5):

> f := proc(х) if х<0 then error "invalid variable x: %1", x else

х^(1/2) end if end proc;

f:= proc(x)

 if x < 0 then error "invalid variable x:%1", x else
х^(1/2) end if

end proc

> f(3.) ;

1.732050808

> f(-3.);

Error, (in f) invalid variable x: -3.

> lasterror;

"invalid variable x: %1", -3

> lastexception;

f, "invalid variable x: %1",-3

Эта процедура вычисляет квадратный корень из числа х. При х<0 выводится заданное сообщение об ошибке. Еще раз обращаем внимание читателя на учебный характер данного примера, поскольку вычисление квадратного корня (в том числе из комплексных и отрицательных действительных чисел) реализовано встроенной функцией sqrt.

10.3.9. Ключи в процедурах

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

options opseq

Иногда их называют расширяющими ключами. Предусмотрены следующие ключи:

arrow — определят процедуру-оператор в нотации ->;

builtin — определяет функцию как встроенную;

call external — задает обращение к внешним программным модулям;

copyright — защищает процедуру от копирования.

inline — определяет процедуру как подчиненную (возможно не для всех процедур — см. справку).

load=memberName — загружает нужный для определений процедуры модуль (см. также опцию unload и детали в справке);

operator — объявляет процедуру — функциональный оператор;

system — определяет процедуру как системную,

remember — определяет таблицу памяти для процедуры;

trace — задает трассировку процедуры;

unload=memberName — выгружает нужный для определений процедуры модуль (см. опцию load).

10.3.10. Ключ remember

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

> f:=proc(x) options remember; x^3 end:

> f(2);

8

> f(3);

27

> op(4,eval(f));

table([2 = 8, 3 = 27])

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

Поделиться:
Популярные книги

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник