Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?
» » » Основы программирования в Mathcad в ЮУрГУ

Реклама


Основы программирования в Mathcad в ЮУрГУ

Просмотров: 3224 Автор: admin

Основы программирования в Mathcad в ЮУрГУ

Основы программирования в Mathcad


Программой, как известно, называется упорядоченная последовательность инструкций, объединенных в единую логическую структуру. Программа обычно подразумевает более чем одну последовательность действий и этим отличается от формального набора команд. В каждой программной среде есть свои правила записи инструкций, которые образуют язык программирования. Для создания программ в Mathcad предусмотрены специальные утилиты, а для ввода в рабочем документе структур, посредством которых записываются программы, имеется специальная палитра (рис. 6.1).

Рис. 6.1. Палитра инструкций программирования Programming
На палитре Programming представлено десять пиктограмм для ввода различных инструкций. Кратко каждая пиктограмма описана в табл. 6.1. Более подробно они обсуждаются в контексте рассматриваемых в этой главе вопросов.

Таблица 6.1. Кнопки палитры Programming

Таблица 6.1 (окончание)
Каждая программа в рабочем документе Mathcad реализуется в виде отдельного блока или модуля. Структура этого блока вставляется в рабочий документ щелчком на пиктограмме Add Line на палитре Programming или нажатием клавиши . Результат показан на рис. 6.2.
Вместо структурных заполнителей вводятся инструкции (команды) программы, которые должны быть выполнены. Для того чтобы добавить еще один структурный заполнитель (чтобы потом вместо него можно было ввести очередную команду), необходимо снова щелкнуть на пиктограмме Add Line (рис. 6.3).

Рис. 6.2. Вставка программного блока в документ

Рис. 6.3. Добавление в программный блок структурного заполнителя

Для удаления лишнего структурного заполнителя достаточно выделить его и нажать клавишу . Обычно программой возвращается значение (хотя и не обязательно). Этот результат, к концу выполнения программы, как правило, записан в качестве значения некоторой переменной, которая указывается в последней команде программы. Следует также иметь в виду, что в теле программы используется оператор локального присваивания, который имеет вид левонаправленной стрелки и вводится с помощью панели инструментов Programming или нажатием комбинации клавиш +.
Пример 6.1. Дважды два
Исключительно простой пример программы, в которой присутствует оператор локального присваивания, приведен на рис. 6.6.
Программа состоит из трех командинструкций. Первой инструкцией локальной переменной i в качестве значения присваивается число 2. Второй командой эта переменная возводится в квадрат (после этого значение переменной i равно 4). Наконец, третья команда состоит только из названия локальной переменной, и это именно тот результат, который возвращается программой (то есть 4). Для того чтобы увидеть результат выполнения программы, программный блок следует выделить (линиями редактирования) и нажать клавишу , т. е. ввести оператор равенства. Ситуация проиллюстрирована на рис. 6.5.
Разумеется, в реальных ситуациях необходимость в создании таких исключительно простых программ не возникает. Обычно программы более замысловаты. При этом помимо описывавшихся ранее функций, применяются еще и специальные операторы, о которых речь пойдет далее. Но прежде имеет смысл остановиться на логических операторах, которые часто входят в состав условных операторов. Условные же операторы исключительно важны, поскольку именно с их помощью в программах реализуется ветвление алгоритмов (преимущество, которое выгодно отличает программы от обычного набора команд).

Рис. 6.6. Пример простой программы

Рис. 6.5. Вычисление значения согласно созданной программе

Логические операторы
Логические операторы необходимы в основном для сравнения выражений. Их полный набор можно увидеть на палитре Boolean, которая изображена на рис. 6.6.

Рис. 6.6. Палитра Boolean
Назначение пиктограмм палитры Boolean приведено в табл. 6.2.
Таблица 6.2. Пиктограммы панели инструментов Boolean


Таблица 6.2 (окончание)


