Лекция 13 ПРОГРАММИРОВАНИЕ НА ВСТРОЕННОМ МАКРОЯЗЫКЕ План лекции 1.Условные операторы 2.Операторы цикла 3.Блоки 4.Функции 5.Транслятор и компилятор в MAXIMe.

Презентация:



Advertisements
Похожие презентации
Тема: Управление потоком в PHP Изучить возможности языка PHP при решении задач, требующих использования условного оператора. Рассмотреть примеры управления.
Advertisements

Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
ЦИКЛИЧЕСКИЙ АЛГОРИТМ Цели: -Познакомиться с понятием циклического алгоритма. -Освоить языковые средства для реализации циклических алгоритмов.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Министерство образования Республики Беларусь Белорусский государственный университет Управляющие структуры языков программирования.
Лекция 4 Представление основных структур: итерации, ветвления, повторения. Вспомогательные алгоритмы и процедуры.
Тест классы По программированию Pascal.
Программирование Задания В2, В5. Оператор присваивания в языке программирования Задание В2 – базовый уровень, время – 2 мин.
Операторы цикла. Циклический процесс, или просто цикл, – это повторение одних и тех же действий. Последовательность действий, которые повторяются в цикле,
Операторы языка Си Лекция 5.
Введение в C++ Урок 3-4. ОПЕРАТОРЫ ЦИКЛА Операторы цикла используются для организации многократно повторяющихся вычислений. - цикл с предусловием while,
РНР Изучение языка. Программирование интерактивных WEB-сайтов на языке PHP.
далее цикл с известным числом шагов цикл с неизвестным числом шагов (цикл с условием)цикл с неизвестным числом шагов (цикл с условием) что такое цикл?
ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.
Алгоритмическая конструкция «ветвление» Презентацию разработал Мащенко П.С., учитель МБОУ СОШ 2 муниципального образования Щербиновский район станицы Старощербиновской.
Лекция 3 Операторы Цикла 1 Российский государственный университет нефти и газа имени И.М. Губкина Кафедра «Информатики»
ОСНОВНЫЕ ЭЛЕМЕНТЫ БЛОК-СХЕМ Основные геометрические фигуры языка блок-схем, широко используемого для описания небольших алгоритмов.
ОСНОВНЫЕ ЭЛЕМЕНТЫ БЛОК-СХЕМ Основные геометрические фигуры языка блок-схем, широко используемого для описания небольших алгоритмов.
Презентацию составила учитель первой категории МБОУ СОШ 14 имени К.С.Федоровского г.Юрги Кемеровской области Яковлева Ирина Владимировна.
Транксрипт:

Лекция 13 ПРОГРАММИРОВАНИЕ НА ВСТРОЕННОМ МАКРОЯЗЫКЕ План лекции 1. Условные операторы 2. Операторы цикла 3. Блоки 4. Функции 5. Транслятор и компилятор в MAXIMe

1. Условные операторы Основная форма условного оператора if cond 1 then expr 1 else expr 2. Если условие cond1 истинно, то выполняется выражение expr1, иначе - выполняется выражение expr 2. Пакет Maxima позволяет использовать различные формы оператора if, например: if cond 1 then expr 1 elseif cond 2 then expr 2 elseif... else expr 0 Если выполняется условие cond 1, то выполняется выражение expr 1, иначе - проверяется условие cond 2, и если оно истинно - выполняется выражение expr 2, и т.д. Если ни одно из условий не является истинным - выполняется выражение expr 0. Альтернативные выражения expr 1, expr 2,..., expr k - произвольные выражения Maxima (в т.ч. вложенные операторы if). Условия - действительно или потенциально логические выражения, сводимые к значениям true или false. Способ интерпретации условий зависит от значения флага prederror. Если prederror = true, выдаётся ошибка, если значения какого-либо из выражений cond 1,..., cond n отличается от true или false. Если prederror = false и значения какого-либо из выражений cond 1,..., cond n отличается от true или false, результат вычисления if - условное выражение.

