Говорухин В., Цибулин Б. Компьютер в математическом исследовании (1185927), страница 59
Текст из файла (страница 59)
3. е1яетт х«5. 5. е1яе 13, епб получим: апя- 5 Оператор-переключатель аы)гс() предоставляет возможность разветвления и выполнения операторов в зависимости от значения переменной ЧЯй (скаляра или строки): ящтсП Чяй саяе ЧАй!. ЕХРй 1 саяе (Чдй2, ЧЯМ3. . ). ЕХРй 2, отнегитае.
ЕХРМ О епб Здесь ЧЯй1, ЧАВ2, ЧАВЭ, ... — различные значения, которые может принимать переменная ЧЯй, а ЕХРЙ 1, ЕХРй 2 и т. д. — группы операторов. Переключение возможно по единственному значению (выбор ЧАй1) и по группе значений (выбор из ЧАМ2, ЧАВЗ,...). Кроме того, если осознанного выбора не сделано, то выполняются операторы группы ЕХРй 2 (ключевое слово от()егы! зе). Приведем пример со строковой переменной, здесь команда б! зр используется для вывода текстового сообщения: » МЕТНОО-'Сиип'; аи!тон МЕТНОО саяе (" трап".'прян'1, бтар!"Метод 2 порядка") саяе "Сиип", б>яр!"Метод 4 порядка" ) отнеси!яе, Ш ар!"Метод неизвестен") епб В результате получим: Метод 4 порядка Перечислительный цикл имеет вид: Гог М-МО ОМ М1, ЕХРй епб Здесь М вЂ” счетчик, пробегающий с шагом ОМ значения от МО до М1 (учитываются вещественные части чисел); а ЕХРй обозначает выполняемые в теле цикла команды.
Цикл с условием: и!п'1е Н)ОЕ. ЕХРй епб 318 Глава 12. Элементы языка ИАПАВ выполняется до тех пор, пока не будет нарушено условие ВООЕ. Для выхода из тела цикла имеется оператор прерывания Ьгеах. В МАТ1.АВ 6 появился оператор сопт! пое, означающий пропуск операторов и переход к следующему значению переменной цикла. Приведем примеры. В результате выполнения команд » х=Ц: Гог Х"1:5; !! Х"-5.
Ьгеай. епс, х=Ех.х"31: епс; будет сформирован вектор: 11.8,27.641 Здесь вначале организована пустая переменная х, к которой в процессе выполнения цикла добавляются новые элементы. К тому же результату приведет выполнение цикла с условием: » х-1; Х-1; нП))е в<4; Х-Е+1; х-Ех,х 31: епп; Подчеркнем, что матричные операции МАТЮКАВ выполняет быстрее, чем действия с циклами. Формирование массива х потребует меньше времени„если не пользоваться оператором цикла: » 1=1:4; х-й."3: Хотя для задания гильбертовой матрицы имеется функция Ь! ) Ь, приведем пример ее определения с помощью следующих двух циклов: тог в=1:3 Гог м 1;4 А!ЕЛ)=1/! Х.на-1); епо епо Если эти циклы вводить в командном окне, то переход на следующую строку происходит при нажатии клавиши ВВОД, При этом МАТЕАВ не приступит к выполнению цикла, пока не оформится конструкция цикла.
Для обработки ошибок вычислений в МАТЮКАВ предусмотрена конструкция !гу ОРЕМ 1 сагсП ОРЕМ 2 епе Здесь обозначения ОРЕй 1 и ОРЕЯ 2 представляют группы операторов. Если фрагмент программы содержит данную конструкцию и при выполнении операторов ОРЕй 1 не произошло ошибки, то управление передается операторам, стоящим за словом епО. Если же возникает ошибка, то служебной переменной 1азсегг присваивается сообщение о характере ошибки и выполняется группа операторов ОРЕМ 2.
Следующий пример показывает, что МАТЕАВ считает ошибкой: » !гу. Гог Е-О:1.й/О.епо. Г!. са2сь. Ейй-)аз!егг, епо,'Е!' Магп)пвс О!ч!Ое Ьу гего. апзМам Магп!пй: Отч!де Ьу гего. апз1пт Ейй Опоеттпео топот!оп ог чаг!аые т!". 3пементы программмровання 319 дпв Гд В заключение отметим, что обработка циклов интерпретатором МАТЕАВ замедляет скорость расчетов, поэтому по возможности следует применять векторизацию — проведение операций по строкам или по колонкам с использованием двоеточий для указания обрабатываемых диапазонов. Сравним затраты времени для вычисления синуса от последовательности чисел, используя оператор цикла: » С!с.
тог 1-1;23456. у-41п(1):епб. Сос е1араеб С)пе- 1.0400 и расчета с применением векторизации: » Ыс, 1-1:23450: у д1п(г): Сос е!арвеб Юме = 0.0000 Второй способ потребовал значительно меньше времени. Полезно также предварительно выделять память, чтобы исключить переписывание наращиваемых массивов. Приведем пример, в котором массив из тысячи элементов в цикле заполняется значениями счетчика цикла. Если не описать переменную В как массив, то получается следующий результат: » и-1000; Мс.тог К-1:и, 01г)=с; епб: Ссс е1арвеб Мпе- 0.4400 Если же ввести предварительно массив из тысячи элементов, то экономия очевидна: » и-1000;А-аегов(1,п);11с.тог Ь"1:и, А1г)-1: епб; Сос е1арвеб 11пе = 0.0000 Вообще, при разработке программ полезно использовать профилер МАТЮКАВ, чтобы выяснить, какие части программы вызывают особые затраты времени, а затем оптимизировать их.
В частности, для этого можно использовать шех-файлы — написанные на С или Фортране модули и откомпилированные так, чтобы их можно было вызывать из МАТЮКАВ. О профилере и создании шех-файлов речь пойдет в главе 16 «Программирование в МАТЮКАВ». Функции и файлы-источники (т-файлы) Для простых операций удобен интерактивный режим, но если вычисления нужно многократно повторять или необходимо реализовать сложные алгоритмы, то следует использовать ш-файлы МАТЮКАВ. Существуют два вида ш-файлов — файлы внешних функций и всп'рт-файлы (последовательности команд или программы), Записанные в вспрс-файл команды будут исполнены, если в командной строке ввести имя вспрт-файла.
Переменные вспрс-файла являются глобальными. Их значения заместят значения таких же переменных, которые были использованы до вызова данного всйрт-файла. Примером всг)рс-файла является файл Вгет.ш, приведенный в главе 11 «Работа вМ АТ1.АВ»; 320 Глава 12. элементы языка мАтеАВ АП2:341 тпч(А) воз*А"2 а-Оет(А) В отличие от зспрт-файлов обращение к внешней функции обычно сопровождается передачей аргументов. Внутренние переменные по умолчанию являются локальными, и для того, чтобы использовать нх как глобальные, требуется соответствующее описание. По завершении работы функции выводится результат — некоторое число матриц, строк и т. д.
Схематично структура функции имеет вид: Гроот(оо 1001,002,...)-ЕЬМ(1М1,1М2,...) тО)миемт д)оЬа) 61 02 ... ОРЕКАТОК5 Здесь 001, 002, ... — выходные параметры (результаты),!М1, 1М2, — входные параметры, ЖСОММЕМТ вЂ” комментарий, 61, 62, ... — глобальные переменные, ОРЕРАТОМ5 — операторы, составляющие тело функции. Обычно выход из функции происходит после выполнения последнего оператора, если же нужно завершить работу раньше, то используется команда гегигп. Приведем пример. В текстовом редакторе подготовим файл й)пс.(п из двух строк; Типот(оп у/ тиос(х); т Проверке, нто х не бесконечность тг -!згтп(се(х). 5тиосг(оп Гияс - (прот еггог".
ге!иго. епо у=х"2/2-х"4/4; Теперь к функции Гипс можно обращаться, как и к любой функции МАТ1.АВ, например к функции Гр! ЬЬ для изображения графика или к функции Гтего для отыскания корней нелинейного уравнения, см. главу 15 «Численный анализ в МАТ1.АВм » тзего('Тиос',1), доз 1.4142е+000 Если используются глобальные переменные, то помимо описания в самой функции их следует описать также в командной строке или вызываемом вопи-файле. Например, создадим файл п)аяза.гш Тиос!)оо сит - мазза(чо) иве) д)оЬа) ОЕМ5!ТЧ оиг - ОЕМ5!ТУ*чо)име; Затем в командной строке наберем » д)ЬЬа) ОЕМ51ТУ, ОЕМ51ТУ 1; Обратимся к функции в)азза: » авззз(3) алз- 3 Глобальную переменную можно интерактивно менять в процессе работы, при этом нет необходимости модифицировать функцию мазза.
Для глобальных переменных разработчики МАТ1.АВ рекомендуют использовать заглавные буквы. Элементы программирования 321 При помощи о писателя регз15 Еепт можно указать, что локальная переменная должна сохранять свое значение между вызовами функции. В этом случае переменная остается недоступной извне м-функции. При первом вызове такая переменная инициализируется пустым массивом. Вычисление факториала может быть реализовано с применением описателя регз1зтепт следующим образом. Подготовим файл Раст Рета.)п: топсспоп у=гает Реса(х) Рега1атепс РЕР5 ~т паемрту(РЕ»5). РЕР5-1: епс у=РЕР5.*х: РЕР5=у: Теперь можно найти 41, организовав следующий цикл: » тог Х-1:4.