Оператор пошагового цикла for
Предназначен для реализации в программе полного варианта цикла с параметром – формирование начального и последующих значений параметра цикла, проверка каждого из них на соответствие диапазону изменения с реализацией тела цикла, если условие выполняется, и выходу из цикла в случае его невыполнения.
Структура оператора
for( [нач_выр] ; [усл_выр] ; [выр_прир] )
{
тело
цикла
}
где for – ключевое слово (для);
нач_выр – выражение, задающее начальное значение параметра цикла;
усл_выр – выражение, определяющее проверку условия повторения цикла;
выр_прир – выражение, формирующее текущее значение параметра цикла через предыдущее;
; – разделители выражений;
( ) – ограничители выражений;
[ ] – признак необязательности содержимого;
тело цикла – совокупность операторов, выполнение которых требуется повторять;
{ } – ограничители тела цикла.
Внимание! В операторе цикла for символ окончания (;) не указывается.
Оператор выполняется следующим образом:
· определяется начальное значение параметра цикла (нач_выр);
· проверяется его соответствие диапазону счета (усл_выр);
· если выражение усл_выр истинно (результат не равен нулю):
выполняется тело цикла;
формируется новое текущее значение параметра (выр_прир);
повторяется его проверка в усл_выр;
· если усл_выр ложно (результат равен нулю):
выполнение оператора цикла прекращается;
управление передается следующему после тела цикла оператору (цикл завершается).
Схема выполнения оператора
for( нач_выр ; усл_выр ; выр_прир )
ЛОЖЬ ИСТИНА
{
тело
цикла
}
Правила записи и выполнения
В качестве начального выражения (нач_выр) используются одно простое (последовательное) или несколько (разделенных запятыми) присваиваний, например xi = xn (a=b=c=1.) или xi = xn, y=0., z=2.5, a=b=c=1.
Если начальное выражение отсутствует, начальное значение параметра цикла будет определяться содержимым соответствующей переменной (xi). Например, сформированным до входа в цикл:
xi = xn; /* формирование начального значения */
for( ; xi <= xk; xi = xi + dx )
{
. . .
yi = sin( xi );
. . .
}
В качестве усл_выр могут использоваться любые выражения Си/Си++. Арифметические, например (sin(b)+0.5), (2*c–d/f), (a) или простые (составные) логические выражения, например ( а != b ), ( sin( x ) < b ), ( x <= a && x >= b ).
Если условное выражение отсутствует, его значение считается истинным – создается бесконечный цикл.
ü Внимание! Выход из такого цикла невозможен – требуется перезагрузка операционной системы.
Один из вариантов предотвращения подобной ситуации заключается в формировании в теле цикла отрицания условного выражения в виде оператора 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 ); . . . } |
В качестве выражения приращения (выр_прир) используются одно (несколько разделенных запятыми) присваиваний вида xi = j(xi - 1), например xi=xi +dx или xi = xi+dx, b=b+2.
Если выр_прир отсутствует, текущее значение параметра цикла будет определяться содержимым соответствующей переменной (xi). Если оно не меняется – создается бесконечный цикл.
ü Внимание! Выход из такого цикла невозможен – требуется перезагрузка операционной системы.
Один из вариантов предотвращения подобной ситуации – формирование закона изменения параметра в теле цикла, например:
for( xi = xn ; xi <= xk ; ) /* заголовок цикла */
{
. . .
yi = sin( xi );
. . .
xi = xi + dx; /* закон изменения параметра*/
}
В принципе, нач_выр и выр_прир могут формироваться вне заголовка цикла. Первое – до него, второе – в теле цикла, например:
xi = xn;/*формирование начального значения параметра*/
for( ; xi <= xk ; ) /* заголовок цикла */
{
. . .
yi = sin( xi );
. . .
xi = xi + dx; /* закон изменения параметра*/
}
В этом случае оператор for выполняет функции оператора while.
Тело цикла оформляется одним оператором (составным или простым).
В теле цикла возможно использование специальных операторов 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. Третий прерывает выполнение тела цикла по тому же условию, но управление возвращается заголовку цикла.
В теле цикла возможно использование других (вложенных) операторов цикла.
Вывод: оператор 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. Вариант программы имеет вид:
/*Задача 5.1. Программа цикла с предусловием. */
/* Составил студент гр. А033 Бушуев И.А.*/
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali;/*описание вещественных переменных*/
int n; /* описание целой переменной */
scanf("%5f%5f%4f%3f",&zn,&zk,&dz,&pn);/*ввод переменных*/
printf(" zn=%7.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);
}
2842.5500.300.13.
Под телом программы расположена строка численных значений вводимых переменных.
Результаты решения представлены в приложении 5.1.
Программа по алгоритму цикла с постусловием
Анализ алгоритмов, выполненных в виде цикла с постусловием (рис. 5.5, 5.7б) и структур операторов цикла, позволяет сделать вывод, что программирование возможно только с do ... while. Вариант программы имеет вид:
/*Задача 5.1. Программа цикла с постусловием. */
/* Составил студент гр. А033 Бушуев И.А.*/
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali; /*описание вещественных переменных*/
int n; /* описание целой переменной */
scanf("%5f%5f%4f%3f",&zn,&zk,&dz,&pn);/*ввод переменных*/
printf(" zn=%7.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);
}
2842.5500.300.13.
Под телом программы расположена строка численных значений вводимых переменных.
Результаты решения представлены в приложении 5.2.
Программа по алгоритму цикла с параметром
Анализ алгоритмов, выполненных в виде цикла с параметром (рис. 5.6, 5.7в) и структур операторов цикла, позволяет сделать вывод, что программирование возможно только с for. Вариант программы имеет вид:
/*Задача 5.1. Программа с использованием пошагового цикла */
/* Составил студент гр. А033 Бушуев И.А.*/
#include <stdio.h>
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float zn,zi,zk,dz,pn,nali;/*описание вещественных переменных*/
int n; /* описание целой переменной */
scanf("%5f%5f%4f%3f",&zn,&zk,&dz,&pn);/*ввод переменных*/
printf(" zn=%7.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);
}
2842.5500.300.13.
Под телом программы расположена строка численных значений вводимых переменных.
Результаты решения представлены в приложении 5.3.
Арифметические циклы с табличным заданием аргумента
К классу циклических процессов с табличным заданием (изменением) аргумента относятся вычислительные процессы вида
yi = f(xi)
при задании аргумента конкретными численными значениями (массивом), в простейшем случае
x1, x2, . . . , xi, . . . , xm,
Массив– упорядоченная совокупность однородных элементов (данных), имеющих одно имя и разные индексы.
Каждый массив (матрица) характеризуется тремя параметрами – именем, размерностью (количеством измерений), размером.
Имя– основная часть обозначения массива (каждого его элемента).
В качестве имени массива в математике, как правило, используются заглавные буквы, например: A, X, B. Элементы массива обозначают строчными буквами с индексами, например: a1, xk, bi j, yk 8, zk p t.
Размерность– число измерений (направлений изменения) массива.
Размерность определяет количество индексов у каждого элемента массива.
Одномерный массив имеет одно направление изменения, а каждый элемент – один индекс. Если измерений больше одного, массив относится к многомерным. Большинство из многомерных массивов – двумерные и трёхмерные.
Двумерный массив можно представить в виде таблицы (матрицы), при этом первое измерение определяет строку, второе – столбец. Каждый элемент двумерного массива имеет два индекса. Первый задает номер строки, второй – номер столбца элемента в таблице.
Трехмерный массив – последовательная совокупность одинаковых по структуре таблиц (страниц). Следовательно, каждый элемент такого массива имеет три индекса, первый из которых определяет номер страницы, второй – номер строки, третий – номер столбца, где расположен элемент.
В качестве индексов элементов могут использоваться числа, переменные и арифметические выражения целого типа, например: 8, i, j+2. Поэтому обозначения элементов одномерного массива X – x1, xj, xj+2; двумерного Y – y2 6, yi j, yk j+3; трехмерного Z – z 2 6 4, z i j k, z i j+6 k-4.
Размер– величина, определяющая максимальное количество элементов массива.
В математике размер записывается в круглых скобках после имени массива и указывается отдельно по каждому измерению. Для многомерных (двумерных и трехмерных) массивов последовательность указания размеров аналогична рассмотренной для индексов. Для указания размера могут использоваться числа и переменные целого типа.
Например, обозначения Y(7), X(m) определяют одномерные массивы Y и X размером 7 и m элементов соответственно. Двумерный массив D, состоящий из 20 строк и 30 столбцов, обозначается как D(20х30). Его размер определяет число элементов (20х30=600) в массиве. Двумерный массив Z из m строк и n столбцов обозначается как Z(mхn), а его размер вычисляют как произведение указанных величин. Трехмерный массив S из десяти страниц с пятью строками и пятнадцатью столбцами на каждой обозначается как S(10х5х15), т.е. состоит из 10х5х15=750 элементов.
Следовательно, в рассматриваемой задаче вычисления yi = f(xi) табличное задание аргумента соответствует одномерному массиву X(m) с именем X и размером m, текущий элемент которого обозначается xi.
Рассмотрим программирование арифметических циклов с табличным изменением аргумента на конкретной задаче (5.2) о кладах.
Постановка задачи
Рассчитать размер вознаграждений, получаемых сдатчиками кладов, если известно, что он составляет 25 % оценочной стоимости, при условии, что количество кладов равно 7, а оценочные стоимости составляют 492 тыс. р., 503, 948, 738, 892, 320, 250 тыс. р.