2. Операторы цикла Для выполнения итераций используется оператор do. Могут использоваться три варианта его вызова, отличающиеся условием окончания цикла: for variable: initial_value step increment thru limit do body for variable: initial_value step increment while condition do body for variable: initial_value step increment unless condition do body Здесь variable - переменная цикла; initia_value - начальное значение; increment - шаг (по умолчанию равен 1); limit - конечное значение переменной цикла; body - операторы тела цикла.

Ключевые слова thru, while, unless указывают на способ завершения цикла: по достижении переменной цикла значения limit ; пока выполняется условие condition ; пока не будет достигнуто условие condition. initial_value, increment, limit, и body могут быть произвольными выражениями. Контрольная переменная по завершении цикла предполагается положительной (при этом начальное значение может быть и отрицательным). Выражения limit, increment, условия завершения ( condition ) вычисляются на каждом шаге цикла, поэтому их сложность влияет на время выполнения цикла. При нормальном завершении цикла возвращаемая величина - атом done. Принудительный выход из цикла осуществляется при помощи оператора return, который может возвращать произвольное значение. Контрольная переменная цикла - локальная внутри цикла, поэтому её изменение в цикле не влияет на контекст (даже при наличии вне цикла переменной с тем же именем).

Условия инициализации и завершения цикла можно опускать. Пример (цикл без явного указания переменной цикла)

Несколько более изощрённый пример - реализация метода Ньютона для уравнения с одной неизвестной (вычисляется та же величина - корень из пяти):

Ещё одна форма оператора цикла характеризуется выбором значений переменной цикла из заданного списка. Синтаксис вызова: for variable in list end_tests do body Проверка условия завершения end_tests до исчерпания списка list может отсутствовать. Пример:

3. Блоки Как в условных выражениях, так и в циклах вместо простых операторов можно писать составные операторы, т.е. блоки. Стандартный блок имеет вид:

Сначала идет список локальных переменных блока (глобальные переменные с теми же именами никак не связаны с этими локальными переменными). Список локальных переменных может быть пустым. Далее идет набор операторов. Упрощенный блок имеет вид:

Обычно в циклах и в условных выражениях применяют именно эту форму блока. Значением блока является значение последнего из его операторов. Внутри данного блока допускаются оператор перехода на метку и оператор " return ". Оператор " return " прекращает выполнение текущего блока и возвращает в качестве значения блока свой аргумент В отсутствие оператора перехода на метку операторы в блоке выполняются последовательно. (В данном случае слово "метка" означает отнюдь не метку типа "%i5"или "%o7"). Оператор "go" выполняет переход на метку, расположенную в этом же блоке: В этом блоке реализован цикл, который завершается по достижении "переменной цикла" значения Меткой может быть произвольный идентификатор. Следует иметь в виду, что цикл сам по себе является блоком, так что (в отличие от языка C или С++) прервать выполнение циклов (особенно вложенных циклов) с помощью оператора "go" невозможно, т.к. оператор "go" и метка окажутся в разных блоках. То же самое относится к оператору "return".

Если цикл, расположенный внутри блока, содержит оператор "return то при исполнении оператора "return" произойдет выход из цикла, но не выход из блока: Если необходимо выйти из нескольких вложенных блоков сразу (или нескольких блоков и циклов сразу) и при этом возвратить некоторое значение, то следует применять блок "catch" В данном блоке выполнение цикла завершается, как только значение i достигает 2. Возвращаемое блоком catch значение равно 555.

