Для более осмысленного применения составных выражений должна быть возможность составления одного выражения из нескольких. Для этих целей используется локальный оператор присваивания "f", с помощью которого определяются локальные переменные программы, действующие только "внутри" составного выражения. Здесь следует заметить, что MathCAD не допускает использования обычных операторов присваивания (":=" и "≡") внутри составных выражений.
На рисунке 17 а) показано "громоздкое" выражение, а на рисунке б) - эквивалентное ему по результату составное выражение, в котором использованы внешние (то есть определенные вне составного выражения) переменныеw, x, y, z и локальные переменныеa, b и c, определенные внутри составного выражения с помощью оператора "f". Отметим, что переменная a определена подчиненным составным выражением, вложенным в главное составное выражение.
Пример в) иллюстрирует два важных свойства локальных переменных: во-первых, они действуют только в пределах составного выражения, в котором определены (одноименные внешние переменные a, b и cне изменили своих начальных значений после вычисления составных выражений, в которых такие же переменные были определены локально); во-вторых, если локальная переменная определена в составном выражении, она становится доступной в любой его части – в главном и всех подчиненных ему составных выражениях.
Рисунок 17 – Использование локальных переменных
5.1.3 Подпрограммы
Любая программа принимает входные данные, обрабатывает их по некоторому ("запрограммированному") алгоритму, и возвращает результаты своей работы в форме, удобной для представления их пользователю или обработки другими программами. При этом программист должен иметь возможность многократно обращаться к одной и той же программе из других программ, передавая этой программе различные входные данные и получая соответствующие им результаты.
Таким образом, чтобы определить программу, отвечающую перечисленным требованиям, необходимо:
· присвоить ей уникальное имя, отличное от имен других программ;
· определить список переменных - входных параметров программы;
· определить список переменных - выходных параметров программы;
· определить типы и структуры данных для каждого входного и выходного параметра;
· описать на языке программирования алгоритм работы программы, обеспечивающий преобразование множества входных параметров во множество выходных.
Очевидно, что с точки зрения соответствия перечисленным требованиям, рассмотренные выше составные выражения программами не являются, так как не имеют ни имен, ни явно выраженных списков входных параметров, то есть не обеспечивают возможности многократного вызова с разными входными данными.
Для описания структуры программы в языках программирования используются понятия головной и подчиненной программ. Головная программа активируется пользователем, а подпрограммы могут активизироваться как из головной программы, так и из других подпрограмм. При этом вызывающая программа называется родительской по отношению к вызываемой программе, которая, в свою очередь, в данном отношении называется дочерней.
Обычно языки программирования поддерживают две формы подпрограмм – процедуры и функции, отличающиеся формой обращения и способом использования результатов, возвращаемых подпрограммой. В отличие от процедуры, функция не имеет явно выраженного списка выходных параметров – считается, что единственный выходной параметр функции получает имя самой этой функции. На самом деле, это ограничение не является существенным, по крайней мере, по двум причинам. Во-первых, этот "единственный" выходной параметр функции может быть массивом данных – в этом случае он фактически представляет множество выходных параметров. Во-вторых, любые (в том числе и промежуточные) результаты работы подпрограммы могут быть сохранены во внешних файлах данных, доступных другим программам – в этом случае эти результаты, по существу, получают статус дополнительных выходных параметров подпрограммы-функции.
При разработке MathCAD-программы необходимо следовать определенным правилам и учитывать ограничения структурного характера, основные из которых обсуждаются ниже.
1 Роль головной программы выполняет документ MathCAD. Имя головной программы ассоциируется с именем соответствующего .mcd-файла.
2 Единственной допустимой формой подпрограммы в системе MathCAD является функция. Правила определения и использования пользовательских функций подробно описаны в пункте 1.3.2 данного учебного пособия. Будем называть некоторую пользовательскую функцию подпрограммой, если эта функция определена с помощью составного выражения.
3 MathCAD не допускает определения подпрограмм внутри других подпрограмм с помощью локального оператора присваивания "f". Из этого ограничения, в частности, следует необходимость определения всех необходимых разработчику подпрограмм, независимо от уровня их подчиненности при выполнении, в головной программе (то есть непосредственно в документе MathCAD).
4 При этом не накладывается никаких формальных ограничений на иерархию вызовов подпрограмм – любая из определенных в головной программе подпрограмм может быть использована в составном выражении, определяющем другую подпрограмму. Более того, допускается рекурсивное определение подпрограмм, когда выражение, определяющее некоторую функцию, содержит обращение к самой этой функции. Программирование рекурсивных вычислений подробно рассмотрено в разделе 5.5.
5 В составном выражении, с помощью которого определяется некоторая подпрограмма, допускается использование переменных следующих трех категорий.
а) Формальные аргументы определяемой функции, указанные в списке параметров функции после ее имени. Как правило, эти переменные используются в правых частях выражений и не изменяют своих значений оператором "f", хотя это формально и не запрещено. При выполнении подпрограммы формальные аргументы получают значения позиционно соответствующих им фактических аргументов, указанных при обращении к подпрограмме.
б) Локальные (внутренние) переменные, определяемые непосредственно в этой подпрограмме оператором "f". Переменные этой категории обычно используются для хранения промежуточных результатов работы подпрограммы и используются как в левых, так и в правых частях выражений.
в) Внешние переменные, которые должны получить свои значения в головной программе перед определением (а не перед выполнением !) подпрограммы, в которой они используются. Как правило, внешние переменные используются в правых частях выражений и не изменяют своих значений оператором "f", хотя это формально и не запрещено.