Предисловие главы 6

Если в предыдущих изданиях книги автор вплоть до данной главы удержался и не вставлял в книгу программы, созданные с помощью встроенных средств программирования Mathcad, то в этом издании Mathcad-программы (операторы, созданные с использованием инструментов, показанных на рис. 6.3) появились уже в гл. 1 (см. рис. 1.40). И это имеет под собой определенное обоснование. Дело в том, что раньше программирование в среде Mathcad было некой экзотикой[1]. Теперь же это рутинный этап ведения расчетов в среде данной математической программы[2].

В связи с этим в данной главе несколько смещены акценты. В ней теперь не даются уроки программирования, как это было в предыдущих изданиях, а только обсуждаются некоторые проблемы программирования в среде Mathcad и для среды Mathcad.

6.1. Немного истории

Средства программирования появились в 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] Бытовало даже такое мнение, что математические пакеты — это средство решения задач на компьютере ленивыми. "Ленивые" же резонно на это возражали, что все блага цивилизации — это их (ленивых) изобретения.


 [А.С.1]В сноске есть выделение. Зачем оно?

 [VFO2]Исправлено!

 [А.С.3]Почему выделено?

 [VFO4]Хотел что-то добавить… Исправлено!