В данном блоке выполнение цикл выполняется полностью, и возвращаемое блоком catch значение равно 777 (условия выхода из цикла при помощи throw не достигаются). Оператор "throw аналог оператора "return но он обрывает не текущий блок, а все вложенные блоки вплоть до первого встретившегося блока "catch". Наконец, блок "errcatch" позволяет перехватывать некоторые (к сожалению, не все!) из ошибок, которые в нормальной ситуации привели бы к завершению счета. Пример: Выполнение последовательности операций прерывается на первой операции, приводящей к ошибке. Остальные выражения блока не выполняются (значение c остаётся неопределённым). Сообщение об возникшей ошибке может быть выведено функцией errormsg().

4 Функции Наряду с простейшим способом задания функции, Maxima допускает создание функции в виде последовательности операторов: f(x) := (expr1, expr2,...., exprn); Значение, возвращаемое функцией - значение последнего выражения exprn. Чтобы использовать оператор return и изменять возвращаемое значение в зависимости от логики работы функции, следует использовать конструкцию block, например: f(x) = block([], expr1,..., if(a > 10)then return(a),..., exprn). При a > 10 выполняется оператор return и функция возвращает значение a, в противном случае - значение выражения exprn. Формальные параметры функции или блока - локальные, и являются видимыми только внутри них. Кроме того, при задании функции можно объявить локальные переменные (в квадратных скобках в начале объявления функции или бока). Пример: block([a : a], expr1,...a : a + 3,..., exprn) В данном случае при объявлении блока в локальной переменной a сохраняется значение глобальной переменной a, определённой извне блока.

В данном примере значение переменной a задаётся вне тела функции, но результат, возвращаемый ею, зависит от значения a.

Пример: Более сложный пример (лямбда-выражения могут использоваться в контексте, когда ожидается имя функции):

Аргументы лямбда-выражений - локальные переменные. Другие переменные при вычислении лямбда-выражений рассматриваются как глобальные. Исключения отмечаются специальным символом - прямыми кавычками

Лямбда-функции могут быть вложенными. При этом локальные переменные внешнего выражения доступны как глобальные для внутреннего (одинаковые имена переменных маскируются). Подобно обычным функциям, лямбда-функции могут иметь список параметров переменной длины. Список [cc] при вызове лямбда-функции f включает элемента: [a, b, c]. Формула для расчёта f применяется к каждому элементу списка. Локальные переменные могут быть объявлены и посредством функции local (переменные v1, v2,..., vn объявляются локальными вызовом local(v1, v2,..., vn) независимо от контекста).

5 Транслятор и компилятор в MAXIMe Определив ту или иную функцию, можно заметно ускорить ее выполнение, если ее оттранслировать или откомпилировать. Это происходит потому, что если Вы не оттранслировали и не откомпилировали определенную Вами функцию, то при каждом очередном ее вызове MAXIMA каждый раз заново выполняет те действия, которые входят в определение функции, т.е. фактически разбирает соответствующее выражение на уровне синтаксиса MAXIMы.

5.1 Функция translate Функция translate транслирует функцию MAXIMы на язык LISP. Например, выражение После этого функция (как правило) начинает считаться быстрее.

5.2 Функция compile Функция compile сначала транслирует функцию MAXIMы на язык LISP, а затем компилирует эту функцию LISPa до двоичных кодов и загружает их в память. Пример: После этого функция (как правило) начинает считаться еще быстрее, чем после трансляции.

Следует иметь в виду, что как при трансляции, так и при компиляции MAXIMA старается оптимизировать функцию по скорости, не заботясь об аккуратности. Поэтому при работе с большими по объему функциями могут возникнуть чудеса. В этом случае следует отказаться от трансляции или компиляции, либо переписать функцию. Выигрыш во времени существенным образом зависит от типа машины, от вида функции, от того, декларирован ли тип функции и ее аргумента при определении функции, от типа аргумента, с которым вызывается функция. Если предполагается использовать функцию только для работы с действительными числами (например для вычисления определенного интеграла с помощью функции " romberg " или поиска корня с помощью функций " find_root " и " newton "), то обязательно следует декларировать тип аргумента и самой функции как " float ". Это во много раз усилит эффект от трансляции или компиляции.

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