Если в предыдущих изданиях книги автор вплоть до данной
главы удержался и не вставлял в книгу программы,
созданные с помощью встроенных средств
программирования Mathcad,
то в этом издании Mathcad-программы (операторы, созданные с использованием
инструментов, показанных на рис. 6.3) появились уже в гл. 1 (см.
рис. 1.40). И это имеет под собой определенное обоснование. Дело в том,
что раньше программирование в среде Mathcad было некой экзотикой[1].
Теперь же это рутинный этап ведения расчетов в среде данной математической
программы[2].
В связи с этим в данной главе несколько смещены акценты. В
ней теперь не даются уроки программирования, как это было в предыдущих изданиях,
а только обсуждаются некоторые проблемы программирования в среде Mathcad и для среды Mathcad.
Средства программирования появились в 6-й версии Mathcad,
а некоторые их дополнения и изменения в 7-й (операторы break,
continue и return) и 12-й версиях
(локальная функция — см. разд. 6.8).
Несмотря на то, что пакет Mathcad возник как прямая альтернатива
программированию, при работе в этой среде всегда ощущалась потребность в
программировании для расширения и совершенствования базового набора
математических инструментов — операторов и функций. Более-менее опытные
пользователи решали эту проблему тремя путями.
Путь 1. В самых первых версиях Mathcad были две
функции (if и until), позволявшие через
различные хитрости и трюки реализовывать две основные алгоритмические
конструкции — выбор (if) и повторение (until). Хитрить же
приходилось из-за неспособности функций if
и until иметь в качестве аргументов несколько операторов. Поэтому для
реализации даже несложного алгоритма нужно было подключать механизм вложенных функций и операторов, что
нередко превращало программу в
настоящую криптограмму, в которой
даже сам автор разбирался с трудом.
Вот как, например, выглядит поиск корня уравнения (нуля
функции) методом половинного деления (рис. 6.1) с использованием функций if и until.
Читатель может сравнить "программу" на рис. 6.1 с программой
(без кавычек) на рис. 2.6, реализующей практически тот же алгоритм:
отрезок неопределенности [а, b]
делится пополам и смотрится, где расположен корень; соответствующая половинка
снова делится пополам, и так до тех пор (until —
рис. 6.1 или while —
рис. 2.6), пока не будет достигнута нужная точность расчета.
Рис. 6.1. Поиск корня алгебраического уравнения методом половинного
деления с использованием функций if
и until
Кроме "зашифрованности" алгоритма (чего стят аргументы функции until на рис. 6.1)
"беспрограммный" поиск корня имеет и другой недостаток: он приводит к
нерациональному использованию ресурсов компьютера — к генерации векторов a и b[А.С.1][3][VFO2],
у которых нас интересуют только последние (last)
элементы, между которыми зажат искомый корень (переменная корень).
Операторы if
и until позволяют менять естественный порядок выполнения
операторов в Mathcad-документе сверху вниз и слева направо на более сложный.
Кроме того, есть еще два признака программирования: локальные переменные и объединение операторов в операторные блоки. Но об этом речь
пойдет чуть ниже.
Примечание
Функция until
в 2000-й версии перешла в разряд недокументированной, в 11-й ее совсем изъяли
из Mathcad, а в 12-й она вернулась в инструментарий программирования (см. п. 13
в Предисловии к данному изданию книги, где перечислены новинки Mathcad
12).
Путь 2. Версии Mathcad, начиная с 4.0, — это
полноценные Windows-приложения.
Поэтому при решении конкретной задачи в среде Mathcad можно в статике (через
файлы на диске или через буфер обмена) или в динамике (технологии DDE и
OLE — см. разд. 6.10) перенести данные (скаляр, вектор или
матрицу) в среду, например, Fortran и, используя богатый набор средств
вычислительной математики этого языка программирования, решить задачу (этап
задачи). Начиная с 5-й версии Mathcad пользователям была предоставлена
возможность программирования на языке С и объявления в среде Mathcad новых
встроенных функций (операторов). Код этих функций нужно откомпилировать
каким-либо 32-разрядным транслятором и прикрепить к среде Mathcad через
механизм DLL, опираясь на соглашение UserEFI[А.С.3].[VFO4]
Но этот путь с самого начала был в чем-то тупиковым. Во-первых, Mathcad
создавался как инструмент решения широкого класса задач теми, кто не хотел или
не умел возиться с классическими языками программирования, и мы это уже не раз
подчеркивали. При обращении же к языку C получалось так, что от чего ушли, к
тому и пришли. Во-вторых, тот, кто все-таки переключался из среды Mathcad в
среду языка С, как правило, там и оставался, решая всю задачу целиком.
В-третьих (вернее, во-вторых с половиной), если кто-то и мог решить свою задачу
на языке С, то он обычно не пользовался услугами Mathcad по неким
"моральным соображениям", считая это ниже своего достоинства[4]. Но
главным недостатком в технологии использования языка C для расширения возможностей Mathcad
является невозможность включения в C-программу богатого математического инструментария Mathcad. Тем
не менее, обращение к языку С — это одно из средств расширения списка
встроенных функций, и мы в данной главе опишем, как это можно сделать (см.
разд. 6.10).
Путь 3. Как отмечалось в гл. 1,
последние версии Mathcad
оборудованы элементами интерфейса Controls, поддерживаемыми программами на языках JScript или
VBScript (см. рис. 1.16). Этим можно воспользоваться не только для
форматирования Controls,
но и для написания программ, особенно тем пользователям Mathcad, кто силен в языке BASIC. Так на рис. 6.2
показано, как можно циклом определить сумму S
чисел от а до b, вставив в Mathcad-документ Controls — текстовое
поле с возможностью ввода двух переменных а
и b (по умолчанию количество
вводов Number of Inputs
равно нулю) и одним (умолчание) выводом (Number of Outputs) для переменной S.
Рис. 6.2. Программа,
введенная в Mathcad через текстовое окошко
Как понимает читатель, через текстовое поле, показанное на
рис. 6.2, как через "игольное ушко" можно "протащить"
в Mathcad-документ
довольно сложные BASIC-программы
и решить поставленную задачу. Недостатки здесь известные. Во-первых, и мы уже
это отмечали, скрипты нежелательны в Mathcad-документах, т. к. через них можно
"протащить" не только "невинные" программы (см.
рис. 6.2 или 1.16), но и вирусы — "чуму" компьютеров.
Во-вторых, программы, введенные в Mathcad-документы через Controls, по-прежнему отрезаны
от мощнейших инструментов Mathcad —
в них нельзя вставлять функции и операторы решения уравнений и систем, линейной
алгебры, оптимизации и всего того, что составляет суть данного математического
пакета. Программирование в Controls,
как правило, ведется только для улучшения интерфейса (см., например,
рис. 1.16, где небольшая программа меняла цвет подложки выводимого числа).
[1] Кроме
того, раньше инструменты программирования были только в продвинутых (и дорогих)
версиях Mathcad,
версиях с приставками PLUS
или Pro. Сейчас же все
версии Mathcad оснащены этим инструментом.
[2] Мольеровский
Журден, очень удивился, когда узнал, что он не просто говорит, а говорит именно
прозой. Так и некоторые пользователи Mathcad удивляются, когда оказывается, что
они программируют в среде Mathcad, к которой обратились именно потому, что в
ней не нужно программировать.
[3] С
другой стороны эти векторы хранят историю решения задачи, что полезно при
отладке (см. разд. 6.7).
[4]
Бытовало даже такое мнение, что математические пакеты — это средство
решения задач на компьютере ленивыми. "Ленивые" же резонно на
это возражали, что все блага цивилизации — это их (ленивых) изобретения.