Пример 6.2. Логические операторы
Некоторые примеры вызова логических операторов (с проверкой результата) представлены в документе на рис. 6.7.

Рис. 6.7. Примеры вызова логических операторов
Для того чтобы проверить значение логического оператора, достаточно, как и в случае обычной команды, указать после него знак равенства (нажатием клавиши ).
Условный оператор
Главной отличительной чертой условного оператора является инструкция if, справа и слева от которой размещаются два структурных заполнителя. В правом заполнителе указывается проверяемое условие, а в левом — вычисляемое выражение. Обычно определяется также выражение (или оператор), вычисляемое (или выполняемый) при невыполнении условия в условном операторе. Альтернативное действие указывается вместе с инструкцией otherwise. Выполняемый оператор вводится вместо заполнителя слева от инструкции.
Пример 6.3. Условный оператор
На рис. 6.8 представлен пример программного блока с условным оператором и инструкцией otherwise.


Рис. 6.8. Программный блок с условным оператором
В программном блоке проверяется условие, которое состоит в том, что переменная х меньше нуля. Если это так, то в качестве результата возвращается О, в противном случае — 1 (значение, указанное слева от инструкции otherwise). Проверить результат выполнения программного блока можно, указав после него знак равенства. Предварительно, правда, необходимо определить значение переменной х (что и было сделано, как это видно из рис. 6.8).
Программные блоки с успехом используются при определении функциональных зависимостей, не сводящихся к суперпозиции элементарных математических функций. В этом случае после названия создаваемой функции (с указанием аргумента или аргументов) вводится оператор присваивания, после которого следует программный блок, где в соответствии со значением аргумента функции вычисляется ее значение.
Пример 6.6. Функция с условным оператором
На рис. 6.9 уже знакомый программный блок описывает функцию, которая возвращает два значения: 0 при отрицательном аргументе и 1 — в противном случае. Здесь же приведены примеры вызова созданной функции.

Рис. 6.9. Определение функции с использованием условного оператора
Часто в одном программном блоке реализуют сразу несколько условных операторов, которые могут последовательно размещаться один за другим или быть вложенными.

Пример 6.5. Несколько условных операторов
Пример последовательного размещения условных операторов приведен на рис. 6.10.

Рис. 6.10. Определение функции с использованием нескольких условных операторов
В соответствующем программном блоке определяется функция одного аргумента, которая может принимать три значения: 1 при отрицательном аргументе, 1 — при положительном и 0, если аргумент функции равен нулю. Программный блок реализуется с помощью двух условных операторов. Первым оператором проверяется, меньше ли нуля аргумент функции, и если это так, в качестве результата возвращается значение —1. Далее проверяется условие, положителен ли аргумент функции. В этом случае возвращается единица. Перед инструкцией otherwise указано нулевое значение. Поэтому если не выполняется ни одно из двух проверяемых условий (то есть аргумент функции не является ни положительным, ни отрицательным и, следовательно, равен нулю), в качестве значения возвращается нуль. Таким образом, если перед инструкцией otherwise следует несколько условных операторов, то оператор, соответствующий этой инструкции, выполняется только если не выполнено ни одно из условий в условных операторах.
Условный оператор допускается и без инструкции otherwise. Ведь ситуация, когда некоторое действие следует выполнить только при выполнении (или невыполнении) определенного условия, встречается на практике достаточно часто.
Пример 6.6. Использование условного оператора
Рассмотрим функцию, которая в качестве значения возвращает свой аргумент, если он неотрицателен, и число, на единицу большее, если аргумент функции отрицателен. Программный блок с описанием этой функции показан на рис. 6.11.
Первая команда соответствующего программного блока — инициализация локальной переменной i, которой в качестве значения присваивается аргумент х, передаваемый функции у(). Далее проверяется, меньше нуля

