Программирование циклических вычислительных процессов
Программирование циклических вычислительных процессов с использованием операторов, реализующих базовые структуры цикла
Страницы работы
Содержание работы
ПРОГРАМИРОВАНИЕ В СРЕДЕ TURBOPASCAL 7.0
Лабораторная работа № 4
Тема – программирование циклических вычислительных процессов с использованием операторов, реализующих базовые структуры цикла.
Цель работы – освоить на практике программирование простейших циклических процессов, используя для этого операторы цикла, научиться отладке программ и подготовке с этой цель тестов.
Выполнил студент группы ТО-07
Магомедов Гаджи Сиражудинович
Проверил доц. каф. ИКТ Журов Г.Н..
Дата: 16.04.08
Задача 1. Составить программу для табулирования функций
и
при x=1,5; 1,51; 1,52; 1,53; 1,54; 1,55; 1,56; 1,57; 1,58; 1,59; 1,6.
при заданном значении х и y. Напечатать значения х и у.
Указание. Программу составить двумя способами:
а) с помощью условного оператора;
б) с помощью оператора безусловного перехода.
Обозначим: а – начальное значение х;
b – конечное значение х; h – шаг изменения х;
Тогда: a=1,5; b=1,6; h=0,01.
2. Тесты для проверки программы:
a=1,5; b=1,5; y=2.04727; z=-2.24084.
a= 1.50 b= 1.60 h= 0.010
1.5 2.04727 -2.24084
1.5 2.03256 -2.21810
1.5 2.01700 -2.19467
1.5 2.00057 -2.17054
1.5 1.98325 -2.14571
1.6 1.96504 -2.12016
1.6 1.94591 -2.09388
1.6 1.92585 -2.06686
1.6 1.90486 -2.03908
1.6 1.88291 -2.01054
1.6 1.86000 -1.98121
Задача 2. Элементы последовательности вычисляются рекуррентно по формуле . Составить программу для вычисления и печати числа элементов последовательности, удовлетворяющих неравенству
, если
; а значения
изменяются от 1 до 10.
Пусть n – число вычисляемых элементов последовательности, к – число элементов, удовлетворяющих условию .
Тогда ,
к=0 – начальное значение к.
Исходные данные:, , n=10.
Циклические вычислительные процессы
Цикл – это многократное повторение определённой последовательности действий.
В алгоритмическую структуру «цикл» входят операторы, выполняемые многократно. Такая последовательность команд образует тело цикла.
Циклические алгоритмические структуры бывают двух типов:
1) циклы с параметром, в которых тело цикла выполняется определенное (заранее известное) количество раз;
2) циклы с условием, в которых тело цикла выполняется, пока условие истинно или ложно.
Цикл с параметром
Цикл с параметром используется, когда заранее известно, какое число повторений тела цикла необходимо выполнить (рисунок 6).
Рисунок 6 – Цикл с параметром
В начале выполнения цикла значение переменной i устанавливается равным in.
При каждом проходе цикла переменная i увеличивается на величину шага.
Когда она достигает величины, большей Ik, то цикл завершается, и выполняются следующие за ним операторы.
В Паскале цикл с заданным числом повторений реализуется с помощью оператора FOR.
Общий вид оператора FOR
FOR i:= In TO Ik do ;
FOR i:= In TO Ik do
где FOR (для),TO (до), do (выполнить) – служебные слова, i – управляющая переменная цикла (параметр цикла), которая должна быть перечисляемого типа (целая, символьная и т.д.)
Чаще всего параметр цикла используют как переменную целочисленного типа, шаг ее равен +1 (или — 1).
Параметр цикла не может быть вещественного типа;
In, Ik – выражения, тип которых соответствует типу управляющей переменной i,
In – начальное значение управляющей переменной цикла,
Ik – конечное значение управляющей переменной цикла,
тело цикла – простой или составной оператор Турбо Паскаля.
Работа оператора FOR
1. Параметру цикла присваивается начальное значение;
2. Начальное значение сравнивается с конечным значением, и, если оно не больше конечного значения, выполняется тело цикла;
3. Параметр цикла изменяет свое значение – увеличивается на шаг (единицу, если параметр цикла имеет целый тип);
4. Циклическая часть выполняется повторно для каждого значения параметра цикла от его начального значения In до конечного значения Ik включительно;
5. Когда параметр цикла превысит конечное значение, оператор FOR прекращает работу и передает управление следующему оператору.
Параметр цикла i не должен переопределяться внутри циклической части.
Если шаг изменения параметра цикла равен +1, а In>Ik, то циклическая часть не выполнится ни разу.
Пример 3.Пусть имеется фрагмент программы с переменными целого типа:
FOR I:= 1 to 5 do
Циклическая часть программы выполняется повторно пять раз, при этом параметр цикла I изменяет свое значение от 1 до 5. В результате выполнения программы переменные получают следующие значения:
При программировании может быть использована другая форма оператора цикла, в которой происходит уменьшение значения управляющей переменной:
FOR i:=In downto Ik do
FOR i:=In downto Ik do
Пример 4.Пусть имеется фрагмент программы с переменными целого типа:
FOR I:=5 downto 1 do
В процессе выполнения данного фрагмента программы переменные принимают следующие значения:
Пример 5.Напечатать все буквы латинского алфавита в обратном порядке. Алгоритм решения в виде блок-схемы представлен на рисунке 7.
Рисунок 7 – Алгоритм решения задачи
Программа на языке Паскаль выглядит следующим образом:
FOR i:=’Z’ downto ‘A’ do
ВАРИАНТЫ ЗАДАЧ
1 Дано натуральное число N. Вычислить:
2 Дано натуральное число N. Вычислить:
3 Дано натуральное число N. Вычислить произведение первых N сомножителей
4 Дано натуральное число N. Вычислить:
5 Дано натуральное число n. Вычислить:
6 Дано натуральное число n. Вычислить: где n>2.
7 Дано натуральное число n. Вычислить: (n>1).
8 Дано натуральное число n. Вычислить:
9 Вычислить:
10 Дано натуральное число n. Вычислить:
Циклы с условием
В Паскале циклы с неизвестным заранее числом повторений (итерационные циклы) организованы с помощью операторов While и repeat.
Эти операторы, в отличие от оператора FOR, имеют более широкую область применения.
Циклы с предусловием
Цикл с предусловием реализуется в Паскале посредством оператора While. Заголовок оператора While (в переводе «пока») не содержит явных указаний на количество итераций – он содержит логическое выражение, значение которого автоматически вычисляется перед началом выполнения каждой очередной итерации (рисунок 8). Пока логическое выражение «истинно», итерации цикла будут продолжаться; как только после завершения очередной итерации логическое выражение станет «ложным», следующая итерация цикла выполнена не будет, и управление получит оператор программы, следующий после оператора While.
Очевидно, что если в заголовок цикла поместить тождественно ложное логическое выражение, этот цикл не выполнит ни одной своей итерации, а если это выражение тождественно истинно, цикл будет бесконечным (последнюю ситуацию называют зацикливанием программы). Для того, чтобы избежать подобных ситуаций, в число операндов логического выражения должны быть включены одна или более переменных, изменяющих свои значения в теле цикла таким образом, чтобы цикл был конечным.
Рисунок 8 – Цикл с предусловием
Паскаль работает с оператором WHILE следующей структуры:
Программирование циклических вычислительных процессов
называется конечной суммой
Для некоторых последовательностей известны формулы расчета конечных сумм, например: при an = an-1 + d; Sn = (a1 + an)*n/2; — арифметическая прогрессия, при an = an-1 * q; Sn= (a1 — an*q)/(1-q); — геометрическая прогрессия, где d и q — постоянные числа. Здесь N-ый член последовательности выражается через (N-1)-ый член. Такие зависимости называются реккурентными. Конечная сумма последовательности может быть неизвестна, тогда для ее расчета применяется алгоритм суммирования членов последовательности в цикле от 1 до N. Приведем пример расчета конечной суммы последовательности: 12 + 32 + 52 +. . . + (2*N-1)2; Sn = N*(4*N2-1)/3; В некоторых случаях «N»-ый член последовательности определяется через сумму предыдущих членов, например,
и конечную сумму можно рассчитать по формуле:
где «S» — начальная сумма. Рассмотрим программу вычисления конечной суммы денежного вклада в банк через N месяцев при ежемесячной процентной ставке «pr» (5% cоответствует pr=5). Часто применяются вложенные операторы цикла. Например, если необходимо провести все варианты расчета при изменении нескольких параметров в заданных диапазонах. Составим программу расчета функции y = A*sin(x) — cos(x)/A; при изменении аргумента «x» в диапазоне от 0 до Pi с шагом Pi/100 и при изменении параметра «A» в диапазоне от 1 до 3 с шагом 0.5.
Операторы цикла с условием
Схема выполнения операторов имеет вид:
называется бесконечным рядом и записывается в виде:
Здесь an — общий член ряда. Сумма конечного числа членов ряда называется частичной суммой и обозначается «Sn«. Если сумма членов бесконечного ряда имеет конечный предел «S», то ряд называется сходящимся. Для некоторых рядов получены формулы расчета суммы членов ряда. Например, сумма членов числового ряда:
1 + 1/32 + 1/52 + . . . + 1/(2*N-1) + .
имеет предел S = Pi 2 /8 и общий член an = images/(2*N-1) 2 , где N = 1, 2, 3, . Для сходящегося ряда вычисляется последовательность частичных сумм с заданной погрешностью. Абсолютная погрешность расчетов определяется по формуле Eps=abs(S-Sn), либо Eps=abs(an), если значение S неизвестно. Относительная погрешность расчетов определяется по формуле Eps_o=abs((S-Sn)/S), либо Eps_o=abs(an/Sn). Частичные суммы вычисляются по формуле: Sn = Sn-1 + an Для знакопеременного ряда следует добавить k1=-1, а в цикле: k1:=-k1, an=k1*an. В некоторых случаях «N»-ый член ряда выражается через «N-1»-ый, например, для ряда:
1 + 1/2! + 1/4! + 1/6! + . + 1/(2*N)! + . ; N = 0, 1, 2, .
общий член ряда вычисляется по формуле: an = an-1*k; Параметр k = an/an-1 — коэффициент роста вычисляется предварительно (до написания программы). Для данного ряда
Здесь N! = 1*2*3*. *N; — вычисление факториала числа «N», причем 0! = 1. Расчет частичных сумм производится в цикле с условием, например, для данного ряда операторами:
Операторы ограничения и прерывания цикла
Примеры
Пример1: На промежутке от 1 до M найти все числа Армстронга. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу.
Этапы решения задачи:
- Математическая модель: xО[1;M], x=
- Составим блок схему программы:
Распишем составные части блока»Находим все числа Армстронга на заданном промежутке и печатаем их»
Опишем блок «Подсчитываем сколько цифр в числе i» Опишем блок «Проверяем, является ли i числом Армстронга»
Дальнейшая детализация не требуется, запишем блок-схему целиком:
Дальнейшей детализации не требуется, переведем программу на язык Паскаль.
Контрольные вопросы
- Как записывается и как работает оператор FOR?
- Для организации каких циклов применим оператор FOR?
- В чем отличие оператора WHILE от оператора REPEAT?
- Как программируются циклические алгоритмы с явно заданным числом повторений цикла?
- Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?
- Напишите оператор цикла, который не выполняется ни разу.
- Напишите оператор цикла, который выполняется неограниченное число раз.
- Замените оператор «Repeat A Until B» равносильным фрагментом программы с оператором While.
Задачи
- Найти все двузначные числа, сумма цифр которых не меняется при умножении числа на 2,3,4,5,6,7,8,9.
- Найти все трехзначные числа, сумма цифр которых равна данному целому числу.
- Найти все трехзначные числа, средняя цифра которых равна сумме первой и третьей цифр.
- Найти все трехзначные числа, которые можно представить разностью между квадратом числа, образованного первыми двумя цифрами и квадратом третьей цифры.
- Найти все двузначные числа, сумма квадратов цифр которых делится на 17.
- Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр.
- Найти двузначное число, обладающее тем свойством, что куб суммы его цифр равен квадрату самого числа.
- Найти двузначное число, равное утроенному произведению его цифр.
- В каких двузначных числах удвоенная сумма цифр равна их произведению?
- Можно ли заданное натуральное число М представить в виде суммы квадратов двух натуральных чисел? Написать программу решения этой задачи.
Вычисление выражений:
Дано натуральное n. Вычислить: ;
;
Дано действительное число х, натуральное число n. Вычислить:


