Программирование циклических алгоритмов
Циклическим алгоритмом (или просто циклом) называется алгоритм, содержащий вычисления, повторяющиеся при различных значениях некоторой переменной, названной параметром цикла, а сами повторяющиеся вычисления составляют тело цикла.
Типы циклов.По способам организации цикла можно выделить:
а) цикл типа арифметической прогрессии;
б) итерационный цикл.
Особенностью цикла типа арифметической прогрессии является изменение параметра цикла по закону арифметической прогрессии, и поэтому можно, не выполняя цикла, определить количество повторений цикла.
Пример 3.3.1. Сформировать вектор z из n элементов, определяемых соотношением:
, i = 1, …, n; n = 10.
В этом примере i – параметр цикла, а тело цикла (вычисление элементов ) будет повторено n = 10 раз, т.е. алгоритм является циклом типа арифметической прогрессии. ¨
В итерационном цикле невозможно «априори», т.е. не выполняя вычислений, определить число повторений тела цикла из-за разнообразных условий завершения цикла.
Пример 3.3.2. Вычислить приближенное значение , используя итерационную процедуру:
(3.3.1)
В качестве приближенного значения принимается , удовлетворяющее условию:
, (3.3.2)
где – заданная точность вычисления корня квадратного. Даже задав конкретные значения (например, а = 9, ), невозможно априори определить количество повторений цикла. ♦
Программирование цикла типа арифметической прогрессии.Параметр такого цикла задается дискретной переменной (называемой также ранжированной переменной), и тогда конструкции, входящие в тело цикла, располагаются начиная от этого описания и до конца документа MathCAD или до конструкции, переопределяющей дискретную переменную – параметр цикла.
Фрагмент документа, в котором реализован алгоритм решения задачи примера 3.3.1 приведен на рис. 3.3.1.
Рис. 3.3.1. Формирование вектора z примера 3.3.1
На рис. 3.3.2 приведен фрагмент документа, формирующий матрицу (двумерный массив) по следующему правилу:
. (3.3.3)
Очевидно, что этот цикл имеет уже два параметра: i – параметр, определяющий номер строки; j – параметр, определяющий номер столбца матрицы. Напомним, что такой цикл называется двойным циклом.
Рис. 3.3.2. Формирование матрицы В по алгоритму (3.3.3)
Заметим, что в приведенных на рис. 3.3.1 и 3.3.2 фрагментах системная переменная ORIGIN=1.
Программирование итерационных циклов.Для этого используется функция until, записываемая в виде:
until (<выр. 1>,<выр. 2>).
Эта функция принимает значение равное выр. 2 , если выр. 1 больше или равно 0. Как только выр. 1 принимает отрицательное значение, функция until принимает значение0, и дальнейшее выполнение функции прекращается. Это свойство позволяет применять функцию until для программирования итерационных циклов.
На рис. 3.3.3 приведен фрагмент документа, реализующий алгоритм примера 3.3.2. ♦
Замечание 3.3.1. В русифицированной версии MathCAD2001i обращение к этой функции вызывает ошибку и рекомендуется для программирования итерационных циклов использовать подпрограмму-функцию с оператором while.
Рис. 3.3.3. Приближенное вычисление корня квадратного
с помощью функции until
Последний, 7-й элемент массива x (значение индекса равно 6) равен нулю из-за того, что выражение стало меньше нуля, а значение функции until – 0. Поэтому в качестве приближенного значения корня необходимо принять предыдущий элемент, номер и значение которого определяются в следующем фрагменте:
Следует отметить, что такой способ программирования не эффективен при большом числе итераций из-за необходимости хранить в памяти все предыдущие значения xn. На самом деле необходимо хранить в памяти только два приближения: xn («старое») и x n+1 («новое»).
В заключение этого параграфа заметим, что рассмотренные способы безмодульного программирования можно рекомендовать для реализации достаточно простых алгоритмов. Более сложные алгоритмы целесообразно реализовать в виде подпрограммы-функции, которая содержит конструкции, подобные конструкциям таких алгоритмических языков, как FORTRAN или Pascal: оператор присваивания, условные операторы, операторы цикла и т.д. В следующих темах будут рассмотрены конструкции пакета MathCAD, позволяющие реализовывать различные алгоритмы в подпрограмме-функции.