Программирование циклических процессов. Циклические вычислительные процессы Что же такое цикл в программировании
«Программирование циклических вычислительных процессов»
Цель работы
Изучение операторов цикла в языке С++.
Теоретическая часть
Цикл - разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом.
Набор инструкций, предназначенный для многократного выполнения, называется телом цикла . Однократное выполнение тела цикла называется итерацией . Выражение определяющее, будет в очередной раз выполняться итерация, или цикл завершится, называется условием выхода или условием окончания цикла. Переменная, хранящая текущий номер итерации, называется счётчиком итераций цикла или просто счётчиком цикла. Цикл не обязательно содержит счётчик, счётчик может быть не один - условие выхода из цикла может зависеть от нескольких изменяемых в цикле переменных.
Исполнение любого цикла включает первоначальную инициализацию переменных цикла, проверку условия выхода, исполнение тела цикла и обновление переменной цикла на каждой итерации. Кроме того, большинство языков программирования предоставляют средства для досрочного управления циклом, например, операторы завершения цикла, то есть выхода из цикла независимо от истинности условия выхода (в языке Си - break) и операторы пропуска итерации (в языке Си - continue).
Различают следующие виды циклов.
1. Безусловные циклы. Циклы, выход из которых не предусмотрен логикой программы. Специальных синтаксических средств для создания бесконечных циклов, ввиду их нетипичности, языки программирования не предусматривают, поэтому такие циклы создаются с помощью конструкций, предназначенных для создания обычных (или условных ) циклов. Например, В языке С используется цикл for(;;) с незаполненными секциями.
2. Условные циклы. Это циклы, выполнение которых управляется некоторым условием, проверяемым в начале или конце тела цикла. Соответственно, условные циклы бывают с предусловием и с постусловием. Цикл с предусловием - цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно). В большинстве процедурных языков программирования реализуется оператором while , отсюда его второе название - while-цикл. На языке С++ такой цикл имеет вид:
while(<условие>)
<тело цикла>
Цикл с постусловием - цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что цикл всегда выполняется хотя бы один раз. В языке Паскаль этот цикл реализует оператор repeat..until , в Си - do…while , например:
<тело цикла>
while(<условие продолжения цикла>);
В разных языках в использовании условия цикла с постусловием есть некоторые различия. В Паскале и языках, произошедших от него, условие такого цикла трактуется как условие выхода - цикл завершается, когда условие истинно. В Си - как условие продолжения (цикл завершается, когда условие ложно, такие циклы иногда называют «цикл пока»).
Цикл с выходом из середины - наиболее общая форма условного цикла. Синтаксически такой цикл оформляется с помощью трёх конструкций: начала цикла, конца цикла и команды выхода из цикла. Конструкция начала определяет точку программы, в которой начинается тело цикла, конструкция конца - точку, где тело заканчивается. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся оператору, следующему за конструкцией конца цикла. Естественно, чтобы цикл выполнился более одного раза, команда выхода должна вызываться не безусловно, а только при выполнении условия выхода из цикла.
Основной особенностью цикла данного типа является то, что часть тела цикла, расположенная после начала цикла и до команды выхода, выполняется всегда (даже если условие выхода из цикла истинно при первой итерации), а часть тела цикла, находящаяся после команды выхода, не выполняется при последней итерации. С помощью цикла с выходом из середины можно легко смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце тела цикла).
Цикл со счётчиком - цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for , в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик.
В некоторых языках, например, Си и других, произошедших от него, цикл for , несмотря на синтаксическую форму цикла со счётчиком, в действительности является циклом с предусловием. То есть в Си конструкция цикла:
for (i = 0; i < 10; ++i)
Тело цикла
фактически представляет собой другую форму записи конструкции:
while (i < 10)
Тело цикла
То есть в конструкции for сначала пишется произвольное предложение инициализации цикла, затем - условие продолжения и, наконец, выполняемая после каждого тела цикла некоторая операция (это не обязательно должно быть изменение счётчика; это может быть правка указателя или какая-нибудь совершенно посторонняя операция). Для языков такого вида вышеописанная проблема решается очень просто: переменная-счётчик ведёт себя совершенно предсказуемо и по завершении цикла сохраняет своё последнее значение.
Организация циклов в языке Си++
1. Цикл for.
Цикл с использованием оператора for удобно использовать, когда требуемое число итераций заранее известно. Синтаксис данного оператора имеет вид:
for (действие до начала цикла;
условие продолжения цикла;
действия в конце каждой итерации цикла) {
инструкция цикла;
инструкция цикла 2;
инструкция цикла N;
Существует частный случай этой записи (со счетчиком):
for (счетчик = значение; счетчик < значение; шаг цикла)
тело цикла;
Сначала присваивается первоначальное значение счетчику, после чего ставится точка с запятой. Затем задается конечное значение счетчика цикла. После того, как значение счетчика достигнет указанного предела, цикл завершится. Затем задается шаг цикла - значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
Пример: подсчет суммы всех числе от 1 до 1000.
#include
using namespace std;
int i; // счетчик цикла
int sum = 0; // сумма чисел от 1 до 1000.
setlocale(0, "");
for (i = 1; i <= 1000; i++) // задаем начальное значение 1, конечное 1000 и задаем шаг цикла - 1.
cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
2. Цикл while.
Организацию циклов while или do...while удобно использовать, когда требуемое число итераций заранее неизвестно . Синтаксис цикла while в C++ выглядит следующим образом.
while (Условие) {
Тело цикла;
Данный цикл будет выполняться, пока условие, указанное в круглых скобках истинно. Пример реализации суммирования чисел от 1 до 1000 с помощью цикла while:
#include
using namespace std;
setlocale(0, "");
while (i < 1000)
cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
3. Цикл do while
Цикл do while отличается от while тем, что при его выполнении цикла один проход цикла будет выполнен независимо от условия. Программа для решения задачи на поиск суммы чисел от 1 до 1000 с применением цикла do while :
#include
using namespace std;
setlocale(0, "");
int i = 0; // инициализируем счетчик цикла.
int sum = 0; // инициализируем счетчик суммы.
do {// выполняем цикл.
} while (i < 1000); // пока выполняется условие.
cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
1. Разработать программу на языке С++ для решения задачи, соответствующей выбранному варианту.
2. Ввести, отладить и откомпилировать программу. Проверить правильность ее работы.
1. Блок-схема алгоритма программы.
2. Листинг программы с комментариями.
3. Результаты контрольных прогонов.
Контрольные вопросы
1. Дайте определение цикла, тела цикла, итерации.
2. Что такое условие выхода из цикла, счётчик итераций?
3. Какие этапы включает выполнение любого цикла?
4. Как работает цикл с постусловием?
5. Как работает цикл с предусловием?
6. Как работает цикл со счетчиком?
7. Как реализуется цикл с помощью оператора for?
8. Как реализуется цикл с помощью оператора while?
9. Как реализуется цикл с помощью оператора do while?
1. Вывести на экран следующую последовательность символов
2. Вводится последовательность целых чисел (0 – конец последовательности), найти разность между наименьшим среди положительных и наибольшим среди отрицательных чисел.
3. Вводится последовательность из N целых чисел, найти разность между произведением нечетных чисел и наибольшим среди отрицательных чисел.
4. Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы два числа, кратных 3, 5 и 7.
5. Вводится последовательность из N целых чисел. Определить наибольшее число среди кратных 11.
6. Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы три отрицательных четных числа.
7. Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20.
8. Вводится последовательность целых чисел, 0 – конец последовательности. Вычислить количество положительных чисел, кратных 7 и не кратных 5, и сумму отрицательных элементов последовательности.
9. Вводится последовательность из N вещественных чисел. Определить среднее арифметическое среди элементов последовательности, кратных 7.
10. Вводится последовательность чисел, 0 – конец последовательности. Определить является ли последовательность строго убывающей.
12. Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы два рядом стоящих положительных числа.
13. Вводится последовательность из N вещественных чисел. Определить, является ли последовательность знакочередующейся.
14. Вводится последовательность из N вещественных чисел. Определить разницу между минимальным положительным и максимальным отрицательным элементами последовательности.
15. Найти последние три числа кратные четырем в диапазоне от 1 до N. Вычислить сумму этих чисел.
16. Вывести на экран следующую последовательность символов
18. Вычислить произведение последних трех чисел не кратных 5 в диапазоне от N1 до N2.
19. Вычислить среднее арифметическое четных чисел, некратных четырем в диапазоне от 1 до K.
“Программирование циклических вычислительных процессов”
Цель работы: освоение методов составления алгоритмов циклических вычислительных процессов и организации циклических программ сложной структуры.
Теоретическая часть
4.1.1. Циклические алгоритмы.
Цикл – это последовательность действий, которая может выполняться более одного раза.
Циклический алгоритм – это алгоритм, содержащий один или несколько циклов.
Имеется 3 вида циклов:
Цикл с предусловием;
Цикл с постусловием;
Цикл со счетчиком (счетный цикл).
Если выполнение цикла связано с каким-либо логическим условием, то используются циклы с предусловием или с постусловием.
Циклы со счетчиком представляют такой класс, в котором выполнение тела цикла должно повторяться заранее определенное число раз.
Блок-схемы циклических алгоритмов выглядят следующим образом:
1. Цикл со счетчиком.
2. Цикл с предусловием. 3. Цикл с постусловием.
4.1.2 Операторы цикла в языке программирования C++.
В C++ для каждого вида цикла имеется соответствующий оператор:
Цикл типа while (с предусловием);
Цикл типа do…while (с постусловием);
Цикл типа for (счетный).
1.Оператор цикла типа while
Форма записи:
while (условие) оператор;
где: (условие) – логическое выражение;
оператор – выполняемый в цикле оператор или тело цикла.
Если тело цикла представляет собой составной оператор, то его нужно заключить в операторные скобки{...}:
while (условие)
группа операторов
Схема работы такого цикла: пока условие является истинным (true), выполняется тело цикла и снова проверяется условие и т.д. Когда условие станет ложным (false) цикл завершает работу.
2. Оператор цикла типа do…while
Форма записи:
оператор;
while (условие);
Схема работы такого цикла: сначала выполняется оператор, потом проверяется условие, если условие является истинным, выполняется оператор и снова проверяется условие и т.д. Когда условие станет ложным, цикл завершает работу.
Если тело цикла представляет собой составной оператор, то, как и для цикла с предусловием, его нужно заключить в операторные скобки{...}:
группа операторов
while (условие);
3. Оператор цикла типа for
Форма записи:
оператор;
A – начальное выражение, которое задает начальные значения параметру цикла и при необходимости начальные значения другим параметрам. Например:
i=0, x=0.5, p=1, s=0
B – условное выражение, которое проверяет условие продолжения работы цикла. Например:
C – выражение приращения, которое задает приращение параметру цикла и при необходимости другим параметров, тогда они записываются списком. Например: x+=0.1, i++
4.1.3 Пример составления алгоритма и программы на языке C++ для циклического вычислительного процесса.
Вычислить значение выражения:
b – исходная величина, ее значение вводятся с клавиатуры и не изменяется;
a – изменяется в диапазоне с шагом 1;
y – результат, его значения выводятся на экран.
Исходя из условия задания переменная a является целочисленной, поэтому может быть использована в качестве счетчика в счетном цикле.
Блок-схема алгоритма решения данной задачи с использованием счетного цикла выглядит следующим образом:
#include
#include
#include
printf(“Введите b: “);
scanf(“%f”,&b);
printf(“ a y\n”);
for (a=0;a<=10;a++)
printf(“%3d”,a);
printf(“%8.2f\n”,y);
y=(a-b)/sqrt(a);
printf(“%8.2f\n”,y);
Блок-схема алгоритма решения данной задачи с использованием цикла с предусловием выглядит следующим образом:
Текст программы на языке C++, соответствующей данному алгоритму, выглядит следующим образом:
#include
#include
#include
printf(“Введите b: “);
scanf(“%f”,&b);
printf(“ a y\n”);
printf(“%3d”,a);
printf(“%8.2f\n”,y);
y=(a-b)/sqrt(a);
printf(“%8.2f\n”,y);
else printf(“ y не существует\n”);
Блок-схема алгоритма решения данной задачи с использованием цикла с постусловием выглядит следующим образом:
Текст программы на языке C++, соответствующей данному алгоритму, выглядит следующим образом:
#include
#include
#include
printf(“Введите b: “);
scanf(“%f”,&b);
printf(“ a y\n”);
printf(“%3d”,a);
printf(“%8.2f\n”,y);
y=(a-b)/sqrt(a);
printf(“%8.2f\n”,y);
else printf(“ y не существует\n”);
while(a<=10);
Практическая часть
4.2.1 Требования к выполнению работы:
Выполнить задание из лабораторной работы № 3 для диапазона значений одной из переменных. Изменяемая переменная, диапазон ее изменения и шаг указаны в таблице 4. Составить блок-схемы алгоритмов и программы для двух типов циклов, указанных в индивидуальном задании (таблица 4).
Оформить вывод результатов таким образом, чтобы четко выделялись значения изменяемого параметра и при каждом его конкретном значении выводились значения результата (трех переменных из столбца 2 таблицы 3) в виде таблицы.
Порядок выполнения работы.
1. Выполнить анализ задания, сформулировать постановку задачи.
2. Составить блок-схемы алгоритмов.
3. Составить программу на языке C++. Предусмотреть ввод исходных данных с клавиатуры и вывод результатов на экран.
4. Выполнить проверку работоспособности программы на различных исходных данных.
5. Выполнить анализ полученных результатов.
Варианты индивидуальных заданий.
Варианты индивидуальных заданий выбираются из таблицы 4 в соответствии с номером студента в списке группы в журнале преподавателя.
Таблица 4. Варианты индивидуальных заданий
№ п/п | Изменяемая переменная | Типы циклов |
10 ≤ a ≤ 10, Δ a=1 | ||
-4 ≤ d ≤ 4 , Δ d = 0.5 | ||
-6 ≤ x ≤ 3 , Δ x = 0.5 | ||
0 ≤ b ≤ 3 0, Δ b = 1.5 | 1. С предусловием, 2. Счетный | |
-15 ≤ j ≤ 1 0, Δ j = 0.5 | 1. С предусловием, 2. С постусловием | |
5 ≤ e ≤ 35, Δ e = 2 | 1. Счетный, 2. С постусловием | |
-5 ≤ m ≤ 15, Δ m = 1 | 1. С предусловием, 2. Счетный | |
1 ≤ c ≤ 70, Δ c = 3 | 1. С предусловием, 2. С постусловием | |
1.5 ≤ c ≤ 15, Δ c = 0.5 | 1. Счетный, 2. С постусловием | |
-8 ≤ b ≤ 28, Δ b = 2 | 1. С предусловием, 2. Счетный | |
-4.5 ≤ x ≤ 11.5, Δ x = 0.5 | 1. С предусловием, 2. С постусловием | |
-7 ≤ k ≤ 2, Δ k = 0.3 | 1. Счетный, 2. С постусловием | |
-1 ≤ m ≤ 21, Δ m = 1 | 1. С предусловием, 2. Счетный | |
-2 ≤ e ≤ 34, Δ e = 2 | 1. С предусловием, 2. С постусловием | |
-11 ≤ c ≤ 23, Δ c = 2 | 1. Счетный, 2. С постусловием | |
-13 ≤ p ≤ 50, Δ p = 3 | 1. С предусловием, 2. Счетный | |
3.3 ≤ b ≤ 9.3, Δ b = 0.3 | 1. С предусловием, 2. С постусловием | |
3.5 ≤ y ≤ 12.3, Δ y = 0.4 | 1. Счетный, 2. С постусловием | |
-7.5 ≤ a ≤ 5.7, Δ a = 0.6 | 1. С предусловием, 2. Счетный | |
-1.5 ≤ h ≤ 1.2, Δ h = 0.1 | 1. С предусловием, 2. С постусловием | |
0 ≤ h ≤ 10, Δ h=0.5 | 1. Счетный, 2. С постусловием | |
-15 ≤ b ≤ 15 , Δ b =2 | 1. С предусловием, 2. Счетный | |
-7 ≤ l ≤ 3 , Δ l = 0.5 | 1. С предусловием, 2. С постусловием | |
-5.5 ≤ b ≤ 6.5 , Δ b = 0.5 | 1. Счетный, 2. С постусловием | |
1 ≤ k ≤ 9 , Δ k = 0.4 | 1. С предусловием, 2. Счетный | |
0 ≤ b ≤ 6.9, Δ b = 0.3 | 1. С предусловием, 2. С постусловием | |
-3 ≤ v ≤ 9, Δ v = 0.6 | 1. Счетный, 2. С постусловием | |
-2 ≤ p ≤ 2.6, Δ p = 0.2 | 1. С предусловием, 2. Счетный |
4.3 Контрольные вопросы и практические задания:
1. Как работает оператор while?
2. Как работает оператор do ... while?
3. Как работает оператор for?
4. Подчеркнуть в программе операторы, образующие цикл.
5. В чем заключается отличие операторов while и do ... while?
6. Заменить в программе один оператор цикла другим.
Задание №2
Программирование ветвящихся вычислительных процессов
Цель работы
Получить навыки программирования ветвящихся вычислительных процессов. Изучить условные операторы, переменные логического типа, логические отношения и операции.
Пусть на плоскости x, y задана область D. Требуется определить «попадает» ли точка с координатами (x, y) в область D или нет. Если попадает, то необходимо вычислить функцию и переменной M, значение которой является признаком «попадания» или «непопадания», присвоить значение M=1. В противном случае вычислить и положить M=2.
Ход работы
Алгоритм решения поставленной задачи:
1. Выписать область D и выписать функции и
2. Записать уравнения, определяющие границы области
3. Подготовить 7 точек, чтобы часть точек находилась внутри D, а часть- вне ее.
4. Написать программу для выполнения поставленной задачи.
5. Для выбранных точек получить и записать результаты счета.
f 1= tg(x)/e y f 2 =
(x>0 и y>0 и X**2+Y**2<=9) или (x<0 и y>0 и y<=x+4) или (x<0 и y<0 и x>(-4) и y>(-2))
то точка принадлежит области D
1)(1;1)
2)(3;3)
3)(-1;2)
4)(-5;2)
5)(-2;-1)
6)(-5;-3)
Fortran | MathCAD | ||||||
x | y | z | m | c | z | m | c |
0.1573E+01 | T | 1.573 | |||||
0.0751E+01 | F | 0.751 | |||||
-1 | -0.1211E+01 | T | -1.211 | ||||
-5 | 0.083E+01 | F | 0.83 | ||||
-2 | -1 | 0. 394E+01 | T | 3.94 | |||
-5 | -3 | 0.0282E+01 | F | 0.282 | |||
-3 | 0. 0271E+01 | F | 0.271 |
PRINT *,"X=?,Y=?";READ *,X,Y
C=(x>0..and. y>0..and.X**2+Y**2<=9).or.(x<0..and.y>0..and.y<=x+4).or.(x<0..and.y<0..and.x>(-4).and.y>(-2))
PRINT 2,X,Y,Z,C,M
2 FORMAT ("X=",F7.3,3X,"Y=",F7.3,3X,"Z=",E11.4,3X,"C=",L2,3X,"M=",I2/)
END PROGRAM LAB2
FUNCTION F1(X,Y)
F1=tan(x)/exp(x)**y
FUNCTION F2(X,Y)
F2= (sqrt(sin(2*x+3*y)**2)**1./3.)
print*,"a,b,c=?";read "(2F7.3)",a,b,c
q=a>b.and.a a w=b>a.and.b b e=c>a.and.c c 28.,558.,345. 345.0000 Задание №3
Программирование циклических вычислительных процессов
Цель работы Получить навыки программирования циклических вычислительных процессов. Изучить циклы с шагом и циклы с условием. 1. Записать расчетные формулы для вычисления слагаемого и конечной суммы 2. Составить алгоритм вычисления с заданной точностью суммы конечного числа членов ряда в указанном диапазоне изменения параметра x с заданным шагом. Для получения шага диапазон изменения x разделить на 10. 3. Составить программу решения задачи. В программе для каждого значения x предусмотреть вычисление как приближенной, так и точной суммы соответствующего ряда y по приведенной в таблице формуле. точное значения суммы ряда, а также количество просуммированных членов. Ход работы 1. Задать x0-начало цикла и xл-конец цикла 2. Задаем шаг h по формуле 4. Составить программу решения задач рекуррентным способом 5. Построить таблицу полученных данных Формула ряда: Формула точного вычисления суммы: π/4 1. x0= π/10 xk=9 π/10 3. real:: a,b,c,eps,h,s,x,x0,xk,y,p b=(sin*(x)*(2*n)-1+sin*((2*n-1)*x))/4*n-2 if(abs(a) print 2,x,s,y,n; write(1,2)x,s,y,n end do 2 format("x=",f6.3,3x,"s=",e10.3,3x,"y=",e10.3,3x,"n=",i5) end program lab3 1. Способы построения циклических вычислительных процессов в программах.
2. В компьютер вводится
N
вещественных чисел. Составить программу, выдающую на экран среднее арифметическое значение этого набора.
Введение
Циклические программы используются практически в любом программном обеспечении. При этом циклы могут быть явными и неявными. В частности неявный цикл присутствует в обработчиках прерываний, которые фактически работают в бесконечном цикле, чье тело инициируется прерыванием. Циклическими являются и подпрограммы - оконные функции приложений Windows. Далее рассматриваются программы с циклом, тело которого содержит функциональные модули. Циклический процесс
- это вычислительный процесс, в котором многократно выполняются вычисления по одним и тем же формулам при различных значениях аргумента. Программы
, реализующие циклический процесс называются циклическими программами. В организации цикла можно выделить следующие этапы: подготовка (инициализация) цикла (И); выполнение вычислений цикла (тело цикла) (Т); модификация параметров (М); проверка условия окончания цикла (У). Порядок выполнения этих этапов, например, Т и М, может изменяться. В зависимости от расположения проверки условия окончания цикла различают циклы с нижним и верхним окончаниями. Для цикла с нижним окончанием тело цикла выполняется как минимум один раз, так как сначала производятся вычисления, а затем проверяется условие выхода из цикла. В случае цикла с верхним окончанием тело цикла может не выполниться ни разу в случае, если сразу соблюдается условие выхода. Цикл называется детерминированным, если число повторений тела цикла заранее известно или определено. Цикл называется итерационным, если число повторений тела цикла заранее неизвестно, а зависит от значений параметров (некоторых переменных), участвующих в вычислениях. Тело цикла
- это многократно повторяющийся участок программы. Параметр цикла
- это переменная, которая принимает новые значения при каждом повторении цикла (циклы бывают простые и сложные). Общий вид цикла n раз
В общем виде цикл n раз записывается так: нц число повторений раз Служебное слово нц (начало цикла) и кц (конец цикла) пишутся строго одно под другим и соединяются вертикальной чертой. Правее этой черты записывается повторяемая последовательность команд (тело цикла). Число повторений – произвольное целое число. При выполнении алгоритма последовательность команд в теле цикла повторяется указанное число раз. Правила алгоритмического языка допускают задание любого целого числа повторений. Оно может быть нулевым и даже отрицательным. Эти случаи не считаются ошибочными, просто тело цикла не будет выполнено ни разу, а компьютер сразу перейдет к выполнению команд, записанных после кц Общий вид цикла пока
В общем виде цикл пока записывается так: нц пока условие | тело цикла (последовательность команд) При выполнении цикла компьютер повторяет следующие действия: а) проверяет записанное после служебного слова пока условие; б) если условие не соблюдается, то выполнение цикла завершается и компьютер начинает выполнять команды, записанные после кц. Если же условие соблюдается, то компьютер выполняет тело цикла, снова проверяет условие и т.д. Общий вид цикла для
нц для i от i1 до i2 | тело цикла (последовательность команд) Здесь i – имя величины целого типа, i1, i2 – произвольные целые числа или выражения с целыми значениями. Тело цикла последовательно выполняется для i = i1, i = i1 + 1, i1 + 2, …i = i2. Правила алгоритмического языка допускают задание любых целых i1, i2. в частности, i2 может быть меньше i1. этот случай не считается ошибочным – просто тело цикла не будет выполнено ни разу, а компьютер сразу перейдет к выполнению команд, записанных после кц. Цикл n раз и цикл пока
Циклы n раз и пока оформляются в алгоритмическом языке почти одинаково. Это не удивительно, ведь обе эти команды задают цикл – повторяющуюся последовательность команд. Служебные слова нц и кц указывают, что исполняется цикл, а заголовок цикла задает конкретный механизм его выполнения. Однако у этих двух циклов есть одно существенное отличие. Начиная выполнять цикл n раз, компьютер знает, сколько раз придется повторить тело цикла. При исполнении цикла пока это не так: компьютер каждый раз проверяет условие цикла и не может заранее определить, когда выполнение закончится. Узнать количество повторений цикла пока можно только после того, как цикл завершен. Отсюда ясно, в каких случаях какой цикл следует использовать. Если к моменту начала цикла количество повторений известно, удобно воспользоваться циклом n раз. Если же количество повторений заранее определить нельзя, необходим цикл пока. Например, программа автоматического управления имеет структуру, изображенную на рис. 1. Модули, входящие в цикл
(а также модули обработки прерываний), с одним входом и одним выходом каждый, как правило, имеют характерную особенность: модули содержат статические переменные, которым присваивается значение в текущем цикле, а анализ этих переменных выполняется в следующем цикле. Таким образом, упомянутые переменные характеризуют состояние модуля на конец текущего или начало следующего цикла программы. В дальнейшем будем рассматривать только такие модули циклических программ и обозначать их кратко МЦП. Рис.1. Типовая структура управляющей программы с бесконечным циклом. МЦП имеют разнообразную структуру, сложность которой необходимо оценивать по специальным критериям. В.В.Липаевым предложен удобный и объективный критерий сложности программных модулей, а именно: число и суммарная длина путей в управляющем графе модуля . При этом учитываются только условные операторы и операторы выбора. Однако этого критерия явно недостаточно для МЦП со статической памятью, ибо при анализе МЦП необходимо помнить значения всех статических переменных, установленные в предшествующем цикле. Помимо этого, никаких рекомендаций по стандартизации алгоритмов и программ, кроме давно известного структурного программирования на общеупотребительных языках программирования типа Си и Паскаль - нет. В данной статье предлагается восполнить эти пробелы применительно к МЦП. 2. Фрагменты модулей циклических программ
Двухполюсным фрагментом, или просто фрагментом, будем считать участок программы с одним входом и одним выходом (включая операторы циклов) в предположении, что рассматриваемые МЦП структурированы. Простейший фрагмент включает единственный оператор. Последовательность фрагментов также является фрагментом. МЦП в свою очередь является фрагментом и состоит из последовательности фрагментов. В предложен метод независимых фрагментов для синтеза структуры модулей, реализующих таблицы решений. При этом независимым считается такой фрагмент, который можно вставить в любом месте последовательности фрагментов модуля. Независимость местоположения такого фрагмента обусловлена тем, что анализируемые в нем данные не формируются в указанной последовательности фрагментов, а формируемые в независимом фрагменте данные не анализируются в данной последовательности фрагментов. Поэтому независимые фрагменты могут выполняться параллельно (псевдопараллельно). На рис. 2 показаны возможные варианты реализации модуля с двумя независимыми фрагментами. В вариантах “а” и “б” фрагменты переставлены местами без искажения существа программы; в варианте “в” фрагменты реализуются параллельно. Рис.2. Варианты реализации модуля с независимыми фрагментами: а) и б) - последовательная реализация, в) - параллельная реализация: двойная горизонтальная линия обозначает распараллеливание программы, жирная горизонтальная черта обозначает завершение параллельных процессов. Фиксированным будем называть зависимый фрагмент, местоположение которого в модуле строго определено. Например, в модуле распознавания символа, введенного с клавиатуры, первым должен быть снизу зависимый фрагмент непосредственно ввода символа. Операторы “начало” и “конец” модуля есть фиксированные фрагменты. Абсолютно независимых фрагментов не существует хотя бы потому, что в любом модуле есть упомянутые фиксированные фрагменты начала и конца. Поэтому независимый фрагмент, в общем случае, имеет ограниченную двумя взаимно зависимыми фрагментами область возможного местоположения. То есть более строгое определение независимого фрагмента звучит следующим образом: независимым относительно двух фиксированных фрагментов будем называть такой фрагмент, который может быть размещен в любом месте последовательности фрагментов, ограниченной сверху и снизу указанными фиксированными фрагментами. В программировании часто встречаются задачи, требующие многократного выполнения одной и той же группы операторов программы с разными значениями их операндов. Такие процессы называются циклическими
или просто циклами.
Группа циклически повторяющихся операторов образует так называемое тело цикла
, которое может быть представлено как простым, так и составным выражением. Однократное выполнение тела цикла будем называть итерацией
. Телу цикла в программе всегда предшествует заголовок цикла
, содержащий обозначение оператора цикла
и выражение, определяющее (прямо или косвенно) количество итераций. Заметим, что тело цикла является операндом оператора цикла, следовательно, заголовок и тело цикла составляют неделимую структурную единицу программы. В дальнейшем, используя термин "оператор цикла
", будем иметь в виду и заголовок, и тело цикла. Для организации циклов во всех системах программирования существуют специализированные операторы циклов
, применение которых избавляет программиста от необходимости программировать циклы "вручную". 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
x
S(x)
y
0.314
0.324
0.785
0.565
0.622
0.785
0.817
0.979
0.785
1.068
1.404
0.785
1.319
1.43
0.785
1.57
-19.257
0.785
1.821
-533.961
0.785
2.072
-8.624E+3
0.785
2.324
-9.986E+4
0.785
2.575
-8.928E+5
0.785
2.826
-6.477E+6
0.785