Дано натуральное n. Вычиcлить:


Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ):






Нужное приближение считается полученным, если вычислена сумма нескольких первых слагаемых, и очередное слагаемое оказалось по модулю меньше данного положительного числа e.
- Определить, является ли заданное число совершенным , т.е. равным сумме всех своих (положительных) делителей, кроме самого этого числа (например, число 6 совершенно: 6=1+2+3).
- Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314. в которой выписаны подряд все натуральные числа.
- Дано натуральное k. Напечатать k-ю цифру последовательности 149162536. в которой выписаны подряд квадраты всех натуральных чисел.
- Дано натуральное k. Напечатать k-ю цифру последовательности 1123581321. в которой выписаны подряд все числа Фибоначчи.
Циклические вычислительные процессы
Большинство задач, решаемых в инженерной практике, имеют циклическую структуру. Циклический вычислительный процесс – это процесс, в котором предусмотрено неоднократное выполнение одной и той же последовательности действий при различных значениях входящих в них величин.
Многократно повторяющиеся участки называют циклами. Циклическая структура позволяет существенно сократить объём алгоритма и программы. Переменная алгоритма, которая при каждом выполнении цикла принимает новое значение, называется параметром цикла.
Для организации цикла необходимо: задать начальное значение параметра цикла; задать изменение значения параметра перед каждым новым повторением цикла и проверку условий окончания повторений и переход к началу цикла, если повторения не окончены.
Существуют различные типы циклов. Тип определяется по способу контроля окончания. Для инженерных задач наиболее характерен тип арифметической прогрессии. В этих циклах параметр изменяется от заданного начального до заданного конечного значения, получая при каждом выполнении цикла постоянное приращение (цикл с известным числом итераций).
Если в цикле изменяется простая переменная, то параметром цикла является эта переменная. Для переменных с индексом (массивов) параметром цикла является индекс переменной.
В контрольном задании №3 представлены задачи циклической структуры типа арифметической прогрессии.
Рассмотрим наиболее типичные алгоритмы циклической структуры.
Пример 4. Задан массив по имени А, состоящий из 20 элементов, Ai , i=1. 20. Составить схему вычисления суммы и произведения элементов этого массива.
При вычислении суммы используется приём накопления – новое слагаемое прибавляется к сумме предыдущих. При выполнении при каждом цикле нужно накапливать сумму, прибавляя очередное слагаемое к этой сумме. Для этого необходимо перед циклом задать начальное значение суммы равное 0. В данном примере параметром цикла будет индекс i, который изменяется от 1 до 20 с шагом равным 1.
Тот же приём используется и при накоплении произведения. В алгоритмических языках Фортран и Бейсик, если переменная не определена, то ей присваивается значение 0, следовательно, произведение значений функции вычисляться не будет, поэтому перед циклом задаётся начальное значение произведения, равное 1. Внутри цикла вычисляется очередной сомножитель и умножается на произведение.
В соответствии со смыслом описываемых величин выбираем имя переменных: для суммы – S, произведения – P.
Схема вычисления будет состоять из следующих символов действий.
1. Начало.
2. Вводмассива Ai, i=1. 20.
3. Процесс. Переменным S и P задаются начальные значения S=0, P=1.
4. Начало цикла. Указывается параметры цикла: начальное и конечное значение параметра i и шаг цикла, равный 1.
5. Процесс. Происходит накопление суммы S и произведения P.
6. Конец цикла по параметру i. Цикл, т.е. вычисление S и P выполняется до тех пор, пока параметр i меньше или равен конечному значению. Как только параметр будет больше конечного значения, то цикл заканчивается и следующим будет выполняться печать результатов.
7. Документ, который выводит на печать вычисленные сумму S и произведение P.
Останов.
Схема вычисления представлена на рис. 4.
Рис. 4. Схема вычисления суммы и произведения элементов массива.
Пример 5.Задан массив по имени Х, состоящий из 10 элементов, Хj, j=1. 10. Составить схему вычисления произведения положительных элементов этого массива.
Для вычисления произведения используем приём накопления, который был подробно описан выше. Но в данном примере вычисляется произведение только положительных элементов, поэтому внутри цикла нужно выполнить проверку очередного элемента массиваХjна знак. Если элемент положителен, то он умножается на произведение, если нет – то он не рассматривается.
Параметром цикла будет индекс j, который изменяется от 1 до 10 с шагом равным 1. Переменную произведения обозначим через P.
Схема вычисления будет состоять из следующих символов действий.
1. Начало.
2. Вводмассива Хj, j=1. 10.
3. Процесс. Переменной P задаётся начальное значение равное 1.
4. Начало цикла. Указывается начальное и конечное значение параметра цикла j и шаг цикла.
5. Решение. Очередной элемент массива проверяется на знак. Хj >0?
6. Процесс, вычисляющий произведение P=P*Хj
7. Конец цикла по параметру j. Цикл выполняется до тех пор, пока параметр j меньше или равен конечному значению, иначе цикл будет закончен и следующим будет выполняться Документ.
8. Документ, выводящий на печать вычисленное произведение Р.
9. Останов.
Схема вычисления представлена на рис. 5.
Рис. 5. Схема вычисления произведения положительных элементов.
При вычислении произведения отрицательных элементов массива в схеме изменится только содержание п.5 Решение.
Пример 6. Задан массив Х, состоящий из 20 элементов, Хi, i=1. 20. Составить схему вычисления суммы и количества положительных элементов массива.
Приём вычисления суммы S описан в примере 4. тот же приём используется и при вычислении количества элементов. Обозначим через k – накопленное количество элементов. Такую переменную k называют счётчиком. Перед входом в цикл k нужно «почистить», т.е. присвоить 0. И при каждом цикле увеличивать счётчик на 1.
В данном примере вычисляется сумма и количество только положительных элементов, следовательно, внутри цикла нужно сделать проверку очередного элемента массива Хi на знак, как это было сделано в примере 5. Параметр цикла – индекс i, изменяющийся от 1 до 20 с шагом 1.
Схема вычисления будет состоять из следующих символов действий.
1. Начало.
2. Вводмассива Хi , i=1. 20.
3. Процесс. Переменным S и K задаются начальные значения S=0, K=0.
4. Начало цикла. Задаётся начальное и конечное значение параметра i и шаг цикла.
5. Решение. Проверяется положительность очередного элемента массива, т.е. Хi >= 0?
6. Процесс. Происходит процесс накопления суммы S и увеличения счетчика К на 1, т.е. S=S+Xi , К=К+1.
7. Конец цикла по параметру i. Цикл повторяется до тех пор, пока параметр i меньше или равен 20. Если i больше, то следующим выполняется Документ.
8. Документ. Печатаются значения S и К.
9.Останов
Схема вычисления представлена на рис.6
Пример 7.Для массива Х, описанного в примере 6, вычислить среднее арифметическое значение положительных элементов.
Схема вычисления будет совпадать с предыдущей до п.7. Конец цикла.
Среднее арифметическое значение элементов – это сумма этих элементов, деленная на их количество. Возможен такой набор данных, когда все элементы массива Xi имеют отрицательное значение, тогда переменная, в которой хранится значение количества положительных элементов массива, примет значение равное нулю. Возникает ситуация деления на нуль, а это системная ошибка, по которой программа завершается аварийно. Для устранения деления на нуль, проверяется количество этих элементов. И если количество равно нулю, то на печать выводится сообщение об этом.
Обозначим среднее арифметическое значение положительных элементов через переменную R. Схема вычисления, начиная с п.8 состоит из следующих действий.
8. Решение. Проверка числа элементов К=0? Если Да – печать с сообщением ‘K=0’, если Нет – переход на вычисление R.
9. Документ, в котором на печать выводится сообщение ‘Положительных элементов нет’, и переход к символу Останов.
Рис. 6. Схема вычисления суммы и количества положительных элементов массива.
10. Процесс. Вычисляется R=S:K.
11. Документ, в котором печатается значение R.
12. Останов.
Схема вычисления представлена на рис.7.
Если будет вычисляться среднее арифметическое всех элементов массива, то в схеме не будет проверки очередного элемента массива на знак, т.е. не будет п.5 Решение.
При вычислении среднего арифметического отрицательных элементов массива в п.5 Решение будет проверка условия Хi КВ, то выполняется п.14, если КА Ymax? Если значение Yj больше значения Ymax, то следующим будет выполнятся п. 6. Процесс. Если – нет, то переход на Конец цикла.
6. Процесс. Присвоим Ymax значение j –го элемента
7. Конец цикла по параметру j.
8. Документ. Печать Ymax.
9. Останов.
Схема вычислений представлена на рис. 9.
Рис. 8. Схема вычисления положительных элементов двух массивов и определение их числового соотношения.
Рис.9. Схема вычисления максимального элемента массива.
Если надо найти минимальный (наименьший) элемент массива, то для выбора минимального элемента используется формула
И алгоритм выбора аналогичен рассмотренному выше.
Как и в предыдущем примере в качестве начального значения Yminберётся значение первого элемента массива и цикл начинается со второго элемента массива.
Пример 10. для массива Y, заданного в примере 9, найти минимальный элемент Ymin и его порядковый номер.
Особенностью данного примера является то, что нужно найти не только минимальный элемент, но и его порядковый номер. Для этого каждый раз, когда в цикле будет выполняться условие Yj
Программирование циклических процессов
Дата добавления: 2015-06-12 ; просмотров: 2810 ; Нарушение авторских прав
В программировании часто встречаются задачи, требующие многократного выполнения одной и той же группы операторов программы с разными значениями их операндов. Такие процессы называются циклическими или просто циклами. Группа циклически повторяющихся операторов образует так называемое тело цикла, которое может быть представлено как простым, так и составным выражением. Однократное выполнение тела цикла будем называть итерацией.
Телу цикла в программе всегда предшествует заголовок цикла, содержащий обозначение оператора цикла и выражение, определяющее (прямо или косвенно) количество итераций. Заметим, что тело цикла является операндом оператора цикла, следовательно, заголовок и тело цикла составляют неделимую структурную единицу программы. В дальнейшем, используя термин «оператор цикла«, будем иметь в виду и заголовок, и тело цикла.
Для организации циклов во всех системах программирования существуют специализированные операторы циклов, применение которых избавляет программиста от необходимости программировать циклы «вручную». MathCAD поддерживает два вида таких операторов – цикл с предопределением For(называемый также циклом со счетчиком) и цикл с предусловием While. Описание структуры этих операторов приведено в таблице 5.
5.4.1 Оператор For
Этот оператор следует использовать в тех случаях, когда количество итераций предопределено, то есть известно заранее.
Заголовок цикла этого оператора (правый операнд) содержит переменную, называемую параметром (или счетчиком) цикла, и список значений этого параметра. Число элементов списка определяет и количество итераций – при выполнении каждой итерации параметр цикла получает очередное значение из списка, заданного в заголовке.
Параметр цикла имеет статус внутренней переменной программы и обладает всеми ее свойствами (описанными в параграфе 5.1.4). Как правило, параметр цикла используется в правой части выражений, входящих в состав тела цикла, хотя формально и не запрещено использование его в левой части выражений (то есть слева от оператора локального определения «f»). При этом следует помнить, что если параметр был изменен в теле цикла, его измененное значение будет действовать лишь до конца текущей итерации, так как перед началом следующей итерации параметр все равно получит очередное значение из списка, указанного в заголовке цикла.
Формально допускается вообще не использовать параметр цикла в выражениях тела цикла – в этом случае список значений параметра не играет никакой роли — существенна лишь длина этого списка, определяющая число (возможно бессмысленных) итераций.
По завершению последней итерации будет выполняться оператор программы, следующий после оператора цикла. При этом переменная, использованная в качестве параметра завершенного цикла, сохраняет значение, которое она имела в последней реально выполненной итерации[*]. Заметим, что это значение не всегда совпадает с последним значением из списка, заданного в заголовке цикла, так как возможен «досрочный» выход из цикла при срабатывании оператора Break, включенного в тело цикла.
Список значений параметра цикла записывается в заголовке цикла после символа «Î«, обозначающего принадлежность множеству (этот символ не требуется вводить «вручную» – он будет автоматически отображен при вводе оператора For). MathCAD допускает использование трех форм записи этого списка: прямое перечисление – элементы списка явно указываются через запятую, параметр получает значения из списка в порядке их следования; в стиле ранжированной переменной – элементы списка образуют соответствующий арифметический ряд; массив – элементы списка последовательно получают значения элементов массива в порядке следования их индексов (сначала – столбцы слева направо, затем – строки сверху вниз).
Три программы, приведенные на рисунке 21, иллюстрируют различные варианты использования оператора For.
Программа Fact(n) вычисляет факториал числа n. Оператор цикла в этой программе входит в состав составного выражения, которое, в свою очередь, является операндом условного оператора Otherwise. Параметр цикла k получает значения из целочисленного арифметического ряда.
Программа Ch(V,N,p) обрабатывает входной вектор V, заменяя в нем на значение p те элементы, индексы которых заданы элементами второго входного вектора N. В этом примере список значений параметра цикла i задан множеством элементов вектора N. Заметим, что обе эти программы осуществляют входной контроль данных и блокируют выполнение основного алгоритма в случае, если фактические аргументы программы заданы некорректно.
Программа L(M,z), приведенная в примере в), сопровождается подробными комментариями и не требует пояснений. Эта программа иллюстрирует возможность использования нескольких операторов цикла, один из которых включен в число операторов тела другого. Использование вложенных циклов — типичный прием, используемый для обработки многомерных массивов.
Этот пример может быть рекомендован в качестве образца оформления результатов выполнения последующих лабораторных работ и контрольных заданий.
Рисунок 21 – Примеры программирования циклов For
Рисунок 22 иллюстрирует использование операторов Break и Continue в теле цикла. Как правило, эти операторы сами являются операндами условных операторов If или Otherwise.
Оператор Break («прервать») прерывает выполнение цикла и передает управление оператору, следующему после прерванного оператора цикла. Заметим, что если оператором Break прерван вложенный цикл, выполнение внешнего цикла будет продолжено.
Оператор Continue («продолжить») действует иначе – он прерывает только текущую итерацию цикла и передает управление заголовку этого цикла, после чего выполнение цикла продолжается со следующей итерации (если, конечно, прерванная итерация не была последней).
Оператор Break допускается использовать и вне тела цикла. В этом случае прерывается выполнение всей подпрограммы, и возвращается результат вычисления последнего фактически выполненного ее выражения.
Рисунок 22 – Примеры использования операторов Break и Continue
Функция SumN(V) суммирует только те элементы вектора, которые содержат скалярные данные числового типа, а остальные элементы пропускаются. Функция Inverse(V) формирует вектор, элементы которого – значения, обратные значениям соответствующих элементов исходного вектора. При этом, если очередной элемент содержит число «0» или не является скаляром числового типа, цикл прерывается. Заметим, что оператор Break в последнем примере не прерывает работы программы, а передает управление оператору Return, следующему непосредственно после оператора For.
5.4.3 Оператор While
В отличие от оператора For, заголовок оператора While (в переводе — «пока«) не содержит явных указаний на количество итераций – он содержит логическое выражение, значение которого автоматически вычисляется перед началом выполнения каждой очередной итерации[†]. Пока это выражение «истинно», итерации цикла будут продолжаться; как только после завершения очередной итерации выражение станет «ложным», следующая итерация цикла выполнена не будет, и управление получит оператор программы, следующий после оператора While.
Очевидно, что если в заголовок цикла поместить тождественно ложное логическое выражение, этот цикл не выполнит ни одной своей итерации, а если это выражение тождественно истинно, цикл будет бесконечным (последнюю ситуацию называют зацикливанием программы). Для того, чтобы избежать подобных ситуаций, в число операндов логического выражения должны быть включены одна или более переменных, изменяющих свои значения в теле цикла таким образом, чтобы цикл был конечным (для предотвращения зацикливания могут использоваться и другие средства – например, принудительный выход из цикла оператором Break).
Примеры использования оператора While приведены на рисунке 23. Приведены три варианта решения одной и той же задачи: каждая из программ F0, F1 и F2 возвращает индекс первого из элементов исходного вектора V, превосходящего заданное значение z.
Первая программа (пример а) прибавляет единицу к счетчику k в теле цикла While до тех пор, пока очередной k-й элемент исходного вектора не превысит заданного значения z. После этого цикл завершается, и программа возвращает последнее измененное значение переменной k, которое и является решением задачи. Отметим, что в отличие от цикла For, счетчик k здесь необходимо обрабатывать отдельными операторами: инициализировать (то есть присваивать ему начальное значение) перед оператором цикла и изменять его значение в теле цикла.
Нетрудно заметить, что вариант а) программы имеет существенный недостаток: он не предотвращает зацикливания программы в случае, когда задача не имеет решения, то есть когда параметр z превышает значение самого большого элемента вектора V. В этом примере зацикливания в такой ситуации реально не произойдет – но это заслуга не нашей программы, а системы MathCAD, которая проконтролирует выход индекса вектора V за пределы допустимых значений и выдаст сообщение об ошибке.
Свободным от этого недостатка является вариант б) программы, в котором тело цикла содержит дополнительную проверку допустимости очередного значения индекса и принудительно прерывает цикл оператором Break в соответствующей ситуации с выдачей текстового сообщения.
Возможно, наиболее эффективным вариантом решения этой задачи является вариант в), который вообще не использует оператор While. В этой программе переменная k использована только для соблюдения «чистоты стиля» – чтобы исключить обработку параметра цикла i вне оператора For.
Рисунок 23 – Примеры программирования циклов While