значение этой переменной или нет. Если переменная отрицательна, ее значение увеличивается на единицу. Последним оператором в программном блоке указана переменная i, которая и возвращается в качестве значения функции. Строго говоря, такую функцию можно было описать без ввода специальной локальной переменной. Фрагмент документа с альтернативным способом определения функции показан на рис. 6.12.

Рис. 6.11. Определение функции
с использованием условного оператора
и локальной переменной

Рис. 6.12. Альтернативный способ определения функции

В отличие от предыдущего варианта, в данном случае программный блок содержит всего два оператора. Первым оператором аргумент функции увеличивается на единицу при условии, что этот аргумент меньше нуля. Аргумент возвращается в качестве значения функции. Ниже приведен пример вызова такой функции. Сначала переменной х присвоено отрицательное значение 3. Далее переменная указывается аргументом функции, после чего проверяется значение переменнойаргумента. Несложно заметить, что значение этой пе-ременной не меняется. Дело все в том, что в теле программы использовался оператор локального присваивания. Поэтому все операции по изменению значений переменных, в том числе и глобальных (то есть таких, что инициализированы вне программного блока), имеют силу только в пределах данной программы.
Несколько иначе реализуется программа с вложенными условными операторами. Речь идет о том, что одна или более команд, выполняемых в рамках условного оператора, реализована с помощью условного оператора. Обычно к такой схеме построения программы прибегают в случаях, когда проверяется большое количество взаимосвязанных условий. Классический пример — определение кусочно-непрерывной функции.

Пример 6.7. Кусочно-непрерывная функция
В этом случае искомая функция может записываться через достаточно простые элементарные функции, однако, в зависимости от диапазона, в который попадает аргумент, формулы, определяющие ее значение, разные. Такая ситуация показана на рис. 6.13. Сначала там определена кусочно-непрерывная функция, а далее, чтобы можно было представить характер функциональной зависимости, построен график.

Рис. 6.13. Вложенные условные операторы использованы при определении кусочно-непрерывной функции
Программа реализуется по следующему алгоритму: сначала проверяется условие х > о, т. е. больше ли нуля аргумент функции. Если это так, то далее проверяется условие х < 2. При верном втором условии значение функции равно ее аргументу, т. е. х. Таким образом, если аргумент функции попадает в интервал от 0 до 2, то функция задается линейной зависимостью. В ситуации, когда второе условие не выполняется (но выполняется первое), функция определяется зависимостью 4/х. Именно такое выражение указано вместе с инструкцией otherwise в блоке второго, внутреннего условного оператора. Эта формула, следовательно, соответствует значениям аргумента, большим либо равным двум. Наконец, если не выполнено условие первого, внешнего условного оператора, значение функции вычисляется по формуле sin(x). Разумеется, существует много способов проверки нескольких условий, в том числе с помощью вложенных условных операторов. На рис. 6.14 показан

фрагмент документа с описанием кусочно-непрерывной функции, полностью аналогичной той, что была представлена ранее. Однако в данном случае несколько иначе организован программный блок, в котором непосредственно задается функция. В частности, в первую очередь проверяется, попадает ли аргумент функции в интервал значений от 0 до 2. При этом использован логический оператор И (должны одновременно выполняться два неравенства). Второй, вложенный условный оператор указан в качестве команды для инст-рукции otherwise.

Рис. 6.16. Альтернативный способ определения кусочно-непрерывной функции
Убедиться в том, что в программном блоке описана та же функция, что и созданная ранее, можно по графику, приведенному в нижней части рис. 6.16. В обоих случаях вложенный условный оператор вводился в отдельном блоке, отделенном вертикальной линией слева. Чтобы вставить в тело программы такой блок, нужно выделить структурный заполнитель (слева от инструкции if условного оператора или инструкции otherwise — в соответствии с тем, где блок должен быть добавлен), после чего выполняется щелчок на пиктограмме Add Line палитры Programming.
Пример 6.8. Вложенные операторы
Разницу между последовательным размещением условных операторов и ситуацией, когда один из них вызывается внутри другого, иллюстрирует рис. 6.15.


