Оператор пошагового цикла for
Предназначен для реализации в программе полного варианта цикла с параметром – формирование начального и последующих значений параметра цикла, проверка каждого из них на соответствие диапазону изменения с реализацией тела цикла, если условие выполняется, и выходу из цикла в случае его невыполнения.
Структура оператора
for([нач_выр]; [усл_выр]; [выр_прир])
{
тело
цикла
}
где for – ключевое слово (для);
нач_выр – выражение, задающее начальное значение параметра цикла;
усл_выр – выражение, определяющее проверку условия повторения цикла;
выр_прир – выражение, формирующее текущее значение параметра цикла через предыдущее;
; – разделители выражений;
() – ограничители выражений;
[ ] – признак необязательности содержимого;
тело цикла – совокупность операторов, выполнение которых требуется повторять;
{ } – ограничители тела цикла.
Оператор, при наличии всех составляющих, выполняется следующим образом:
· определяется начальное значение параметра цикла (нач_выр);
· проверяется его соответствие диапазону счета (усл_выр);
· если выражение усл_выр истинно (результат не равен нулю):
– выполняется тело цикла;
– формируется новое текущее значение параметра (выр_прир);
– повторяется его проверка в усл_выр;
· если усл_выр ложно (результат равен нулю):
– выполнение оператора цикла прекращается;
– управление передается следующему после тела цикла оператору (осуществляется завершение цикла).
Схема выполнения оператора
for(нач_выр; усл_выр; выр_прир)
ЛОЖЬ ИСТИНА
{
тело
цикла
}
Правила записи и выполнения
1. В качестве начального выражения (нач_выр) используются одно простое (последовательное) или несколько (разделенных запятыми) присваиваний, например xi = xn (a=b=c=1.) или xi = xn, y=0., z=2.5, a=b=c=1.
2. Если начальное выражение отсутствует, начальное значение параметра цикла будет определяться содержимым соответствующей переменной (xi). Например, сформированным до входа в цикл:
xi = xn; /* формирование начального значения */
for(; xi <= xk; xi = xi + dx)
{
...
yi = sin(xi);
...
}
3. В качестве усл_выр могут использоваться любые выражения Си. Арифметические, например (sin(b) + 0.5), (2*c - d / f), (a) или простые (составные) логические выражения, например (а!= b), (sin(x) < b), (x <= a && x >= b).
4. Если условное выражение отсутствует, его значение считается истинным – создается бесконечный цикл.
ü Внимание! Выход из такого цикла невозможен – требуется перезагрузка операционной системы.
Один из вариантов предотвращения подобной ситуации заключается в формировании в теле цикла отрицания условного выражения в виде оператора if со структурой, например if(усл_выр) break;
Реальное использование иллюстрируется фрагментами:
for(xi = xn;; xi = xi + dx)
{
...
if(!(xi <= xk))
break;
yi = sin(xi);
...
}
| for(xi = xn;; xi = xi + dx)
{
...
if(xi > xk)
break;
yi = sin(xi);
...
}
| 5. В качестве выражения приращения (выр_прир) используются одно или несколько (разделенных запятыми) присваиваний вида xi = j (xi - 1), например xi = xi + dx или xi = xi + dx, b=b+2.
6. Если выр_прир отсутствует, текущее значение параметра цикла будет определяться содержимым соответствующей переменной (xi). Если оно не меняется – создается бесконечный цикл.
ü Внимание! Выход из такого цикла невозможен – требуется перезагрузка операционной системы.
Один из вариантов предотвращения подобной ситуации – формирование закона изменения параметра в теле цикла, например:
for(xi = xn; xi <= xk;) /* заголовок цикла */
{
...
yi = sin(xi);
...
xi = xi + dx; /* закон изменения параметра*/
}
7. В принципе, нач_выр и выр_прир могут формироваться вне заголовка цикла. Первое – до него, второе – в теле цикла, например:
xi = xn; /* формирование начального значения параметра */
for(; xi <= xk;) /* заголовок цикла */
{
...
yi = sin(xi);
...
xi = xi + dx; /* закон изменения параметра*/
}
В этом случае оператор for выполняет функции оператора while.
8. Тело цикла оформляется одним оператором (составным или простым).
9. В теле цикла возможно использование специальных операторов break, goto, continue, обеспечивающих искусственный (принудительный) выход из цикла. Оператор break прекращает выполнение цикла и передает управление оператору, записанному непосредственно под телом цикла. Оператор goto m организует выход из цикла с передачей управления оператору, помеченному его меткой. Оператор continue прерывает выполнение тела цикла и возвращает управление заголовку цикла, например:
for(ai=an;
ai > b;
ai= ai + da)
{
...
if(c < ai)
break;
...
}
d = 15.;
| for(ai=an;
ai > b;
ai= ai + da)
{
...
if(c < ai)
goto k;
...
}
d = 15.;
...
k: d=12.;
| for(ai=an;
ai > b;
ai= ai + da)
{
...
if(c < ai)
continue;
...
}
d = 15.;
| Первый фрагмент предписывает искусственный выход из цикла при выполнении в теле цикла условия c < ai с передачей управления оператору d = 15. Второй – нарушает естественный порядок вычисления тела цикла при c < ai с передачей управления оператору d=12., помеченному меткой k. Третий прерывает выполнение тела цикла по тому же условию, но управление возвращается заголовку цикла.
10. В теле цикла возможно использование других (вложенных) операторов цикла.
Вывод: оператор for позволяет программировать арифметические циклы с параметром, например, представленные схемами рис. 5.6 (блоки 4, 5, 6, 7); рис. 5.7в (блоки 4, 5, 6). При этом задание начального значения параметра, его проверка на соответствие диапазону счета и изменение осуществляются в заголовке цикла (блок 4).
Рассмотренные операторы цикла позволяют реализовать составленные ранее схемы алгоритмов.
ü Внимание! Используемые в алгоритме переменные Зi и Зi-1 математически представляют текущие и предыдущее значения одной и той же переменной. Поэтому в программе они должны идентифицироваться как одна именованная ячейка (переменная).
Идентификация переменных с учётом сказанного имеет вид табл. 5.2.
Таблица 5.2
Обозначения в алгоритме
| Зн
| Зк
| DЗ
| пн
| Зi
| Зi-1
| Налi
| N
| Обозначения в программе
| zn
| zk
| dz
| pn
| zi
| zi
| nali
| n
| Составим возможные варианты программ решения задачи с каждым из рассмотренных операторов цикла.
Программа по алгоритму цикла с предусловием
Анализ алгоритмов, выполненных в виде цикла с предусловием (рис. 5.4, 5.7а) и структур операторов цикла, позволяет сделать вывод, что программирование возможно только с while. Вариант программы имеет вид:
/* Программа с использованием цикла с предусловием */
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali; /* описание вещественных переменных */
int n; /* описание целой переменной */
scanf("%4f%5f%4f%3f",&zn,&zk,&dz,&pn); /* ввод переменных */
printf(" zn=%6.2f zk=%7.2f dz=%6.2f pn=%5.2f\n",zn,zk,dz,pn);
zi=zn; /* формирование начального значения параметра цикла */
while(zi<=zk) /* заголовок цикла */
{
nali=(zi*pn)/100.; /* вычисление текущего значения налога */
printf(" %10.2f %10.2f\n",zi,nali); /* печать zi, nali */
zi=zi+dz; /* формирование текущего значен`ия параметра цикла */
}
n=(zk-zn)/dz+1; /* оператор, следующий за циклом */
printf(" N=%2d\n",n);
}
842.2500.100.12.
Под телом программы расположена строка численных значений вводимых переменных.
Программа по алгоритму цикла с постусловием
Анализ алгоритмов, выполненных в виде цикла с постусловием (рис. 5.5, 5.7б) и структур операторов цикла, позволяет сделать вывод, что программирование возможно только с do... while. Вариант программы имеет вид:
/* Программа с использованием цикла с постусловием */
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali; /* описание вещественных переменных */
int n; /* описание целой переменной */
scanf("%4f%5f%4f%3f",&zn,&zk,&dz,&pn); /* ввод переменных */
printf(" zn=%6.2f zk=%7.2f dz=%6.2f pn=%5.2f\n",zn,zk,dz,pn);
zi=zn; /* формирование начального значения параметра цикла */
do /* начало цикла */
{
nali=(zi*pn)/100.; /* вычисление текущего значения налога */
printf(" %10.2f %10.2f\n",zi,nali); /* печать zi, nali */
zi=zi+dz; /* формирование текущего значения параметра цикла */
}
while(zi<=zk); /* проверка условия повторения цикла */
n=(zk-zn)/dz+1; /* оператор, следующий за циклом */
printf(" N=%2d\n",n);
}
842.2500.100.12.
Под телом программы расположена строка численных значений вводимых переменных.
Программа по алгоритму цикла с параметром
Анализ алгоритмов, выполненных в виде цикла с параметром (рис. 5.6, 5.7в) и структур операторов цикла, позволяет сделать вывод, что программирование возможно только с for. Вариант программы имеет вид:
/* Программа с использованием пошагового цикла */
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali; /* описание вещественных переменных */
int n; /* описание целой переменной */
scanf("%4f%5f%4f%3f",&zn,&zk,&dz,&pn); /* ввод переменных */
printf(" zn=%6.2f zk=%7.2f dz=%6.2f pn=%5.2f\n",zn,zk,dz,pn);
for(zi=zn;zi<=zk;zi=zi+dz) /* заголовок цикла */
{
nali=(zi*pn)/100.; /* тело */
printf(" %10.2f %10.2f\n",zi,nali); /* печать zi, nali */
}
n=(zk-zn)/dz+1; /* оператор, следующий за циклом */
printf(" N=%2d\n",n);
}
842.2500.100.12. - численные значения вводимых переменных.
Не нашли, что искали? Воспользуйтесь поиском:
|