Рис. 6.15. Различные способы размещения условных операторов в теле программы
При определении первой функции T1() использовано два последовательных условных оператора. В первом аргумент функции сравнивается с числом 5. Если аргумент не меньше этого числа, в качестве значения функции возвращается 3. Вторым оператором проверяется условие, состоящее в том, что аргумент функции меньше либо равен 1. В этом случае возвращается значение 1. При невыполнении ни одного из условий в условных операторах значение функции равно 2. Ниже под описанием функции приведены примеры ее вызова. В правой части документа описана функция Т2 (). В теле блока описания этой функции в первом операторе аргумент сравнивается с единицей. Если он строго больше единицы, выполняется другой условный оператор. В соответствии с этим вложенным оператором для аргументов функции, меньших 5, в качестве значения возвращается число 2, если это не так, то число 3. Наконец, для значений аргумента функции, не превышающего 1, значение функции равно 1 (команда у инструкции otherwise для внешнего оператора). Сразу под блоком программы приведены примеры вызова функции Т2 ().
Несложно заметить, что оба программных блока фактически опи-сывают одну и ту же зависимость: для значений аргумента, не превышающих 1, значение функции равно 1; если аргумент функции лежит в интервале от 1 до 5, функция принимает значение 2; при аргументе, принимающем значение от 5 и более, в качестве результата возвращается число 3. Разница между функциями TI() и Т2() состоит лишь в способе реализации такой зависимости. В частности, условие второго условного оператора в функции T1() проверяется всегда, вне зависимости от того, выполнено ли условие первого условного оператора. Напротив, в функции T2() условие второго вложенного условного оператора проверяется только в том случае, если выполнено условие первого оператора. При написании небольших программных блоков такая

разница обычно мало сказывается на конечном результате. Однако когда программа достаточно большая или в процессе ее реализации предполагается выполнить существенное число итераций, такие нюансы следует принимать во внимание, поскольку при этом важно не только корректно составить алгоритм (последовательность команд), но и реализовать наиболее оптимальные схемы.
Еще одна особенность условных операторов связана с интерпретацией численных значений при работе с логическими операторами. Любое численное значение, отличное от нуля, интерпретируется, если оно указано в логическом операторе, как TRUE. Нулевое значение, соответственно, интерпретируется как FALSE. Поэтому в условных операторах в качестве условия допустимы не только логические операторы, но и обычные арифметические выражения.
Пример 6.9. Арифметическое выражение в условии
Пример арифметического выражения в условном операторе представлен на рис. 6.16.

Рис. 6.16. Пример использования в условном операторе арифметического выражения
В приведенном документе описывается функция, которая возвращает результат, равный единице, деленной на разность аргумента функции и единицы. Эта функция, очевидно, определена для любого аргумента, за исключением единицы. При таком аргументе функцией в качестве результата возвращается текстовая строка "infinity". Соответствующий программный код реализуется с помощью всего одного условного оператора. В качестве проверяемого условия, при выполнении которого значением является упомянутая текстовая строка, указано арифметическое выражение (разность аргумента функции

и единицы, т. е. выражение в знаменателе при вычислении значения функции). Точнее, это выражение является аргументом логического оператора отрицания. Если это выражение равно нулю, результатом вызова функции должна быть текстовая строка. Нулевое значение, как отмечалось ранее, интерпретируется как логическое значение FALSE, поэтому возникает ситуация, будто условие в условном операторе не выполнялось. Поскольку выражение является аргументом логического оператора отрицания, то при нулевом выражении результат всей логической операции равен TRUE (В противном случае — FALSE). Поэтому слева от инструкции if условного оператора указана текстовая строка, возвращаемая функцией в качестве результата в точке разрыва. Для всех прочих значений аргумента результат вызова функции вычисляется по формуле, указанной слева от инструкции otherwise. Разумеется, можно было, например, просто записать в условном операторе в качестве условия упомянутое выражение (без оператора отрицания). Тогда следует поменять местами текстовую строку и формулу для вычисления значения функции.
Операторы циклов
Наряду с условными операторами, особое место занимают операторы циклов. Их назначение состоит в основном в том, чтобы в краткой форме кодировать серии большого числа однотипных операций. В Mathcad существует несколько способов организации циклов. Рассмотрим их.
Часто при выполнении оператора цикла каждый итерационный шаг можно отождествить с некоторой переменной, которую далее будем называть индексной. В этом случае процесс реализации оператора цикла состоит в том, что индексная переменная пробегает значения из определенного множества, а выполняемая последовательность действий при данном фиксированном значении индексной переменной обычно зависит от индексной переменной (но это не обязательно). Такого рода циклы в Mathcad создаются с помощью конструкции For, при вставке которой (с помощью пиктограммы на панели программирования) автоматически добавляется блок с двумя структурными заполнителями и символом принадлежности множеству. В левом структурном заполнителе указывается индексная переменная, а вместо правого струк-турного заполнителя вводится интервал или множество значений, которые она пробегает.
Пример 6.10. Сумма квадратов
На рис. 6.17 приведен фрагмент документа с кодом процедуры для вычисления суммы квадратов натуральных чисел. Верхняя граница суммы указывается аргументом процедуры.


Рис. 6.17. Процедура вычисления суммы квадратов натуральных чисел
В начале процедуры с нулевым значением инициализируется локальная переменная s. Далее индексная переменная пробегает значения от i до N (аргумент функции, определяющий верхнюю границу суммы) и квадрат значения индексной переменной прибавляется к значению локальной переменной s. После выполнения всех итераций значение локальной переменной возвращается как результат выполнения процедуры (которую, кстати, можно рассматривать и как функцию).
Нередко встречается инструкция continue, которая служит указанием для выхода из цикла. Точнее, после этой инструкции с помощью ключевого слова if указывают условие, при котором выполнение цикла прекращается.
Пример 6.11. Сумма квадратов с ограничением

Рис. 6.18. Измененная процедура с примерами вызова
В качестве примера разместим в рассматривавшемся ранее операторе цикла команду continue if i > 10 (рис. 6.18).

В этом случае сумма будет увеличиваться до тех пор, пока индексная переменная не превысит значение 10. Другими словами, процедурой будет вычисляться сумма квадратов натуральных чисел с верхней границей, равной минимальному из чисел 10 и аргумента функции. В последнем несложно убедиться по результатам вычисления суммы для разных передаваемых процедуре аргументов. Если аргумент превышает 10, результат не меняется.
Операторы цикла в Mathcad организуются также с помощью инструкции while. Цикл продолжается до тех пор, пока выполняется условие, указанное после этого ключевого слова. Главная особенность состоит в том, что теперь пользователю самостоятельно приходится определять процедуру изменения индексной переменной или задавать иной способ взаимосвязи между проверяемым условием и процессом выполнения итераций.
Пример 6.12. Еще один оператор цикла
Процедуру вычисления суммы квадратов натуральных чисел на основе инструкции while можно было бы определить так, как показано во фрагменте программного кода на рис. 6.19.

Рис. 6.19. Использование в теле процедуры инструкции while
Теперь приходится в явном виде инициализировать не только переменную для записи значения суммы, но и индексную переменную. Проверяемым условием является неравенство: индексная переменная не должна превышать верхнюю границу, т. е. аргумент процедуры. Выполняемых операций в пре-

делах каждой отдельной итерации также две: сначала на единицу изменяется значение индексной переменной, а затем квадрат этого значения прибавляется к переменной, определяющей сумму квадратов натуральных чисел. Хотя такой код, по сравнению с первоначальным, выглядит более громоздким, реализация оператора цикла посредством инструкции while часто бывает предпочтительней, поскольку позволяет создавать более гибкий алгоритм.
Пример 6.13. Использование инструкции break
Как и ранее, при работе с инструкцией while можно пропускать некоторые итерации или вообще преждевременно завершать выполнение программного кода. Пример приведен в документе на рис. 6.20.

Рис. 6.20. Использование инструкции break
После команды увеличения индексной переменной добавлена инструкция break и условный оператор. В условном операторе проверяется, превышает ли индексная переменная значение 10. Если это так, то выполнение процедуры прекращается. Здесь легко прослеживается главное отличие в работе инструкций continue и break — если в первом случае пропускается соответствующая итерация, то во втором — завершается работа.

Рекурсия
Под рекурсией в общем случае подразумевают ситуацию, когда в теле описания процедуры (или функции) вызывается эта же процедура (или функция), но уже с другим аргументом. Иными словами, если функция или процедура ссылается на саму себя, имеет место рекурсия. Часто рекурсия бывает следствием ошибки, допущенной пользователем. Но если рекурсию реализовать с умом, то можно создавать эффективные, компактные и достаточно элегантные программные коды.
Пример 6.16. Двойной факториал
Как иллюстрацию к использованию рекурсии рассмотрим процедуру вычисления двойного факториала — произведения чисел "через один", т. е. для четной границы это произведение всех четных чисел, начиная с 2, а для нечетной границы — нечетных, начиная с 1. Фрагмент программного кода такой процедуры приведен на рис. 6.21.

Рис. 6.21. Рекурсия при вычислении двойного факториала
Как видим, код состоит всего из одного условного оператора. Проверяемым является условие, что аргумент больше 2. Если это условие выполнено, вычисляется произведение аргумента на значение, возвращаемое процедурой для аргумента, уменьшенного на 2. При невыполнении условия в качестве значения возвращается аргумент. Таким образом, процедура будет по рекурсии вызывать (с уменьшением аргумента с шагом 2) сама себя до тех пор, пока аргументом не станет число, не большее 2 — т. е. 2 или 1. Наличие при каждом рекурсивном вызове процедуры множителя обеспечивает корректное вычисление двойного факториала. Подтверждением тому служат примеры, приведенные внизу под блоком описания процедуры.
Рекурсия позволяет существенно сократить программный код. При этом вопрос о том, упрощается ли алгоритм выполнения программы, остается открытым. Чего однозначно нельзя отрицать, — так это простоты решения целого ряда задач с помощью рекурсивного описания процедур.

Пример 6.15. Вычисление суммы через рекурсию
В качестве примера можно привести задачи о вычислении сумм и произведений. На рис. 6.22 представлен пример документа с кодом процедуры для вы числения суммы

Аргумент процедуры — верхняя граница индексной

переменной.
Рис. 6.22. Вычисление суммы с помощью рекурсии
Как и при вычислении двойного факториала, в данном случае программа состоит всего из одного условного оператора. При условии отличного от нуля аргумента вычисляется сумма значения, возвращаемого процедурой для уменьшенного на единицу аргумента, и слагаемого с показателем степени, совпадающем с аргументом процедуры. При нулевом значении аргумента в качестве результата возвращается единица. Код, таким образом, достаточно простой и элегантный, однако увлекаться рекурсией без крайней необходимости все же не стоит. Пояснение к этому можно найти ниже, под описанием процедуры, где приведены примеры ее вызова. Дело в том, что она работает только с относительно небольшими аргументами. Если же аргумент велик, вместо ожидаемого результата (близкого к значению 2) появляется сообщение об ошибке. Причем стандартная встроенная процедура для вычисления суммы дает вполне корректное значение (см. рис. 6.22). Причина в том, что рекурсия подразумевает существенную загрузку системных ресурсов. Именно это имелось в виду, когда утверждалось, что простота кода не всегда означает эффективность алгоритма.



Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП